Forum: Mikrocontroller und Digitale Elektronik Interrupt bei Timer1


von Sven (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ANFÄNGERFRAGE: !!!

Ich habe hier ein Projekt in das ich mich einarbeiten möchte, leider
zum ersten mal im Bereich der MC Programmierung!
Controller: 80C517 / 80C537

Und gleich beim Timer fängt es an!

#define  ZEIT      0xFC17
void timer1_init(void)
{
  TMOD&=0x1F;
  TMOD|=0x10;
  TH1=ZEIT>>8;
  TL1=ZEIT&0x00FF;
  ms_timer = 10;
}
Soweit klar, (hoffe ich)
Timer1 = keine Abhängigkeit von externer Freigabe
       = ist ein Timer, kein Zähler
       = Modus ist 1 (16-Bit Timer, ohne Autoreload)
TH1 = FCh
TL1 = 17h
somit im Timer1 Counter FC17h, als nächstes folgt der Start des Timers
mit:
void timer1_start(void)
{
  TR1=1; // Timer1 wird gestartet
  ET1=1; // Interrupt für Timer1 wird freigegeben
}

Nun zählt doch der "Timer 1 Counter" hoch und setzt (nach 1ms) das
Interruptflag TF1.
Soweit sollte ich es doch richtig verstanden haben, oder?

Nun da dieser Interrupt ausgelöst wurde suche ich in der
Interruptvektor Tabelle nach diesem Interrupt. In der User Manual für
meinen Baustein steht das nach Adresse 001Bh gesprungen wird.
Wie kann ich rausfinden, ob auf diesen Interrupt reagiert wird?
Den nach meinen Verständnid sollte darauf reagiert werden, im Anhang
ist ein Teil einer Init() Methode die den Timer startet und drauf
reagiert.
Ich hoffe ich habe mich nicht zu kompliziert ausgedrückt, oder gar zu
blöd!
Danke für eure Hilfe!

Sven

von johnny.m (Gast)


Lesenswert?

Da musst Du eine Interrupt-Routine schreiben, die eine Aktion ausführt,
wenn der Interrupt auftritt. Alternativ kann man natürlich das
Interrupt-Flag auch im Polling-Verfahren abfragen.

Weiß jetzt nicht, was für nen Compiler Du benutzt, aber in der
dazugehörigen Dokumentation sollte drinstehen, wie ein
Interrupt-Handler auszusehen hat (im Prinzip wie eine Funktion, nur mit
dem Hinweis auf den entsprechenden Interrupt-Vektor).

von Sven (Gast)


Lesenswert?

Danke dir erstmal für die rasche antwort!

Es ist bereits ein lauffähiges Programm, an dem ich auch schon einige
Änderungen (Nur Berechnungen und Auswertungen, nicht an Registern oder
Interrupts) gemacht habe. Da es mein erstes Projekt im MC Bereich ist,
wollte ich dieses Programm einfach mal aufdröseln.

Ich vermute du meinst so :
void timer_int (void) interrupt 3
{
   // Bla ..
}

Davon habe ich einige mit verschiedenen Interrupts, nur weiß ich leider
nicht welche Methode, von welchen Interrupt aufgerufen wird?
Dieses muss ja irgendwo zugeordnet sein, nur wo???

Sven

von Sven (Gast)


Lesenswert?

Compiler: Keil V3.2 / V8.0 Demo

von johnny.m (Gast)


Lesenswert?

> Dieses muss ja irgendwo zugeordnet sein, nur wo???

Im Zweifelsfall in der Headerdatei. Ist ne Weile her, dass ich mit mit
8051ern und Keil beschäftigt habe. Habe Keil auch net auf dem Rechner,
so dass ich jetzt nicht nachsehen kann.

von Sven (Gast)


Lesenswert?

Der Wink mit dem Zaunpfahl war gut! ;-)

Habe meine Googlesuche um Keil erweitert ;-)
Es ist Compiler abhänging beim Keil Compiler wird es so ermittelt:

http://www.phytec.de/phytec/faqs_tools/keil_c51_interruptnummer_fuer_eine_interruptquelle_.html

kurz:
n = (int_adresse aus vektortabelle -3 ) / 8
bei mir:
n = 1Bh = ( 27d - 3 ) / 8
n = 3

Nach dem Timer1 Interrupt wird :
"void timer_int (void) interrupt 3"
aufgerufen.

Hatte ich mir schon gedacht, nur wusste ich nicht sicher!

thx a lot

Sven

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.