Forum: Mikrocontroller und Digitale Elektronik Priorität von Interrupt setzen


von thomas (Gast)


Lesenswert?

Hallo,

ich  habe ein kleines Programm gechrieben, in dem ich zwei 
Interrupt(senden und empfangen über UART) aktiviert habe.Jetzt will ich 
dass das Empfang eine höhe Priorität hat,dh wenn gleichzeitig Senden bzw 
Empfangenaktion sich treffen, soll zuesrt die Empfangenaktion 
gearbeitet.

thomas

von Micha (Gast)


Lesenswert?

Möglicherweise solltest du verraten welchen Controller du verwendet 
hast...

von Gast (Gast)


Lesenswert?

Du mußt in das IPRIR5-Register den Wert 9 schreiben. Dann klappt das!

von experte (Gast)


Lesenswert?

nein, nein das war bei der letzten Revision noch so - jetzt muss das 
GRTC.8 Bit getoglled werden!!

SCNR

von thomas (Gast)


Lesenswert?

ich benuzte der AT90CAN128

von gespannter (Gast)


Lesenswert?

Oh, das ist schwierig, geht nur in Basic. Kann ganz elegant mit 4 mal 
goto geloest werden.

von thomas (Gast)


Lesenswert?

hallo zusammen
bitte konnt ihr mehr Erklärungen für die Antwörte geben.

Danke

von Andreas K. (a-k)


Lesenswert?

Das waren alles sehr kreative Aufforderungen, den Typ zu enthüllen.

AVRs haben keine wirklich priorisierten Interrupts. Wenn es sehr eilig 
ist, kann man bei weniger wichtigen Interrupts im Handler die Interrupts 
wieder freigeben, wenn es sich um welche handelt deren Ursache mit 
Ansprung des Handler bereits gelöscht ist (was bei UART Interrupts 
nicht der Fall ist). Geht natürlich zu Lasten des Stacks, und wenn 
sehr viele gleichzeitig eintreffen kann es interessant werden.

von Kachel-Heinz (Gast)


Lesenswert?

> bitte konnt ihr mehr Erklärungen für die Antwörte geben.

Auf unüberlegt hingespuckte Fragen gibt es nunmal rotzige Antworten. Sie 
sollen Dir sagen, dass Du Deine Frage schlecht formuliert hast und Dich 
dazu erziehen, es beim nächsten mal besser zu machen.


Den AT90CAN128 kenne ich mangels Interesse an CAN nicht, ich vermute 
aber, das ist ein Mega128 mit CAN-Erweiterung, also ein AVR. AVRs haben 
aber keine echte Interrupt-Priorität, d.h. das Unterbrechen einer 
laufenden ISR durch einen anderen (höher priorisierten) Interrupt ist 
nicht vorgesehen. Es gibt zwar Möglichkeiten, in der ISR weitere 
Interrupts zu erlauben, aber dazu muss man schon sehr genau wissen, was 
man tut. Ich gehe deshalb nicht darauf ein.

Es wird Dir wohl nichts Anderes übrig bleiben, als Deine ISRs so kurz 
wie möglich zu halten (Daten sichern und per Merker beim Hauptprogramm 
anmelden) und die Verarbeitung der Daten in der Mainloop zu erledigen. 
Da es Dir vorrangig um RX und TX geht, solltest Du Ringbuffer dafür 
einrichten. Das schafft die Voraussetzung, die ISRs kurz halten zu 
können und beschleunigt die Datentransfer-Zugriffe der Mainloop (bzw. 
derer Routinen) sehr.

KH

von micha r. (Gast)


Lesenswert?

Alternativ könntest du nen PIC nehmen.
Die können sowas.

von Falk B. (falk)


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.