Forum: Mikrocontroller und Digitale Elektronik TWI_Start bringt hin und wieder fehler


von Marco (Gast)


Lesenswert?

Servus,

ich hab hier einen Atmega328 und über I2C einen SL030 (MIFARE 
Kartenleser) angeschlossen.

das auslesen der Karten geht auch, hin und wieder tritt aber ein fehler 
auf
1
uint8_t TWI_Start(uint8_t Adresse)
2
{
3
4
  TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);                    // In das Register TWCR (Control) Startbedingungen Schreiben bzw. senden
5
  while (!(TWCR & (1<<TWINT)));                        // Warten Bis die interrupt flag eine 1 zurück gibt Senden abgeschlossen
6
  if ((twst != TWI_START) && (twst != TWI_REP_START)) LEDRED_AN();      // Prüfe ob TWSR den "Start-Erfolgt-Wert" hat
7
  TWDR = Adresse;                                // Setze die Adresse und die des I2C in das Register
8
  TWCR=(1<<TWINT)|(1<<TWEN);                          // Sende den Inhalt des TWDR über den Bus
9
  while (!(TWCR & (1<<TWINT)));                        // Warte bis das Senden abgeschlossen ist                            // Setze twst auf Wert des TWSR ohne die TWSP
10
  if ((twst != TWI_MTX_ADR_ACK) && (twst != TWI_MRX_ADR_ACK)) LEDYEL_AN();  // Prüfe ob TWSR den Status "Gesendet und Bestätigung erhalten" hat
11
  return 0;
12
}


beim Starten des buses
kommt dann bei Prüfe ob TWSR den Status "Gesendet und Bestätigung 
erhalten" hat meine Gelbe LED was einem fehler gleich kommt danach geht 
es dann logischerweise auch nicht weiter wenn der fehler auftritt muss 
man den atmega aus und wieder einschalten nach dem neustart geht es dann 
wieder

hatte jemand schonmal das problem oder kann mir sagen was ich falsch 
gemacht habe?

ich gebe auch gerne noch infos zum code raus wenn ihr mir sgt was ihr 
braucht.

TWBR = 255 TWPS = 0
das sind dann so ca 2kbit
der schaltungsaufbau ist recht simpel an dem antmega sind nur der I2C, 
ISP und an PD2 der SL030_OUT (der eine 1 liefert wenn kein und eine 0 
wenn eine Karte da ist) angeschlossen und natürlich noch die C für die 
spannungsversorgung
pullups am I2C sind auch dran. je 4,7kohm

schonmal danke.

von Joachim B. (jar)


Lesenswert?

Marco schrieb:
> while (!(TWCR & (1<<TWINT)));

Endlosschleife

Marco schrieb:
> wenn der fehler auftritt muss
> man den atmega aus und wieder einschalten

wegen oben, kein Wunder, wie wäre es mit einem Timer einen Zähler 
mitlaufen lassen der nach Zeit X die Schleife verlässt?

Marco schrieb:
> pullups am I2C sind auch dran. je 4,7kohm

können auch mal kleinere bis 2k probiert werden und sie sollten stets am 
Ende der LEitung beim letzten Teilnehmer sitzen, nicht am Master

von Oliver S. (oliverso)


Lesenswert?

Marco schrieb:
> das auslesen der Karten geht auch, hin und wieder tritt aber ein fehler
> auf

Was ja kein Wunder ist, denn der Code, so wie er da steht, kann 
überhaupt nicht funktionieren. Ersetz den nochmal mit dem 
Fleury-Original.

Oliver

von Klaus (Gast)


Lesenswert?


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.