Assembler- oprava kódu. PIC16F88
Moderátor: Moderátoři
Pro jistotu popíšu i to co si myslím, že chápu. Takže zapis_cekat
zapis_cekat btfsc eecon1,1
goto zapis_cekat
bcf eecon1,2
return
Takže já tam testuju bit 1 eeconu1 (předtím jsem tam zapisoval). Furt to tam jede dokola do te doby, než bude ten bit mít 0 hodnotu. Pak to přeskočí ten řádek s goto. A pak to bcf mi vynuluje v eeconu1 ten druhej bit.
Takhle to chápu myslím dobře. Z datasheetu vím, že druhý bit povoluje nebo zakazuje zápis. Záleží jestli tam dám 1 nebo 0 .
Ty dotazy napíšu na vícekrát. U mého počítače nikdy nevím, kdy přijde blue death nebo neco podobného a nechtěl bych to celé psát znova.
bcf eecon1,7 ;volba pamět EEPROM
Zase, vím, že instrukce bcf mi nuluje ten bit. V datasheetu vidím, že nulováním jsem si zvolil EEPROMku.
Já to takhle chápu, jen nevím, jak člověk musí přemýšlet aby se kouknul na program co mu nefunguje a řekl si "Hmm, tak támdle tomu chybí zvolení EEPROMky" . Mě by todle nikdy nenapadlo.
BANK2
movlw h'10'
movwf eeadr ;
BANK3
bcf eecon1,7 ;volba pamět EEPROM
bsf eecon1,0 ;zahájit čtení
BANK2
movf eedata,w
return
U tohodle si tak úplně jistej nejsem, ale popíšu jak to chápu.
movlw h10-mám to ve střadači
movwf eeadr-přesunu to do eeadru
pak jak píšeš v poznámkách vybereš eepromku, zahájíš čtení... Ale pak nechápu k čemu je tam ta BANK2? Dál tam je movf eedata,w čim zase přesunu z eedata do W což je pracovní registr. Takže ta BANK2 je tam kvůli W ?
a čtení. tady to platí stejně, přečíst datašít, zjistíš postup práce s periferií. takže postup je jasně danej. bank2 před movf eedata,w musí bejt proto že registr eedata se nachází v bank2. kvuli střadači se banka nepřepíná, střadač pracuje ve všech bankách, banky přepínáš kvůli registrum s kerejma pracuješ.
Pak tam jsou ty zpoždění. Na ty ani nekoukám... Jen ty zákmity tlačítek si ještě pořádně vychytám až na samotný desce. Takže se zpožděníma žádnej problém rozhodně nemám. Už nemám... Pamatuju si, že minulej rok to pro mě docela problém byl. Nevěděl jsem, že se to v assembleru dělá tím způsobem, že budu přeskakovat instrukci furt dokola. Byl jsem zvyklej z Bioloida (robo stavebnice), že napíšu jednoduše Timer = 1sec
Wait while (Timer > 0sec)
ale to jen tak na okraj.
Potom tabulka mi je taky jasná. Jen se zeptám, kdybych vícekrát dekrementoval tu proměnou pocet, dostal bych se na 0 nebo by mi to hodilo nějakej error?
K hlavnímu programu toho moc nemám. Jen u testu2 vidim
movlw b'11111111'
movwf porta
bcf portb,4
Toho samého bych dosáhl kdybych dal call init? Nebo jsi call init smazal z původního programu záměrně?
Kdyby si v prubehu programu znova volal init tak bys znova prenastvil procesor, coz by mohlo prepsat nastaveni kery si udelal v prubehu programu , moch by se ti zhroutit program a delat nepredvidatelny efekty. Coz nechces. Takze celkovou inicializaci jen po zapnuti a pak uz ne. Pak uz jen prenastavovat periferie.