Forum: Mikrocontroller und Digitale Elektronik PIC16F819 mit externem EEPROM


von _Emsländer_ (Gast)


Lesenswert?

Hallo,
ich habe ein Problem mit dem PIC16F819. Ich will mit dem PIC Daten über 
die SSP Schnittstelle (I2C) an ein externes EEPROM schicken und auslesen 
)alles in Assembler).
Die AN, die von Microchip angegeben werden (AN578, 554) habe ich 
gelesen, ich habe aber immer noch keine Ahnung, wie ich die 
Initialisierung oder die eigentliche Kommunikation machen soll.
Kennt jemand einen Link zu einen Code oder kann mir selber fertige 
Routinen zur Verfügung stellen?

von Sven S. (stepp64) Benutzerseite


Lesenswert?

kannst ja mal meine Routinen probieren. Bei mir funktionieren die mit 
einem PIC16F886 und LM75 bzw. 24C256.

Definitionen:
1
; ***********   Macros definieren   *************
2
Bank0  macro
3
  bcf  STATUS,RP0  ;Bank 0
4
  bcf  STATUS,RP1
5
  endm
6
7
Bank1  macro
8
  bsf  STATUS,RP0  ;Bank 1
9
  bcf  STATUS,RP1
10
  endm
11
12
  constant  PIC_Takt  =.8000000
13
  constant  RS232_Takt  =.9600
14
  constant  I2C_Takt  =.100000
15
       
16
  constant  Wert_SSPADD  =PIC_Takt/(.4*I2C_Takt)-.1    ;100kHz = 8MHz/(4*(SSPADD+1))
17
  constant  Wert_SPBRG  =PIC_Takt/(.16*RS232_Takt)-.1   ;9,6kHz = 8MHz/(16*(SPBRG+1))
18
19
20
  constant  LM75_Adresse=0x90
21
  constant  sEPROM_Adresse=0xA0    ;I2C Adresse des seriellen EEPROMS (24C256)

Initialisierung
1
; I2C einschalten
2
  Bank1
3
  movlw  Wert_SSPADD ;8MHz/(4*(SSPADD+1)) = 400kHz
4
  movwf  SSPADD              
5
  bsf    SSPSTAT,SMP  ;keine Kontrolle der Signalanstiegszeiten
6
7
  Bank0
8
  movlw B'00001000' ;Master Mode
9
  movwf SSPCON              
10
  bsf   SSPCON,SSPEN ;MSSP-Modul einschalten
11
  call  i2c_idle

und die Routinen:
1
;***I2C UNTERPROGRAMME************************************************************
2
;
3
; I2C-Bus im Master-Mode übernehmen
4
; Warten bis MSSP-Modul frei ist
5
i2c_idle
6
  Bank1
7
  btfsc   SSPSTAT, R_W  ;läuft eine Übertragung?
8
  goto    $-1        ;ja, warten...
9
i2cidle_loop2
10
  movfw   SSPCON2      ;nein, läuft ein anderes Ereignis?
11
  andlw   0x1F            ;test auf ACKEN, RCEN, PEN, RSEN, SEN
12
  btfss   STATUS,Z    
13
  goto    i2cidle_loop2  ;ja, warten...
14
  Bank0
15
  return          ;MSSP Modul ist nicht beschäftigt
16
17
i2c_start
18
  call    i2c_idle    ;Bus frei?
19
    Bank1
20
    bsf     SSPCON2, SEN    ;Bus Übernahme anweisen und Startbit senden
21
    btfsc   SSPCON2, SEN  ;Auf das Ende der Startkondition warten
22
    goto    $-1
23
   Bank0
24
  return
25
26
;Restart aktivieren
27
i2c_rstart
28
    call    i2c_idle    ;Bus frei?
29
  Bank1
30
    bsf     SSPCON2, RSEN   ;Restart Sequence einleiten      
31
  btfsc   SSPCON2, RSEN
32
    goto  $-1
33
  Bank0
34
    return
35
36
;ein Byte aus W senden
37
;Rückgabewert in W: 0=ACK empfangen, 1=ACK nicht empfangen 
38
i2c_tx
39
  movwf  i2c_Puffer
40
    call    i2c_idle      ;Bus frei?
41
    bcf     PIR1, SSPIF     ;Lösche Interrupt Flag
42
  movfw  i2c_Puffer
43
    movwf   SSPBUF          ;Byte wird gesendet
44
    btfss   PIR1, SSPIF     ;Senden fertig?                
45
    goto  $-1
46
47
    Bank1
48
  btfss   SSPCON2, ACKSTAT ;Test ob ACK vom Slave empfangen wurde
49
  goto  i2c_tx_ack
50
  Bank0
51
    retlw   d'1'      ;ACK wurde nicht empfangen
52
i2c_tx_ack
53
  Bank0
54
    retlw   d'0'            ;ACK wurde empfangen
55
56
;ein Byte vom Slave empfangen ohne ACK
57
;Rückgabewert in W
58
i2c_rx
59
    call    i2c_idle
60
    bcf     PIR1,SSPIF    ;Interrupt Flag löschen
61
  Bank1                   
62
    bsf     SSPCON2, RCEN   ;Empfang einschalten
63
  Bank0     
64
  btfss   PIR1,SSPIF      ;Byte empfangen?
65
    goto  $-1        ;noch nicht
66
67
    Bank1
68
  bsf     SSPCON2, ACKDT  ;kein ACK senden (ACK=High)
69
    bsf     SSPCON2, ACKEN  ;sende negatives ACK
70
    btfsc   SSPCON2, ACKEN  ;fertig?
71
    goto    $-1
72
  Bank0
73
  movfw  SSPBUF      ;Empfangenen Wert nach W
74
    return
75
76
;ein Byte vom Slave empfangen mit ACK
77
;Rückgabewert in W
78
i2c_rx_ack
79
    call    i2c_idle
80
    bcf     PIR1,SSPIF    ;Interrupt Flag löschen
81
  Bank1
82
    bsf     SSPCON2, RCEN   ;Empfang einschalten
83
  Bank0     
84
  btfss   PIR1,SSPIF      ;Byte empfangen?
85
    goto  $-1        ;noch nicht
86
87
    Bank1
88
  bcf     SSPCON2, ACKDT  ;ACK senden
89
    bsf     SSPCON2, ACKEN
90
    btfsc   SSPCON2, ACKEN  ;fertig?
91
    goto    $-1
92
  Bank0
93
  movfw  SSPBUF      ;Empfangenen Wert nach W
94
    return
95
96
; I2C-Bus wieder freigeben
97
i2c_stop
98
    call    i2c_idle
99
  Bank1
100
    bsf     SSPCON2, PEN    ;Stop Bit senden und Bus frei geben
101
    btfsc   SSPCON2, PEN  ;fertig?
102
  goto  $-1
103
  Bank0
104
    return

Viel Spaß damit
Sven

von _Emsländer_ (Gast)


Lesenswert?

Danke Sven!
Leider funkts das nicht ganz, werd aber versuchen den Code 
umzuschreiben. Der 16F819 hat nur ein SSPCON Register.
Aber ein dickes Danke!!!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.