ATMEGA16 - Realisierung einer Digitaluhr

Gast #1899240
Lesenswert?
• ▲
▼
Hallo Leute,

ich bräuchte mal eure Hilfe denn ich komme leider überhaupt nicht weiter 
mit meinem Code. WinAVR bringt keine Fehler aber leider passiert halt 
überhaupt nichts wenn ich das Programm "brenne". Zur Beschreibung: Ich 
versuche eine Digitaluhr zu realisieren die im natürlich im Sekundentakt 
blinkt.

Hier mein C-Quellcode:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/signal.h>
4

5

6
int second;
7
int minute;
8
int hour;
9

10
ISR( TIMER1_OVF_vect ) { 
11
    TCNT1 = 49911;                            
12
    add_second();
13
}
14

15
void add_second(void){
16
    
17
    second++;
18
    
19
    if (second == 60) {
20
        second = 0;
21
        minute++;
22
        if (minute == 60) {
23
            minute = 0;
24
            hour++;
25
            if (hour == 24) { hour = 0; }
26
        }
27
    }
28
}
29

30

31

32
void timerinit(void){
33
    TIMSK|=(1<<TOIE1);            //Aktivierung des Überlaufinterrupts
34
    TCCR1B|=(1 << CS12) | (1 << CS10);    //Prescaler auf 1024
35
    TCNT1=49911;                //Ladewert für Timer1 für 1s Verzögerung
36
}
37

38

39

40
int main( void ){
41
    DDRA  = 0xFF;                //PortA als Ausgang definieren
42
    DDRC  = 0xFF;
43
    DDRD  = 0xFF;
44
    
45

46
    timerinit();                //Timer initialisieren
47
    sei();                        //Interrupts global zulassen
48
    
49

50
    while( 1 ) {                // Endlosschleife
51
        PORTA = hour;
52
        PORTD = second;
53
        PORTC = minute;
54
    }
55
    
56
    return 0;
57

58
}

Für eure Bemühungen im voraus vielen Dank.

MfG

Frank
#1899361
Lesenswert?
• ▲
▼
@  Christian H. (netzwanze) Benutzerseite

>Alle Variablen, die in einer Interrupt-Routine verändert werden, müssen
>volatile sein.

Nicht ganz.

> Ansonsten merkt der Compiler nicht, dass sich die
>Variable verändert und optimiert sie weg.

Kaum. Er optimiert aber ggf. den ZUGRIFF. Siehe Artikel Interrupt.
Persönliche Seite #1899394
Lesenswert?
• ▲
▼
Falk Brunner schrieb:
> @  Christian H. (netzwanze) Benutzerseite
>
>>Alle Variablen, die in einer Interrupt-Routine verändert werden, müssen
>>volatile sein.
>
> Nicht ganz.

Ok, nicht alle, sondern nur die, welche im Interrupt und in der 
Hauptschleife verwendet werden.

>> Ansonsten merkt der Compiler nicht, dass sich die
>>Variable verändert und optimiert sie weg.
>
> Kaum. Er optimiert aber ggf. den ZUGRIFF.

Stimmt, mal wieder zu voreilig geschrieben. Ich meinte auch den Zugriff.

Hier ein Beispiel, was ich meinte (hoffe mal, dass es so besser ist):

main:
1
variable = 1;
2
while (1) {
3
  if (variable == 2) {
4
    mach_licht_aus();
5
  }
6
}

wird optimiert zu:
1
variable = 1;

da sich innerhalb der Schleife ja scheinbar nichts mehr verändert. Der 
IF-Vergleich wird also nie zutreffen (so jedenfalls die Meinung des 
Compilers).

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.