Forum: Mikrocontroller und Digitale Elektronik PIC16 MSSP I2C


von Osccon (Gast)


Lesenswert?

Hallo,
ich versuche gerade eine I2C Verbindung zwischen zwei PIC16F887 
herzustellen.
Aber es will nicht funktionieren.
Beide PICs haben eine LED an RD1 und beide SCL und SDA Leitung 
sind jeweils miteinander Verbunden und werden mit einem 1 kOhm 
Widerstand auf High gezogen.
Eigentlich müsste die LED vom Slave nach jedem Reset bzw. Neustart des 
Masters(Weil der dann erneut eine Nachricht schickt) den Zustand 
wechseln.
Aber es passiert gar nichts bzw. beim Slave wird nie ein Interrupt 
ausgelöst.
Was mache ich falsch?

Und warum startet der Master oder auch Slave PIC obwohl ich am VDD Pin 
des jeweiligen PICS keine Spannung angeschlossen habe sondern nur GND 
und die SCL, SDA Pull Ups.
Als würde der PIC durch SCL und SDA mit Strom versorgt.

Der 1. PIC dient als Master und führt dieses Programm aus:
1
ERRORLEVEL -203,-205,-206,-302
2
INCLUDE p16f887.inc
3
__CONFIG _CONFIG1, H'20F4'
4
__CONFIG _CONFIG2, H'3EFF'
5
    
6
;###############################################################################
7
;# Register
8
;###############################################################################
9
10
TMP_0    EQU H'20'
11
TMP_1    EQU H'21'
12
TMP_2    EQU H'22'
13
14
INT_W_TMP  EQU H'70'
15
INT_STATUS_TMP  EQU H'71'
16
17
;###############################################################################
18
;# Makros
19
;###############################################################################
20
    
21
BANK0 MACRO
22
bcf  STATUS,RP0
23
bcf  STATUS,RP1
24
ENDM
25
 
26
BANK1 MACRO
27
bsf  STATUS,RP0
28
bcf  STATUS,RP1
29
ENDM
30
 
31
BANK2 MACRO
32
bcf  STATUS,RP0
33
bsf  STATUS,RP1
34
ENDM
35
 
36
BANK3 MACRO
37
bsf  STATUS,RP0
38
bsf  STATUS,RP1
39
ENDM
40
    
41
;###############################################################################
42
;# Vektoren
43
;###############################################################################
44
    
45
ORG H'0'
46
goto  MAIN
47
 
48
;###############################################################################
49
;# MAIN
50
;###############################################################################
51
52
MAIN
53
54
; Oscillator konfigurieren
55
BANK0
56
 
57
movlw  B'01110001' 
58
movwf  OSCCON
59
60
; IO konfiguerieren
61
BANK1
62
 
63
movlw  B'00000000'
64
movwf  TRISD
65
 
66
BANK0
67
 
68
movlw  B'11111111'
69
movwf  PORTD
70
 
71
; I2C konfigurieren
72
BANK1
73
 
74
movlw  B'01001111'
75
movwf  SSPADD
76
movlw  B'10000000'
77
movwf  SSPSTAT
78
movlw  B'00000000'
79
movwf  SSPCON2
80
 
81
BANK0
82
 
83
movlw  B'00101000'
84
movwf  SSPCON
85
86
; Warte einfach eine Sekunde.
87
call  DELAY1S
88
 
89
; Sende Start Signal
90
BANK0
91
bcf  PIR1,SSPIF
92
BANK1
93
bsf  SSPCON2,SEN
94
BANK0
95
SEN_WAIT
96
btfss  PIR1,SSPIF
97
goto  SEN_WAIT
98
bcf  PIR1,SSPIF
99
 
100
; Sende Adresse und R/W Bit
101
BANK0
102
bcf  PIR1,SSPIF
103
movlw  B'11001110'
104
movwf  SSPBUF
105
TRN_WAIT
106
btfss  PIR1,SSPIF
107
goto  TRN_WAIT
108
bcf  PIR1,SSPIF
109
 
110
; Sende Stop Signal
111
BANK0
112
bcf  PIR1,SSPIF
113
BANK1
114
bsf  SSPCON2,PEN
115
BANK0
116
PEN_WAIT
117
btfss  PIR1,SSPIF
118
goto  PEN_WAIT
119
bcf  PIR1,SSPIF
120
 
121
; LED Off
122
BANK0
123
clrf  PORTD
124
 
125
; Loop
126
MAIN_LOOP
127
 
128
129
goto  MAIN_LOOP
130
131
END
Der 2. PIC dient als Slave und führt dieses Programm aus:
1
ERRORLEVEL -203,-205,-206,-302
2
INCLUDE p16f887.inc
3
__CONFIG _CONFIG1, H'20F4'
4
__CONFIG _CONFIG2, H'3EFF'
5
    
6
;###############################################################################
7
;# Register
8
;###############################################################################
9
10
INT_W_TMP  EQU H'70'
11
INT_STATUS_TMP  EQU H'71'
12
13
;###############################################################################
14
;# Makros
15
;###############################################################################
16
    
17
BANK0 MACRO
18
bcf  STATUS,RP0
19
bcf  STATUS,RP1
20
ENDM
21
 
22
BANK1 MACRO
23
bsf  STATUS,RP0
24
bcf  STATUS,RP1
25
ENDM
26
 
27
BANK2 MACRO
28
bcf  STATUS,RP0
29
bsf  STATUS,RP1
30
ENDM
31
 
