Atmega8 Uhr problem

OP (Firma: privat) #2118068
Hallo Leute,

Hier habe ich ein code für eine einfache Uhr zusammengestellt. Leider 
kriege ich nicht das was ich will am LCD. Die zahl der sekunden zahlt 
bis 59 oder 60 und springt zu 19 und aufwärts also nicht wieder von 
null.

Kann jemand mir helfen um festzustellen wo liegt ein Fehler im code.

Ich benütze ATmega8 @4 MHz, Genauigkeit ist mir jetzt nicht wichtig.
Ich lerne die TIMERx_OVF in Zahlen auf Display zu setzen.

Danke im Vorraus
1
\\Uhr Versuch, Atmega8. 4MHz.
2

3
#include <stdio.h>
4
#include <avr/delay.h>
5
#include <stdlib.h>
6
#include <avr/io.h>
7
#include <avr/pgmspace.h>
8
#include <avr/signal.h>
9
#include <avr/interrupt.h>
10
#include "lcd.h"
11

12

13
// define global variables 
14

15
volatile uint8_t Seconds;
16
volatile uint8_t Minutes;
17
volatile uint8_t Hours;
18
char buffer[4];
19

20
// ISR 
21
 ISR(TIMER1_OVF_vect)//
22
 {
23
    
24
  if (++Seconds ==60)
25
  {
26
    Seconds=0;
27
    
28
    if (++Minutes == 60)
29
    {
30
      Minutes = 0;
31

32
    
33
      if (++Hours == 24)
34
      {
35
        Hours = 0;
36

37
         Seconds=0;
38

39
  }
40
  
41
  }
42
  
43
  }
44

45
  }
46

47

48
  void init_timer(void)
49
  {
50
  
51
  TIMSK|=(1<<TOIE1);//enable overflow interrrupt.
52
  TCCR1B|=(1<<CS11);
53
  sei();    // enable global interrupts 
54
}
55

56

57
int main(void)
58
{
59
        
60
  
61

62
  init_timer();      // Timer init 
63
  lcd_init(LCD_DISP_ON);  // LCD-Display init 
64

65
    lcd_puts("Time");
66
    lcd_gotoxy(4,1);
67

68

69
    for (;;)        // Loop 
70
  
71
    {
72
    
73
      lcd_gotoxy(4,1);//
74
            lcd_puts(":");
75
      itoa(Hours, buffer,10);
76
      lcd_puts(buffer);
77
            
78

79
      lcd_gotoxy(7,1);
80
            lcd_puts(":");
81
        itoa(Minutes, buffer,10);
82
        lcd_puts(buffer);
83
      
84

85
      lcd_gotoxy(10,1);
86
            lcd_puts(":");
87
            itoa(Seconds,buffer,10);
88
          lcd_puts(buffer);
89
        
90
      }
91
}
#2118083
wenn du am LCD den Text 59 mit dem Text 1 überschreibst, dann 
überschreibt die 1 nur die 5, die 9 bleibt weiterhin sichtbar und du 
liest dann 19.

gib nach der der 1 (oder generell nach dem text) noch ein Leerzeichen 
aus, damit auch eine eventuell Textstelle von vorher gelöscht wird.
Gast #2118099
1
// Uhr Versuch, Atmega8. 4MHz.
2

3
#include <stdlib.h>
4
#include <avr/io.h>
5
#include <avr/interrupt.h>
6
#include <util/atomic.h>
7
#include "lcd.h"
8

9
// define global variables 
10

11
volatile uint8_t Seconds;
12
volatile uint8_t Minutes;
13
volatile uint8_t Hours;
14
char buffer[4];
15

16
ISR(TIMER1_OVF_vect)
17
{
18
  if( ++Seconds == 60 ) {
19
    Seconds = 0;
20
    if( ++Minutes == 60 ) {
21
      Minutes = 0;
22
      if( ++Hours == 24 ) {
23
        Hours = 0;
24
      }
25
    } 
26
  }
27
}
28

29
void init_timer(void)
30
{
31
  TIMSK |= (1<<TOIE1); //enable overflow interrrupt.
32
  TCCR1B |= (1<<CS11);
33
  sei(); // enable global interrupts 
34
}
35

36
int main(void)
37
{
38
  init_timer();
39
  lcd_init(LCD_DISP_ON);
40
  lcd_puts("Time");
41

42
  for(;;) {
43
    uint8_t h;
44
    uint8_t m;
45
    uint8_t s;
46

47
    // Siehe Artikel Interrupt
48
    ATOMIC_BLOCK(ATOMIC_FORCEON)
49
    {
50
      h = Hours;
51
      m = Minutes;
52
      s = Seconds;
53
    }
54

55
    // "Time:HH"
56
    // nicht itoa() verwenden, weil itoa bei einstelligen 
57
    // Zahlen keine führenden Nullen erzeugt!
58
    lcd_gotoxy(4, 1);
59
    buffer[0] = ':';
60
    buffer[1] = h / 10 + '0'; // Zehnerstelle
61
    buffer[2] = h % 10 + '0'; // Einerstelle
62
    buffer[3] = '\0';
63
    lcd_puts(buffer);
64
            
65
    // "Time:HH:MM"
66
    lcd_gotoxy(7, 1);
67
    buffer[0] = ':';
68
    buffer[1] = m / 10 + '0';
69
    buffer[2] = m % 10 + '0';
70
    buffer[3] = '\0';
71
    lcd_puts(buffer);
72

73
    // "Time:HH:MM:SS"
74
    lcd_gotoxy(10, 1);
75
    buffer[0] = ':';
76
    buffer[1] = s / 10 + '0';
77
    buffer[2] = s % 10 + '0';
78
    buffer[3] = '\0';
79
    lcd_puts(buffer);
80
  }
81
}
OP (Firma: privat) #2118466
Karl Heinz Buchegger schrieb:
> wenn du am LCD den Text 59 mit dem Text 1 überschreibst, dann
> überschreibt die 1 nur die 5, die 9 bleibt weiterhin sichtbar und du
> liest dann 19.
>
> gib nach der der 1 (oder generell nach dem text) noch ein Leerzeichen
> aus, damit auch eine eventuell Textstelle von vorher gelöscht wird.

Danke für die Hilfe ich werde es probieren.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 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.