Forum: Mikrocontroller und Digitale Elektronik UART und I2C: Interrupt oder nicht


von TechInfo (Gast)


Lesenswert?

Hallo,

ich möchte mir folgende Konfiguration aufbauen:

Am TWI eines Atmega128 hängen I2C-Display und I2C-Tastatur. Tastatur und 
Display sind Slaves, der Atmega der Master. Da die Tastatur ein Slave 
ist, wird sie also vom Master gepollt auf Änderungen an den Ports.
Wenn die Tastatur gedrückt wird, soll dies zur Folge haben, dass ein 
Befehl über den USART verschickt wird. Gleichzeitig sollen Befehle über 
USART empfangen werden können, die dann eine Änderung des Displays 
bewirken.

Der TWI bietet ja nun die Möglichkeit, "interrupt-driven" oder mit 
Polling zu arbeiten. Bei Interrupt-Steuerung wird, wenn das 
TWI-Interrupt-Flag gesetzt ist (passiert immer dann, wenn das 
TWI-Interface Daten erhalten oder grade rausgeschickt hat), ein 
Interrupt im Controller ausgelöst. Beim Polling wird eben kein Interrupt 
ausgelöst, sondern das Interrupt-Flag wird dauernd abgefragt.

Die USART-Geschichte möchte ich auf alle Fälle mit Interrupts 
realisieren, indem beim Empfangen von einem Zeichen in die ISR 
gesprungen wird, und falls das Ende-Zeichen angekommen ist, ein Flag 
"Befehl angekommen" gesetzt wird, dass wiederum vom Hauptprogramm 
gepollt wird.

Jetzt meine Fragen:

Ist es sinnvoll, sowohl für I2C als auch für USART den Interrupt-Modus 
zu benutzen? Oder könnte es da Probleme geben und ich fahre besser, wenn 
ich I2C nur polle?

Was passiert, wenn zwei Interrupts genau gleichzeitig ankämen?

Und was passiert, wenn der USART ein Zeichen empfängt, während er am 
Senden ist?

von A.K. (Gast)


Lesenswert?

Alternative: Der Tastatur-Slave wird mit einer separaten 
Interrupt-Leitung ausgestattet. Die sagt dem Master, eben per Interrupt, 
dass es an der Zeit ist, mal wieder nachzuhaken. Erspart das Polling, 
wenn das stören sollte.

I2C ist langsam genug, dass man die entsprechenden Routinen per 
Interrupt betreiben sollte. Zumal die State-Machine ohnehin die gleiche 
ist und der entsprechende Code in irgendwelchen AppNotes sowieso schon 
rumliegt.

von TechInfo (Gast)


Lesenswert?

>Alternative: Der Tastatur-Slave wird mit einer separaten
>Interrupt-Leitung ausgestattet. Die sagt dem Master, eben per Interrupt,
>dass es an der Zeit ist, mal wieder nachzuhaken. Erspart das Polling,
>wenn das stören sollte.

Der Interrupt-Ausgang liegt bei der mir zur Verfügung stehenden Tastatur 
brach, Änderungen kommen da nicht in Frage.

>I2C ist langsam genug, dass man die entsprechenden Routinen per
>Interrupt betreiben sollte. Zumal die State-Machine ohnehin die gleiche
>ist und der entsprechende Code in irgendwelchen AppNotes sowieso schon
>rumliegt.

Also deiner Meinung nach sollte ich sowohl USART-Behandlung als auch I2C 
per Interrupt betreiben, und das beißt sich nicht?

von Andreas K. (a-k)


Lesenswert?

Warum sollte es sich beissen? Eines ist hoffentlich klar: In 
Interrupt-Handler gehören keine längeren Aktivitäten. Der übliche 
I2C-Handler macht das auch nicht.

von TechInfo (Gast)


Lesenswert?

Natürlich nicht. I2C ist ja sowieso ein sehr schmal gehaltenes 
Protokoll.

Was wäre denn der Vorteil von Interrupt-basierter I2C-Behandlung 
gegenüber Pollen auf das TWI-Interrupt-Flag?

von Andreas K. (a-k)


Lesenswert?

Wenn du einen extrem zeitkritischen Interrupts hast, aber einen 
Controller ohne priorisierierte Interrupts, dann kann es tatsächlich 
sinnvoll sein, nur ebendiesen einen Interrupt als solchen zu 
implementieren und alle anderen Ereignisse zu pollen.

Ansonsten verzögert deine Variante nur die I2C-Aktivitäten der Slaves, 
die dann u.U. auf den Pollzyklus vom Master warten. Geht freilich 
beides, und deine Variante ist weniger nebenläufig, etwas mit dem manche 
Leute Probleme haben.

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.