Ac nerad, mel bych zase dotaz… fakt uz nevim, co s tim…
Pisu program (budik) do PIC16F877A, uz je to skoro hotovy, jen bych chtel neco zapsat do EEPROM.
To, co se zapsalo uvadim na konci postu jako vypis programu “UP v2.42” pri verifikaci EEPROM.
Nejdriv teda kod:
Tenhle podprogram by mel akorat nastavit ci otestovat vse potrebne a pripadne nechat zapsat.[code]ZapsatBudik ; otestuje, ci je moznost zapsat aktualne nastavenej budik a pokud jo, tak ho to i zapise (svine!)
bcf STATUS, IRP ; radsi smazat i toto, ac by to melo byt 0
movf SELDISP, f ; otestovani na nulu
btfss STATUS, Z ; pokud to neni nula
return ; tak konec
movf MODE, w ; presunout do W
xorlw .2 ; testnout, ci sem v modu 2 (nastaveni budiku)
btfss STATUS, Z ; a pokud jsem i ve spravnym modu
return ; pokud nejsem tak skoncim
; ted by se snad i siklo zaridit cekani na preruseni - abych zbytecne nekurvil ten cas, i kdyz 1/400 sekundy...
movlw CURBUD ; presunout do FSR
movwf FSR ; adresu prave upravovanyho budiku
call ZapsatEEprom ; nechat zapsat budik do EEPROM
return ; a vratit se[/code]
Nasledujici by melo zapsat tri bajty do EEPROM podle cisla v registru CURBUD. Podprogram “EEWrite” je napsan podle PDFka. [code]ZapsatEEprom
; v FSR se ocekava adresa cehosi jako CURBUD = adresa v EEPROM / 3
bcf STATUS, C ; vynulovat C, pro jistotu...
rlf INDF, w ; nejdriv vynasobit dvema
addwf INDF, w ; a potom pricist jednou - a huraaa, mame trojnasobek
bcf STATUS, RP0
bsf STATUS, RP1 ; protoze tady se nastavej banky a uz k tomu asi nebude pristup... debilni...
; === ZAPIS MINUT ===
movwf EEADR ; presunout do adresy
incf FSR, f ; inkrementovat ukazatel
movf INDF, w ; presunout minuty
movwf EEDATA ; do EEDATA
call EEWrite ; zapsat minuty
; === ZAPIS HODIN ===
incf EEADR, f ; inkrementovat adresu v EEPROM
incf FSR, f ; ale i v FSR - na hodiny
movf INDF, w ; hodiny
movwf EEDATA ; do
call EEWrite ; EEPROM
; === ZAPIS DNU ===
incf EEADR, f
incf FSR, f
movf INDF, w ; dny
movwf EEDATA
call EEWrite
bcf STATUS, RP1
bcf STATUS, RP0
return
EEWrite
bsf STATUS, RP0 ; Bank 3
bcf EECON1, EEPGD ; Point to DATA
bsf EECON1, WREN ; Enable writes
bcf INTCON,GIE ;Disable INTs.
movlw 0x55
movwf EECON2 ; Write 55h
movlw 0xAA
movwf EECON2 ; Write AAh
bsf EECON1, WR
bsf INTCON, GIE
bcf EECON1, WREN
btfsc EECON1, WR ; cekani na dozapsani
goto $-1
bcf STATUS, RP0
return[/code]Vzhledem k tomu, ze tu vyuzivam neprimeho adresovani (je to jednodussi, predevsim kvuli odpadle nutnosti neustale prepinat mezi bankami), bude asi dulezite ukazat i organizaci pameti:[code]; pro mod nastavovani budiku:
CURBUD equ RAM+20 ; aktualne vybranej budik, zobrazovat se bude na miste sekund
CURMIN equ CURBUD+1 ; minuty RAM+22
CURHOD equ CURMIN+1 ; hodiny RAM+23
CURDEN equ CURHOD+1 ; den RAM+24[/code]Jsem si docela jistej, ze tady chyba nebude - pri nastavovani se mi to vsechno zobrazuje na displeje a tvari se to OK, pri vypnuti nastavovaciho modu se zobrazi cas tak, jak ma bejt.
Tlacitka i zapis do EEPROM jsou obsluhovany v “main-loop”, takze by teoreticky nemel byt ani problem v nejakej preruseni preruseni prerusenim…
Pokud by se tim nekdo rozhod prohrabnout a treba nasel chybu, bude mu patrit jedno moje veliky diky (snad to nebude moc narocny, kod se snazim komentovat - predevsim pro sebe). Delam se s tim fakt dlouho a nemam uz jedinou predstavu, cim by to mohlo byt. Zapis konstanty do EEPROM funguje celkem v poradku a problem v tom neni.
Jeste ten vypis z UPu:1.: Verify of data memory: 02 read instead of 00 at address 0002
2.: Verify of data memory: 03 read instead of 00 at address 0023
3.: Verify of data memory: 03 read instead of 00 at address 0026
4.: Verify of data memory: 03 read instead of 00 at address 0029
5.: Verify of data memory: 04 read instead of 00 at address 002C
6.: Verify of data memory: 04 read instead of 00 at address 002F
7.: Verify of data memory: 04 read instead of 00 at address 0037
8.: Verify of data memory: 04 read instead of 00 at address 003A
9.: Verify of data memory: 06 read instead of 00 at address 0053
10.: Verify of data memory: 06 read instead of 00 at address 0058
11.: Verify of data memory: 06 read instead of 00 at address 005B
12.: Verify of data memory: 07 read instead of 00 at address 0077
13.: Verify of data memory: 08 read instead of 00 at address 007A
14.: Verify of data memory: 08 read instead of 00 at address 007D
15.: Verify of data memory: 08 read instead of 00 at address 0088
16.: Verify of data memory: 0A read instead of 00 at address 00A4
17.: Verify of data memory: 0A read instead of 00 at address 00A7
18.: Verify of data memory: 0A read instead of 00 at address 00AF
19.: Verify of data memory: 0B read instead of 00 at address 00C5
20.: Verify of data memory: 0B read instead of 00 at address 00C8