Stránka 1 z 2

Assembler- oprava kódu. PIC16F88

Napsal: 02 led 2014, 19:01
od PIClover
Zdravím, potřeboval bych pomoct s programem do školy. Program je téměř hotový, stačí najít chybu, kterou se mi po delším bádání, nepodařilo najít.

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.

Napsal: 02 led 2014, 20:17
od Pawalo
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 :D


Oprava: nedávej tam clrf porta ale setf porta ( teda jestli 16f88 zná instrukci setf )

Napsal: 02 led 2014, 20:17
od Niki31
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.

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.

Napsal: 02 led 2014, 20:46
od monterjirka
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.

Napsal: 02 led 2014, 23:43
od procesor
To nulovanie EEPROM na adrese0x2110 je O.K.
To sa definuje iba do hex súboru pri napaľovaní procesora aby začal žiť od stavu NULA.
Clrf portA je dobrá instrikcia, lepšej niet, iba zložitejšie cez w register.

Napsal: 03 led 2014, 09:05
od Niki31
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.

Napsal: 03 led 2014, 15:19
od PIClover
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 :D


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 :D Úloha na pana Bumbu...

Napsal: 03 led 2014, 15:46
od PIClover
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.

Napsal: 03 led 2014, 17:53
od Pawalo
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.

Napsal: 03 led 2014, 19:38
od PIClover
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.

Napsal: 03 led 2014, 23:05
od Niki31
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.

Napsal: 03 led 2014, 23:55
od Pawalo
tááák už je to tu...

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.

Napsal: 04 led 2014, 08:05
od Niki31
Ešte taká malá poznámka, namiesto makra:

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.

Napsal: 04 led 2014, 12:20
od Pawalo
jen pro pořádek,,,,, za nikoho sem domácí úkol nedělal a nikomu sem nic nesežral. bylo hnedka jasný že to je do školy. když vidim snahu něco vytvořit, tak pomůžu. celej program bych mu nikdy nepsal.

Napsal: 04 led 2014, 15:11
od PIClover
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.