mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Uhr mit ATmega16


Autor: Roy Thinnes (roy)
Datum:

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

Autor: Thomas (Gast)
Datum:

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

Autor: Ralf (Gast)
Datum:

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

Autor: Roy Thinnes (roy)
Datum:

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

Autor: Roy Thinnes (roy)
Datum:

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

Autor: Lupin (Gast)
Datum:

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

Autor: Thomas (Gast)
Datum:

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

Autor: Roy Thinnes (roy)
Datum:

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

Autor: Rahul (Gast)
Datum:

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

Autor: Tim Günther (Gast)
Datum:

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

Autor: Tim Günther (Gast)
Datum:

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

Autor: Roy Thinnes (roy)
Datum:

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

Autor: Tim Günther (Gast)
Datum:

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

Autor: Thomas (Gast)
Datum:

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

Autor: Roy Thinnes (roy)
Datum:

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

Autor: Tim Günther (Gast)
Datum:

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

Autor: Tim Günther (Gast)
Datum:

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

Autor: ,,,,,,, (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Tim Günther (Gast)
Datum:

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

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.