01 marzo 11, 11:44 | #1 (permalink) Top |
User Data registr.: 19-07-2008 Residenza: catania
Messaggi: 978
| COME scrivere su EEPROM -16F628
chiedo qui se qualcuno ha mai avuto la fortuna di riuscire a scrivere su EEPROM del 16F628. Seguendo passo passo le indicazioni del DataSheet non ci si riesce... BSF STATUS,RP0 ; Bank 1 BTFSC EECON1,WR ;Wait for write GOTO $-1 ;to complete MOVLW 0X00 ; MOVWF EEADR ; Address to read MOVF VALORE,W MOVWF EEDATA ; carica in EEDATA il valore di VALORE BCF INTCON,GIE ; Disable INTs. BSF EECON1,WREN ; Enable write MOVLW 0X55 ; MOVWF EECON2 ; Write 55h MOVLW 0XAA ; MOVWF EECON2 ; Write AAh ZZZ BSF EECON1,WR ; Set WR bit ; BEGIN WRITE BTFSC EECON1,WR ; Testa il bit WR e salta listruzione successiva se 0 GOTO ZZZ BSF INTCON,GIE ; Enable INTs. BCF STATUS,RP0 ; Bank 0 |
01 marzo 11, 15:59 | #2 (permalink) Top |
User Data registr.: 19-07-2008 Residenza: catania
Messaggi: 978
| CORREGGO E AGGIUNGO qualcosina
allora se per caso qualcuno ha la curiosità, a seguire trova una codifica in C , scaricata da un forum vi è una vorispondenza qusi uno ad uno ************* CODIFICA IN C ********* #include <pic16f6x.h> void eeprom_w(char addr,char value) { EEADR=addr; // indirizzo cella memoria eeprom EEDATA=value; // valore da memorizzare GIE=0; // disabilita interrupt WREN=1; // abilita la scrittura EECON2=0x55; // Sequenza richiesta EECON2=0xAA; WR=1; while(WR); WREN=0; GIE=1; // riabilita global interrupt } /* ************************************************** ******/ * Funzione per la ettura dati dalla memoria EEprom del PIC ** ************************************************** ********/ unsigned char eeprom_r(char addr) { EEADR=addr; // indirizzo cella memoria eeprom RD=1; return EEDATA; } ************* CODIFICA IN ASSEMBLER ********* bsf STATUS,RP0 ;Swap to bank 1 movwf EEDATA movlw b'00000000' movwf EEADR BCF INTCON,GIE ;Disable INTs. bsf EECON1,WREN ;Enable Write movlw H'55' ;Write 55h to EECON2 movwf EECON2 movlw H'AA' ;Write AAh to EECON2 movwf EECON2 bsf EECON1,WR ;Begin write LoopWReeprom btfsc EECON1,WR ;Writing done ? goto LoopWReeprom ;No, wait bcf EECON1,WREN ;Enable Write BSF INTCON,GIE ;Enable INTs |
02 marzo 11, 10:20 | #3 (permalink) Top |
User Data registr.: 21-01-2004 Residenza: Milano
Messaggi: 989
|
Il codice sembra 'quasi' giusto e deve funzionare; nel primo esempio di scrittura la posizione dell'etichetta ZZZ è sbagliata e va posizionata una riga sotto, altrimenti continui a settare il bit WR intanto che lo aspetti a '0'. Dopo aver settato il it WR devi anche mettere a '0' il bit WREN. Il test su WR può essere fatto solo all'inizio o alla fine del ciclo di scrittura. Il problema potrebbe essere la rilettura del dato scritto in EEPROM; prova a scrivere un valore poi resetta il micro e prova a leggerlo. Questo è il codce della libreria del compilatore C che a me funziona da qualche anno... /************************************************** *********************/ /****** EEPROM memory read/write macros and function definitions *******/ /************************************************** *********************/ /* NOTE WELL: The macro EEPROM_READ() is NOT safe to use immediately after any write to EEPROM, as it does NOT wait for WR to clear. This is by design, to allow minimal code size if a sequence of reads is desired. To guarantee uncorrupted writes, use the function eeprom_read() or insert while(WR)continue; before calling EEPROM_READ(). */ #if EEPROM_SIZE > 0 #ifdef __FLASHTYPE // macro versions of EEPROM write and read #define EEPROM_WRITE(addr, value) \ do{ \ while(WR)continue;EEADR=(addr);EEDATA=(value); \ EECON1&=0x7F;CARRY=0;if(GIE)CARRY=1;GIE=0; \ WREN=1;EECON2=0x55;EECON2=0xAA;WR=1;WREN=0; \ if(CARRY)GIE=1; \ }while(0) #define EEPROM_READ(addr) ((EEADR=(addr)),(EECON1&=0x7F),(RD=1),EEDATA) #else // else doesn't write flash #define EEPROM_WRITE(addr, value) \ do{ \ while(WR)continue;EEADR=(addr);EEDATA=(value); \ CARRY=0;if(GIE)CARRY=1;GIE=0; \ WREN=1;EECON2=0x55;EECON2=0xAA;WR=1;WREN=0; \ if(CARRY)GIE=1; \ }while(0) #define EEPROM_READ(addr) ((EEADR=(addr)),(RD=1),EEDATA) #endif Michele
__________________ __________________________________________________ The worst day flying is better than the best day working. |
03 marzo 11, 10:09 | #4 (permalink) Top | |
User Data registr.: 19-07-2008 Residenza: catania
Messaggi: 978
| grazie
grazie mille della risposta.. ho individuato il problema... stranamente non passa al banco 1 sebbene l'istruzione BSF STATUS,RP0 mettendo una RETURN PRIMA DI QUESTA ISTRUZIONE, TUTTO OK, non legge perchè esco prima però non si blocca.. se metto la return dopo allora si blocca.. segno che è appunto questa istruzione... nel file dell'assemblatore zero Error, zero Warning ,, però 17 Messaggi tutti del tipo Register in operand not in bank 0. Ensure that bank bits are correct. segno che appunto sta cercando di scrivere o leggere in EEDATA o in EEADR che appunto non si trovano in Bank 0, però ovviamente ho attendamente messo l'istruzione BSF STATUS,RP0 ecco l'ultima versione delle procedure in assembler: ;_________________________________________________ ____________ R_EEP MOVLW H'00' BSF STATUS,5 ; * Bank 1 * MOVWF EEADR ; Carica indirizzo BSF EECON1,RD ; EE Read MOVF EEDATA,W BCF STATUS,5 ; * Bank 0 * RETURN ;_________________________________________________ ____________ W_EEP MOVLW H'00' BSF STATUS,RP0 ; * Bank 1 * MOVWF EEADR ; Carica indirizzo MOVF VALORE,W MOVWF EEDATA ; carica il valore BCF INTCON,GIE ; Disable INTs. BSF EECON1,WREN ; Enable write MOVLW H'55' ; MOVWF EECON2 ; Write 55h MOVLW H'AA' ; MOVWF EECON2 ; Write AAh BSF EECON1,WR ; Set WR bit ; BEGIN WRITE btfsc EECON1,WR ; Writing done ? goto $-1 ; No, wait BCF EECON1,WREN ; Enable write BCF STATUS,RP0 ; * Bank 0 * BSF INTCON,GIE ; Enable INTs. RETURN c'è da impazzire! credo che sia un problema di MICRO. credo che dovrò passare al 16F628A Ho controllato ovviamente il file di include dove si vede perfettamente che i registri EEDATA EEADR ecc sono nel bank 1 W EQU H'0000' F EQU H'0001' ;------------------------------------------------------ ; Register Files of Bank0 ;------------------------------------------------------ INDF EQU H'0000' TMR0 EQU H'0001' PCL EQU H'0002' STATUS EQU H'0003' FSR EQU H'0004' PORTA EQU H'0005' PORTB EQU H'0006' PCLATH EQU H'000A' INTCON EQU H'000B' PIR1 EQU H'000C' TMR1L EQU H'000E' TMR1H EQU H'000F' T1CON EQU H'0010' TMR2 EQU H'0011' T2CON EQU H'0012' CCPR1L EQU H'0015' CCPR1H EQU H'0016' CCP1CON EQU H'0017' RCSTA EQU H'0018' TXREG EQU H'0019' RCREG EQU H'001A' CMCON EQU H'001F' ;------------------------------------------------------ ; Register Files of Bank1 ;------------------------------------------------------ OPTION_REG EQU H'0081' TRISA EQU H'0085' TRISB EQU H'0086' PIE1 EQU H'008C' PCON EQU H'008E' PR2 EQU H'0092' TXSTA EQU H'0098' SPBRG EQU H'0099' EEDATA EQU H'009A' EEADR EQU H'009B' EECON1 EQU H'009C' EECON2 EQU H'009D' VRCON EQU H'009F' ;----- STATUS Bits -------------------------------------------------------- IRP EQU H'0007' RP1 EQU H'0006' RP0 EQU H'0005' NOT_TO EQU H'0004' NOT_PD EQU H'0003' Z EQU H'0002' DC EQU H'0001' C EQU H'0000' ;----- INTCON Bits -------------------------------------------------------- GIE EQU H'0007' PEIE EQU H'0006' T0IE EQU H'0005' INTE EQU H'0004' RBIE EQU H'0003' T0IF EQU H'0002' INTF EQU H'0001' RBIF EQU H'0000' ;----- PIR1 Bits ---------------------------------------------------------- EEIF EQU H'0007' CMIF EQU H'0006' RCIF EQU H'0005' TXIF EQU H'0004' CCP1IF EQU H'0002' TMR2IF EQU H'0001' TMR1IF EQU H'0000' ;----- T1CON Bits --------------------------------------------------------- T1CKPS1 EQU H'0005' T1CKPS0 EQU H'0004' T1OSCEN EQU H'0003' NOT_T1SYNC EQU H'0002' TMR1CS EQU H'0001' TMR1ON EQU H'0000' ;----- T2CON Bits --------------------------------------------------------- TOUTPS3 EQU H'0006' TOUTPS2 EQU H'0005' TOUTPS1 EQU H'0004' TOUTPS0 EQU H'0003' TMR2ON EQU H'0002' T2CKPS1 EQU H'0001' T2CKPS0 EQU H'0000' ;----- CCP1CON Bits --------------------------------------------------------- CCP1X EQU H'0005' CCP1Y EQU H'0004' CCP1M3 EQU H'0003' CCP1M2 EQU H'0002' CCP1M1 EQU H'0001' CCP1M0 EQU H'0000' ;----- RCSTA Bits --------------------------------------------------------- SPEN EQU H'0007' RX9 EQU H'0006' SREN EQU H'0005' CREN EQU H'0004' ADEN EQU H'0003' FERR EQU H'0002' OERR EQU H'0001' RX9D EQU H'0000' ;----- CMCON Bits --------------------------------------------------------- C2OUT EQU H'0007' C1OUT EQU H'0006' C2INV EQU H'0005' C1INV EQU H'0004' CIS EQU H'0003' CM2 EQU H'0002' CM1 EQU H'0001' CM0 EQU H'0000' ;----- OPTION Bits -------------------------------------------------------- NOT_RBPU EQU H'0007' INTEDG EQU H'0006' T0CS EQU H'0005' T0SE EQU H'0004' PSA EQU H'0003' PS2 EQU H'0002' PS1 EQU H'0001' PS0 EQU H'0000' ;----- PIE1 Bits ---------------------------------------------------------- EEIE EQU H'0007' CMIE EQU H'0006' RCIE EQU H'0005' TXIE EQU H'0004' CCP1IE EQU H'0002' TMR2IE EQU H'0001' TMR1IE EQU H'0000' ;----- PCON Bits ---------------------------------------------------------- OSCF EQU H'0003' NOT_POR EQU H'0001' NOT_BO EQU H'0000' NOT_BOR EQU H'0000' NOT_BOD EQU H'0000' ;----- TXSTA Bits ---------------------------------------------------------- CSRC EQU H'0007' TX9 EQU H'0006' TXEN EQU H'0005' SYNC EQU H'0004' BRGH EQU H'0002' TRMT EQU H'0001' TX9D EQU H'0000' ;----- EECON1 Bits --------------------------------------------------------- WRERR EQU H'0003' WREN EQU H'0002' WR EQU H'0001' RD EQU H'0000' ;----- VRCON Bits --------------------------------------------------------- VREN EQU H'0007' VROE EQU H'0006' VRR EQU H'0005' VR3 EQU H'0003' VR2 EQU H'0002' VR1 EQU H'0001' VR0 EQU H'0000' ;================================================= ========================= ; ; RAM Definition ; ;================================================= ========================= __MAXRAM H'01FF' __BADRAM H'07'-H'09', H'0D', H'13'-H'14', H'1B'-H'1E' __BADRAM H'87'-H'89', H'8D', H'8F'-H'91', H'93'-H'97', H'9E' __BADRAM H'105', H'107'-H'109', H'10C'-H'11F', H'150'-H'16F' __BADRAM H'185', H'187'-H'189', H'18C'-H'1EF' ;================================================= ========================= ; ; Configuration Bits ; ;================================================= ========================= _BODEN_ON EQU H'3FFF' _BODEN_OFF EQU H'3FBF' _CP_ALL EQU H'03FF' _CP_75 EQU H'17FF' _CP_50 EQU H'2BFF' _CP_OFF EQU H'3FFF' _DATA_CP_ON EQU H'3EFF' _DATA_CP_OFF EQU H'3FFF' _PWRTE_OFF EQU H'3FFF' _PWRTE_ON EQU H'3FF7' _WDT_ON EQU H'3FFF' _WDT_OFF EQU H'3FFB' _LVP_ON EQU H'3FFF' _LVP_OFF EQU H'3F7F' _MCLRE_ON EQU H'3FFF' _MCLRE_OFF EQU H'3FDF' _ER_OSC_CLKOUT EQU H'3FFF' _ER_OSC_NOCLKOUT EQU H'3FFE' _INTRC_OSC_CLKOUT EQU H'3FFD' _INTRC_OSC_NOCLKOUT EQU H'3FFC' _EXTCLK_OSC EQU H'3FEF' _LP_OSC EQU H'3FEC' _XT_OSC EQU H'3FED' _HS_OSC EQU H'3FEE' LIST Citazione:
| |
03 marzo 11, 14:58 | #5 (permalink) Top | |
User Data registr.: 21-01-2004 Residenza: Milano
Messaggi: 989
| Citazione:
Il compilatore (in questo caso l'assemblatore) non sa se il micro riuscirà o meno a leggere in quella locazione e quindi non può segnalarti un errore del genere! Quindi il problema non è nella selezione del banco, cosa che puoi verificare facilmente provando a settare il registro di direzione di una porta e a vedere se la porta si comporta di conseguenza. Cosa stai usando per le prove? Come fai a verificare e il dato è stato scritto o meno? Questa sera provo il tuo codice: vedrai che si risolve tutto. Michele
__________________ __________________________________________________ The worst day flying is better than the best day working. | |
04 marzo 11, 01:04 | #6 (permalink) Top | |
User Data registr.: 19-07-2008 Residenza: catania
Messaggi: 978
| Ok Risolto!!!!
come in oggetto.. risolto tutto.. grazie lo stesso MSchiepp.... ..mi piace poter condividere con qualcuno questa esperienza. allora il codice andava bene.. il problema era che io cercavo prima di leggere poi di scrivere.. è qui che mi sono incasinato. Il risultato lo ottengo su un display a 7 segmenti. Allora ho tre bottoni interruttori su RA0,RA1,RA2 1) il primo serve a navigare su dei numeri cha vanno da 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F 2) un secondo interruttore serve a scrivere il numero correntemente mostrato nel display 3) infine il terzo bottone serve a leggere il numero registro nella EEPROM BEne adesso se provo a programmare il MICRo alla prima volta che lo uso se provo a premere il bottone 2, il micro si blocca, cerca di leggere dalla EEPROM che è vuota. PErò se accendo il MIcro navigo tra i numeri ...premo il tasto 3 il numero corrente viene registrato nella EEPROM, se continuo a navigare e poi premo il tasto 2 OK mi fa vedere il numero registrato.. se stacco tutto e riaccendo il micro e clicco direttamente il tasto 2 ecco che appare il numero desiderato. CVD (come volevasi dimostrare) questa volta non si blocca perchè trova nella EEPROM un dato. Perfetto questo è un bel il punto di partenza! sommando il fatto che riesco a usare la USART, i comparatori, i TIMER ...mi pare d'aver raggiunto un buon livello sul 16F628. mi posso ritenere soddisfatto... ..il 16F628 è un gioiellino... il suo datasheet risulta spesso poco chiaro, e non dico per l'inglese, ma per il giro di parole infinite per speigare concetti spesso molto semplici. Però veramente un gioiellino, a guardarlo sembra un niente.. invece... OGGI mi sono preso il 16F876 .... comincierò a lavorarci sopra... voglio iniziare a lavorare sugli ingressi analogici. a presto fausto Citazione:
| |
04 marzo 11, 01:16 | #7 (permalink) Top |
User Data registr.: 21-01-2004 Residenza: Milano
Messaggi: 989
|
Bene, bravo! Ci deve essere però un altro piccolo problemino... quando leggi una locazione in EEPROM, non può essere 'vuota' e quindi il micro la legge comunque, anche se il dato contenuto non è significativo (quando è cancellata è a 0xFF); se ti si blocca il micro in lettura qualcosa non va per il verso giusto... Michele
__________________ __________________________________________________ The worst day flying is better than the best day working. |
04 marzo 11, 16:29 | #8 (permalink) Top | |
User Data registr.: 19-07-2008 Residenza: catania
Messaggi: 978
| ok
ok appena ho tempo indago... per intando sto documentando tutto... stasera ti invio una foto... comunque sono contento.. tale abilità mi apre un insieme di possibilità.. fausto Citazione:
| |
05 marzo 11, 00:44 | #9 (permalink) Top | |
User Data registr.: 19-07-2008 Residenza: catania
Messaggi: 978
| ok
ecco un immagine della demo Ovviamente il tutto ha solo scopo didattico, per i ragazzi di scuole superiori, quindi mi sta bene avere tre tasti.... in realtà si potrebbe fare tutto con un solo tasto. PEr esempio il tasto legge dalla eeprom, e comunque se premuto incrementa, se premuto per piu di due secondi allora registra su eeprom e quindi alla prossima riaccensione ci si trova l'ultimo numero registrato. Citazione:
| |
Bookmarks |
| |
Discussioni simili | ||||
Discussione | Autore discussione | Forum | Commenti | Ultimo Commento |
PIC 16F628, ricezione seriale.. | faustog_2 | Circuiti Elettronici | 18 | 11 novembre 10 14:53 |
alimentazione pic 16f628 | gungun | Circuiti Elettronici | 6 | 04 settembre 09 01:05 |
Modulo USART 16F628 | SoldatoSemplice | Circuiti Elettronici | 1 | 06 marzo 06 19:20 |
Schemi - Regolatore con Pic 16F628 | BaroneRosso | News | 0 | 17 giugno 05 16:07 |
regolatore di giri con pic 16f628 | fabari | Circuiti Elettronici | 5 | 23 marzo 05 22:02 |