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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.