PDA

Επιστροφή στο Forum : PIC16F877A EEPROM write (no write δλδ...)



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....

GeorgeVita
29-07-13, 15:51
Πρόσθεσε στο __CONFIG:


& _CPD_OFF
που αφορά την δυνατότητα εγγραφής στην data eeprom και έλεγξε την κατάσταση κάθε configuration bit από το menu.

bchris
29-07-13, 16:03
George, εισαι απαιχτος!

Το εχω στο .asm, αλλα για καποιο λογο ειναι commented out:



; Fuses


__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _BODEN_ON & _LVP_ON
; __CONFIG _WRT_OFF & _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC & _BOREN_OFF & _LVP_OFF & _DEBUG_ON &_CPD_OFF


Μολις παω σπιτι θα το τσεκαρω.
BTW, γιατι η χαζομαρα το gpsim το εγραψε στα @@ του αυτο ????

bchris
29-07-13, 21:19
Δυστυχως... @@ μαντολες.

:hammer::hammer::hammer::hammer::hammer:

Καμμια αλλη ιδεα?

GeorgeVita
29-07-13, 21:32
Τα περισσότερα προβλήματα στη ροή προγραμμάτων PIC (τουλάχιστον 12F και 16F) είναι λόγω bank switching στο πρόγραμμα, τα registers και τα table read που αλλάζουν τον program counter. Υπάρχει πιθανότητα το simulator να τα δει "όπως το μάτι σου" και να μη πιάσει ένα τέτοιο λάθος. Ορθή η σκέψη σου να απομονώσεις τον κώδικα που θα γράψει στην εσωτερική EEPROM και όπως πάντα ότι γράφει το datasheet λειτουργεί!

bchris
29-07-13, 21:49
Τι να σου πω, αρχιζω να πιστευω οτι φταιει κατι στο mpalab ή στο computer... δεν ξερω.

Δοκιμασα σε αλλο PIC16F877A (plcc44) -- τιποτα
Δοκιμασα με pickit2 και στους δυο PIC16F877A (plcc & qfp44)....

Τωρα θελω να βαλω μια ρουτινα να γραφει στην EEPROM και μετα να διαβαζει και αν συμφωνει ν' αναβει ενα LED, αλλα οχι DEBUG, release...

GeorgeVita
29-07-13, 21:55
Μπορεί το "debug" να χαλάει το χρονισμό που αναφέρουν στο datasheet και να μη λειτουργεί.
Γράψε τον κώδικα του datasheet, βάλτο να τρέξει ως "release", και μετά κάνε "read EEPROM" από το MPLAB.

Επίσης γνωρίζεις ότι μπορείς να γράψεις στην εσωτερική EEPROM με data στον κώδικά (με .org 0x2100);
Με αυτό τον τρόπο μπορείς να δοκιμάσεις ρουτίνες ή να έχεις φορτωμένη από πριν κάποια παράμετρο.

klik
29-07-13, 23:50
Και εγώ θα πρότεινα από το .asm (με χρήση data στο 0χ2100, όχι με εντολές) ή στο .hex να γράψεις στην eeprom και να δοκιμάσεις τις ρουτίνες ανάγνωσης σου αν λειτουργούν σωστά.
Τώρα δεν ξέρω τι σημαίνουν τα


bsf EE_WREN

και πολλά άλλα τέτοια (με άλλα bit που έχεις βάλει).
Εγώ ξέρω ότι πρέπει να είναι


bsf EECON1,WREN

βέβαια μπορεί να έχεις κάνει define το EE_WREN σε EECON,WREN αλλά δεν είδα κάτι τέτοιο στον κώδικα που παρέθεσες.

dade
30-07-13, 10:39
Για να μην ανοίγω καινούριο ποστ μια ερώτηση και από μένα.
Προσπαθώ να γράψω ένα πικ 16F628A με το pickit2 v.2.61, αλλά μου βγάζει μήνυμα αποτυχίας στη διεύθυβση 0χ000001 με ένα .hex ή στη διεύθυνση 0χ000000 με άλλο hex, παρόλο που κάνει erase kai ta verifiy blank check δείχνουν εντάξει. Τι κάνω? Πετάω το πικ ή πρέπει να κάνω κάτι άλλο?

bchris
30-07-13, 13:40
Δεν ξερω τι να πω....

