www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer Interrupt


Autor: Elos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen.

Ich Programmiere in C auf dem uC Infineon SAB-517 mit internem Takt 
(2GHz).

Ich versuche nun mit Timer und Interrupt den LED Port (P5) blinken zu 
lassen, leider klappt das nicht so wie es soll.

Hier mal der Code den ich bis jetzt verfasst habe:

#include <reg517.h>


void ISR (void)       // Interrupt Service Routine
{
int cnt;

TR1=0;                               // Timer stoppen
EAL=0;        // Alle Interrupts werden gesperrt
IEN0=0;        // Interrupt löschen
TH0=0x3C;        // Timer High-Bit laden  
TL0=0xAF;        // Timer Low-Bit laden
cnt++;        // Counter erhöhen
if (cnt==40)
  {
  P5=~P5;             // LED Port invertieren
  cnt=0;      // Counter zurücksetzen
  }
ET0=1;        // Interrupt zulsassen
EAL=1;        // Alle Interrupts freigeben
TR1=1;                               // Timer Starten
}

void IntVec (void) interrupt 0  // UP Interrupt
{
TF1=0;        // Timer overflow Flag löschen
ISR();        // Aufruf Interrupt Service Routine
}

void main (void)             // Hauptprogramm
{
int cnt=0;
TR1=0;        // Timer gestoppt
TMOD=TMOD&0xFD;      // Timer auf 16-Bit modus einstellen
TH0=0x3C;        // Timer High-Bit laden  
TL0=0xAF;        // Timer Low-Bit laden
TF1=0;        // Timer overflow Flag löschen
IEN0=0;        // Interrupt löschen
P5=0x00;        // LED Port loeschen
cnt=0;        // counter löschen
ET0=1;        // Interrupt freigeben
EAL=1;        // Alle Interrupts freigeben
TR1=1;        // Timer starten
while(1)        // Endlosschleife
{}
}


Ich hoffe ihr könnt mir den/die Fehler aufzeigen die ich gemacht habe!

Danke im voraus

Marco

Autor: Magnus M. (magnetus) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Elos schrieb:
> Ich Programmiere in C auf dem uC Infineon SAB-517 mit internem Takt
> (2GHz).
   ^^^^

Ich hoffe du nimmst es mir nicht übel, wenn ich den Wahrheitsgehalt 
dieser Angabe anzweifle  =)

Gruß,
Magnetus

Autor: Elos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry sollte heissen MHz nicht GHz

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach cnt in der ISR mal static, damit zwischen zwei ISR() Aufrufen der 
Wert nicht verloren geht bzw. stets neu undefiniert ist. Das cnt in 
der main() ist witzlos/überflüssig.
static int cnt = 0;

Autor: Elos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab ich ausprobiert, die LED's bleiben aber nach wie vor dunkel^^

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber grundsätzlich gelingt es dir ein Programm zu schreiben, um die LEDs 
leuchten zu lassen?

Du hast einen Mix aus Timer 0 und Timer 1:

> TR1=0;          // Timer 1 gestoppt
> TMOD=TMOD&0xFD; // Timer auf 16-Bit modus einstellen
> TH0=0x3C;       // Timer 0 High-Bit laden
> TL0=0xAF;       // Timer 0 Low-Bit laden

Ich bezweifle auch, dass Timer0 den Interruptvektor #0 hat.

> void IntVec (void) interrupt 0  // UP Interrupt

Das ist eher der External Interrupt 0 an Adresse 0003H. Der Timer 0 
Overflow Vektor müsste Nummer 1 auf Adresse 000BH sein. der Timer 1 
Overflow liegt nochmal woanders.

Dem Rest bin ich nach den beiden Problemstellen nicht mehr nachgegangen.

Autor: Elos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So habs jetzt hingekriegt! Das habe ich verändert:

- cnt global initialisiert
- alles auf timer 0 angepasst
- inerruptvektor 0 auf 1 geändert
- Die interrupt service routine dirkekt mit dem overflow-flag gestartet
- anstatt das ganze INTR-enable-register zu löschen nur noch direkt das
  interrupt flag 1 gelöscht:
 ET1=0; 
- und für die leserlichkeit die initialisierung in ein UP gepackt

hier der neue code:
#include <reg517.h>

int cnt;  // definition cnt als globale variable

void init (void)
{
cnt=0;    // Counter auf 0 setzen
TR0=0;    // Timer gestoppt
TMOD=TMOD&0xFD;    // Timer auf 16-Bit modus einstellen
TH0=0x3C;    // Timer High-Bit laden  
TL0=0xAF;    // Timer Low-Bit laden
TF0=0;      // Timer overflow Flag loeschen
ET1=0;      // Interrupt löschen
P5=0x00;    // LED Port loeschen
ET0=1;    // Interrupt freigeben
EAL=1;    // Alle Interrupts freigeben
TR0=1;    // Timer starten
}

void ISR (void) interrupt 1  // Interrupt Service Routine
{
TF0=0;
TR0=0;    // Timer stoppen
EAL=0;    // Alle Interrupts werden gesperrt
ET1=0;    // Interrupt loeschen
TH0=0x3C;  // Timer High-Bit laden  für 25ms
TL0=0xAF;  // Timer Low-Bit laden  für 25ms
cnt++;    // Counter erhöhen
if (cnt>=39)
  {
  P5=~P5;    // LED Port invertieren
  cnt=0;    // Counter zurücksetzen
  }
ET0=1;    // Interrupt zulsassen
EAL=1;    // Alle Interrupts freigeben
TR0=1;    // Timer starten
}



void main (void)  // Hauptprogramm
{
init();
while(1)  // Endlosschleife
{}
}

ein grosses dankeschön an stefan für die tolle hilfe =D

Gruss Marco

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sehr schön!

Wenn du später cnt außerhalb der ISR benutzen willst, schreib die 
Kennzeichnung volatile bei der Definition hinzu und achte auf 
atomaren Zugriff. Mehr dazu im Artikel Interrupt.

Autor: Elos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jop werd ich mir merken, dankeschön

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.