Forum: Mikrocontroller und Digitale Elektronik AT89C51ED2 & Interrupt


von Herbert Hanser (Gast)


Lesenswert?

Hallo,

wie erzeugt man mit dem genannten Controller einen Interruptbefehl in C?

Ich würde gerne zwei Interruptroutinen erzeugen, wenn sich an einem 
Eingang des Port 1 ein Pegel ändert (-> Taster angeschlossen) und wenn 
der Timer0 überläuft.

Habe leider noch nichts diskretes über die Interruptroutinen gefunden, 
wie der Syntax aussieht etc und aus dem Datenblatt werde ich über die 
Register auch nicht schlau, wäre also über alle Tipps sehr dankbar!:)

Müsste das ungefähr so aussehen? (für Timer0):

void Timer0 (void) interrupt 1
{

}

MfG Herbert

von Häsch Define (Gast)


Lesenswert?

Herbert Hanser schrieb:

> Ich würde gerne zwei Interruptroutinen erzeugen, wenn sich an einem
> Eingang des Port 1 ein Pegel ändert (-> Taster angeschlossen) und wenn
> der Timer0 überläuft.

Dann kannst du im Timer-Interrupt auch den Pinpegel abfragen. Oder 
Interrupts priorisieren, und beim Tastendruck ein Flag setzen. Es gibt 
da viele Möglichkeiten.

Aber eine Tastenentprellung geschieht normalerweise über den 
Timerinterrupt mit zyklischer Pinabfrage und Softwarefilterung.

Wenn man aber nur gelegentlich mal einen Tastendruck erkennen möchte, 
und die Prellung egal ist, dafür reicht der externe Interrupt mit 
Flankentriggerung.

von Herbert Hanser (Gast)


Lesenswert?

Häsch Define schrieb:
> Wenn man aber nur gelegentlich mal einen Tastendruck erkennen möchte,
> und die Prellung egal ist, dafür reicht der externe Interrupt mit
> Flankentriggerung.

Das Problem ist, dass 8 Taster angeschlossen werden.

Ziel im Programm wäre es, bei einem der Tastendrücke die ISR zu starten, 
zu überprüfen, welcher Taster betätigt wurde und dann die entsprechende 
Funktion zu starten, um den Tastendruck umzusetzen.

So ähnlich wäre das bei einem weiteren Interrupt, dieser soll bei einer 
internen Signaländerung gestartet werden.

von Häsch Define (Gast)


Lesenswert?

Herbert Hanser schrieb:

> Häsch Define schrieb:
>> Wenn man aber nur gelegentlich mal einen Tastendruck erkennen möchte,
>> und die Prellung egal ist, dafür reicht der externe Interrupt mit
>> Flankentriggerung.
>
> Das Problem ist, dass 8 Taster angeschlossen werden.
>
> Ziel im Programm wäre es, bei einem der Tastendrücke die ISR zu starten,
> zu überprüfen, welcher Taster betätigt wurde und dann die entsprechende
> Funktion zu starten, um den Tastendruck umzusetzen.
>
> So ähnlich wäre das bei einem weiteren Interrupt, dieser soll bei einer
> internen Signaländerung gestartet werden.

Such mal hier im Forum nach Tastenentprellung. Mir schwebt da noch was 
von Peter Dannegger im Kopf, wo es auch ein Beispiel in der Codesammlung 
geben soll.

Vernünftige Einlesung von Mehrfachtaten geht nur über einen Timer mit 
zyklischer Einlesung der Tastenzustände und dann Entprellung.

von Wolfgang B. (et-tutorials) Benutzerseite


Lesenswert?


von Herbert Hanser (Gast)


Lesenswert?

Häsch Define schrieb:
> Such mal hier im Forum nach Tastenentprellung. Mir schwebt da noch was
> von Peter Dannegger im Kopf, wo es auch ein Beispiel in der Codesammlung
> geben soll.
>
> Vernünftige Einlesung von Mehrfachtaten geht nur über einen Timer mit
> zyklischer Einlesung der Tastenzustände und dann Entprellung.

Okay, ich verstehe was du meinst und ich denke ich kann das umsetzen.
Vielen Dank!

Nach wie vor verstehe ich nur noch nicht ganz, wie der Funktionskopf der 
Interruptroutine dann aussehen muss ....


Das ganze wäre dann ja auch theoretisch im main-Programm realisierbar; 
innerhalb einer while-Schleife, amirite?

von Peter D. (peda)


Lesenswert?

Herbert Hanser schrieb:
> Nach wie vor verstehe ich nur noch nicht ganz, wie der Funktionskopf der
> Interruptroutine dann aussehen muss ....

Das hängt vom Compiler ab.
Die obige syntax ist für den Keil C51 o.k.

Herbert Hanser schrieb:
> Das ganze wäre dann ja auch theoretisch im main-Programm realisierbar;
> innerhalb einer while-Schleife, amirite?

Nur hast Du da keinerlei definiertes Zeitintervall.
Hat das Main nichts zu tun, sind es nur wenige µs, ist es beschäftigt 
sinds vielleicht mehrere s und der Tastendruck geht verloren.
Ein konstanter Timerinterrupt (z.B. 10ms) ist erheblich besser.

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.