Forum: Mikrocontroller und Digitale Elektronik Atmega8 Uhr problem


von K. Y. (Firma: privat) (avrfreak12)


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
}

von Karl H. (kbuchegg)


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.

von Torsten K. (ago)


Lesenswert?

K. Yousef schrieb:
> if (++Hours == 24)
>       {
>         Hours = 0;
>
>          Seconds=0;

"Seconds" brauchst du an dieser Stelle nicht mehr (nochmal) auf 0 
setzen.

von Helfer (Gast)


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
}

von K. Y. (Firma: privat) (avrfreak12)


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.

von K. Y. (Firma: privat) (avrfreak12)


Lesenswert?

Torsten K. schrieb:
> K. Yousef schrieb:
>> if (++Hours == 24)
>>       {
>>         Hours = 0;
>>
>>          Seconds=0;
>
> "Seconds" brauchst du an dieser Stelle nicht mehr (nochmal) auf 0
> setzen.

Danke auch für den Beitrag mir zu Hilfen, ich habe dabei gedacht etwas 
bleibt hängen im Puffer und dann kann man so löschen.

von K. Y. (Firma: privat) (avrfreak12)


Lesenswert?

Helfer schrieb:
>
1
> // Uhr Versuch, Atmega8. 4MHz.
2
> 
3
> 
4
>

Recht herzlichen Dank, alles hat super geklappt. Here 
http://www.mikrocontroller.net/articles/Pollin_Funk-AVR-Evaluationsboard
wurde darüber etwas geschrieben aber ich habe das nicht wahrgenommen.

Danke nochmal.

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.