Ciao ragazzi, chiedo il vostro aiuto per un problema:
Ho necessità di leggere e scrivere su una eeprom (che probabilmente sarà una piccola 24c02) da un PIC che non integra il supporto per il protocollo I2C come un 16F84. Cercavo qualcuno che mi possa scrivere un esempio di programma assembler, ad esempio, che legge dalla allocazione 1B e lo mette in una variabile e poi scrive un altro dato nella allocazione 8C....(ad esempio)
Oppure qualcuno che mi indichi qualche routine già fatta in assembler possibilmente chiara e di utilizzo non troppo difficile...
Non sono pratico di I2C.
Grazie a tutti in anticipo.
Comunicazione I2C con PIC
Moderatore:
Paolino
9 messaggi
• Pagina 1 di 1
0
voti
La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre a coniugare la teoria con la pratica: non funziona niente e non si sa il perché.
Albert Einstein.
Albert Einstein.
-

amico_Friz
0 2 - New entry

- Messaggi: 89
- Iscritto il: 30 ott 2005, 23:45
- Località: Cervarese Santa Coce (PD)
0
voti
Emulare il protocollo I2C non è semplice. Ti rimando alla lettura di questo articolo (in italiano) che magari può aiutarti ad approfondire.
Ciao.
Paolo.
Ciao.
Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-

Paolino
32,6k 8 12 13 - G.Master EY

- Messaggi: 4226
- Iscritto il: 20 gen 2006, 11:42
- Località: Vigevano (PV)
0
voti
Grazie, li ci sono alcune routine già pronte, anche se il loro metodo d'utilizzo non è poi così chiaro. Secondo te possono funzionare?
Avete qualche alternativa? Sono disposto anche a passare al MicroC o altri linguaggi....
Avete qualche alternativa? Sono disposto anche a passare al MicroC o altri linguaggi....
La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre a coniugare la teoria con la pratica: non funziona niente e non si sa il perché.
Albert Einstein.
Albert Einstein.
-

amico_Friz
0 2 - New entry

- Messaggi: 89
- Iscritto il: 30 ott 2005, 23:45
- Località: Cervarese Santa Coce (PD)
0
voti
c1b8 ha scritto:amico_Friz ha scritto:.....Sono disposto anche a passare al MicroC o altri linguaggi....
E ad assembler di altri micro?
Anche...
Tu spara... poi vedrò cosa fare...
La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre a coniugare la teoria con la pratica: non funziona niente e non si sa il perché.
Albert Einstein.
Albert Einstein.
-

amico_Friz
0 2 - New entry

