Forum: Mikrocontroller und Digitale Elektronik großes Prob mit PCF8574P


von Felix Fellhauer (Gast)


Lesenswert?

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"

von Felix Fellhauer (Gast)


Lesenswert?

hat denn niemand ne ahnung an was des liegen könnte??

von thkais (Gast)


Lesenswert?

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

von Felix Fellhauer (Gast)


Lesenswert?

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?

von Peter D. (peda)


Lesenswert?

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
Noch kein Account? Hier anmelden.