bchris
29-07-13, 15:36
Παιδια θελω την βοηθεια σας...
Εχω ενα προγραμματακι σε PIC16f877A.
Το firmware με λιγα λογια αυτο που κανει ειναι να ελεγχει με ενα IR remote 4 LED 7 segment displays.
Σε καποια φαση θελω ν' αποθηκευει στην EEPROM μερικες τιμες...
Κι ετσι αρχισε ο καυγας :)
Το ρημαδι, δεν λεει με τιποτα να γραψει στην βρωμο-EEPROM :cursing::cursing::cursing:
Δοκιμασα τα παντα.
Στο τελος, το εβαλα στην αρχη-αρχη να κανει μια δοκιμαστικη εγγραφη, αλλα παλι τιποτα!!!
να προσθεσω οτι με τον ιδιο κωδικα, σε αλλη κατασκευη (παλι με το PIC16F877A), εγραφε μια χαρα.
Επισης στο simulation (gpsim) επισης γραφει!
Αν μπορειτε να δειτε κατι εσεις που εμενα μου ξεφευγει...
to firmware:
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _BODEN_ON & _LVP_ON
;;blah, blah blah...
INIT
;================================================= =====
; INITIALIZATION SECTION START
;================================================= =====
clrf INTCON ; Disable all interrupts.
clrwdt ; Clear the Watchdog timer
; Before anything else, check if an EEPROM write
; got interrupted due to a reset.
; BANKSEL EECON1
; btfss EE_WRERR
; goto Normal_Init
; bcf EE_WRERR
; PAGESEL EE_DATA_WRITE
; call EE_DATA_WRITE
; *** IO Initialization ***
Normal_Init
PAGESEL $
BANKSEL PORTA
clrf PORTA
clrf PORTB
clrf PORTC
clrf PORTD
clrf PORTE
BANKSEL ADCON1
movlw 0x06
movwf ADCON1 ; All ports digital
BANKSEL ADCON0
bcf ADCON0,0 ; Shutdown ADC.
BANKSEL TRISA
clrf TRISA ; PORTA output
movlw B'00000001' ; All output but RB0
movwf TRISB
clrf TRISC
clrf TRISD
movlw B'00000100' ; All output but RE2
movwf TRISE
BANKSEL PORTA
clrf PORTA
movlw B'00100000'
movwf PORTA ; All off but MAX_SCLK
clrf PORTB ; All off
clrf PORTC ; All off
clrf PORTD ; All off
movlw B'00000010' ; All off, MAX6957 disselected.
movwf PORTE
bcf T1CON,T1OSCEN ; Shutoff timer1 oscillator
bcf T1CON,TMR1CS ; Timer1 internal clock source (every instruction)
clrf TMR1H ; Initialize timer1 output
clrf TMR1L ; Both LOW and HIGH
bcf T1CON,TMR1ON ; Now timer1 inactive. Raise to activate.
bcf OPTION_REG,INTEDG ; RB0/INT on falling edge
; bsf OPTION_REG,INTEDG ; RB0/INT on rising edge
; bsf INTCON,INTE ; Enable RB0/INT external interrupt
bcf INTCON,PEIE ; Disable peripheral interrupts
bcf INTCON,T0IE ; Disable timer0 interrupt (for now)
bcf INTCON,RBIE ; Disable RB port change interrupts.
; bsf INTCON,GIE ; Enable interrupts in general
; MAX6957
; PORT CFG
movlw 0x09
movwf MAX_CMD_ADDR
movlw 0x00
movwf MAX_DATA
PAGESEL MAX_TX
call MAX_TX
movlw 0x0A
movwf MAX_CMD_ADDR
movlw 0x00
movwf MAX_DATA
PAGESEL MAX_TX
call MAX_TX
movlw 0x0B
movwf MAX_CMD_ADDR
movlw 0x00
movwf MAX_DATA
PAGESEL MAX_TX
call MAX_TX
movlw 0x0C
movwf MAX_CMD_ADDR
movlw 0x00
movwf MAX_DATA
PAGESEL MAX_TX
call MAX_TX
movlw 0x0D
movwf MAX_CMD_ADDR
movlw 0x00
movwf MAX_DATA
PAGESEL MAX_TX
call MAX_TX
movlw 0x0E
movwf MAX_CMD_ADDR
movlw 0x00
movwf MAX_DATA
PAGESEL MAX_TX
call MAX_TX
movlw 0x0F
movwf MAX_CMD_ADDR
movlw 0x00
movwf MAX_DATA
PAGESEL MAX_TX
call MAX_TX
; PORT CFG
; Config
movlw 0x04
movwf MAX_CMD_ADDR
movlw 0x01
movwf MAX_DATA
PAGESEL MAX_TX
call MAX_TX
; 1:Display Test - 0:Normal
movlw 0x07
movwf MAX_CMD_ADDR
movlw 0x00
movwf MAX_DATA
PAGESEL MAX_TX
call MAX_TX
PAGESEL $
BANKSEL remote_id
;================================================= =====
; INITIALIZATION SECTION END
;================================================= =====
;================================================= =====
; MAIN PROGRAM LOOP
;================================================= =====
;------------------------------------------------------
Main_Loop
clrf ir_repeat_timer
bcf BLINK_0
bcf BLINK_1
bcf BLINK_2
bcf BLINK_3
movlw 0
movwf DigitToBlink
BANKSEL EECON1
btfsc EE_WR ; In case there is another write
goto $-1 ; operation, wait it out.
; bcf EE_PGD ; Point to data memory
; bsf EE_WREN ; Enable writes
bcf INTCON,GIE ; Disable interrupts
BANKSEL EEADR
movlw 0x11
movwf EEADR
movlw 0x06
movwf EEDATA ; Data to be written.
; call EE_DATA_WRITE
BANKSEL EECON2
bcf EE_PGD ; Point to data memory
; bsf EE_WREN ; Enable writes
; bcf INTCON,GIE ; Disable interrupts
bsf EE_WREN ; Enable writes
movlw 0x55 ; EEPROM
movwf EECON2 ; write
movlw 0xAA ; security
movwf EECON2 ; sequence
bsf EE_WR ; Start write operation
; bsf INTCON,GIE ; Enable interrupts
btfsc EE_WR
goto $-1 ; Wait until write finishes
bcf EE_WREN ; Disable further writes
BANKSEL PIR2
bcf PIR2,EEIF ; EEIF
;;blah blah blah....
Εχω ενα προγραμματακι σε PIC16f877A.
Το firmware με λιγα λογια αυτο που κανει ειναι να ελεγχει με ενα IR remote 4 LED 7 segment displays.
Σε καποια φαση θελω ν' αποθηκευει στην EEPROM μερικες τιμες...
Κι ετσι αρχισε ο καυγας :)
Το ρημαδι, δεν λεει με τιποτα να γραψει στην βρωμο-EEPROM :cursing::cursing::cursing:
Δοκιμασα τα παντα.
Στο τελος, το εβαλα στην αρχη-αρχη να κανει μια δοκιμαστικη εγγραφη, αλλα παλι τιποτα!!!
να προσθεσω οτι με τον ιδιο κωδικα, σε αλλη κατασκευη (παλι με το PIC16F877A), εγραφε μια χαρα.
Επισης στο simulation (gpsim) επισης γραφει!
Αν μπορειτε να δειτε κατι εσεις που εμενα μου ξεφευγει...
to firmware:
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _BODEN_ON & _LVP_ON
;;blah, blah blah...
INIT
;================================================= =====
; INITIALIZATION SECTION START
;================================================= =====
clrf INTCON ; Disable all interrupts.
clrwdt ; Clear the Watchdog timer
; Before anything else, check if an EEPROM write
; got interrupted due to a reset.
; BANKSEL EECON1
; btfss EE_WRERR
; goto Normal_Init
; bcf EE_WRERR
; PAGESEL EE_DATA_WRITE
; call EE_DATA_WRITE
; *** IO Initialization ***
Normal_Init
PAGESEL $
BANKSEL PORTA
clrf PORTA
clrf PORTB
clrf PORTC
clrf PORTD
clrf PORTE
BANKSEL ADCON1
movlw 0x06
movwf ADCON1 ; All ports digital
BANKSEL ADCON0
bcf ADCON0,0 ; Shutdown ADC.
BANKSEL TRISA
clrf TRISA ; PORTA output
movlw B'00000001' ; All output but RB0
movwf TRISB
clrf TRISC
clrf TRISD
movlw B'00000100' ; All output but RE2
movwf TRISE
BANKSEL PORTA
clrf PORTA
movlw B'00100000'
movwf PORTA ; All off but MAX_SCLK
clrf PORTB ; All off
clrf PORTC ; All off
clrf PORTD ; All off
movlw B'00000010' ; All off, MAX6957 disselected.
movwf PORTE
bcf T1CON,T1OSCEN ; Shutoff timer1 oscillator
bcf T1CON,TMR1CS ; Timer1 internal clock source (every instruction)
clrf TMR1H ; Initialize timer1 output
clrf TMR1L ; Both LOW and HIGH
bcf T1CON,TMR1ON ; Now timer1 inactive. Raise to activate.
bcf OPTION_REG,INTEDG ; RB0/INT on falling edge
; bsf OPTION_REG,INTEDG ; RB0/INT on rising edge
; bsf INTCON,INTE ; Enable RB0/INT external interrupt
bcf INTCON,PEIE ; Disable peripheral interrupts
bcf INTCON,T0IE ; Disable timer0 interrupt (for now)
bcf INTCON,RBIE ; Disable RB port change interrupts.
; bsf INTCON,GIE ; Enable interrupts in general
; MAX6957
; PORT CFG
movlw 0x09
movwf MAX_CMD_ADDR
movlw 0x00
movwf MAX_DATA
PAGESEL MAX_TX
call MAX_TX
movlw 0x0A
movwf MAX_CMD_ADDR
movlw 0x00
movwf MAX_DATA
PAGESEL MAX_TX
call MAX_TX
movlw 0x0B
movwf MAX_CMD_ADDR
movlw 0x00
movwf MAX_DATA
PAGESEL MAX_TX
call MAX_TX
movlw 0x0C
movwf MAX_CMD_ADDR
movlw 0x00
movwf MAX_DATA
PAGESEL MAX_TX
call MAX_TX
movlw 0x0D
movwf MAX_CMD_ADDR
movlw 0x00
movwf MAX_DATA
PAGESEL MAX_TX
call MAX_TX
movlw 0x0E
movwf MAX_CMD_ADDR
movlw 0x00
movwf MAX_DATA
PAGESEL MAX_TX
call MAX_TX
movlw 0x0F
movwf MAX_CMD_ADDR
movlw 0x00
movwf MAX_DATA
PAGESEL MAX_TX
call MAX_TX
; PORT CFG
; Config
movlw 0x04
movwf MAX_CMD_ADDR
movlw 0x01
movwf MAX_DATA
PAGESEL MAX_TX
call MAX_TX
; 1:Display Test - 0:Normal
movlw 0x07
movwf MAX_CMD_ADDR
movlw 0x00
movwf MAX_DATA
PAGESEL MAX_TX
call MAX_TX
PAGESEL $
BANKSEL remote_id
;================================================= =====
; INITIALIZATION SECTION END
;================================================= =====
;================================================= =====
; MAIN PROGRAM LOOP
;================================================= =====
;------------------------------------------------------
Main_Loop
clrf ir_repeat_timer
bcf BLINK_0
bcf BLINK_1
bcf BLINK_2
bcf BLINK_3
movlw 0
movwf DigitToBlink
BANKSEL EECON1
btfsc EE_WR ; In case there is another write
goto $-1 ; operation, wait it out.
; bcf EE_PGD ; Point to data memory
; bsf EE_WREN ; Enable writes
bcf INTCON,GIE ; Disable interrupts
BANKSEL EEADR
movlw 0x11
movwf EEADR
movlw 0x06
movwf EEDATA ; Data to be written.
; call EE_DATA_WRITE
BANKSEL EECON2
bcf EE_PGD ; Point to data memory
; bsf EE_WREN ; Enable writes
; bcf INTCON,GIE ; Disable interrupts
bsf EE_WREN ; Enable writes
movlw 0x55 ; EEPROM
movwf EECON2 ; write
movlw 0xAA ; security
movwf EECON2 ; sequence
bsf EE_WR ; Start write operation
; bsf INTCON,GIE ; Enable interrupts
btfsc EE_WR
goto $-1 ; Wait until write finishes
bcf EE_WREN ; Disable further writes
BANKSEL PIR2
bcf PIR2,EEIF ; EEIF
;;blah blah blah....