Το ελεγξα με το release και δεν γραφει στην EEPROM.
Ωστοσο, με την χρηση του ORG 0x2100 kai DE 0xNN γραφει (pic1).
Αλλα αυτο ειναι για static data :(

Το ασχημο ειναι οτι οταν παω να γραψω, χτυπαει το WRERR (pic2)

Ανεβαζω το .ASM εδω, και αν θελει και μπορει καποιος, ας μου πει ρε παιδια αν δουλευει σωστα στο δικο σας.


45187
45188
45189

ΥΓ:
Γεωργιε, καλες διακοπες!

klik
30-07-13, 16:09
The WREN bit, when set, will allow a write or erase
operation. On power-up, the WREN bit is clear. The
WRERR bit is set when a write (or erase) operation is
interrupted by a MCLR or a WDT Time-out Reset during
normal operation. In these situations, following
Reset, the user can check the WRERR bit and rewrite
the location. The data and address will be unchanged
in the EEDATA and EEADR registers.

ο μΕ σου κάνει μάλλον κάνει συνεχώς reset...
Για να το επιβεβαιώσεις, κάνε μια ακίδα έξοδο, βάλε και μια αντίσταση pull up 10ΚΩ και κάνε την output και 0 στο ξεκίνημα.
Αν με το πολύμετρο μετράς 0V τότε δεν κάνει reset. Αν μετράς πάνω από 0,3V, τότε κάνει reset συνεχώς.

Οπότε ελέγχεις MCLR (βάλε πυκνωτάκι ή ακύρωσε το MCLR), έλεγξε τον κρύσταλλο με τους πυκνωτές, έλεγξε την τροφοδοσία (decoupling κλπ) για BOR.
Απ' ότι είδα έχεις WDT off, οπότε δεν είναι από τσοπανόσκυλο το πρόβλημα.

bchris
30-07-13, 16:13
Το δοκιμασα το προγραμμα και σε αλλο PIC16F877A, ο οποιος δουλευει σιγουρα μια χαρα.
Εκανε τα ιδια......

Παρ' ολα αυτα, θα το κανω το test που λες.

EDIT:
Μα τι λεω?
Αμα δεις, αυτος ελεγχει 4 7 seg displays που οταν ξεκιναει τα παει σε 0 1 2 3 (νομιζω με τις τοσες δοκιμες δεν θυμαμαι)
και μετα με ενα ir remote, αλλαζειο νουμερα.
Αν εκανε reset θα ξαναπηγαινε παλι στο 0123...

Οχι φιλε, δεν παιζει κατι τετοιο.

GeorgeVita
30-07-13, 16:19
Διάβασε και στο list flie (.lst) τα PAGESEL μεταφράζονται ως bcf και bsf PCLATH;
(Ευχαριστώ, ... δεν έχω MPLΑB μαζί μου)


edit: νομίζω καλείς το EE_DATA_WRITE από 0x1xx χωρίς να έχεις κάνει PAGESEL από το "SETUP_FOR_UNPAIRED" (αλλά δεν είμαι σίγουρος ότι περνά από εκεί το πρόγραμμά σου)

edit2: νομίζω ότι το πρόγραμμα χωράει όλο στο "κάτω μέρος" (έως 0x7FF), βάλτο εκεί και κράτα ψηλά μόνο τα table reads που έχεις πριν/μετά PAGESEL

bchris
30-07-13, 17:04
Εννοειται οτι δεν εχεις mplab.

Εγω απορω που εχεις και computer :)

klik
30-07-13, 17:17
Κάποια banksel και pagesel μου φάνηκαν να λοίπουν.
Όμως σε mplab λειτουργεί και γράφει στην eeprom (δοκιμασμένο με mplab-simulator).
Τώρα σε hardware μορφή, δεν έχω τέτοιο τσιπάκι για να το δοκιμάσω.

bchris
30-07-13, 17:38
Αμα ελειπαν BANKSEL/PAGESEL ουτε στο simulator θα εγραφε. Τι σοι simulator θα ηταν αλλωστε?

Γμτ καποιο αλλο λακκο εχει η φαβα

:confused1:

klik
30-07-13, 17:58
Βλέπω ότι μετά το test write κάνεις ατέρμονο loop. (goto $).
Δοκίμασες να διαβάσεις αυτό που έγραψες, αμέσως μόλις τελείωσε το write.
Ενεργοποίησε κάποια έξοδο σαν ένδειξη ότι το διάβασε σωστά, κάποια άλλη αν το διάβασε λάθος, κάποια 3η αν έχει wrerr και κάποια 4η αν διάβασε 0xff.
(ΣΤο poweron να κάνεις εξόδους όλες αυτές τις ακίδες και να δίνεις 0 στα latch pins τους).