Timer Programm gibt komische Werte aus!

Gast #1076140
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...
Angehängte Dateien:
Persönliche Seite
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?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.