Vai al contenuto
PLC Forum


Comunicazione Tra Pic Ed Eeprom


ntt

Messaggi consigliati

Salve a tutti, sono nuovo in questo forum e nuovo anche nel settore della programmazione dei pic.Volevo chiedere come si fa a far leggere ad un pic 16f84 con clock di funzionamento a 4Mhz un dato di lunghezza 1 byte scritto precedentemente su una eeprom di tipo 24c16?il mio problema principale è che non ho idea di quale sia la velocità di comunicazione tra i due dispositivi e quanto tempo impiega un bit che dalla eeprom deve arrivare sul pic.Credo che questo valore sia importante in quanto devo sicuramente crearmi delle routine di ritardo nel programma da scrivere sul pic affinchè io possa ricevere il bit o l'intero dato.Inoltre non conosco bene le specifiche della eeprom;la comunicazione è seriale asincrona con 1 bit di start , 1 di stop e nessuna parità??Come faccio a livello di programmazione a scrivere il dato sulla eeprom?insomma si capisce che ho tanto da imparare e prego qualcuno di aiutarmi, non necessariamente risolvendo il mio problema ma anche solo consigliandomi qualcosa da leggere a riguardo.

Grazie a tutti in anticipo.

NTT

Link al commento
Condividi su altri siti


Ciao ,

Queste memorie seriali non usano il protocollo asincrono , ma un sistema di comunicazione sincrona chiamato I2C

Usa due linee una e' il clock ( scl ) e l'altra e' la linea dati ( sda ).

E' un protocollo , master/slave , e' il master che decide la velocita' inviando un treno di impulsi sulla linea scl.

In rete ci sono gia' varie routine per leggere e scrivere queste memorie , dovrei sapere se programmi in C o ASM.

Link al commento
Condividi su altri siti

Io programmo il pic16f84 in asm.ho bisogno di scrivere un byte sulla eeprom (e devo capire come si fa!) e poi il pic lo deve leggere.Ho studiato un pò e ho capito che alla eeprom devo dare il clock a 4mhz visto che il pic funziona con questo clock, e in questo modo sincronizzo i due device.Potrebbero essermi utili le routine già scritte e reperibili su internet , ma devo capire il funzionamento della comunicazione...purtroppo ho il vizio di capire quello che faccio! :D Ho anche guardato le piedinature e ho capito che la eeprom ha una sola linea bidirezionale e credo che questo mi semplifica di molto la vita, anche perchè io devo solo leggere dalla eeprom!Il problema è che devo capire di quanti micro secondi il pic deve "aspettare" ogni singolo bit che gli arriva dalla eeprom.

Grazie per l'aiuto,aspetto una risposta e intanto...studio!! :D

NTT

Link al commento
Condividi su altri siti

Va bene, grazie ad entrambi,siete stati gentilissimi e fa sempre piacere, visto che sui forum in genere non è sempre così!Adesso datemi il tempo di studiare poi posterò ancora per risolvere dubbi che sicuramente sorgeranno.per il momento grazie davvero!

NTT

Link al commento
Condividi su altri siti

  • 2 weeks later...

Rieccomi dopo qualche giorno di studio sulla comunicazione tra pic ed eeprom.In particolare bit mi sono guardato il tuo sorgente ma devo capire ancora alcune cose:Prima di tutto io devo fare un circuito gestito da un pic dove si inserisce una smart card (dotata solo di eeprom!!!) nel lettore e se il codice è giusto mi fa scattare un semplice relè.Ma come si fa a far capire al pic quando viene inserita la eeprom nel lettore?devo fare un ciclo per aspettare il bit alto dalla linea sda della eeprom?in tal caso, il pin del pic che va sul "clock" della eeprom deve funzionare sempre, anche quando la carta non è inserita nel lettore?bit se non chiedo troppo, potresti scrivermi almeno le parti più difficili del sorgente in modo che io poi possa solo "sistemarle"?se sei troppo impegnato cerca solo di rispondere a queste domande.Grazie

NTT

Link al commento
Condividi su altri siti

Beh, intanto ti è riuscito di leggere la eeprom?

Fare una interrogazione ciclica del connettore sarebbe una soluzione, se non ti crea problemi per altri motivi. Non occorrerà interrogarle troppo frequentemente, una o due volte al secondo basteranno.

Le parti di programma che ho postato non ti bastano? Nel caso vedrò di prepararti qualcosa, fammi sapere.

Ciao!

Link al commento
Condividi su altri siti

Che intendi per leggere la eeprom??

