Hey leute ich habe ein Programm geschreiben^^ und leider funktioniert es nicht richtig!! aba leider weiss ich nicht warum? Die Zahlen die er auf dem Display ausgibt sind auch im - bereich....könnt ihr mir das erklären und ist das so mit der berechnung richtig? Ich benutze den ATMEGA8 und Programmiere in C...
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?
ich benutze ein 10 MHZ quarz.. aba warum wird dann der Timer im debugger gesstartet und wieder gestoppt?
muennx wrote: > ich benutze ein 10 MHZ quarz.. Ah so. Dann passt die 1250000, wenn der Prescaler auf 8 eingestellt wird. > aba warum wird dann der Timer im debugger gesstartet und wieder > gestoppt? Ich verstehe deine Frage nicht.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.