Atmega8 Uhr problem

OP (Firma: privat) #2118068
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren