Hallo Leuz!! Ich habe volgendes problem, an dem ich jetzt schon fast 15h rumräzel ich schilder es mal, villeicht kann mir einer von euch einen tip geben. Ich habe an meinem at90s8515 via i2c zwei mal nen pcf8574P mit natürlich 2 verschiedenen adressen angeschlossen. an dem einen hängen 8 taster und an dem anderen 8 led´s. ich lese die tasterwerte von dem einen pcf in den µC. dort liegen die daten auch alle korrekt, hab ich nachgemessen. und dann gebe ich die daten an den anderen pcf, den mit den led´s, aus. aber da kommt das problem das funktioniert bei allen tastern außer beim taster7. wenn ich den taster 7 drüche, dann werden alle leds dunkler ?!?. aber wenn ich die led vom µc unabhängig von den tastern am andern pcf steuern lasse funktioniert alles tadellos. ich hoffe mir kann jemand helfen. THX mein CODE: .include "8515def.inc" .equ scl = 6 .equ sda = 7 .equ i2c_port = PORTC .equ i2c_pin = PINC .equ i2c_ddr = DDRC .def temp = r16 ; Stackpointer initialisieren ldi temp, LOW(RAMEND) out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp ldi r16, 0xff out DDRA, r16 out DDRC, r16 ldi r16, 0x00 out PORTA, r16 ldi temp, 25 out UBRR, temp sbi UCR,TXEN read: rcall i2c_start ldi r16, 0b01001101 rcall putbyte rcall getbyte mov r10, r16 out PORTA, r16 rcall i2c_stop rcall i2c_start ldi r16, 0b01000000 rcall putbyte mov r16, r10 rcall putbyte rcall i2c_stop rjmp read serout: ; ============================= ; Warteschleifen-Generator ; 4000 Zyklen: ; ----------------------------- ; warte 3999 Zyklen: ldi R20, $1F WGLOOP02: ldi R21, $2A WGLOOP12: dec R21 brne WGLOOP12 dec R20 brne WGLOOP02 ; ----------------------------- ; warte 1 Zyklus: nop ; ============================= ret delay: ; ============================= ; Warteschleifen-Generator ; 20000000 Zyklen: ; ----------------------------- ; warte 19999992 Zyklen: ldi R20, $BF WGLOOP0: ldi R21, $A7 WGLOOP1: ldi R22, $D0 WGLOOP2: dec R22 brne WGLOOP2 dec R21 brne WGLOOP1 dec R20 brne WGLOOP0 ; ----------------------------- ; warte 6 Zyklen: ldi R20, $02 WGLOOP3: dec R20 brne WGLOOP3 ; ----------------------------- ; warte 2 Zyklen: nop nop ; ============================= ret .include "i2c_routinen.txt"
Nur mal so ne Vermutung: Die 8574 können eigentlich nur einen Low-Pegel erkennen, d.h. man muß den 8574 mit den Tastern mit $FF vordefinieren und dann die Taster gegen Masse schalten lassen, oder mit entsprechenden Pull-Ups arbeiten. Dementsprechend ist es auch im Betrieb als Ausgang: Die LEDs müssen so angeschlossen werden, daß sie bei einem GND am 8574 leuchten. Einen belastbaren High-Pegel liefert der 8574 nur ganz kurz nach einem Schreibvorgang. Gruß Thomas
wenn ich alle led´s abklemme, d.h. die ausgätge vom 8574 stehen alleine und ich messe die spannungen, dann geht die spannung, wenn ich den entsprechenden taster drücke auch nich auf 0v aber bei allen anderen tastern gehz! nur nich bei dem an p7 und wie gesagt die daten liegen alle richtig im µc -> der fehler kann nicht am einlesen entstehen! an was kanns noch liegen?
Wenn Du als Master Daten liest, mußt Du immer nach jedem Byte ein ACK senden. Liest Du aber das letzte Byte, dann mußt Du danach ein NACK senden, damit der Slave weiß, daß er nun nichts mehr auf den Bus legen darf. Peter
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.