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:
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.
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
movlwB'11111111'
3
movwfPORTD
schreibt man:
1
BANKSELPORTD
2
movlwB'11111111'
3
movwfPORTD
...damit entfällt zumindest das ständige nachsehen im DB.
b)Das hier
1
movlwB'0100001'
2
movwfSSPADD
nur 7 von 8 Bit führen eventuell zum richtigen Ergebniss ...oder auch
nicht;-)
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.
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?