Kein ACK von PCA9633 auf TWI

OP #3130195
Lesenswert?

Hallo Leute! :)

Ist mein erster Thread auf dem Forum, also bitte nicht zu hart sein mit 
mir :D

Bin gerade dabei eine LED Steuerung über einen ATMEGA1280 (Assembler) zu 
schreiben, welcher die Befehle zur Steuerung über den TWI oder I²C Bus 
schicken soll.

Zuerst setze ich TWCR auf 10100101.. setze also das TWINT bit zurück 
(mit logischer 1), aktiviere Start Condition, aktiviere TWI und 
aktiviere den TWI-Interrupt

Dann warte ich auf den Interrupt von TWINT und überprüfe ob das TWSR 
0x08 ist (ohne Prescaler) - also ob die Start Condition gesendet wurde - 
und schicke danach die Slave-Adresse die ich ansprechen will:
ldi temp,0b00000010   //Set SLA+W...Address (1) + Write bit to Data 
Register
sts TWDR,temp

lds temp,TWCR
ori temp,0b10000011   //Clear TWINT (with logic 1) -> next step
andi temp,0b11011111  //Clear Start Condition Bit
sts TWCR,temp
sei
call WaitForInterrupt

Sobald der Interrupt auftritt überprüfe ich, ob ich 0x18 empfangen habe, 
was ACK entsprechen würde, empfange allerdings immer 0x20.. auch wenn 
ich als Adresse 0b00000000 nehme.. was ja alle Adressen ansprechen 
würde..

Die Adresse des PCA9633 ist allerdings hardwaremäßig auf 1 gesetzt und 
sollte daher passen..

Lese schon zum 20ten mal den Code durch und finde einfach den Fehler 
nicht :S

MfG Fabian
Gast #3130334
Lesenswert?

Hi

>ATMEGA 1280 SDA und SDL mit 10k auf 5V...

Die Pullups können ruhig kleiner sein.

>Zuerst setze ich TWCR auf 10100101.. setze also das TWINT bit zurück
>(mit logischer 1), aktiviere Start Condition, aktiviere TWI und
>aktiviere den TWI-Interrupt
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^

Wozu? Du willst doch keinen Interrupt benutzen.

>Von da aus auf ne andere
>Platine mit Kabel mit mehreren PCA9633

Du solltest erst mal mit einem Slave anfangen.

Ich habe dir mal meine TWI-Lib angehangen. Da kannst du mal vergleichen.

MfG Spess
Angehängte Dateien:
Gast #3130376
Lesenswert?

Hi

> vll findest du einen Fehler

Du wartest nicht auf das Ende deiner ausgelösten Aktionen. Wenn du z.B. 
eine Startbedingung auslöst
1
start_i2c:            ldi r16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
2
                      sts TWCR, r16              ; Start senden
3
                                       
4
start_i2c10:          lds r16,TWCR      
5
                      sbrs r16,TWINT     
6
                      rjmp start_i2c10
7
                      ....

Musst du warten, bis das TWINT-Bit wieder gesetzt ist. Erst dann kannst 
du TWSR auslesen.

MfG Spess
Gast #3130403
Lesenswert?

Hi

>    ....
>    sbrc  temp,TWINT          //Skip ReadTWSR, if TWINT is not set yet
>    call  ReadTWSR
>    cpi    temp,0x08          //Check if TWSR = 0x08...Start Condition sent
>    brne  WaitForStartAnswer

Bei einem Fehler hängt er sich hier auf.

MfG Spess
Gast #3130422
Lesenswert?

Hi

>Kann ich das nicht so machen??

Es geht nicht um TWINT. Dein Code wartet bis der Statuscode für eine 
erfolgreiche Aktion kommt. Und wenn der nie kommt?

Du kannst dir auch mal den Assembler-Code im Datenblatt ansehen. Der ist 
etwas 'übersichtlicher' gehalten.

MfG Spess

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren