Forum: Mikrocontroller und Digitale Elektronik Uhr mit ATmega16


von Roy T. (roy)


Lesenswert?

Hallo,
Ich wollte fragen wie ich am besten und einfachsten per Assembler eine
Uhr in meinen ATmega16 programmiere?

Ich wollte dafür Sekunden Minuten und Stunden anzeigen also insgesamt 6
7-Segment-Anzeigen ansteuern, die über einen BCD-zu-7-Segment-Wandler
angeschlossen werden. Ich brauche lso jeweils 4bit für Sekunden Minuten
und Stunden...

Wie mache ich das am besten?

von Thomas (Gast)


Lesenswert?

Hi, wie Du beschrieben hast, am besten nicht!

Du brauchst ja ganze 24 IO Leitungen! ;-) Schau mal ein wenig hier im
Forum; die erste Übung mit µC's ist eigentlich meistens, drei 7
Segment Anzeigen mit nur drei IO-Leitungen anzusteuern!

Wenn Du nichts findest, dann einfach selber mal ein bissel drüber
nachdenken; ist eigentlich recht einfach.

Gruß

von Ralf (Gast)


Lesenswert?

@ Thomas:
Hmm .. isses net egal, wieviele IO Ports er dafür ver(sch)wenden
möchte?
Zumal er ja klipp und klar Hilfestellungen zum Thema: Wie programiere
ich eine Uhr haben wollte.

von Roy T. (roy)


Lesenswert?

Ich versteh jetzt nicht so ganz was du meinst also 3 7-Segment-Anzeigen
werden wohl nicht reischen um einer Uhr auch nur zu ähneln ... Aber was
ich nicht verstehe ist wie du 3 7-Segment-Anzeigen mit nur 3 Leitungen
ansprechen willst...

von Roy T. (roy)


Lesenswert?

hm sry wegen 2 mal schreiben aber er hats beim ersten mal nicht
gefressen und beim zweiten mal stand es zweimal da o_O

@Ralf deine Bemerkung ist ganz recht ich will ne Uhr programmiern egaal
wiviele Ports ich dafür brauche. Jedoch war das (SCH) bei verwenden wohl
doch zuviel...

von Lupin (Gast)


Lesenswert?

du kanst deine 6 7-segment anzeigen auch über 2 IOs ansprechen wenn du
das mit Schieberegistern machst (aber ich glaube nur wenn das
bidirektionale sind ansonsten kommen noch 6 pins hinzu für select
signal).

Wo liegt denn das Problem? Im einfachsten falle machst du einen 1 Hz
timer und der erhöht jedes mal deinen sekunden-wert. Der Rest ist ja
nur ein paar if-abfragen.

von Thomas (Gast)


Lesenswert?

Nagut.

Du installierst Dir einen Timer, der z.B. alle 500ms einen Overflow
erfährt.
Ist das ganze zweimal passiert so incrementierst Du die Sekunden; Hast
Du 59 Sekunden, so setzt Du beim nächsten Overflow die Sekunden zurück
sowie die Minuten eins rauf and so on.

Die 7 Segment Anzeige (auch via 24 IO Leitungen) ist kein Problem.
Du baust Dir einfach eine Funktion, der Du die Zahl sowie den Port
(halben Port, also 4 BITs) übergibst. Die Funktion schmeißt nun einfach
das Nibble auf das Port-Nibble. Werte größer zehn musst Du halt vorher
abfangen und separat auf selbem weg ausgeben.

von Roy T. (roy)


Lesenswert?

Du installierst Dir einen Timer, der z.B. alle 500ms einen Overflow
erfährt.
Ist das ganze zweimal passiert so incrementierst Du die Sekunden; Hast
Du 59 Sekunden, so setzt Du beim nächsten Overflow die Sekunden zurück
sowie die Minuten eins rauf and so on.

Sowas hab ich mir gedacht jedoch habe ich keine Ahnung was ein Overflow
ist und ich weiss auch nicht wie ich per Assembler ein Timer baue...
Dann kommt da ja noch das Problem dass ich die entsprechenden Signale
auf die Ports ausgeben muss.

PS: Für die die glauben: Warum nimmt der nicht einfache Zähler oder
kauft sich ne Uhr? ... Ich baue die Uhr mit dem ATmega16, weil es ein
Schuliches Projekt sein soll...

von Rahul (Gast)


Lesenswert?

Dann solltest du dir mal die Tutorien angucken und klein anfangen (LED
blinken lassen etc...)
Das Datenblatt (complete datasheet) ist meistens auch eine Hilfe...

von Tim Günther (Gast)


Lesenswert?

Schau am besten in das ATmega16 Datenblatt. Da steht alles über den
Timer drin.

