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