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.
1 | #use rs232(baud=57600,xmit=PIN_C6,rcv=PIN_C7)
|
2 | #use delay(clock=20000000)
|
3 |
|
4 |
|
5 | int16 overflow_count;
|
6 |
|
7 |
|
8 | #int_timer1
|
9 | timer1_isr() {
|
10 | overflow_count++;
|
11 | }
|
12 |
|
13 |
|
14 | main() {
|
15 | int32 time;
|
16 | int key_0;
|
17 | int j;
|
18 | int i = 0;
|
19 |
|
20 |
|
21 | setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
|
22 | enable_interrupts(int_timer1);
|
23 |
|
24 |
|
25 | while(TRUE) {
|
26 |
|
27 | i++;
|
28 | j = 1;
|
29 |
|
30 |
|
31 | printf("Please press a key to start \n");
|
32 |
|
33 | key_0=getc();
|
34 |
|
35 | if (key_0==27){
|
36 | break;
|
37 | }
|
38 |
|
39 | enable_interrupts(global);
|
40 |
|
41 | set_timer1(0);
|
42 | overflow_count=0;
|
43 |
|
44 | while(j<i+50){
|
45 |
|
46 | delay_us(20);
|
47 |
|
48 | j++;
|
49 | }
|
50 |
|
51 | disable_interrupts(global);
|
52 | time = get_timer1();
|
53 |
|
54 |
|
55 | time = time + (overflow_count<<16);
|
56 | time -= 15; // subtract overhead
|
57 | printf("Time is %lu.%06u seconds.\r\n",time/5000000, (time/5)%1000000);
|
58 | printf("Time is %u milliseconds.\r\n",time/5000);
|
59 |
|
60 |
|
61 | }
|
62 | }
|
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?
Ich habe leider kein Datasheet oder so ähnliches, auf dem Chip steht
aber
PIC16F876 - SP/20
Der Compiler ist CCS S.
Vielen Dank im Voraus.
Gruß Walter