Si ok, ho capito che devo interrogare ciclicamente il connettore ma cosa fa la eerpom non appena gli dò l' alimentazione?ovvero quando inserisco la scheda nel lettore cosa manda in uscita la eeprom per far capire al pic che la carta è stata inserita?

Stasera lavoro al programma e ne scrivo un *.txt, magari te lo faccio vedere se poi proprio non va me lo correggi se sei disponibile ok?

Grazie di tutto bit

NTT

Link al commento
Condividi su altri siti

La eeprom quando la alimenti non fa nulla fino a quando non viene chiamata. Nel programma che ho postato puoi vedere che all'inizio la eeprom viene indirizzata con un preciso byte, al quale risponde con un bit di acknowledge (livello basso). A questo punto il pic può continuare e leggere i vari byte presenti all'interno di essa.

Se il pic non riceve l'acknowledge dopo aver inviato il byte di indirizzo interrompe la routine di dialogo, vuol dire che la eeprom non ha risposto, quindi non c'è.

Non c'è problema per correggerti un eventuale programma. Metti i commenti però (abbonda!), perchè altrimenti ci metto di più a capire cosa vuoi fare che a correggere.

Ciao!

Link al commento
Condividi su altri siti

Ok bit ho capito.ho anche scritto una bozza del programma dove manca la parte finale, o meglio la comparazione tra il valore letto nella eeprom e quello che il pic deve avere in memoria.Ovviamente se le 2 stringhe di bytes sono uguali il pic mi dovrà far scattare un relè o accendere un led.Come faccio a mandarti il mio programma?come si fa ad allegarlo ad un post nel forum?o devo mandartelo ad una tua casella di posta?fammi sapere e grazie!

P.s.:il prgramma che io ho scritto è in pratica il tuo programma copiato tagliando tutte le parti dove il pic scrive sulla eeprom in quanto a me questa operazione non serve;io devo solo leggere una stringa dalla memoria.ancora grazie.

NTT

Link al commento
Condividi su altri siti

#include "P16F628.inc"

;*********************** dichiarazione variabili ****************************

CBLOCK 0x20

CNT  ;contatore byte inviati/ricevuti

EESEND  ;byte dialogo iic

TXRXCNT  ;contatore bit trasmessi/ricevuti dialogo iic

TEMP1  ;contatore ritardi

TEMP2  ;contatore ritardi

ADR_I2C  ;indirizzo periferico

IDENT  ;codice identificativo periferico (sempre scrittura)

ENDC

#DEFINE scl  PORTB,00 ;linea clock bus i2c

#DEFINE sda  PORTB,01 ;linea dati bus i2c

#DEFINE led_verde PORTB,02    ;linea di accensione del led in caso di codice corretto

#DEFINE led_rosso PORTB,03    ;linea di accensione del led in caso di codice errato

;*********************** vettore di reset ***********************************

ORG 0x00

GOTO START

;*********************** vettore di interruzione ****************************

ORG 0x04

GOTO START

;*********************** impostazioni iniziali ******************************

START: ORG 0x10

BCF STATUS,RP1

BSF STATUS,RP0

MOVLW 0x00

MOVWF TRISA  ;porta A uscita

MOVWF TRISB  ;porta B uscita

BCF STATUS,RP0

MOVLW 0x07  ;disabilitazione comparatori

MOVWF CMCON

CLRF PORTA

CLRF PORTB

CALL DELAY3          ;perchè si deve fermare per 196 ms?

;*********************** dialogo periferici *********************************

CLRF ADR_I2C

CIC_TR: CALL RD_EP16  ;lettura prima eeprom (indirizzo 000)

CALL DELAY4  ;ritardo 15 ms

;***************************subroutine dialogo i2c***************************

;***************************invio bit di start*******************************

START_BIT:

BSF sda ;linea dati a 1

CALL DELAY5  ;ritado 8 us

BSF scl ;inizio impulso di clock

CALL DELAY5  ;ritardo 8 us

BCF sda ;linea dati a 0 - condizione di start

CALL DELAY5  ;ritardo 8 us

BCF scl ;fine impulso di clock

RETURN

;***************************invio bit di stop********************************

STOP_BIT:

BCF sda ;linea dati a 0

CALL DELAY5  ;ritado 8 us

BSF scl ;inizio impulso di clock

CALL DELAY5  ;ritardo 8 us

BSF sda ;linea dati a 1 - condizione di stop

CALL DELAY5  ;ritardo 8 us

BCF scl ;fine impulso di clock

