www.mikrocontroller.net

Forum: Compiler & IDEs Timer-Interupt


Autor: Santaneedshelp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey, bin erst seit einigen Tagen dran mit C-Programmierung und Assembler 
und so. Komme da irgendwie null weiter, die Aufgabe übersteigt einfach 
mein Fassungsvermögen daher brauche ich eure Hilfe. Ich will ein 
C-Programm schreiben, dass an der Hardware die 8 vorhandenen LEDs 
nacheinander ein und ausgeschalten werden, also je eine LED leuchtet für 
1 sek und wird dann ausgeschalten danach geht die rechte LED daneben an, 
und so weiter, nach der 8 springt er wieder zu ersten.

Bisher habe ich mit nem Freund das hier ausgearbeitet aber so wirklich 
funktionieren tut es noch nicht.



*********************************

#include <LPC214X.H>

void t0isr(void) __irq;
unsigned int LEDStand;

int main(void) {

  IODIR1 = 0xFF0000;   /* Pin 1.16 bis Pin 1.23 als Ausgang setzen */
  T0PR = 12500;     /* Prescaler auf Millisekunden einstellen */
  T0TCR = 2;       /* Timer reset*/
  T0MCR = 3;      /* Bei Gleichheit Takt und T0MR0 = IR und 0 setzen*/
  T0MR0 = 1000;    /* Periodendauer wird auf 1 Sec gesetzt */
  T0TCR = 1;       /* Timer aktivieren */

  VICVectAddr0 = (unsigned long) t0isr; /* ISR Adresse */
  VICVectCntl0 = 0x24;   /*aktiv für Kanal 4 (=Timer0) */
  VICIntEnable = 0x10;    /* IR für Kanal 4 erlauben */
  LEDStand = 0xFF1000;

  while(1) {;}    /* nichts tun in der Hauptschleife */

}

void t0isr (void) __irq{

   if(LEDStand == 0xFF1000){
     IOCLR1 = 10000;
   }

   IOCLR1 = LEDStand;     /*LED ausschalten */
   LEDStand--;
   IOSET1 = LEDStand;    /*LED enschaltren*/

   if (LEDStand == 10000) {
     LEDStand = 0xFF1000;
   }


   T0IR = 0x10;  /* Damit Timer weiß das IR erfolgte*/
   VICVectAddr = 0;    /* Damit VIC weiß das IR erfolgte*/

}

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Santaneedshelp schrieb:
> die Aufgabe übersteigt einfach
> mein Fassungsvermögen

Dann unterteilt man die Aufgabe Schritt für Schritt:

- LED an / aus
- Blink-LED mit Delay
- Lauflicht mit Delay
- Lauflicht mit Timer und Überlaufbit
- Lauflicht mit Timerinterrupt, der ein Flag für die Mainloop setzt.
Und schlußendlich:
- Lauflicht im Timerinterrupt


Peter

Autor: Santaneedshelp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist es denn bisher so richtig was ich da geschrieben habe oder gibts 
verbesserungsvorschläge?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist schwierig zu sagen, weil es hier im Forum nicht viele gibt, die 
diesen Prozessor verwenden.

Aber das hier

LEDStand--;

schiebt auf jeden Fall nicht ein Bit um 1 Stelle weiter, wie es bei 
einem Lauflicht wohl sein soll.

Auch wirst du von
   LEDStand == 0xFF1000
ziemlich oft 1 abziehen müssen, bis dann endlich 10000 erreicht ist.

    0xFF1000  - 1 = 0xFF0FFF
    0xFF0FFF  - 1 = 0xFF0FFE
    0xFF0FFE  - 1 = 0xFF0FFD
    0xFF0FFD etc, etc

 Man beachte auch, dass du offenbar bei 1000 das 0x vergessen hast.

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, wenn Du ein Anfänger in C bist, dann solltest Du die Interrupts 
zuerst noch nicht verwenden.
Schreib einmal das Programm ohne Timer, einfach nur mit Verzögerungen 
(delayms() Funktion).
Wenn das funktioniert, gehst Du einen Schritt weiter.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hier

  IODIR1 = 0xFF0000;   /* Pin 1.16 bis Pin 1.23 als Ausgang setzen */
  T0PR = 12500;     /* Prescaler auf Millisekunden einstellen */
  T0TCR = 2;       /* Timer reset*/
  T0MCR = 3;      /* Bei Gleichheit Takt und T0MR0 = IR und 0 setzen*/
  T0MR0 = 1000;    /* Periodendauer wird auf 1 Sec gesetzt */
  T0TCR = 1;       /* Timer aktivieren */

  VICVectAddr0 = (unsigned long) t0isr; /* ISR Adresse */
  VICVectCntl0 = 0x24;   /*aktiv für Kanal 4 (=Timer0) */
  VICIntEnable = 0x10;    /* IR für Kanal 4 erlauben */

erscheint mir unlogisch.

Du konfigurierst zuerst den Timer. Gut.
Dann wird hier

  T0TCR = 1;       /* Timer aktivieren */

offenbar der Timer eingeschaltet.

Und erst danach konfigurierst du den Interruptvektor.

Das ist ungefähr so, wie wenn du den Reißverschluss deiner Hose erst 
dann aufmachst, nachdem du hineingestiegen bist.

Autor: santaneedshelp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habs jetzt so umgeschrieben ist das besser?:

******************************

#include <LPC214X.H>

void t0isr(void) __irq;
unsigned int LEDStand;

int main(void) {

  IODIR1 = 0xFF0000;   /* Pin 1.16 bis Pin 1.23 als Ausgang setzen */
  T0PR = 12500;     /* Prescaler auf Millisekunden einstellen */
  T0TCR = 2;       /* Timer reset*/
  T0MCR = 3;      /* Bei Gleichheit Takt und T0MR0 = IR und 0 setzen*/
  T0MR0 = 1000;    /* Periodendauer wird auf 1 Sec gesetzt */


  VICVectAddr0 = (unsigned long) t0isr; /* ISR Adresse */
  VICVectCntl0 = 0x24;   /*aktiv für Kanal 4 (=Timer0) */
  VICIntEnable = 0x10;    /* IR für Kanal 4 erlauben */
  LEDStand = 0xFF1000;

  T0TCR = 1;       /* Timer aktivieren */
  while(1) {;}    /* nichts tun in der Hauptschleife */

}

void t0isr (void) __irq{



   IOCLR1 = LEDStand;       /*LED ausschalten */
   if(LEDStand == 0x800000){  /* falls letztes LED an ist dann wieder 
auf erstes LED umstellen und Verschiebung überspringen, machen wir ja 
schon mit der for-Schleife*/
     LEDStand = 0x10000;
     goto Sprung1;
   }
   LEDStand = LEDStand<<1;
   Sprung1:
   IOSET1 = LEDStand;      /*LED einschalten*/



   T0IR = 0x10;  /* Damit Timer weiß das IR erfolgte*/
   VICVectAddr = 0;    /* Damit VIC weiß das IR erfolgte*/

}

Autor: klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sind die Interrupts global aktiviert ? Es gibt da ein Bit im CPSR...

Außerdem kann man noch irgendwo einstellen, ob der Interrupt als IRQ 
oder FIQ behandelt werden soll. Dies sollte hier wohl IRQ sein

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
santaneedshelp schrieb:
> Habs jetzt so umgeschrieben ist das besser?:

Was stört Dich denn daran, schrittweise vorzugehen?

Du brauchst keine Angst zu haben, so schnell flasht man nen MC nicht 
tot.
Und geht bestimmt schneller, als die Leute im Forum die Fehler raten zu 
lassen.


Peter

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.