Etwas lesbarer formatiert (keine .txt anhängen sondern .c!)
1 | #include <avr/io.h>
|
2 | #include <avr/delay.h>
|
3 |
|
4 | // Definition
|
5 |
|
6 | char cZahl[100] = "0";
|
7 | int nTicks = 0;
|
8 | int geschwindigkeit = 0;
|
9 | int nCycles;
|
10 |
|
11 | // Hauptprogramm
|
12 |
|
13 | int main(void)
|
14 | {
|
15 | // Ein und Ausgänge setzen
|
16 | DDRB = 0x00; // Port B als Eingang
|
17 | PORTB = 0xFF; // alle internen Pullups an PORTB an
|
18 |
|
19 | // Initialisierung des Displays
|
20 | DDRD = 0xFF;
|
21 | // alle PORTD Ausgänge sind vom RESET her implizit LOW
|
22 |
|
23 | wait_ms(200);
|
24 | lcd_init();
|
25 |
|
26 | // Endlos Schleife
|
27 | while(1)
|
28 | {
|
29 | if (!(PINB & (1<<PB0)))
|
30 | {
|
31 | nCycles = 0;
|
32 | TCNT1L=0; //timer auf 0 Setzen
|
33 | TCCR1B|=(1<<CS11)|(1<<CS10); //Timer Starten
|
34 | }
|
35 |
|
36 | if(!(PINB & (1<<PB1)))
|
37 | {
|
38 | TCCR1B |= (0<<CS11)|(0<<CS10)|(0<<CS12); //Timer Stoppen
|
39 |
|
40 | /* Geschwindigkeit berechnen
|
41 | und ausgeben, dabei sollten keine Fliesskommazahlen
|
42 | verwendet werden.
|
43 | v = S / T;
|
44 | T = (nCycles * 65536 + nTicks) / 1250000
|
45 | S = 1 / 5
|
46 |
|
47 | dann wird v zu
|
48 | v = 1/0,29 * (1250000 / (nCycles * 65536 + nTicks))
|
49 | = 362500 / (nCycles * 65536 + nTicks)
|
50 |
|
51 | und nun noch in km/h
|
52 | v = (362500 * 3600) / (nCycles * 65536 + nTicks) * 1000
|
53 | = (362,5 * 3600) / (nCycles * 65536 + nTicks)
|
54 | = 1305000 / (nCycles * 65536 + nTicks)
|
55 | */
|
56 |
|
57 | nTicks= ICR1L;
|
58 | geschwindigkeit = (int) (1305000L / (nCycles * 65536L + (long) nTicks));
|
59 |
|
60 | itoa(geschwindigkeit,cZahl, 10); // convertiert int zu char
|
61 | lcd_write_s(cZahl); // Gibt variable auf display aus
|
62 |
|
63 | wait_ms(10);
|
64 | lcd_clear();
|
65 | lcd_home();
|
66 | }
|
67 | }
|
68 | }
|
Ich sehe nirgends einen Timer laufen.
Es fehlt der Teil wo der Timer Overflow Interrupt in TIMSK enabled wird
und auch das sei() zum globalen Enablen der Interrupts.
Und auch die ISR vom Timerüberlauf fehlt. Also der Teil wo nCycles
hochgezählt wird. Mit dem Auslesen der Restticks per nTicks= ICR1L; bin
ich unsicher aber tendenziell eher misstrauisch. Müsste man ins
Datenblatt schauen.
Und das Stoppen des Timers dürfte so nicht funktionieren. Du kannst
keine Bits löschen, indem du sie verODERst. Näheres unter
Bitmanipulation. Das Stoppen würde man auch nicht durch Wegnehmen
des Takts machen, sondern indem man das Enable Bit in TIMSK löscht
(bevorzugt).
Die 1250000 kommt mir auch verdächtig vor. Bei 1 MHz und Vorteiler 8
wären 125000 verständlich. Hast du einen 10 MHz Quarz am AVR oder nur
eine 0 zuviel?