TWINT Flag wird nicht gesetzt

Gast #277000
Lesenswert?

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
Gast #277001
Lesenswert?

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
Gast #277009
Lesenswert?

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);

}

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