32
BANK3 MACRO
33
bsf  STATUS,RP0
34
bsf  STATUS,RP1
35
ENDM
36
    
37
;###############################################################################
38
;# Vektoren
39
;###############################################################################
40
    
41
ORG H'0'
42
goto  MAIN
43
ORG H'4'
44
goto  ISR
45
 
46
;###############################################################################
47
;# MAIN
48
;###############################################################################
49
50
MAIN
51
52
; Oscillator konfigurieren
53
BANK0
54
 
55
movlw  B'01110001' 
56
movwf  OSCCON
57
58
; IO konfiguerieren
59
BANK1
60
 
61
movlw  B'00000000'
62
movwf  TRISD
63
 
64
BANK0
65
 
66
movlw  B'11111111'
67
movwf  PORTD
68
 
69
; I2C konfigurieren
70
BANK1
71
 
72
movlw  B'0100001'
73
movwf  SSPADD
74
movlw  B'10000000'
75
movwf  SSPSTAT
76
movlw  B'00000001'
77
movwf  SSPCON2
78
 
79
BANK0
80
 
81
movlw  B'00100110'
82
movwf  SSPCON
83
 
84
; Interrupts konfigurieren
85
BANK1
86
 
87
movlw  B'00001000'
88
movwf  PIE1
89
 
90
BANK0
91
 
92
movlw  B'11000000'
93
movwf  INTCON
94
 
95
; Loop
96
MAIN_LOOP
97
98
goto  MAIN_LOOP
99
 
100
;###############################################################################
101
;# ISR
102
;###############################################################################
103
104
ISR
105
 
106
; Prolog
107
movwf  INT_W_TMP
108
swapf  STATUS,W
109
movwf  INT_STATUS_TMP
110
111
BANK0
112
 
113
bcf  PIR1,SSPIF ; Interrupt FLag zurücksetzen
114
movf  SSPBUF,W ; Adresse + R/W Bit auslesen
115
comf  PORTD,F ; Zustand der LED ändern
116
bsf  SSPCON,CKP ; SCL freigeben(Clock stretching)
117
 
118
; Epilog
119
swapf  INT_STATUS_TMP,W
120
movwf  STATUS
121
swapf  INT_W_TMP,F
122
swapf  INT_W_TMP,W
123
 
124
retfie
125
126
END

von Thomas E. (picalic)


Lesenswert?

Osccon schrieb:
> Und warum startet der Master oder auch Slave PIC obwohl ich am VDD Pin
> des jeweiligen PICS keine Spannung angeschlossen habe sondern nur GND
> und die SCL, SDA Pull Ups.
> Als würde der PIC durch SCL und SDA mit Strom versorgt.

Das ist tatsächlich so: über die internen Schutzdioden an den Pins 
fließt in dem Fall Strom vom Pin nach VDD und versorgt so den Prozessor.

von Chris B. (dekatz)


Lesenswert?

Habe jetzt nicht das Programm analysiert, aber 2 Möglichkeiten:
a) Fehler bei der Bankumschaltung: die Verwendung von Macros ist völlig 
unnötig und Fehlerträchtig. Dafür bietet der Assembler die Anweisung 
BANKSEL gefolgt vom jeweiligen Register. Also an Stelle von
1
BANK0 
2
movlw  B'11111111'
3
movwf  PORTD
schreibt man:
1
 BANKSEL PORTD
2
movlw  B'11111111'
3
movwf  PORTD
...damit entfällt zumindest das ständige nachsehen im DB.

b)Das hier
1
movlw  B'0100001'
2
movwf  SSPADD
nur 7 von 8 Bit führen eventuell zum richtigen Ergebniss ...oder auch 
nicht;-)

von Osccon (Gast)


Lesenswert?

Chris B. schrieb:
> a) Fehler bei der Bankumschaltung: die Verwendung von Macros ist völlig
> unnötig und Fehlerträchtig. Dafür bietet der Assembler die Anweisung
> BANKSEL gefolgt vom jeweiligen Register. Also an Stelle vonBANK0
> movlw  B'11111111'
> movwf  PORTDschreibt man: BANKSEL PORTD
> movlw  B'11111111'
> movwf  PORTD...damit entfällt zumindest das ständige nachsehen im DB.

Das Problem dabei ist aber, dass ich dann jedesmal vor jedem Register, 
auf das ich zugreife will ein Banksel setzten müsste, was mir nicht so 
wirklich gefällt.

von Chris B. (dekatz)


Lesenswert?

Na ja wenn es auf ein paar Bytes mehr Flashverbrauch ankommt....
Sicherer ist es auf jeden Fall, nur mal hier ein Beispiel:
Gleich das hier
1
; Oscillator konfigurieren
2
BANK0
3
movlw  B'01110001' 
4
movwf  OSCCON

stimmt schon mal nicht, weil OSCCON beim 887 in Bank 1 liegt!...wäre mit 
BANKSEL OSCCON schon mal nicht passiert....

von Osccon (Gast)


Lesenswert?

Ok erwischt :)

von Osccon (Gast)


Lesenswert?

Ok habe es jetzt endlich hinbekommen.
Aber ein Problem habe ich noch.
Wie kann ich, wenn ein Slave Daten bekommen hat entscheiden ob ein ACK 
oder NACK zum Master zurückgegeben wird?
Weil der Interrupt bei einem Empfang erfolgt doch erst nach dem 9. Clock 
Signal, da ist das ACK/NACK ja schon abgeschickt worden, oder?

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.