So jetzt wird das ganze soweit fehlerfrei kompiliert. Allerdings habe ich immer noch das Problem das es nicht das tut was es soll! Ich wollte damit einen SD20 ansprechen. Ich habe das ganze jetzt mal so geändert das ich es an PortA ablesen kann wenn ein sendeversuch fehlgeschlagen ist.
Und bei mir wird immer der PortA auf 0x02 geschaltet also bleibt das Programm an folgender stelle hängen:Code:#include <avr/io.h> #include <inttypes.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <avr/delay.h> #include <avr/twi.h> #include <stdlib.h> /*für exit*/ /*SD20 Adresse mit Lese- oder Schreibbit*/ #define SD20_W 0xC2 #define SD20_R 0xC3 typedef unsigned char BYTE; typedef unsigned short WORD; void i2c_start(BYTE ADRESSE) { TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); /*Startbedingung senden*/ while (!(TWCR & (1<<TWINT))); /*Darauf warten dass TWINT gesetzt wurde was aussagt das die Startbedingung gesendet wurde*/ if ((TWSR & 0xF8) != TW_START) PORTA=0x01; /*Überprüfen ob START erfolgreich gesendet wurde sonst abbrechen*/ TWDR = ADRESSE; /*Slave Adresse in TWDR laden*/ TWCR = (1<<TWINT)|(1<<TWEN); /*TWINT und TWEN löschen damit die ADRESSE gesendet wird*/ while (! (TWCR & (1<<TWINT))); /*Darauf warten dass TWINT gesetzt wurde was aussagt dass die ADRESSE gesendet wurde*/ if ((TWSR & 0xF8) != TW_MT_SLA_ACK) PORTA=0x02; /*Überprüfen ob ADRESSE erfolgreich gesendet wirde sonst abbrechen*/ } void i2c_data(BYTE DATA) { TWDR = DATA; /*DATA in TWDR laden*/ TWCR = (1<<TWINT)|(1<<TWEN); /*TWINT und TWEN löschen damit die DATA gesendet wird*/ while (! (TWCR & (1<<TWINT))); /*Darauf warten dass TWINT gesetzt wurde was aussagt dass die DATA gesendet wurde*/ if ((TWSR & 0xF8) != TW_MT_DATA_ACK) PORTA=0x04; /*Überprüfen ob DATA erfolgreich gesendet wirde sonst abbrechen*/ } void i2c_stop(void) { TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); /*Stopbedingung senden*/ } int main(void) { DDRA=0xFF; PORTA=0x0; i2c_start(SD20_W); i2c_data(0x01); i2c_data(0x7F); i2c_stop(); while(1) {} }
woran könnte das liegen?Code:if ((TWSR & 0xF8) != TW_MT_SLA_ACK) PORTA=0x02;
So das habe ich noch zum ansprechen eines SD20 auf der Roboter-Teileseite im Forum gefunden:
Ein Schreibzugriff läuft also wie folgt ab:
- Startbedingung
- Adresse senden RW-Bit LOW (0xc2 / 194)
- Register senden (z.B. 1 für Servo 1)
- Wert schreiben (127 für Mittelstellung)
- Stopbedingung
Läuft mein schreibzugriff auch so hab oder habe ich da etwas falsch gemacht?







Zitieren

Lesezeichen