CALL DELAY5  ;ritado 8 us

BCF sda ;linea dati a 0

RETURN

;***************************invio byte***************************************

BYTE_WR:

MOVWF EESEND  ;carica byte da trasferire

MOVLW 0x08  ;numero bit da inviare

MOVWF TXRXCNT  ;carica contatore bit

WR_LOOP:RLF EESEND,F  ;rotazione a sinistra - bit in carry

CALL BIT_WR  ;invio bit

CALL DELAY5  ;ritado 8 us

DECFSZ TXRXCNT,F ;conteggio bit inviati

GOTO WR_LOOP  ;ciclo di invio

CALL DELAY5  ;ritado 8 us

BSF sda

CALL RX_CONF  ;configurazione ricezione dati

CALL BIT_RD  ;lettura bit di acknowledge

CALL TX_CONF  ;configurazione invio dati

BCF sda

RETURN

;***************************lettura byte*************************************

BYTE_RD:

MOVLW 0x08  ;numero bit da leggere

MOVWF TXRXCNT  ;carica contatore bit

CALL RX_CONF  ;configurazione ricezione dati

RD_LOOP:CALL BIT_RD  ;lettura bit

RLF EESEND,F  ;rotazione a sinistra - bit da carry

CALL DELAY5  ;ritado 8 us

DECFSZ TXRXCNT,F ;conteggio bit letti

GOTO RD_LOOP  ;ciclo di lettura

CALL TX_CONF  ;configurazione invio dati

MOVF EESEND,W  ;valore letto

RETURN

;***************************invio bit****************************************

BIT_WR:

BCF sda ;linea dati a 0

BTFSC STATUS,C  ;test bit da trasmettere

BSF sda ;se bit = 1 linea dati a 1

CALL DELAY5  ;ritado 8 us

BSF scl ;inizio impulso di clock

CALL DELAY5  ;ritado 8 us

BCF scl ;fine impulso di clock

CALL DELAY5  ;ritado 8 us

BCF sda ;linea dati a 0

RETURN

;***************************invio bit di acknowledge*************************

ACK0: BCF STATUS,C  ;bit di acknowledge (0)

CALL BIT_WR  ;invio bit di acknowledge

RETURN

;***************************invio bit di non acknowledge*********************

ACK1: BSF STATUS,C  ;bit di non acknowledge (1)

CALL BIT_WR  ;invio bit di acknowledge

RETURN

;***************************lettura bit**************************************

BIT_RD:

BSF scl ;inizio impulso di clock

CALL DELAY5  ;ritado 8 us

BCF STATUS,C  ;reset carry

BTFSC sda  ;test bit letto

BSF STATUS,C  ;se bit = 1 carry a 1

BCF scl ;fine impulso di clock

RETURN

;***************************configurazione invio dati************************

TX_CONF:BSF STATUS,RP0

MOVLW 0x00  ;porta B 00000000

MOVWF TRISB

BCF STATUS,RP0

RETURN

;***************************configurazione ricezione dati********************

RX_CONF:BSF STATUS,RP0

MOVLW 0xFE  ;porta B 11111110

MOVWF TRISB

BCF STATUS,RP0

RETURN

;***************************subroutine lettura 16 byte in eeprom*************

RD_EP16:  ;bit qui credo che dovrebbe andare una routine in modo che il pic ogni X ms debba controllare se la carta è stata

          ;inserita nel lettore.Non so proprio come fare, anche perchè non ho mai fatto programmi di questa difficoltà.

          ;Per il resto il numero bytes da leggere è giusto (16) quindi io ho bisogno che il programma esegua un solo ciclo di letture lungo

          ;appunto 16 bytes.Purtroppo ti ripeto, qua non so andare avanti e se puoi mi devi aiutare!

        MOVLW 0x10  ;numero byte da leggere (16)

MOVWF CNT

MOVLW 0x40  ;valore partenza puntatore ram

MOVWF FSR

MOVLW 0xA0  ;codice ident. eeprom scrittura

MOVWF IDENT

RXI2C: CALL START_BIT

MOVF IDENT,W  ;codice ident. periferico

CALL BYTE_WR

BTFSC STATUS,C  ;test bit di acknowledge

GOTO F_RXI2C

MOVF ADR_I2C,W  ;indirizzo di partenza

CALL BYTE_WR

BTFSC STATUS,C  ;test bit di acknowledge

GOTO F_RXI2C

CALL START_BIT

MOVF IDENT,W  ;codice ident. periferico

ADDLW 0x01  ;modalità lettura

