Forum: Mikrocontroller und Digitale Elektronik PIC 16F876 Timer Interrupt


von walli_l (Gast)


Lesenswert?

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

von TommyS (Gast)


Lesenswert?

> Ich habe leider kein Datasheet oder so ähnliches

Komisch. Zum Forum kommt man, aber auf die Microchip-Seite nicht. 
Komische Firewall-Policy...

http://ww1.microchip.com/downloads/en/DeviceDoc/30292c.pdf

Grüße,
TommyS

von Stephan (Gast)


Lesenswert?

1. datasheet besorgen (siehe link oben) ist nie verkehrt wenn man's mit 
einem unbekannten prozessor zu tun hat.

2. tipp von mir: wenn du mit nem PIC so eine einfache aufgabe lösen 
willst ist assembler dein freund. schau mal auf www.sprut.de, da wird 
alles super beschrieben. c ist meiner meinung nach hier völlig überladen 
und macht die sache nur komplizierter als sie ist.

hast du den code nur in einem simulator oder im zielchip getestet?

btw: ein pic16F... ist ein 8bit-controller, der tut sich mit 16 bit 
schwer... ich weiß natürlich nicht wie der compiler das löst... könntest 
du mal dein fertiges hex-file hochladen oder noch besser ein 
assembler-listing deines compilierten codes?

und was macht printf?? wo soll denn ein pic das hinprinten? auf die 
RS232?

von walli_l (Gast)


Angehängte Dateien:

Lesenswert?

> 1. datasheet besorgen

Erledigt!

> 2. Asm-File
Habe ich als Txt-Datei eingefügt, da das eine echt lange List ist

> und was macht printf?? wo soll denn ein pic das hinprinten? auf die
RS232?

Ja, das kann ich z.B. im HyperTerminal ausgeben lassen.

Gruß Walter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.