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.
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)
{}
}
Und bei mir wird immer der PortA auf 0x02 geschaltet also bleibt das Programm an folgender stelle hängen:
Code:
if ((TWSR & 0xF8) != TW_MT_SLA_ACK) PORTA=0x02;
woran könnte das liegen?
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?
Lesezeichen