CALL BYTE_WR

BTFSC STATUS,C  ;test bit di acknowledge

GOTO F_RXI2C

CIC_RXI2C:CALL BYTE_RD

MOVWF INDF

CALL ACK0

INCF FSR,F

DECFSZ CNT,F

GOTO CIC_RXI2C

CALL BYTE_RD

CALL ACK1

CALL STOP_BIT

F_RXI2C:RETURN

;***************************ritardo 196 ms***********************************

DELAY3: MOVLW 0x00

MOVWF TEMP2

MOVLW 0x00

AAA: MOVWF TEMP1

BBB: DECFSZ TEMP1,F

GOTO BBB

DECFSZ TEMP2,F

GOTO AAA

RETURN

;***************************ritardo 8 us*************************************

DELAY5: NOP

NOP

NOP

NOP

RETURN

;*********************** configurazione fuses *******************************

ORG 0x2007

DATA 0x3F50  ;config word

  END

;Ultimo problema:come faccio per salvare i 16 bytes letti?e come fa il pic per vedere se sono uguali a un valore che ha in memoria?

;Ho fatto qualcosa del genere in passato ma su dati lunghi al massimo 1 bytes quindi non so gestire lunghezze così estese.

;Potresti implementare una routine dove il pic controlla il valore letto con quello presente in memoria (scegli a caso!!!)

;e se sono uguali mi faccia accendere il led verde?ovviamente se sono diversi si dovrà accendere il led rosso.

;Queste sono le parti del tuo programma che ho ritenuto necessarie per far funzionare il mio circuito.Ti ripeto,

;non sono bravo quindi potrei aver commesso degli errori anche gravi.Sto studiando e sto cercando di imparare.

;Ti chiedo già scusa e ti ringrazio per i consigli che già mi hai dato e per quello che stai facendo...e anche perchè

;mi sopporti!! :D

Link al commento
Condividi su altri siti

Uhmmm... l'idea del copia e incolla non è buona, si perdono le tabulazioni, che sono molto importanti.

Comunque qua c'è il programma corretto e completo. C'è solo da provarlo. Adesso sta a te.

http://www.plcforum.it/upload/index.php?ac...name=Chiave.asm

Fammi sapere se c'ho azzeccato. Ciao!

PS: Procedimento per postare in file in questo modo:

Vai nella sezione up-load-download e carica il file che vuoi postare. Poi vai sul collegamento che compare per scaricarlo e cliccando col destro del mouse fai copia collegamento.

A questo punto apri la tua risposta e fai incolla.

Ri-ciao!

Modificato: da bit
Link al commento
Condividi su altri siti

Allora bit ho provato il programma e quando ho compilato mi dava un errore, non trovava la call chiamata DELAY4 che ho aggiunto dal sorgente originale (quello di copia eeprom)e dopo è andato ok in fase di asm.In pratica delay4 è solo un ritardo di 15ms anche se ti conviene sempre controllare quello che faccio io! :D In fase di test invece il programma non va.Ho misurato tutte le tensioni col tester nel circuito ed è tutto ok, la eeprom è alimentata il pic anche ed è funzionante visto che ho provato con altri programmi + semplici.Con eeprom volutamente errata ho fatto partire il programma e il led rosso ha lampeggiato per molto meno di un secondo e poi + niente, adesso non so se sia un errore nel programma o devo ricontrollare il circuito a livello elettronico.Tu che ne pensi?fammi sapere.Grazie ancora per l'aiuto.

NTT

Link al commento
Condividi su altri siti

