www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMEGA16 - Realisierung einer Digitaluhr


Autor: Frank K (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>


int second;
int minute;
int hour;

ISR( TIMER1_OVF_vect ) { 
    TCNT1 = 49911;                            
    add_second();
}

void add_second(void){
    
    second++;
    
    if (second == 60) {
        second = 0;
        minute++;
        if (minute == 60) {
            minute = 0;
            hour++;
            if (hour == 24) { hour = 0; }
        }
    }
}



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



int main( void ){
    DDRA  = 0xFF;                //PortA als Ausgang definieren
    DDRC  = 0xFF;
    DDRD  = 0xFF;
    

    timerinit();                //Timer initialisieren
    sei();                        //Interrupts global zulassen
    

    while( 1 ) {                // Endlosschleife
        PORTA = hour;
        PORTD = second;
        PORTC = minute;
    }
    
    return 0;

}


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

MfG

Frank

Autor: MaWin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> int second;
> int minute;
> int hour;

nicht volatile?
(und das ist nur das erste was auffällt,
ich wüsste jetzt auch nicht von welcher
Frequenz der WinAVR ausgeht und hab mir
den Rest gar nicht angeguckt).

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Außerdem ist nichts initialisiert.
Ich bin mir jetzt aber nicht sicher, ob die Variablen beim Start 
vielleicht doch 0x00 sind. Normal ist das aber nicht. Sie könnten jeden 
beliebigen Wert haben.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>    TCNT1=49911;                //Ladewert für Timer1 für 1s Verzögerung

Schon mal etwas von CTC gehört?  Außerdem fängt der Timer nach dem 
ersten Überlauf wieder von Null an.

MfG Spess

Autor: Magnus M. (magnetus) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Schon mal etwas von CTC gehört?

Zustimmung  =)

>  Außerdem fängt der Timer nach dem ersten Überlauf wieder von Null an.
>
> MfG Spess

Deswegen lädt er ja auch im OVF Interrupt den Zähler wieder mit dem
"Init-Wert".

Gruß,
Magnetus

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Deswegen lädt er ja auch im OVF Interrupt den Zähler wieder mit dem
>"Init-Wert".

Stimmt. Da habe ich irgendwie sein 'add_second' für die ISR gehalten.

MfG Spess

Autor: Frank K (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DANKE. Lag am volatile. Jetzt funktionierts. Weiss zwar noch nicht genau 
für was das steht aber zumindest läufts. SUPI :))))

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Frank K (Gast)

>DANKE. Lag am volatile. Jetzt funktionierts. Weiss zwar noch nicht genau
>für was das steht aber zumindest läufts. SUPI :))))

siehe Interrupt

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alle Variablen, die in einer Interrupt-Routine verändert werden, müssen 
volatile sein. Ansonsten merkt der Compiler nicht, dass sich die 
Variable verändert und optimiert sie weg.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
variable = 1;
while (1) {
  if (variable == 2) {
    mach_licht_aus();
  }
}

wird optimiert zu:
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.