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?
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ß
@ 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.
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...
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...
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.
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.
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...
Dann solltest du dir mal die Tutorien angucken und klein anfangen (LED blinken lassen etc...) Das Datenblatt (complete datasheet) ist meistens auch eine Hilfe...
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.
> 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.
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...
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.
@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?!?
@ 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.
> @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.
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.
@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.
> 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.
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.