Beim ATmega16 hast du mehrere (3) Timer zur Verfügung (T/C0: 8 Bit,
T/C1: 16 Bit, T/C2: 8 Bit). Die werden allgemein vom Systemtakt
getaktet. Alternativ kann man auch einen Quarz speziell zum Takten der
Timer verwenden.
Die Timer aktiviert man in Assembler über die Timer/Conter Control
Register (TCCR0-2). Der alle Timer haben ihr eigenes Counter-Register
(TCNT0-2), was im allgemeinen automatisch incrementiert wird
(ausgenommen im PWM-Betrieb). Diese können einen Overflow-Interrupt
auslösen, wenn das jeweilige TCNT von 0xFF bzw 0xFFFF zu 0x00
umspringt. Damit der Interrupt ausgeführt wird, muss das jeweilige Flag
im TIMSK (Timer Interrupt MaSK - Register) aktiviert werden. Zudem muss
der Timer aktiviert werden, indem man über die Bits 0-2 des jeweiligen
TCCR den Multiplexer zur Takt-Teilung aktiviert.
Dann musst du nurnoch die entsprechende Interrupt-Routine
programmieren, die die Uhrzeit incrementiert. Hinweise zur
Interrupt-Programmierung findest du hier auf der Seite im
AVR-Tutorial.

Wenn du ansonsten keine Timer in deinem Projekt benötigst, kannst du
dir vieles erleichtern, indem du das OCR1A (Output-Compare-Register A
des 16 Bit Timers 1 benützt). Mit diesem kannst du einen Wert wählen,
bei dem automatisch der Interrupt für die OCR1A übereinstimmung
ausgelöst wird. So kannst du am einfachsten aus dem Systemtakt einen 1
s Takt erzeugen.

Du solltest für dein Projekt für den Systemtakt darauf achten, einen
Quarz zu verwenden, falls du keinen einzelnet Taktgeber für die Timer
verwendest, da der interne Taktgeber des ATmega16 sehr stark von
Temperaturschwankungen beeinflusst wird.

von Tim Günther (Gast)


Lesenswert?

> Dann solltest du dir mal die Tutorien angucken und klein anfangen
> (LED blinken lassen etc...)
> Das Datenblatt (complete datasheet) ist meistens auch eine Hilfe...

Du solltest vielleicht dein erstes Projekt erst einmal darauf
beschränken, eine LED zum leuchten zu bringen und dann im Sekundentakt
blinken zu lassen. Außerdem solltest du dir, falls du keine Erfahrungen
im Lesen von englischen Datenblättern hast ein Buch über
AVR-Programmierung ausleihen. ( z.B. AVR-RISC Microcontroller Praxis
o.ä.). Diese gibt es in fast jeder Bücherei und auf jeden Fall in jeder
technischen Uni-Bibliothek.
Im Prinzip ist die Timer-Programmierung keine komplizierte Sache, wenn
man erst einmal die Grudzüge der AVR-Programmierung verstanden hat.

von Roy T. (roy)


Lesenswert?

also ich hab es fertig gebracht ein Lauflicht zu bauen also Taster0
Licht läuft nach links Taster1 Stop Taster2 Licht läuft nach rechts...
Also kleine Grundkenntnisse habe ich schonn ich weiss halt nur nicht
wie das mit dem Zähler bauen usw funktioniert...

von Tim Günther (Gast)


Lesenswert?

Wie gesagt... Timer funktionieren in etwa so, wie ich das beschrieben
habe.
Die Stunden, Minuten, Sekunden kannst du in je 2 8 Bit Register
schreiben, dann brauchst du die nicht einmal mehr umrechnen. Einfacher
wäre es jedoch statt der 7 Segment Blöcke ein fertiges LCD
anzusteuern.

Am besten schaust du in das Datenblatt des ATmega16 unter
Timer/Counter. Am einfachsten ist wie gesagt die Verwendung des Timer 1
für diese Anwendung, auch wenn er etwas überdimensioniert sein mag.
Schau dir an, was die Register TCCR1A, TCCR1B und TIMSK machen, wie
OCR1A Funktioniert. Und dann noch das Interrupt-Kapitel des
AVR-Tutorials durcharbeiten. Damit müsste es möglich sein. Die Infos
über PWM kannst du Ignorieren, denn das brauchst du hierfür nicht.
Am besten schaust du dir auf einem Emulator an, wie die Timer
funktionieren und wann was passiert. Wenn du dann nicht weiter kommst,
frag noch einmal.
Um die Verwendung der Timer hier mal eben zu beschreiben ist das zu
umfangreich.

von Thomas (Gast)


Lesenswert?

@Roy Thinnes (RoY): Ich habe wirklich versucht mich zusammen zu reissen,
aber schaue doch bitte einfach mal im Datenblatt nach; oder nutze die
Verfluchte Suchfunktion - ist denn heute niemand mehr in der Lage
selbstständig ein paar nützliche Informationen zu finden? Wo wären wir
nur ohne Internet?!?

von Roy T. (roy)


Lesenswert?

@ Thomas: Es hat dich niemand gezwungen iergendwas zu schreiben! Ein
Forum ist da um ne Frage zu stellen und ne Antwort zu bekommen. Falls
du nicht antworten willst dann schreibe GARNIX!!! Und lass die Leute
antworten die antworten wollen! Ich habe nicht nach einem Tuorial
gefragt (ausser du hast eins wo beschrieben ist wie man eine Uhr im
ATmega16 programmiert) sondern wie ich eine Uhr programmiere. Wenn du
mir also nicht helfen willst dann enthalte dich doch einfach, das
kostet  dich weniger Energie als hier deinen schlauen Sprüche
abzulassen.

