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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.