Forum: Mikrocontroller und Digitale Elektronik TWINT Flag wird nicht gesetzt


von Kai (Gast)


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

von Kai (Gast)


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

von thkais (Gast)


Lesenswert?

Mega103 Kompatibilitätsmode beim Mega128 auch ausgeschaltet ?

von Kai (Gast)


Lesenswert?

"Mega103 Kompatibilitätsmode beim Mega128 auch ausgeschaltet?"
Ja, der ist aus. In dem 103er-Modus ist der 128er auch kaum zu
gebrauchen.

Gruß
Kai

von Kai (Gast)


Lesenswert?

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

von thkais (Gast)


Lesenswert?

Die Pull-Ups brauchst Du auf jeden Fall.

von Kai (Gast)


Lesenswert?

Ok, daran lag es.
Also TWI ohne PULL-UPs läuft nicht.

Danke
Gruß
Kai

von Peter (Gast)


Lesenswert?

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?

von peter (Gast)


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

}

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
Noch kein Account? Hier anmelden.