Ja då var det dags för mina dumma frågor igen.....
Jag har testat att försöka få skriva (och läsa men skrivningen behöver ju fungera först så jag ser att jag får ut annat än FF (då jag tittar på en byte)) till EEPROM att fungera. Jag satt och simulerade det hela via MPLAB SIM och när jag där tittar på resultatet i EEPROM så innehåller det hela tiden FF på alla adresser, ja även efter mina skrivförsök till EEPROM.
Efter mycket felsökande så hittade jag något fel i koden men ändå fick jag det inte att fungera, då valde jag att skicka ut det till min krets som jag har uppkopplat på labbplattan och döm om min förvåning när jag där får det resultatet som jag vill ha på mina dioder. Jag har kopplat upp 8 dioder som representerar den byte data på den adress jag försöker skriva och läsa till. Det borde ju betyda att min skrivning (och läsning) till EEPROM fungera.
Jag provade i ett tidigare skede att lägga ut koden på dioderna men då var det alltid alla 8 dioder som lös (FF hex) så då fungerade det som sagt inte, men sedan hittade jag några misstag av mig i koden och när jag nu ändrar vad jag skriver in för data och sedan läser ut och matar ut resultatet på dioderna så ändras det vilka dioder som lyser så den biten "måste" ju stämma.
Jag borde ju göra något fel, antingen när jag simulerar eller om det finns grodor i min kod, är det någon som känner igen fenomenet?
Koden kommer här (det är lite expriment-kod och ja jag vet att jag inte skall köra goto $-2 till exempel men jag plankade det som stog i databladet för microchip för att få det att fungera, men jag skall snygga till det nu när det fungerar på min platta) (jag har lagt 5 minuter på att snygga till indragningen då jag alltid kör tab i MPLAB, lär mig aldrig att köra mellanslag där, men ser att det inte är helt snyggt här.....):
Kod: Markera allt
list p=16f690
#include <p16F690.inc>
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
my_vars udata_shr
Display res 1 ; Variabel för att tända LED'arna
Data_ee_addr res 1
Data_ee_data res 1
org 0000
goto Init
org 0004
goto Inter
Init:
movlw 0x0f
movwf Data_ee_data
movlw 0x00
movwf Data_ee_addr
clrf Display ; Nollställer Display
banksel TRISA ; Gör det möjligt att ställa in TRISX
movlw b'00110100' ; RA2 = Interrupt, RA4 = Högerknapp (uppväxling), RA5 = Vänsterknapp (nedväxling), resten utgångar
movwf TRISA
clrf TRISB ; Alla RBx är utgångar
clrf TRISC ; Alla RCx är utgångar
banksel ANSEL
clrf ANSEL
clrf ANSELH
banksel OPTION_REG
bsf OPTION_REG, INTEDG ; Interrupt på rising edge
; bcf OPTION_REG, INTEDG ; Interrupt på falling edge
banksel INTCON
bcf INTCON, INTF ; Nollställer External Interrupt Flaggan
bsf INTCON, GIE ; Enablar GIE
bsf INTCON, INTE ; Enablar External Interrupts
call Skriv_ee
Start:
goto Start
Skriv_ee:
banksel PIR2
bcf PIR2, EEIF
movf Data_ee_addr, w
banksel EEADR
movwf EEADR
clrf EEADRH
movf Data_ee_data, w
banksel EEDAT
movwf EEDAT
clrf EEDATH
banksel EECON1
bcf EECON1, EEPGD
bsf EECON1, WREN
banksel INTCON
bcf INTCON, GIE
btfsc INTCON, GIE
goto $-2
banksel EECON2
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1, WR
nop
nop
nop
nop
nop
banksel INTCON
bsf INTCON, GIE
nop
nop
nop
nop
banksel EECON1
bcf EECON1, WREN
return
Inter:
btfsc PORTA, 4 ; kontrollerar om högerknapp är uppe
goto Knapp_oka ; nu är den nedtryckt
btfsc PORTA, 5 ; kontrollerar om vänsterknapp är uppe
goto Knapp_minska ; nu är den nedtryckt
goto Inter
Knapp_oka:
; incf Display, f
; movf Display, w
banksel EEADR
movf Data_ee_addr, w
movwf EEADR
banksel EECON1
bcf EECON1, EEPGD
bsf EECON1, RD
banksel EEDAT
movf EEDAT, w
movwf PORTC
bcf INTCON, INTF
RETFIE
Knapp_minska:
decf Display, f
movf Display, w
movwf PORTC
bcf INTCON, INTF
RETFIE
end