von Tim Günther (Gast)


Lesenswert?

> @Roy Thinnes (RoY): Ich habe wirklich versucht mich zusammen zu
> reissen, aber schaue doch bitte einfach mal im Datenblatt nach;
> oder nutze die Verfluchte Suchfunktion - ist denn heute niemand
> mehr in der Lage selbstständig ein paar nützliche Informationen zu
> finden? Wo wären wir nur ohne Internet?!?

Naja, die Suchfunktion kann ja nix dafür ;). Aber sehe ich genauso,
schau in das Datenblatt, da steht alles drin, was man wissen muss. Das
auch noch sehr ausführlich, wie ich finde. Ansonsten gibt es sowohl im
Internet, als auch in den meisten Büchereien und Bibliotheken, die
zumeist morgen wieder geöffnet haben, ausreichend Informationen.

Ansonsten: Google ist dein Freund.

Stichwörter in Form von Registernamen habe ich dir ja schon genug
gegeben. Damit findest du genug Informationen. Wenn du schon LEDs
leuchten lässt, ist das ja wirklich kein Problem.

von Tim Günther (Gast)


Lesenswert?

Thomas hat aber Recht. Es steht im Datenblatt. Schau da nach und wenn du
dann weiter Probleme hast, schreib einfach hier drunter. Das ganze ist
zu umfangreich um alles hier zu Posten. Im AVR-Studio hast du einen
Emulator, der zeigt dir das nötigste an (Achtung: DER EMULATOR IST
WESENTLICH LANGSAMER ALS DER ATmega16).

Für einen Timer 0 Overflow Interrupt benötigst du z.B. folgenden
Code.Dieses Beispiel sollte alle 256 Taktzyklen die Routine TIM0_OVF
aufrufen. Nicht vergessen: Stack Initialisieren!

rjmp START
.org 0x09
rjmp TIM0_OVF
START:
[...]
ldi r16, 0b00000001
out TCCR0, r16
ldi r16, 0b00000001
out TIMSK, r16
sei
[...]
LOOP:
rjmp LOOP
TIM0_OVF:
[...]
reti

Anhand des Datenblatts sollte der Code verständlich sein. Damit lässt
sich dann einfach weiter arbeiten. Die Frequenz mit der TIM0_OVF
aufgerufen wird wäre in diesem Fall f/256 wobei f die Frequenz des
Taktgebers ist.

von ,,,,,,, (Gast)


Lesenswert?

@TIM

>Ansonsten gibt es sowohl im Internet, als auch in den meisten
>Büchereien und Bibliotheken, die.........................

offensichtlich hast Du noch nie irgendwelche AVR-Bücher gelesen,
denn sonst wüsstest Du das da nur teurer Schund angeboten wird.
Sind meisst nur schlecht übersetzte Datenblätter.

@Thomas
Ein Forum dient letztendlich dem Gedankenaustausch von
Gleichgesinnten.

Und wem das nicht passt, bzw. diese Meinung nicht teilt sollte seine
Rübe in andere Beiträge stecken, anstatt Platz auf dem Server für
überflüssige Kommentare zu verschwenden.

von Karl H. (kbuchegg)


Lesenswert?

> Wie mache ich das am besten?

Am besten machst Du das so wie Du das kannst und
wie Du es hinkriegst.

Im Ernst: Wo liegt denn konkret Dein Problem.
Wenn Du ein Lauflicht hinkriegst, dann wird doch
wohl das meiste, was du für eine Uhr brauchst, kein
großes Problem sein.

Denk mal nicht darüber nach, wie Du das am besten
machst. Implementiere das was Du kannst. Das Beste
kommt mit der Zeit sowieso von alleine.

von Tim Günther (Gast)


Lesenswert?

> offensichtlich hast Du noch nie irgendwelche AVR-Bücher gelesen,
> denn sonst wüsstest Du das da nur teurer Schund angeboten wird.
> Sind meisst nur schlecht übersetzte Datenblätter.

Doch das habe ich, auch wenn ich es nach ein paar Seiten aufgegeben
habe und mir das Datenblatt wieder hervor geholt habe. Und, ja, das
sind im Prinzip nur die Übersetzungen der Datenblätter mit ein paar
Beispielen. Deshalb würde ich mir auch nie ein solches Buch kaufen.

Aber: Es mag Leute geben, die nicht gerne (englische) Datenblätter
lesen. Für die mag ein solches Buch hilfreich sein. Ich habe nicht ohne
Grud auch auf das Datenblatt verwiesen, denn da steht alles drin was man
braucht und zwar so ausführlich, dass es schon fast nicht mehr als
Datenblatt erkennbar ist :).

Wie gesagt: Ist aber auf Englisch und es gibt sehr viele Leute, die da
ein Problem mit haben.

MfG
Tim

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.