Interrupt bei Timer1

Gast #396417
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
Angehängte Dateien:
Gast #396418
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).
Gast #396419
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
Gast #396421
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.
Gast #396422
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren