Guten abend zusammen, ich habe ein kleines Problem mit meinem Drehzahlmesser Projekt, das die Drehzahl von einem Lüfter o.ä. auf einem LCD ausgeben soll. Das LCD (hapsim) wird anständig initialisiert und gibt auch den anfangswert 0 aus. Zum testen habe ich den INT0 zum auslösen auf eine der Hapsim Tasten gelegt. Wenn ich nun eine Taste drücke und so eine fallende flanke erzeuge sollte ISR(INT0_vect) ausgelöst werden und mit count++ die erzeugten flanken zählen. Nach 1sek liest ISR(TIMER1_COMPA_vect)den wert von count++ aus, übergibt ihn an das Hauptprogramm, wo ein string zur Ausgabe auf dem LCD erzeugt wird. Der wert auf dem LCD bleibt aber bei 0! Eventuell kann mal jemand über den code schauen und mir bei der Fehlersuche helfen? Habe versucht alles so gut wie möglich zu kommentieren. Kann OCR1A falsch berechnet sein? (ISR(TIMER1_COMPA_vect) Soll genau nach 1sek auslösen) Benutzt wird ein Attiny2313 @ 4MHz HAPSIM zum testen der LCD ausgabe. Vielen Dank für die Hilfe
1 | #include <stdlib.h> |
2 | #include <avr/io.h> |
3 | #include <stdio.h> |
4 | #include <avr/interrupt.h> |
5 | #include <util/delay.h> |
6 | #include <avr/pgmspace.h> |
7 | #include <math.h> |
8 | #include "lcd.h" |
9 | |
10 | |
11 | volatile uint16_t count=0; //Revolution Counter |
12 | volatile uint16_t rpm=0; //Revolution per minute |
13 | char buffer[16]; |
14 | |
15 | |
16 | int main(void) |
17 | {
|
18 | //INIT
|
19 | GIMSK |= (1<<INT0); //INT0 enable S.60 |
20 | MCUCR |= (1<<ISC01); //The falling edge of INT1 generates an interrupt request. S.60 |
21 | asm("sei"); //Global Interrupt enable |
22 | TCCR1B |= (1<<WGM12) | (1<<CS12) | (1<<CS10); //CTC Mode S.106 |
23 | //Prescaler 1024 S.107
|
24 | OCR1A = 3906; //Compare value (fCPU/(fOCnA*2*N)) (4MHz/(0.5Hz*2*1024) S.108 |
25 | TIMSK |= (1<<OCIE1A); //Triggers interrupt when timer count reaches compare value S.109 |
26 | lcd_init(LCD_DISP_ON); |
27 | lcd_clrscr(); |
28 | |
29 | |
30 | while(1) |
31 | {
|
32 | lcd_clrscr(); |
33 | itoa( rpm, buffer, 16 ); |
34 | lcd_puts(buffer); |
35 | _delay_ms(500); |
36 | }
|
37 | }
|
38 | |
39 | ISR(INT0_vect) |
40 | {
|
41 | //CPU jumps here automatically when INT0 pin detect a falling edge
|
42 | count++; |
43 | }
|
44 | |
45 | ISR(TIMER1_COMPA_vect) |
46 | {
|
47 | //CPU Jumps here every 1 sec
|
48 | rpm=count*60; |
49 | count=0; |
50 | }
|