Hast du keinen Timer mehr frei? Dort machst du Takte von 10 oder 100ms oder auch 1s. Die Eigentliche Ausgabe machst du in deinem Hauptprogramm.
Ein Programm sollte übrigens so aufgebaut sein, daß es keine Warteschleifen enthält.
Servus an Alle,
ich habe folgendes Problem:
Ich möchte in einer Zeile eines LCD (4x16) das Datum und die Zeit mit Sekunden ausgeben. Ach ja, dabei werde ich unterstützt von einem ATmega8.
Mein Problem hierbei ist nun, das ja mein eigentliches Programm parallel zum Zeitprog laufen sollte, da das Hauptprog unterschiedlich lange Zyklen hat. Würde ich allso nach jedem Zyklus einen Zähler incrementieren, so wäre die Uhr sehr ungenau!
Wie allso kann ich das realisieren?
Mit freundlichen Grüßen
EagleStar
Hast du keinen Timer mehr frei? Dort machst du Takte von 10 oder 100ms oder auch 1s. Die Eigentliche Ausgabe machst du in deinem Hauptprogramm.
Ein Programm sollte übrigens so aufgebaut sein, daß es keine Warteschleifen enthält.
Disclaimer: none. Sue me.
Timer? ich weiß das es die gibt, aber nicht wie ich auf die zugreif bzw wie ich mit den umzugehen habe.
Kannst du mir vielleicht ein vereinfachtes Beispiel dafür geben?
Ach ja, welches Problem würde sich aus der Kombination mit Warteschleifen ergeben? Warscheinlich nur die aktualisierung. Aber anstatt warteschl. könnte man ja dann mit dem Takt oder Timer arbeiten?
MfG EagleStar
Ein Beispiel für Timer-Programmierung hab ich im Wiki.
https://www.roboternetz.de/wissen/in...LED_blinken%29
Das ist zwar C, aber das Vorgehen in Assembler ist das gleiche.
Im Assembler schreibst du also 0 nach TCCR1A und (1 << WGM12) | (1 << CS10) nach TCCR1BCode:TCCR1A = 0; // Timer1 ist Zähler: Clear Timer on Compare Match (CTC, Mode #4) // Timer1 läuft mit vollem MCU-Takt: Prescale = 1 TCCR1B = (1 << WGM12) | (1 << CS10);
Mit den anderen SFRs wie TIMSK entsprechend. Falls dein Assembler diese Konstrukte nicht frisst (ich weiß net ob Atmel-Assembler so was kann, bei GNU-Assembler geht es. Dasz einfach ein #include <avr/io.h> machen).
Falls es nicht geht muss eben im Manual schauen, wo sich diese Bits befinden. CS10 ist glaub bit 0 in TCCR1B. Das musst du eben setzen.
Den Wert für OCR1A lässt du den Preprozessor (GNU) berechnen oder machst es von Hand aufm Tacshenrechner.
In dem Beispiel benutze ich den OCR1A-Interrupt. GNU-Assembler trägt den in die VECTAB ein, bei Atmel-Assembler musst du das händisch machen. Ist im Wiki ASM-Tutorial beschrieben.
Nach der Initialisierung der Timers kannst du IRQs aktivieren (sei). Die Interrupt-Routine musst du noch implementieren, also den COde, den er bei einem Interrupt ausführen soll.
Das Problem mit Warteschleifen ist, daß während einer Schleife die Maschine brach liegt. Bei simplen Sachen ist das nicht schlimm, aber wenn es komplizierter wird und man hat das ganze Design drauf ausgelegt, wird's ätzend.
Was die Timer angeht lies mal das Handbuch, das ist echt gut geschrieben. Zum Einstieg die Kapitelzusammenfassung oder Überblick über die Timer-Register.
Disclaimer: none. Sue me.
Danke, ich glaub das Prinzip verstanden zu haben. Allerdings konnte ich mit der C-Code-Zeile absolut nix anfangen.
Aber mir ist schon mal weitergeholfen, thx!
MfG EagleStar
.. oder nutz doch eine I2C-Realtime-Clock ... dann bleiben die Werte auch nach dem Aus- und wiederschalten erhalten .. oder dekodiere ein DCF77-Modul .. auch simpel zu machen - dann muß nix gespeichert werden ...
Ich kann mir keine Signatur leisten - bin selbständig!
I2C: klingt interessant aber damit habe ich noch nie gearbeitet. Gibt es da Beisiele für?
DCF77 ist warscheinlich zu aufwendig!
Ich kann mir keine Signatur leisten - bin selbständig!
Hilft warscheinlich nich viel mehr aber im Downloadberich gibts auf Basic Beispiele.
mfg
Gut, ich hab mir grade mal die Datenblätter geholt und die Bsps runtergeladen. Ich schau mir das jetzt mal an und melde mich dann wieder wenn ich Probleme hab - ich melde mich sicher...
Trotzdem schon mal danke!
Lesezeichen