Forum: Mikrocontroller und Digitale Elektronik AVR Interrupts priorisieren in C?


von Christoph Söllner (Gast)


Lesenswert?

Hi,
habe hier im Vergleich mit den 8051 eine Anleitung gefunden, wie man
auch bei den AVRs Interrupts priorisieren kann mit Rücksprungadresse
oder so?
Hat das vielleicht schon mal jemand in C (codeVision oder avrgcc) im-
plementiert?
Weil mein ursprünglicher Plan, einen 8051 zu nehmen schiefgeht, weil
dem sein UART (zumindest bei den Reichelt 5 EUR Teilen) keine 250kbs
hinbekommen, was ich benötigte...
Oder gibts dafür auch eine Alternative (5 EUR, Hersteller egal)

Danke, Christoph

von Peter D. (peda)


Lesenswert?

Du kannst beim AT89S52 doch T2 für die Baudrate nehmen, dann gehts.

Mußt natürlich nen entsprechenden Quarz nehmen (8, 16 oder 24MHz).


Echte Prioritäten beim AVR werden selten gemacht, da sehr umständlich.
Man muß in jedem low-Level Interrupt, sämtliche low-level Interrupts
disablen und dann SEI ausführen und vor dem RETI alles wieder zurück.

Oftmals wird daher nur ein SEI gemacht, was sämtliche Interrupts wieder
enabled. Geht aber nur gut, bei Timerinterrupts, wo bis zum nächsten
Interrupt eine definierte Mindestzeit besteht. Bei UART, I2C, extern
level usw. gibts die rote Karte (Stacküberlauf).


Peter

von Wolfgang Horn (Gast)


Lesenswert?

Hi, Christoph,

die Priorität der Interrupts ist beim Atmega festgelegt durch die
Rangfolge gemäß Interruptsprungtabelle.

Aber 250 kbps müßten machbar sein, wenn Du einen Atmega168 nimmst, den
du mit 24 MHz taktest.

ciao
Wolfgang Horn

von Christoph Söllner (Gast)


Lesenswert?

> Du kannst beim AT89S52 doch T2 für die Baudrate nehmen,
> dann gehts. Mußt natürlich nen entsprechenden Quarz nehmen
> (8, 16 oder 24MHz).
Oje, ich seh schon, 8051 ist nichts für mich. Hab grad mal im
DB nachgesehen, und da war die maximale Baud-Rate mit 115k an-
gegeben. Der Satz "T2 nehmen" sagt mir nun nichts, obwohl er
sicher richtig ist...

> die Priorität der Interrupts ist beim Atmega festgelegt durch
> die Rangfolge gemäß Interruptsprungtabelle.
Leider nein, ISR werden abgearbeitet, wie sie gerade kommen.
Weil auch die USART-ISR den INT0 (der oberste!) unterbricht
zur Zeit.

> Aber 250 kbps müßten machbar sein, wenn Du einen Atmega168
> nimmst, den du mit 24 MHz taktest.
250k sind auch jetzt machbar, ATmega16 und 16MHz.

Aber gut. Ich weiß nicht, vllt muß ich dann doch Features
streichen, schnüff :(

Christoph

von Peter D. (peda)


Lesenswert?

T0, T1, T2 sind die Timer, also einfach mal im DB unter Timer 2
nachsehen, wo der Baudgenerator-Mode beschrieben ist.

115200Baud ist nur die höchste PC-übliche Baudrate aber nicht der
Grenzwert der Hardware.


Peter

von Dieter (Gast)


Lesenswert?

"> die Priorität der Interrupts ist beim Atmega festgelegt durch
> die Rangfolge gemäß Interruptsprungtabelle.
Leider nein, ISR werden abgearbeitet, wie sie gerade kommen.
Weil auch die USART-ISR den INT0 (der oberste!) unterbricht
zur Zeit."


Natürlich hat Wolfgang Recht.
Was Du meinst, sind Interruptlevel.
Interruptprioritäten entscheiden, welcher Interrupt zuerst ausgeführt
wird, wenn sie gleichzeitig eintreffen.

von Christoph Söllner (Gast)


Lesenswert?

ok, point taken. Habt natürlich recht...

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.