Simulace běhu programu v MPLAB X IDE
Moderátor: Moderátoři
Simulace běhu programu v MPLAB X IDE
vyskousej starej MPLAB IDE https://www.youtube.com/watch?v=pnkUOL0mmyA
jinak skus projet temata od uzivatele pettter nedavno jsme tam resily spoustu uzitecnejch veci
Je to tento prográmek, který má opakovaně honit v osmici LED na portu B jednu svítící LED od bitu 0 po bit7 a zpět. Ve skutečnosti se rozsvítí jen LED na bitu 0 a tím to skončí. Na simulaci jsem zjistil že program běží dobře pouze do skončení čekání a pak se vrátí na začátek cyklu while a tak dokola v nekonečném cyklu.
/*
* File: 8xLEDpostupne_cyklem.c
* Author: xxxx
*
* Created on 27. ?ervna 2018, 17:03
*/
#pragma config FOSC=INTOSCIO //vnitrni osc., RA6 a RA7 volne
#pragma config WDTE=OFF //vypnuti WDT
#pragma config LVP=OFF //vypnuti LVP, RB4 volny
#define _XTAL_FREQ 4000000UL //taktovaci kmitocet 4 MHz
#include <xc.h>
#include <stdint.h>
void main(void)
{
uint8_t n,m;
TRISB=0; //vsechny vyvody portu B jsou vystupy
PORTB=0b11111111; //vsechny LED zhasnute
n=0b00000001;
while(1) //nekonecny cyklus
{
if (n==0b00000001)
m=0;
if (n==0b10000000)
m=1;
PORTB=(unsigned)~n;
__delay_ms(500);
if (m==0)
n>>1; //bitovy posuv doleva o 1 bit
if (m==1)
n>>1; //bitovy posuv doprava o 1 bit
}
return;
}
Tedy část:
if (m==0)
n>>1; //bitovy posuv doleva o 1 bit
if (m==1)
n>>1; //bitovy posuv doprava o 1 bit
se celá přeskakuje.
Našel jsem pouze varování překladače
":: warning: (1273) Omniscient Code Generation not available in Free mode" s kterým si nevím rady v čem je problém a jak jej mohu řešit i v bezplatné (free) verzi.
Mohu požádat někoho ze zkušených, proč vadí ty dva podmíněné příkazy na konci. Rád bych to pochopil abych věděl v čem je omezení.
Díky moc za pomoc.
Kód: Vybrat vše
n>>1; //bitovy posuv doleva o 1 bit
n>>1; //bitovy posuv doprava o 1 bit https://www.sallyx.org/sally/c/c10.php
Navíc sallyx je v češtině.
gcc píše:Kód: Vybrat vše
test.c:5:11: warning: statement with no effect [-Wunused-value]
n >> 1;
~~^~~~
asi neznamena ze je to spravne ...
Kód: Vybrat vše
n>>1; //bitovy posuv doleva o 1 bit otevri si ten odkaz co sem sem dal a najdi si Binární a relační operátory a najdi si spravny zapis prikazu ne "asi spravny"
Jsem totiž původně analogový hardwerář s určitými malými zkušenostmi z pokusů ve strojovém kódu se stavebnicí SDK 8085 (historicky). Tam o žádný překlad nešlo a za celý program včetně chyb a jejich hledání si ručil programátor. Hlavním nástrojem byl selský rozum a pečlivost při studiu a použití instrukcí. Byly také nějaké historické pokusy v Basicu a pak v Borland Pascalu, ale to se netýkalo řízení hardware.
Domnívám se že problém může být v tom, že na rozdíl od prostého assembleru (vlastně strojový kód jen zapsaný v sybolických adresách) tady (u C) přibývá překladač, kde kromě toho selského rozumu přibývá nutnost respektovat potřeby toho překladače, aby interpretace nejen příkazů (syntaxi pohlídá překladač) ale i obsahu proměnných byla jednoznačná (signed, unsigned apod.). Z toho vyplývá zřejmě nutnost prostudovat si úvodní kapitoly (definice, typy, deklarace atd.) k jazyku C, což se mi jednak nechtělo v anglické rozsáhlé dokumentaci k XC8, jednak jsem jel podle té Matouškovy knihy, která se tím na začátku vůbec nezabývá. Ty příklady z knihy jsou samozřejmě v pořádku, ale jen primitivní, no a já jsem chtěl hned u prvního příkladu více, podle selského rozumu měl program fungovat, syntaxe byla taky OK, ale překladač to asi chápe jinak.
Takže zpátky na strom a začít studovat, nejlépe v češtině. Zkusím sallyx.org i když tam samozřejmě není popis C pro XC8 od Microchipu, ale to už snad porovnám s dokumentací k XC8 (asi stačí syntaxe příkazů).
Vidíte někdo lepší cestu k porozumění chování překladače?
O tom že by to mohlo být i jinak jsem začal uvažovat až po přečtení dotazu od MiloPS3 (kam zapisuješ výsledek?). Stačilo nahradit n>>1; příkazem n=n>>1; a obdobně u druhého posuvu a vše jede.
Akorát to při překladu varuje:
8xLEDpostupne_cyklem.c:34: warning: (373) implicit signed to unsigned conversion.
Ale protože je asi správně definovaný typ proměnné, tak to nevadí?
Ještě jednou díky všem.