Hallo, ich schreibe gerade für den Atmega128L im AVR-GCC die nötigen Routinen für die I2C-Steuerung. Für die Initialisierung setze ich dabei folgende Register: TWAR = 0x00; TWBR = 0xFF; TWSR |= 0x00; TWDR = 0x00; Beim Code für den Schreibzugriff hängt der Compiler in der Abfrage-Schleife fest: CS_CLEAR; TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //Übertrage StartCond while (!(TWCR & (1<<TWINT))); Offenbar wird das TWINT-Flag nie gesetzt. Selbst wenn ich nur den AVR ohne Peripherie laufen lasse hängt er an dieser Stelle. Woran liegt das? Vielen Dank im Vorraus Gruß Kai
Ich muss diesen Beitrag nochmal pushen, da mir das Problem sehr unter den Nägeln brennt und ich bisher keine Lösung finden konnte. Selbst der Logic-Analyser zeigt weder auf der SCL noch auf der SDA Leitung eine Reaktion, wenn ich die Start-Condition wie im Handbuch beschrieben einleite. Kennt jemand das Problem? Danke Kai
"Mega103 Kompatibilitätsmode beim Mega128 auch ausgeschaltet?" Ja, der ist aus. In dem 103er-Modus ist der 128er auch kaum zu gebrauchen. Gruß Kai
Kann es sein, dass es daran liegt, dass an den TWI-Leitungen keine PULL-UP-Widerstände hängen? Ich dachte, wenn ich die Leitungen am Port auf High-Lege müsste das reichen. Gruß Kai
Ok, daran lag es. Also TWI ohne PULL-UPs läuft nicht. Danke Gruß Kai
Ich habe genau das gleiche Problem, dass TWINT in der Simulation mit AVR Studio nicht gesetzt wird! Wie kann ich das in AVR Studio Simulieren? Ohne reale Hardware mit Pull-ups?
Hier noch mein Programm: Wie kann ich das im AVR Studio Simulieren, damit ich auch einen Pegelwechsel an der SDA SCL-Leitung sehe? #include <avr/io.h> #include <avr/signal.h> #include <avr/interrupt.h> #define F_CPU 8000000 #define USART_BAUD_RATE 19200 #define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16L)-1) //#define SCHIEBETAKT 10000 //#define TWI_VORTEILER 1 //#define BITRATENFAKTOR ((F_CPU/SCHIEBETAKT)-16)/(8*TWI_VORTEILER) void twi_init(void) { //CLK 10 kHz TWSR = 1; TWBR = 98; } void twi_sende_byte(unsigned char adresse, unsigned char daten) { TWCR =(1<<TWINT) | (1<<TWSTA) | (1<<TWEN); //sende Startbedingung while(!(TWCR & (1<<TWINT))); //warte bis TWI Interrupt Flag = 1 TWDR = adresse; //Adresse in Senderegister schreiben TWCR = (1<<TWINT) | (1<<TWEN); //setze TWI Interrupt Flag = 1 while(!(TWCR & (1<<TWINT))); //warte bis TWI Interrupt Flag = 1 TWDR = daten; //Daten in Senderegister schreiben TWCR = (1<<TWINT); //setze TWI Interrupt Flag = 1 while(!(TWCR & (1<<TWINT))); //warte bis TWI Interrupt Flag = 1 TWCR =(1<<TWINT) | (1<<TWSTO); //sende Stopbedingung } int main(void) { sei(); twi_init(); twi_sende_byte(5,123); while(1); }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.