- Messaggi: 89
- Iscritto il: 30 ott 2005, 23:45
- Località: Cervarese Santa Coce (PD)
0
voti
ok, queste le routine di gestione I2C Master per un 8051.
Questi due esempi di utilizzo
Spero possa bastarti.
PS.: Trattale bene....
- Codice: Seleziona tutto
; -----------------------------------------------------
; Routine per la gestione del I2C come Master
; -----------------------------------------------------
; -----------------------------------------------------
; Definizione porte
; -----------------------------------------------------
SDA equ P2+6
SCL equ P2+7
; -----------------------------------------------------
; Invia in uscita il contenuto del registro A
; inizia la trasmissione con uno start e attende ACK
; -----------------------------------------------------
I2C_Out_Start:
; invia uno start
SETB SDA ; dati HI
SETB SCL ; Clock HI
lcall I2C_Wait
CLR SDA ; dati Lo = Start
lcall I2C_Wait
ljmp I2C_Out
; -----------------------------------------------------
; Invia in uscita il contenuto del registro A
; esce con C = 0 se ACK o C=1 se no ACK
; -----------------------------------------------------
I2C_Out:
; Invio carattere
push 2 ; Salvo R2
MOV R2, #8 ; Numero di bit da trasferire
CLR SCL ; Clock Lo
I2COut_Loop:
RLC A
mov SDA, C
lcall I2C_Wait
SETB SCL
lcall I2C_Wait
CLR SCL
lcall I2C_Wait
DJNZ R2, I2COut_Loop
pop 2 ; Ripristino R2
; Attesa ACK
SETB SDA ; SDA come input
lcall I2C_Wait
SETB SCL
lcall I2C_Wait
mov C, SDA ; Legge ACK
clr SCL
jc I2C_Out_Error
lcall I2C_Wait
RET
I2C_Out_Error:
lcall I2C_Stop
setb C
ret
; -----------------------------------------------------
; Invia una condizione di stop
; -----------------------------------------------------
I2C_Stop:
clr SCL
lcall I2C_Wait
CLR SDA
lcall I2C_Wait
SETB SCL
lcall I2C_Wait
SETB SDA
lcall I2C_Wait
RET
; -----------------------------------------------------
; Riceve un carattere
; Attende che il clock sia libero
; Il carattere viene tornato in A
; dopo questa routine serve inviare un ACK o un NACK
; -----------------------------------------------------
I2C_Read:
push 2 ; Salva R2
MOV R2, #8
setb SCL
lcall I2C_Wait
lcall I2C_Wait
lcall I2C_Wait
lcall I2C_Wait
; Attesa che il clock sia libero
jnb SCL, $ ; Attesa che clock diventi '1'
sjmp I2C_Read_Bit
I2C_Read_Loop:
CLR SCL
lcall I2C_Wait
SETB SCL
I2C_Read_Bit:
lcall I2C_Wait
mov C, SDA
RLC A
DJNZ R2, I2C_Read_Loop
pop 2 ; Ripristina R2
RET
; -----------------------------------------------------
; Invia un ACK
; -----------------------------------------------------
I2C_ACK:
clr SCL
lcall I2C_Wait
CLR SDA
lcall I2C_Wait
SETB SCL
lcall I2C_Wait
clr SCL
lcall I2C_Wait
setb SDA
RET
; -----------------------------------------------------
; Invia un NACK
; -----------------------------------------------------
I2C_NACK:
clr SCL
lcall I2C_Wait
setb SDA
lcall I2C_Wait
SETB SCL
lcall I2C_Wait
clr SCL
lcall I2C_Wait
RET
; -----------------------------------------------------
; Attesa di 5 us
; -----------------------------------------------------
I2C_Wait:
push 6
push 7
mov R6, #4
mov R7, #0
lcall Delay_Us
pop 7
pop 6
lcall I2C_Wait_ret
I2C_Wait_ret:
ret
Questi due esempi di utilizzo
- Codice: Seleziona tutto
; Scrive valore 01 su indirizzo 0
mov A, #10100010b ; Scrive su EEPROM 000
lcall I2C_Out_Start
jc Errore
mov A, #0 ; Indirizzo
lcall I2C_Out
jc Errore
mov A, #1 ; valore
lcall I2C_Out
jc Errore
; lettura immediatamente successiva
mov A, #10100011b ; legge da EEPROM 000
lcall I2C_Out_Start
jc Errore
lcall I2C_Read
lcall I2C_NACK
Spero possa bastarti.
PS.: Trattale bene....
Fabio
0
voti
Azz...
credevo di un altro PIC non di un 8051...
Stavo pensando di tradurle per PIC (non conosco 8051, non l'ho mai usato e non so come programmarlo) ma non so se sia possibile... Credete che se lo traducessi avrebbe problemi di temporizzazione? un 8051 a che clock va di solito?
credevo di un altro PIC non di un 8051... La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre a coniugare la teoria con la pratica: non funziona niente e non si sa il perché.
Albert Einstein.
Albert Einstein.
-

amico_Friz
0 2 - New entry

- Messaggi: 89
- Iscritto il: 30 ott 2005, 23:45
- Località: Cervarese Santa Coce (PD)
0
voti
Ti avevo detto per altro micro.. no?
Tranquillo la traduzione non è difficile e la sola routine critica è la I2C_Wait che realizza un ritardo di 5 us.
Il software che ti ho postato gira in un micro con frequenza di sistema (non clock, ma frequenza macchina) di 20 MHz
Per capirci un PIC con clock 4 MHz ha frequenza macchina (esecuzione istruzioni) pari a 1 MHz (ossia clock/4).
Il micro da me utilizzato ha una frequenza macchina di 20 MHz.
Non preoccuparti di questo "dettaglio", per lo scopo che devi ottenere devi solo tradurre e realizzare la I2C_Wait opportunamente.
Tranquillo la traduzione non è difficile e la sola routine critica è la I2C_Wait che realizza un ritardo di 5 us.
Il software che ti ho postato gira in un micro con frequenza di sistema (non clock, ma frequenza macchina) di 20 MHz
Per capirci un PIC con clock 4 MHz ha frequenza macchina (esecuzione istruzioni) pari a 1 MHz (ossia clock/4).
Il micro da me utilizzato ha una frequenza macchina di 20 MHz.
Non preoccuparti di questo "dettaglio", per lo scopo che devi ottenere devi solo tradurre e realizzare la I2C_Wait opportunamente.
Fabio
0
voti
amico_Friz ha scritto:Sono disposto anche a passare al MicroC o altri linguaggi....
MikroC ha una libreria che emula I2C... Prova a scaricare il compilatore e a vedere l'esempio.
Ciao.
Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-

Paolino
32,6k 8 12 13 - G.Master EY

- Messaggi: 4226
- Iscritto il: 20 gen 2006, 11:42
- Località: Vigevano (PV)
9 messaggi
• Pagina 1 di 1
Torna a Realizzazioni, interfacciamento e nozioni generali.
Chi c’è in linea
Visitano il forum: Nessuno e 8 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)