Rutina pro PIC16F84A funguje jen do 0x08

Zdravím všechny nadšence,
ačkoli jsem v programování pro MCU docela nováček, zatím se mi s assemblerem dařilo vycházet dobře. Teď jsem ale narazil na problém, který, del mého názoru, vychází z nějaké vlastnosti MCU, na který jse mještě nenarazil. Zřejmě to bude něco primitivního, tak se mi prosím nesmějte.

V programu používám standardní smyčku pro zpomalení a vytvoření zpoždění. Mám tři diody na portu A (RA0, RA1, RA2, postupně zelená, žlutá, červená) a stejné tři diody na portu B (RB0, RB1, RB2, zelená, žlutá, červená). Každá skupina reprezentuje jeden směr na semaforu. Mezi změnami barev používám následující standardní smyčku a vše funguje dobře.

....
Pauza
   MOVLW   h'FF'
   MOVWF   Poct1
   MOVWF   Poct2

   Smycka
   DECFSZ  Poct1
   GOTO     Smycka
   DECFSZ  Poct2
   GOTO     Smycka
...

Diody dělají, co se od nich požaduje, tedy svítí obě červené, pak se spouští směr 1 (Port A), zastavuje se, spouští se druhý směr (Port B) a zase dokola. Mezi jednotlivými barvami vždy volám rutinu Pauza (následující problém se však týká i kódu, který rutinu nepoužívá).

Zjistil jsem ale, že při použitém oscilátoru běhají moc rychle. Přidal jsem tedy do rutiny puaza ještě jeden počítací registr, Poct3, který ale nepočítá do 255, ale stačilo by mi do cca deseti, dvanácti. Daná část kódu tedy vypadá následovně:

....
Pauza
   MOVLW   h'FF'
   MOVWF   Poct1
   MOVWF   Poct2
   MOVLW   h'0B'
   MOVWF   Poct3

   Smycka
   DECFSZ  Poct1
   GOTO     Smycka
   DECFSZ  Poct2
   GOTO     Smycka
   DECFSZ  Poct3
   GOTO     Smycka
...

A tady jsem opakovaným programováním PICu zjistil divnou funkci rutiny - pokud je třetí počítací registr v rozmezí nula až šest, je vše v pořádku, pokud je hodnota sedm, z Portu B funguje jen zelená dioda na RB0, a u hodnot osm a výš funguje jen Port A, a to navíc tak, že daná dlouhá pauza s třemi smyčkami se provede jen dvakrát a dále až do resetu MCU trvá Pauza jen dvě smyčky.

Tuším, že diody, které blikat nevidím, se ve skutečnosti spouští, ale krátce. A tuším, že to nějakou záhadnou cestou souvisí s plněním registru hodnotami, přitom ale na začátku každé rutiny naplním první dva čítací registry 255ti a třetí 11.

Děkuji za každý nápad, který by pomohl odstranit problém. Vzhledem k tomu, že program je v základu (bez třetího čítače) funkční, nedávám sem celý zdroják, ať se tím nemusíte zbytečně prolouskávat.

S díky a s zdravem,
Jakub

Dej sem celej ASM jako přílohu. Můžeš mít chybu hned na začátku programu a to se s toho kousku nepozna.

OK, hned večer z domova ho nahodím, nerad bych ho sem házel z hlavy, aby nevznikla nějaká zbytečná chyba přepisem. I když, jak je možný, že u malejch hodnot třetího čítače se problém neprojevuje a běhá to správně, ale u větších jo? Může to být vůbec chyba kódu? Je přeci jedno, jestli počítám do 0x06 nebo 0x0B, nebo ne? To je jedinej rozdíl mezi programem, co běhá dobře a programem, co zlobí…

Každopádně sem hodim celej kód, hned jak přijdu.

Zdravím, tady je celý kód programu, u kterého mě zlobí rutiny. Pauzy jsou dvě, jedna dlouhá (Pauza) a krátká (PauzaK).

