Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Comunicazione I2C con PIC

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[1] Comunicazione I2C con PIC

Messaggioda Foto Utenteamico_Friz » 17 set 2009, 20:30

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.
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.
Avatar utente
Foto Utenteamico_Friz
0 2
New entry
New entry
 
Messaggi: 89
Iscritto il: 30 ott 2005, 23:45
Località: Cervarese Santa Coce (PD)

0
voti

[2] Re: Comunicazione I2C con PIC

Messaggioda Foto UtentePaolino » 18 set 2009, 9:03

Emulare il protocollo I2C non è semplice. Ti rimando alla lettura di questo articolo (in italiano) che magari può aiutarti ad approfondire.

Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[3] Re: Comunicazione I2C con PIC

Messaggioda Foto Utenteamico_Friz » 18 set 2009, 16:18

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....
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.
Avatar utente
Foto Utenteamico_Friz
0 2
New entry
New entry
 
Messaggi: 89
Iscritto il: 30 ott 2005, 23:45
Località: Cervarese Santa Coce (PD)

0
voti

[4] Re: Comunicazione I2C con PIC

Messaggioda Foto Utentec1b8 » 18 set 2009, 17:07

amico_Friz ha scritto:.....Sono disposto anche a passare al MicroC o altri linguaggi....

E ad assembler di altri micro?
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[5] Re: Comunicazione I2C con PIC

Messaggioda Foto Utenteamico_Friz » 18 set 2009, 17:15

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...
:D
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.
Avatar utente
Foto Utenteamico_Friz
0 2
New entry
New entry
 
Messaggi: 89
Iscritto il: 30 ott 2005, 23:45
Località: Cervarese Santa Coce (PD)

0
voti

[6] Re: Comunicazione I2C con PIC

Messaggioda Foto Utentec1b8 » 18 set 2009, 17:24

ok, queste le routine di gestione I2C Master per un 8051.
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.... :mrgreen:
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[7] Re: Comunicazione I2C con PIC

Messaggioda Foto Utenteamico_Friz » 18 set 2009, 22:39

Azz... #-o 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?
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.
Avatar utente
Foto Utenteamico_Friz
0 2
New entry
New entry
 
Messaggi: 89
Iscritto il: 30 ott 2005, 23:45
Località: Cervarese Santa Coce (PD)

0
voti

[8] Re: Comunicazione I2C con PIC

Messaggioda Foto Utentec1b8 » 18 set 2009, 22:54

Ti avevo detto per altro micro.. no? :mrgreen: :mrgreen:

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
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[9] Re: Comunicazione I2C con PIC

Messaggioda Foto UtentePaolino » 22 set 2009, 8:28

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
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)


Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 21 ospiti