Založen: Feb 28, 2012 Příspěvky: 117 Bydliště: Brno
Zaslal: st červen 27 2018, 23:40 Předmět: Simulace běhu programu v MPLAB X IDE
Na stará kolena začínám s programováním Mikrokontrolerů PIC. Pro začátek jsem se chytil Matouškovy knížky Mikrokontroléry PIC bez předchozích znalostí a dalšího dílu této knížky - pro pokročilé. Pořídil jsem PIC16F628A a PICkit3 (klon z ebay). Používám MPLAB X IDE v. 4.15 s překladačem XC8 v. 1.45. Pokud vyjdu z příkladů v knize lze to snadno pochopit a po editaci programu a odstranění chyb které ohlásí překladač proběhne vše v pořádku a program se přenese do PIC a vše běží. Menší úpravy programů rovněž. Když si ale vymyslím složitější verze s cykly, mám problém jak program odladit. Protože PICkit3 údajně umí debug pouze u PICů, které mají zabudovánu HW podporu, potřeboval bych krokovat program aspoň v simulaci. Tady ovšem narážím na rozsáhlost možných nastavení programu MPLAB X, zatím nevím jak na to. Angličtinu zvládám s obtížemi. Můžete mi někdo poradit jak na to?
Založen: Feb 28, 2012 Příspěvky: 117 Bydliště: Brno
Zaslal: so červen 30 2018, 20:57 Předmět:
Děkuju za tip na youtube. Tam jsem našel postup jak nastavit MPLABX IDE pro simulaci. Je to sice logické, ale v tom obrovském rozsahu možných nastavení to neprofesionál sám těžko hledá. Ale můj problém jsem stejně nevyřešil, pouze jsem zjistil jak se program chová (ale to není málo!).
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
*/
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í.
Založen: Feb 28, 2012 Příspěvky: 117 Bydliště: Brno
Zaslal: so červen 30 2018, 21:26 Předmět:
Omlouvám se za chybnou verzi programu, uvedenou v předchozím příspěvku. Zkoušel jsem totiž přehazovat příkazy pro posuvy a omylem jsem uvedl verzi kde jsou ty posuvy prohozené. Na chování programu to ale nemá žádný vliv, protože jak jsem uvedl, překladač ty dva podmíněné příkazy stejně ignoruje. Uvádím to jen pro toho kdo tuto chybu objeví, aby věděl že v tom problém nespočívá.
Založen: Feb 28, 2012 Příspěvky: 117 Bydliště: Brno
Zaslal: so červen 30 2018, 21:45 Předmět:
Bohužel to moje upozornění na chybu přišlo pozdě, MiloPS3 byl rychlejší. Ale dík za odkaz na sallyx.org. Zjistil jsem totiž že Microchip má v dokumentaci která se nainstaluje s překladačem pěkný chaos vyplývající asi z kombinace s makroassemblerem. A když se místo překladače XC8 verze 1.45 nainstaluje novější verze 2.00, což MPLABX nabídne, překladač používá jinak psané příkazy.
Navíc sallyx je v češtině.
Založen: Feb 28, 2012 Příspěvky: 117 Bydliště: Brno
Zaslal: ne červenec 01 2018, 16:39 Předmět:
pro rnbw:
je to zpráva pro mne nebo pro gcc (asi mimo toto vlákno)?
mám tam sice podobný příkaz pro posuv, ale napsaný asi správně, tj. bez mezer. Alespoň jinak tomu nerozumím.
Založen: Feb 28, 2012 Příspěvky: 117 Bydliště: Brno
Zaslal: ne červenec 01 2018, 17:09 Předmět:
Nějak jsem uvízl v mrtvém bodě.
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?
Založen: Feb 28, 2012 Příspěvky: 117 Bydliště: Brno
Zaslal: ne červenec 01 2018, 18:13 Předmět:
Děkuju všem za pomoc, už to běhá jak má. Ve všech popisech, které mám k dispozici se u operátorů pro bitový posuv sice zabývají popisem co se stane s operandem signed a co s unsigned, ale ve všech jsem to chápal tak, že se NAHRADÍ původní obsah proměnné hodnotou bitově posunutou požadovaným směrem o požadovaný počet bitů.
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.
Časy uváděny v GMT + 1 hodina Jdi na stránku 1, 2Další
Strana 1 z 2
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.