Interrupt Timer
Dienstag, 22. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  CCS Compiler  |  Timer (CCS)  |  Interrupt Timer « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: Interrupt Timer  (Gelesen 1585 mal)
 
walli_l
Newbie
*
Offline Offline

Beiträge: 2


Profil anzeigen
« am: Februar 12, 2009, 11:07:11 »

Hi Leute.

Mein Chef hat mir ein selbstgebastelten Multiplexer in die Hand gedrückt
und mir nahegelegt, eine eigentlich simple Aufgabe damit zu
programmieren.

Die Aufgabe: Nach Tastendruck verschiedene LED's für 400 ms zum leuchten
bringen, anschliessend LED's ausschalten und warten, bis eine Taste
gedrückt wurden.

Diese Aufgabe habe ich auch hinbekommen, indem ich einfach nur
LED_ON(x)
delay_ms(400)
LED_OFF(x)
delay(400)
(x steht für verschiedene LED :-)

in C geschrieben habe.

Nun möchte ich aber jeweils die Zeit mit ausgeben, wann welche LED
aufgeleutet hat.
also z.B.

Zeit : 0    LED1
Zeit : 800  LED2
Zeit : 1600 LED3
...

Ich habe versucht, mich in Interrupts und timer einzulesen, allerdings
verstehe ich das nicht...bin so langsam verzweifelt und suche um Rat.

Hier ein Code für die Interrupts, das ich irgendwo gefunden habe und
versucht habe, das zu modifizieren.

Nach Tastendruck einfach mal eine gewisse Zeit (hier anfangs 50*20 =
1000us = 1 ms) warten und dann diese Zeit ausgeben. anschliessend wird i
incrementiert sodass beim nächsten mal 51*20 us gewartet wird usw...

Damit wollte ich nur testen, was für eine Zeit die Variable time
ausgibt.

Code:
#use rs232(baud=57600,xmit=PIN_C6,rcv=PIN_C7)   
#use delay(clock=20000000)                     


int16 overflow_count;


#int_timer1
timer1_isr() {
overflow_count++;
}


main() {
int32 time;
int key_0;
int j;
int i = 0;


setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
enable_interrupts(int_timer1);


while(TRUE) {

i++;
j = 1;


printf("Please press a key to start \n");

key_0=getc();

if (key_0==27){
   break;
 }

enable_interrupts(global);

set_timer1(0);
overflow_count=0;

while(j<i+50){

delay_us(20);

j++;
}

disable_interrupts(global);
time = get_timer1();


time = time + (overflow_count<<16);
time -= 15; // subtract overhead
printf("Time is %lu.%06u seconds.\r\n",time/5000000, (time/5)%1000000);
printf("Time is %u milliseconds.\r\n",time/5000);


}
}




Leider gibt mir dieser Code nicht das zurück, was ich erwartet habe.

Kann mir jemand sagen, wie ich das hinbekomme, oder ob das überhaupt
geht und kann mir evtl. jemand dann ein Code zeigen, wie das
realisierbar ist?

Chip : PIC16F876 - SP/20

Der Compiler ist CCS S.

Vielen Dank im Voraus.

Gruß Walter

Gespeichert
wberger
Full Member
***
Offline Offline

Beiträge: 204


Profil anzeigen
« Antworten #1 am: Februar 12, 2009, 19:46:49 »

Was hast du an externer Hardware dranhängen? Woher soll der ESC Tastendruck kommen, den du mit getc einliest? Kommt überhaupt was auf der seriellen Schnittstelle, oder kommt das Programm gar nicht da hin?

Gruß
  Wolfgang
Gespeichert
walli_l
Newbie
*
Offline Offline

Beiträge: 2


Profil anzeigen
« Antworten #2 am: Februar 12, 2009, 19:53:55 »

Was hast du an externer Hardware dranhängen? Woher soll der ESC Tastendruck kommen, den du mit getc einliest? Kommt überhaupt was auf der seriellen Schnittstelle, oder kommt das Programm gar nicht da hin?

Gruß
  Wolfgang

Der ESC-Tastendruck kommt von meinem PC, den ich über die RS232- Schnittstelle verbunden habe.
Damit kann ich über den  HyperTerminal kommunizieren. (z.B. über printf("");

Gruß Walter
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.039 Sekunden mit 19 Zugriffen.
 
Top! Top!