Assembler- oprava kódu. PIC16F88
Moderátor: Moderátoři
Assembler- oprava kódu. PIC16F88
Zadání: Vytvořte program, který bude počítat počet zapnutí napájecího napětí pro vývojovou desku s jednočipovým mikropočítačem PIC16F88. Počet zapnutí bude uložen v BCD kódu na adrese 10H v paměti EEPROM. Po uložení nové hodnoty se rozsvítí desetinná tečka na zobrazovači. Po stisknutí tlačítka TL1 se na 1 sekundu zobrazí na sedmisegmentovém zobrazovači jednotky počtu zapnutí napájení.
V příloze najdete zjednodušené schéma, vývojové diagramy a samotný program. Budu vám velice vděčný a mé vysvědčení taktéž za jakoukoliv pomoc či připomínku. Děkuji.
- Přílohy
-
PraceSEEPROM.rar- (119.93 KiB) Staženo 190 x
nevim proč máš na konci programu znovu inicializaci když chceš jen hasnout displej, dej tam jen clrf porta a pak rozsvit tečku,,,, no a nevim k čemu je ta inkrementace eedata v podprogramu cteni když tu inkrementaci provádíš po vyskočení z tabulky? to sou dvě věci kerý zatim vidim. až dorazim dom, pustim mplab a uvidim snad víc.
a jen tak okrajově,, nejsi ty z COPky ??? mi ten zdroják je nějakej povědomej
Oprava: nedávej tam clrf porta ale setf porta ( teda jestli 16f88 zná instrukci setf )
Inak tie časové slučky sa už asi nedali napísať zložitejšie,o neustálom volaní INIT ani nahovorím.Je to zbytočné plýtvanie prostriedkami mikrokontroléra.Tento program sa dá napísať aj 2x kratší.
Doporučujem používať original include súbory.
- monterjirka
- Příspěvky: 2855
- Registrován: 14 čer 2003, 00:00
- Bydliště: Blížejov
Niki31 píše:Pozrel som to len tak zbežne a prve čo vidím je,že po zapnutí sa v definíciach nuluje eeprom.Ťažko ti preto bude zobrazovať predtým zapísané data.
...
Ono by to chtělo vybrat nějakou nevyužitou adresu v EEPROM, přečíst co je tam a podle toho, jestli tam bude nastavená hodnota nebo ne, rozhodnout se, jestli provést nulování EEPROM a pak tu hodnotu na zmíněnou adresu uložit.
Tím by po příštím zapnutí přístroj poznal, že již je nastaven a nulování by se přeskočilo.
že adresa 2110 zasahuje už do EEPROM.
Pawalo myslel SETF PORTA kvôli tomu že display sa zhasína nastavením všetkých bitov portu A na Log.1. Tak by to bolo najjednoduchšie,lenže túto inštrukciu tento mikrokontrolér nepozná.
Riadok 258 treba odstrániť,pretože počet je inkrementovaný 2 krát.
Ďalej nieje ošetrené väčšie číslo ako 9 v rutine tabulka.Inštrukcia return
na konci je nanič,ak bude číslo > 10 tak sa aj tak preskočí a program skolabuje. Pred volaním rutiny tabulka treba zabezpečiť že číslo bude iba v rozsahu 0-9.
Lepšie ošetriť zakmitavanie tlačítka,určite by som doplnil sekciu "je stále stlačené?" a "je uvolnené tlačítko?" by som dal na začiatok.
Pawalo píše:a jak se ti to chová teď ??
nevim proč máš na konci programu znovu inicializaci když chceš jen hasnout displej, dej tam jen clrf porta a pak rozsvit tečku,,,, no a nevim k čemu je ta inkrementace eedata v podprogramu cteni když tu inkrementaci provádíš po vyskočení z tabulky? to sou dvě věci kerý zatim vidim. až dorazim dom, pustim mplab a uvidim snad víc.
a jen tak okrajově,, nejsi ty z COPky ??? mi ten zdroják je nějakej povědomej
Oprava: nedávej tam clrf porta ale setf porta ( teda jestli 16f88 zná instrukci setf )
V tudle chvíli se mi na disleji zobrazí jenom 0 a po vypnutí a zapnutí stále jenom 0. Takže chybu bych hledal asi v zápisu nebo ve čtení...
Jojo z COPky jsem
Niki31 píše:To vynulovanie je OK,nevedel som že 16f88 ma takú kratučkú pamäť,
že adresa 2110 zasahuje už do EEPROM.
Pawalo myslel SETF PORTA kvôli tomu že display sa zhasína nastavením všetkých bitov portu A na Log.1. Tak by to bolo najjednoduchšie,lenže túto inštrukciu tento mikrokontrolér nepozná.
Riadok 258 treba odstrániť,pretože počet je inkrementovaný 2 krát.
Ďalej nieje ošetrené väčšie číslo ako 9 v rutine tabulka.Inštrukcia return
na konci je nanič,ak bude číslo > 10 tak sa aj tak preskočí a program skolabuje. Pred volaním rutiny tabulka treba zabezpečiť že číslo bude iba v rozsahu 0-9.
Lepšie ošetriť zakmitavanie tlačítka,určite by som doplnil sekciu "je stále stlačené?" a "je uvolnené tlačítko?" by som dal na začiatok.
Aha, asi můj dotaz bude znít hodně stupidně, ale já v tom programu přece větší číslo než 9 nevkládám? Tak jak bych tedy měl ošetřit větší čísla? Každopádně děkuju za pomoc.
asi takhle by to vypadalo:
retlw h'00' ;Znak "8".
retlw h'10' ;Znak "9".
retlw h'XX' ;Znak ''E''
decf pocet
goto $-2
zase sem v praci, takže funkce neověřena. až v noci dorazim, tak si snad už vzpomenu a skusim simulaci celýho programu.
Pawalo píše:no vono čtení i zápis mi příde necelej,,, ošetření překročení čísla 9 to chtít bude, jinak ti to pak bude v tabulce skákat kamsi dám do programu. bude to chctí před skokem do tabulky zjistit jestli je číslo větší, a nebo asi jednoduší metodou a to tak že do tabulky na 11 pozici dáš třeba znak E jako Error a na 12 pozici se dá decf pocet. takže funkce bude taká že když zapneš po jedenáctý, tak se ukáže E a když pak zapneš po 12 tak se provede dekrementace na 11, dáš goto $-2 aby si skočil na řádek s pozicí znaku E.
asi takhle by to vypadalo:
retlw h'00' ;Znak "8".
retlw h'10' ;Znak "9".
retlw h'XX' ;Znak ''E''
decf pocet
goto $-2
zase sem v praci, takže funkce neověřena. až v noci dorazim, tak si snad už vzpomenu a skusim simulaci celýho programu.
Paráda, to ošetření chápu. Nějak podobně to chtěl řešit spolužák. Já bych ti zase nerad ubírat spánek kvůli té simulaci, ale pokud si najdeš čas, budu jedině rád.
V tudle chvíli se mi na disleji zobrazí jenom 0 a po vypnutí a zapnutí stále jenom 0. Takže chybu bych hledal asi v zápisu nebo ve čtení.
Je treba si uvedomiť že k zápisu dôjde až po stlačení tlačítka,takže zaznamenaný bude len výpadok po ktorom je stlacené tlačítko !
Skontroluj si zápisovú rutinu podľa datasheetu,chýba ti tam odomknutie zápisu a hlavne čakanie na dokončenie zápisu,to môže trvať aj niekoľko desiatok milisekúnd a môže mať za určitých okolností fatálne dôsledky.
v příloze máš přepsanej zdroják, takže si to porovnej s tim tvym at víš co sem přepisoval. Měl si špatně čtení i zápis, no špatně, spíš nekompletní. dopsal sem ti tam to ošetření v tabulce že když bude hodnota větší jak 9, tak ti to vypíše E a pak to bude vypisovat pořád E, vlastně dokud nesmažeš EEPROM. a taky sem ti trochu zpřeházel začátek v programovej smyčce, měl si to tam nelogicky posobě. No prohlídni, porovnej, pokud něco nebudeš chápat, ptej se.
- Přílohy
-
- COP_TEST.asm
- (12.63 KiB) Staženo 195 x
BANK0 macro
bcf status,5
bcf status,6
endm
stačí použiť príkaz : banksel 0
V tomto mini programe ti makra akurát pletú hlavu.Treba ho používať prednostne a neriešiť prepínanie bánk všelijakými inými spôsobmi.Ale to len tak naokraj,pretože neviem či to nebol zámer ukázať ich použitie.
Jeejda píše:Kdyby měl snahu něco vytvořit, tak bych nic nenamítal... jenže to že "chtěl pomoci" ve stejném čase a s textem ve stejném znění hned na dvou fórech najednou dost svědčí o opaku. Tím že mu pomáháš mu ve skutečnosti nepomáháš, ale přímo škodíš.
Ale dost hádek, nemám v úmyslu se tu s kýmkoliv hádat. Zkus se prosím na tím, co jsem napsal, trochu hlouběji zamyslet, jestli na tom náhodou něco nemůže být...
To, že je to do školy jsem hned ze začátku psal. Takže pokud by s tím někdo měl problem nemusel mi jakkoliv pomáhat či radit. Že jsem "otravoval" i jinde? To je pravda, ale nepsal jsem to tam z toho důvodu jak říkáš. Nebyl jsem si jistý, jestli se mi dostane vůbec nějaké rady.
Ale chápu co chceš říct. Jen bych na svou obhajobu dodal, že toto je poslední úloha ve které budu s PICem dělat a obecně s assemblerem. Takže si nemyslim, že by mi škodil ba naopak mi hodně pomohl. Assembleru rozumim opravdu jenom mírně a po této úloze se s ním snad už nikdy nesetkám.