LED mit Hilfe der Timer blinken lassen
Mittwoch, 23. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  Programmiersprache C  |  LED mit Hilfe der Timer blinken lassen « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: LED mit Hilfe der Timer blinken lassen  (Gelesen 857 mal)
 
HamstA
Newbie
*
Offline Offline

Beiträge: 6


Profil anzeigen
« am: August 16, 2010, 08:25:30 »

Ich muss mich gerade in PIC-Programmierung (in C) reinarbeiten und mein Betreuer ist die Woche nicht da =(
Zuerst habe ich mit:

Code:
void blink_D3_LED_ms(int count,int time){
int i = 0;
for(i=0;i<count;i++){
D3_LED_on;
delay_ms(time);
D3_LED_off;
delay_ms(time);
}

LEDs blinken lassen.
Hat einwandfrei geklappt, jetzt will ich das ganze jedoch mit den Timern machen, vorzugsweise Timer 1 und 2.
Das Ziel ist 3 Leds blinken zu lassen:
1. LED im Takt von Timer 1
2. LED im Takt von Timer 2
3. LED mit Hilfe des period register und timer 1 im gleichen Takt wie timer 2

Dass ich mit interrupts arbeiten muss hab ich schon rausbekommen, der jetzige stand ist:

Code:
int flag = 0;
int flag2 = 0;

while(true){
  ENABLE_INTERRUPTS(INT_TIMER1);
          ENABLE_INTERRUPTS(INT_TIMER2);
  }

Die Interrupt-Routine sieht so aus:

Code:
void isr_timer1(){  
if (flag==0){
D3_LED_on;
flag = 1;
}
else {
D3_LED_off;
flag = 0;
}
}

und für timer 2 ebenso.

Funktioniert das so oder muss man das anderst angehen, ich kann es gerade nicht testen, da der Schlüssel für das DEV-board gerade nicht da ist.

Mein größtes Problem jedoch ist wie ich da jetzt noch das Blinken mit Hilfe des period registers mit reinbringe oder geht das gar nicht?

Und wie stellt man am besten die timer ein, mit welchem Takt kann man noch eine blinkende LED erkennen?

Vieln Dank für eure Bemühungen und Hilfe

MFG
Gespeichert
Master Snowman
Sr. Member
****
Offline Offline

Beiträge: 289



Profil anzeigen WWW
« Antworten #1 am: August 16, 2010, 10:55:56 »

hallo

ich kenne dein c-compiler nicht, daher kann ich dir nicht sagen, ob das vom syntax her funktionieren wird. von der idee her, funktioniert's (wenn ich jetzt nicht gerade was übersehen habe).

ein timer zählt hoch und beim überlauf von max-wert zu 0, generiert er einen interrupt. sprich, genau dann springt der PIC in deine interrupt-routine, bei der jedesmal die LED getoggelt wird. um die toggle-frequenz zu erhöhen, kannst du in der interrupt-routine den counter auf einen wert vorladen. nehmen wir an, der timer läuft von 0 bis 256 und du setzt ihn in der interrupt routine auf 128, so erhöht sich die frequenz um den faktor 2.
wenn du die toggle-frequenz verkleinern willst, so toggelst du die LED nicht bei jedem aufrufen der interruptroutine, sondern z.b. nur jedes 2. mal.
natürlich kannst du beide varianten gleichzeitig verwenden und so beliebige blinkfrequnezen erzeugen.

grüsse aus der Schweiz
« Letzte Änderung: August 16, 2010, 12:33:26 von Master Snowman » Gespeichert
HamstA
Newbie
*
Offline Offline

Beiträge: 6


Profil anzeigen
« Antworten #2 am: August 17, 2010, 11:15:08 »

Hey,

danke für deine Antwort.

Ich habe jetzt ein aderes Board auftreiben können um meine Programme zu testen. Es läuft.
Ich kriege auch 2 Timer synchron (Timer0 läuft mit ~344ms und Timer1 mit ~43ms) durch:
Code:
#INT_TIMER1                               //timer interrupt routine
void isr_timer1(){
if(flag1<15){
if (flag1<8){
D4_LED_off;
}
else {
D4_LED_on;
}
flag1++;
}
else {
D4_LED_on;
flag1=0;
}

Ich weiss nicht ob das saube rgelöst ist, aber es funktioniert.

Jetzt frage ich mich aber noch, wie das mit dme period register funktioniert. Manche timer haben ja so ein period register integriert, sodass man z.b. den takt halbiert mir pr2=0x0002. Übernimmt er das dann direkt in die Timer-initialisierung und wenn ich interrupt auslöse nimmt er den halbierten Takt oder muss ich das pr2 nochmal irgendwo einbauen?

Vielen Dank!
Gruß
Gespeichert
Master Snowman
Sr. Member
****
Offline Offline

Beiträge: 289



Profil anzeigen WWW
« Antworten #3 am: August 17, 2010, 12:26:51 »

liess dir mal diese seite durch, da ist alles schön erklärt. ist zwar alles in assembler, aber wenn du das prinz der verschiedenen timers verstanden hast, ist's in c auch kein problem mehr (sogar noch einfacher zu programmieren)
http://www.sprut.de/electronic/pic/grund/timer/timer.htm
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.042 Sekunden mit 19 Zugriffen.
 
Top! Top!