Impossibile! Nel mio programma non esiste una chiamata alla subroutine DELAY4... :(:(

Inoltre il compilatore non mi da errori.

E ho controllato anche il programma riscaricandolo dal forum...

Il programma potrà anche non funzionare, ma quella chiamata non c'è.

Sei sicuro di aver compilato il file giusto? ;)

Ciao.

Link al commento
Condividi su altri siti

Allora sicuramente avrò sbagliato io!Ho provato a rifare il procedimento e adesso MPASM mi dice:Error[125] 1 : Illegal condition (EOF encountered before END or conditional end directive).Non so proprio che cosa può essere questo errore anche perchè col notepad di windows mi risulta difficile andare a cercare le righe di testo, magari dovrei utilizzare qualche altro programma per scrivere i listati.è strano che mi dà questo errore, anche perchè tu mi dici che a te errori non ne dà!scusa ancora ma mi serve ancora il tuo aiuto :(

NTT

Link al commento
Condividi su altri siti

L'errore allora è nel salvataggio del file.

Come mai con lo stesso file adesso ti da un errore diverso?

EOF significa End Of File, quindi Mpasm ti dice che il file finisce prima che sia presente la direttiva END, sempre necessaria. C'è qualche errore di salvataggio. Riapri il file con notepad (io uso quello e va benissimo) e controlla se il listato ha nulla di strano. Ad esempio manca davvero la direttiva END nel tuo file?

L'unica è riprovare a scaricare di nuovo il programma... a me non dà errori, non so che dire. Il problema sarà sul tuo PC.... :(

Ciao!

Link al commento
Condividi su altri siti

Ciao bit, allora ho rifatto tutto con calma e adesso mpasm non si lamenta più e dice che è tutto ok, quindi mi genera il file*.hex.Ho provato ma per qualsiasi cosa scritta in eeprom il risultato è sempre lo stesso:mi lampeggia per un attimo il led verde.Ti metto qua le 2 eeprom programmate , una buona e l'altra volutamente errata per farti vedere se sbaglio qualcosa:

0000: ff ff ff ff ff ff ff ff

0008: ff ff ff ff ff ff ff ff

0010: ff ff ff ff ff ff ff ff

0018: ff ff ff ff ff ff ff ff

0020: ff ff ff ff ff ff ff ff

0028: ff ff ff ff ff ff ff ff

0030: ff ff ff ff ff ff ff ff

0038: ff ff ff ff ff ff ff ff

0040: f0 10 10 10 10 10 10 10

0048: 10 10 10 10 10 10 10 10

0050: ff ff ff ff ff ff ff ff

0058: ff ff ff ff ff ff ff ff

0060: ff ff ff ff ff ff ff ff

0068: ff ff ff ff ff ff ff ff

0070: ff ff ff ff ff ff ff ff

0078: ff ff ff ff ff ff ff ff

0080: ff ff ff ff ff ff ff ff

0088: ff ff ff ff ff ff ff ff

0090: ff ff ff ff ff ff ff ff

Link al commento
Condividi su altri siti

OPS.....Chiedo scusa!Gli indirizzi in eeprom esterna (24lc16) sono errati!la lettura della eeprom comincia dall'indirizzo 0000 vero?se è così entrambe le eeprom che ho postato prima sono programmate correttamente o mi sbaglio ancora?i 16 bytes che a me interessano nella 24lc16 vanno da 0x00 a 0x0f?credo di si.Scusa ancora.

resta comunque il secondo problema, quello della programmazione del pic che non è proprio uguale al sorgente.

Link al commento
Condividi su altri siti

Beh, vedo che ti sei risposto da solo. Si, il codice nella eeprom esterna è agli indirizzi da 00 a 0F, come pure nella eeprom interna del pic. L'indirizzo 40 si riferisce alla ram di appoggio del codice.

Ho il presentimento che il tuo programmatore faccia un po' le bizze, se rileggi il pic e trovi i codici che hai riportato in fondo alla tua risposta il problema potrebbe essere nella programmazione.

Consiglio Icprog, lo puoi scaricare dal suo sito ufficiale.

Come programmatore cose hai?

Ciao.

Link al commento
Condividi su altri siti

Ciao bit, come programmatore ho un comunissimo ludipipo connesso alla com1 del pc e dovrebbe andare bene visto che non mi ha dato mai grossi problemi.Adesso rifaccio il tutto programmando il pic con icprog, lo conosco ed è vero, è un ottimo software.Volevo però farti notare una cosa:questo è un pezzo del mio primo post in questo thread:

Volevo chiedere come si fa a far leggere ad un pic 16f84 con clock di funzionamento a 4Mhz....

Link al commento
Condividi su altri siti

Rieccomi....Programmazione corretta adesso, ma il risultato non cambia, anche se adesso il led verde non lampeggia più.Resta solo il problema del file *.inc, altrimenti potrebbe davvero essere il sorgente ad avere qualche errore.Inutile dirlo che continuo a studiarlo ma che errori non ne vedo. :(

Link al commento
Condividi su altri siti

Ecco il problema! Il mio programma è stato fatto per il pic16f628, e ci vuole il suo file .inc, e la corretta impostazione del compilatore, del programmatore e ovviamente il micro giusto. A te serviva per il pic16f84? Guarda che costa di più, ha meno funzioni, ti serve il quarzo esterno, ha meno pin in/out... Andrebbero fatte alcune modifiche, se ti serve te le preparo.

Ciao!

Link al commento
Condividi su altri siti

  • 1 month later...

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...