Díky za pomoc, seděl jsem u toho dva celé večery a nevím, prostě nevím. Podotýkám, že pokud se do registru POCT3 vloží hodnota 0-6, je to bez problému. U 7 přestanou blikat dvě diody na RB1 a RB2 a od 8 se celý port B tváří, jako by nebyl, bliká jen port A a to zvláštně - první dvě změny barev OK, pak velice zrychleně.
semafor2-0.asm (3.33 KB)

Tak jsem na to zbežně koukal a máš zapnutej WDT a nikde ho nenuluješ. Chtělo by to nějakej INIT procesoru, kde nastavíš vše potřebné pro správný běh procesoru. A to máš na RC oscilátoru? To tam taky nikde nemáš. A proč nepoužiješ soubor *.INC?
Semafor.asm (3.19 KB)

Typ oscilátoru nastavuju ve WinPICu při vypalování, myslel jsem, že to stačí…
Minulej program, semafor jen pro jeden směr, mi fungoval výborně pro jakýkoliv zpoždění, aniž bych řešil WDT.

Každopádně díky za radu, jestli je to tim, prolouskám se příslušnou literaturou a zkusim, co se dá dělat. Pomohlo by mi například, kdybych WDT vypnul? (WinPIC -> WDT = disabled)?

Takže jo, bylo ti čistě tim WDT. Díky moc za radu, na to bych asi následující týden sezení s hlavou v dlaních nepřišel. jdu studovat funkci WDT a nulování.

Ještě jednou díky. Věděl jsem, že tu jsou samý odborníci :slight_smile:

Kuba

Cau, jestli nepotrebujes WDT a to jako ze ne tak ho nech viplej, samo by to slo i pres WDT ale sez v zacatcich tak steci bez nej,

urcite bych ti doporucil pouzit definicni soubor , usetris si cas vypisovani tech definici a muzes si nastavit i pojistky,

[code] list p=16f84A, R=DEC
include “p16f84A.inc”

;nastaveni kristalovyho oscilatoru 4Mhz,spozdeni pri startu,WDT OFF, CP OFF
__CONFIG _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF[/code]

kdyz sem zacinal tak sem to delal jako ty, polovina pripadu kdy mi ¨program nebezel byl ze sem spatne nastavil pojistky, (nezapnul XT osc, zapnul WDT, a povedlo se mi i zapnout ochranu precteni kodu,)

OK, definiční soubor doplním.
Nevím, jestli na to založit další vlákno, ale když jsem koupil relativně drahej krystal, PIC protestoval, a i když byl správně nastavenej, nechtěl ho. Tak jsem sestavil RC článek, nastavil PIC na RC a taky nic. Potom jsem náhodou zapojil pin OSC1 přes 2k rezistor na kladnou větev a světe div se, běhá (při nastavení jako RC oscilátoru) :slight_smile: Je to normální a neničím ho?

Jakej mas kristal ? nad 8MHz by mel bejt nastavenej na HS, mas ho dobre zapojenej ? na OSC1 OSC2 + 2 kondiky 15-33pF na Vss

pokud k tomu mas kondik na Vss tak je to RC osc,

Nad 4Mhz je to HS! A PIC16F84A jsem na víc jak 10Mhz neviděl, a to jen jeden. Jinak všechny byli do 4Mhz. Mrkni na PIC a na něm je napsáno, PIC16F84-xy a to xy je max. rychlost. To bude možná ono, proč PIC protestoval. A možná mu vadí ty kondiky proti VSS.

Ale i ty 16F84 jsou na 20MHz viz např. tme.eu/cz/katalog/index.phtm … szukaj%3D+

:arrow_right: administrator: příspěvek byl upraven

Já jsem 16F84A držel v ruce naposled před skoro 2 lety, tenkrát ješte nebyli :blush: :blush: :blush: Holt doba pokročila.

já ten “šrot” taky držel naposledy na střední :smiley: to je taky pár let, ale vím, že učitel nám o tom říkal, že jsou i 20MHz