Forum: Mikrocontroller und Digitale Elektronik Timer Programm gibt komische Werte aus!


von muennx (Gast)


Angehängte Dateien:

Lesenswert?

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...

von muennx (Gast)


Lesenswert?

keine HILfe?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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?

von muennx (Gast)


Lesenswert?

ich benutze ein 10 MHZ quarz..

aba warum wird dann der Timer im debugger gesstartet und wieder 
gestoppt?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.