ntt Inserito: 2 febbraio 2004 Segnala Share Inserito: 2 febbraio 2004 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 More sharing options...
dlgcom Inserita: 2 febbraio 2004 Segnala Share Inserita: 2 febbraio 2004 Ciao ,Queste memorie seriali non usano il protocollo asincrono , ma un sistema di comunicazione sincrona chiamato I2CUsa 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 More sharing options...
ntt Inserita: 2 febbraio 2004 Autore Segnala Share Inserita: 2 febbraio 2004 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! 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!! NTT Link al commento Condividi su altri siti More sharing options...
dlgcom Inserita: 2 febbraio 2004 Segnala Share Inserita: 2 febbraio 2004 Ho studiato un pò e ho capito che alla eeprom devo dare il clock a 4mhz Link al commento Condividi su altri siti More sharing options...
bit Inserita: 3 febbraio 2004 Segnala Share Inserita: 3 febbraio 2004 Ho realizzato molti sistemi con la gestione di eeprom esterne e dispositivi equivalenti.Avevo anche postato un file di un programma per la copia di una eeprom 24lc02, quindi con subroutine di lettura e scrittura.Dovrebbe essere questo, se il collegamento funziona.http://www.plcforum.it/forums/index.php?ac...e=post&id=22836 Link al commento Condividi su altri siti More sharing options...
ntt Inserita: 3 febbraio 2004 Autore Segnala Share Inserita: 3 febbraio 2004 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 More sharing options...
ntt Inserita: 11 febbraio 2004 Autore Segnala Share Inserita: 11 febbraio 2004 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 More sharing options...
bit Inserita: 11 febbraio 2004 Segnala Share Inserita: 11 febbraio 2004 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 More sharing options...
ntt Inserita: 12 febbraio 2004 Autore Segnala Share Inserita: 12 febbraio 2004 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 bitNTT Link al commento Condividi su altri siti More sharing options...
bit Inserita: 12 febbraio 2004 Segnala Share Inserita: 12 febbraio 2004 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 More sharing options...
ntt Inserita: 16 febbraio 2004 Autore Segnala Share Inserita: 16 febbraio 2004 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 More sharing options...
bit Inserita: 16 febbraio 2004 Segnala Share Inserita: 16 febbraio 2004 Beh, fai un copia e incolla e lo metti nella risposta al post. Magari tra "quote".Ciao Link al commento Condividi su altri siti More sharing options...
ntt Inserita: 17 febbraio 2004 Autore Segnala Share Inserita: 17 febbraio 2004 #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_I2CCIC_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 bitWR_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 datiRD_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 IDENTRXI2C: 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_RXI2CCIC_RXI2C:CALL BYTE_RD MOVWF INDF CALL ACK0 INCF FSR,F DECFSZ CNT,F GOTO CIC_RXI2C CALL BYTE_RD CALL ACK1 CALL STOP_BITF_RXI2C:RETURN;***************************ritardo 196 ms***********************************DELAY3: MOVLW 0x00 MOVWF TEMP2 MOVLW 0x00AAA: MOVWF TEMP1BBB: 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!! Link al commento Condividi su altri siti More sharing options...
bit Inserita: 17 febbraio 2004 Segnala Share Inserita: 17 febbraio 2004 (modificato) 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.asmFammi 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: 17 febbraio 2004 da bit Link al commento Condividi su altri siti More sharing options...
ntt Inserita: 18 febbraio 2004 Autore Segnala Share Inserita: 18 febbraio 2004 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! 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 More sharing options...
bit Inserita: 18 febbraio 2004 Segnala Share Inserita: 18 febbraio 2004 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 More sharing options...
ntt Inserita: 19 febbraio 2004 Autore Segnala Share Inserita: 19 febbraio 2004 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 More sharing options...
bit Inserita: 19 febbraio 2004 Segnala Share Inserita: 19 febbraio 2004 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 More sharing options...
ntt Inserita: 20 febbraio 2004 Autore Segnala Share Inserita: 20 febbraio 2004 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 More sharing options...
ntt Inserita: 20 febbraio 2004 Autore Segnala Share Inserita: 20 febbraio 2004 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 More sharing options...
bit Inserita: 21 febbraio 2004 Segnala Share Inserita: 21 febbraio 2004 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 More sharing options...
ntt Inserita: 22 febbraio 2004 Autore Segnala Share Inserita: 22 febbraio 2004 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 More sharing options...
ntt Inserita: 22 febbraio 2004 Autore Segnala Share Inserita: 22 febbraio 2004 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 More sharing options...
bit Inserita: 25 febbraio 2004 Segnala Share Inserita: 25 febbraio 2004 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 More sharing options...
wafermirco80 Inserita: 7 aprile 2004 Segnala Share Inserita: 7 aprile 2004 Ciao bit, potresti gentilmente prepararmi le routine per pic 16f84, avendo tale microcontroller!!!!Grazie mille Link al commento Condividi su altri siti More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora