Hallo,
Ich möchte eine Uhr bauen die mir die Zahlen in einem Binärsystem
ausgibt. Und wollte Fragen
-welchen Mikrocontroller benutzt man am besten
-brauch man über haupt einen
-in welcher Sprache macht man das am besten (habe schon kleine Erfahrung
in C++)
Danke =)
Hallo Maudi,
frag doch mal Tante Googel nach Binäruhr und Schaltplan. Da findest Du
Lösungen mit und ohne Microcontroller zu hauf.
In der Lehre haben wir die Uhr nur mit Logikgattern aufgebaut.
Taktgewinnung über die 50Hz aus dem Netz (per Schmitt-Trigger) und dann
per Schieberegister zählen und an den richtigen Punkten die LEDs
anschließen.
Gruß
N8Schicht
Maudi schrieb:> -welchen Mikrocontroller benutzt man am besten
Irgendeinen mit >20 IOs, z.B. einen PIC18 im DIP-28 (z.B. PIC18F25k22)
> -brauch man über haupt einen
Nein, geht auch mit 47HCxxx Logik ICs
> -in welcher Sprache macht man das am besten (habe schon kleine Erfahrung
C oder ASM, da du Erfahrung mit C++ hast würde ich C sagen.
Guten Tag,
da ich in der Ausbildung als Zeitvertreib auch eine Binär Uhr machen
soll und meine Assembler Zeit schon eine Weile her ist bräuchte ich
etwas Hilfe.
Meine Uhr soll von der Zeitausgabe auch so aussehen wie die oben von
ELV. Nur dass ich sie mit einem atmega8535 programmieren soll. Alles
schön und gut, wie ich die Ausgabe an die LED's mache ist auch nicht das
Problem, aber!
Wie lese ich das 1Hz Signal über meinen Taktgeber (mit 4,194304MHz und
Beschaltung) ein (liegt an PB0 an) und gebe es an das Register weiter,
dass es die Sekunden hochzählt?
Vielen Dank schon mal im voraus.
Grüße,
Pixelfreund
Lars S. schrieb:> Wie lese ich das 1Hz Signal über meinen Taktgeber (mit 4,194304MHz und> Beschaltung) ein (liegt an PB0 an)
War das jetzt der Schaltplan?
> und gebe es an das Register weiter, dass es die Sekunden hochzählt?
Ich würde vorschlagen, dass erst mal DU etwas lieferst, dann
beschreibst, was du damit erwartest und was nicht geht, dann kann man
drüber diskutieren. Dann wüsste man auch, mit welcher Programmiersprache
das Ganze abgehandelt werden soll.
> Wie lese ich das 1Hz Signal über meinen Taktgeber (mit 4,194304MHz und> Beschaltung) ein (liegt an PB0 an)
Wenn du schon ein fertiges 1Hz Signal hast, dann ist es doch einfach:
Flankenerkennung am PB0 und dann das Sekunden-Register hochzählen.
> da ich in der Ausbildung als Zeitvertreib eine Binär Uhr machen soll
DU sollst sie also machen. Nicht "das Forum". Und es ist vermutlich kein
"Zeitvertreib", sondern dein Meister will schon mal sehen, wie sich der
Bursche da anstellt...
BTW: es ist nicht elegant, sich an andere Threads anzuhängen. Könnte ja
sein, dass da einer (so wie ich) erst mal das ganze alte Zeug ansieht,
nur um zum Schluss zu sehen, dass eine neue Frage gestellt wird...
Lothar Miller schrieb:> Lars S. schrieb:>> Wie lese ich das 1Hz Signal über meinen Taktgeber (mit 4,194304MHz und>> Beschaltung) ein (liegt an PB0 an)> War das jetzt der Schaltplan?>> und gebe es an das Register weiter, dass es die Sekunden hochzählt?> Ich würde vorschlagen, dass erst mal DU etwas lieferst, dann> beschreibst, was du damit erwartest und was nicht geht, dann kann man> drüber diskutieren. Dann wüsste man auch, mit welcher Programmiersprache> das Ganze abgehandelt werden soll.
Schaltplan ist nichts besonderes, das Eingangssignal und 20 Ausgänge für
die LED's.
Später kommt noch ein Taster zum Stellen, aber dafür sollte es erstmal
laufen.
Zur Sprache: Steht drinne: Assembler.
>> Wie lese ich das 1Hz Signal über meinen Taktgeber (mit 4,194304MHz und>> Beschaltung) ein (liegt an PB0 an)> Wenn du schon ein fertiges 1Hz Signal hast, dann ist es doch einfach:> Flankenerkennung am PB0 und dann das Sekunden-Register hochzählen.
Danke, dass war schon mal eine Sache, an die ich nicht gedacht habe.
>> da ich in der Ausbildung als Zeitvertreib eine Binär Uhr machen soll> DU sollst sie also machen. Nicht "das Forum". Und es ist vermutlich kein> "Zeitvertreib", sondern dein Meister will schon mal sehen, wie sich der> Bursche da anstellt...
Nein, daran liegt es nicht. Letzte Woche wurde das Insolvenzverfahren
eingeleitet, es geht einfach darum, dass ich die 3 Monate noch was zu
tun hab und net sinnlos rumsitze. Aber konntest du ja nicht wissen.
> BTW: es ist nicht elegant, sich an andere Threads anzuhängen. Könnte ja> sein, dass da einer (so wie ich) erst mal das ganze alte Zeug ansieht,> nur um zum Schluss zu sehen, dass eine neue Frage gestellt wird...
Hätte ich was neues geschrieben, wäre wie in so vielen Sachen gekommen
"Nutz die Froum Suche!"
Deswegen hab ich an ein anderes Thema mich drangehängt.
Trotzdem danke schonmal für den Hinweiß, mit der Flankenerkennung.
Lars S. schrieb:> Zur Sprache: Steht drinne: Assembler.
Es steht drin, dass das schon eine Weile her ist. Dass du heute den
Assembler verwenden sollst, das könnte man nur raten...
> Später kommt noch ein Taster zum Stellen, aber dafür sollte es erstmal> laufen.
Gleich mal einen Hinweis für den Taster:
Entprellen und dann wieder die Flankenerkennung.
Hier mal ein Pseudocode für die Flankenerkennung. Du bekommst das schon
in Assembler umgesetzt... ;-)
1
portpinB0 = PINB0
2
wenn portpinB0 ungleich portpinB0alt dann -- Pegel geändert? ja: Flanke!
3
wenn portpinB0 = high -- jetzt high? ja: steigende Flanke.
4
sekunden hochzählen
5
wenn sekunden = 60 dann
6
sekunden = 0
7
minuten hochzählen
8
wenn ...
9
10
portpinB0alt = portpinB0 -- Pegel merken für nächste runde
Lars S. schrieb:> Wie lese ich das 1Hz Signal über meinen Taktgeber (mit 4,194304MHz und> Beschaltung) ein (liegt an PB0 an)
Einen Takt kann man mit einem externen Interrupt oder einem Timer
einlesen.
Man könnte auch einfach die 4,194304MHz oder einen anderen Quarz direkt
als CPU-Takt anschließen. Der AVR hat die Hucke voll mit Timern, die das
runter teilen können.
Lars S. schrieb:> und gebe es an das Register weiter,> dass es die Sekunden hochzählt?
Das geht nicht. Zählen mußt Du in Software.
Lars S. schrieb:> Hätte ich was neues geschrieben, wäre wie in so vielen Sachen gekommen> "Nutz die Froum Suche!"> Deswegen hab ich an ein anderes Thema mich drangehängt.
Da hast Du was missverstanden. Solche Antworten bekommst Du, wenn
Du Sachen fragst, die schon x-mal beantwortet wurden.
Wenn Du neue Fragen hast, solltest Du einen neuen Thread eröffnen
und, wenn es hilfreich ist, einen Link auf den alten Thread einfügen.
Gruss
Harald
Harald Wilhelms schrieb:> Und wo findet man die? :-)
Bei so gut wie jedem Elektronikhändler, z.B.:
TME, Reichelt, Farnell, Conrad, Mouser, RS Components,...
Mit den TTL Bausteinen und mit CMOS Bausteinen haben wir das in der
Firma schon gemacht, aber nie mit nem µC. Deswegen soll ich das halt
jetzt mal mit einem machen.
Ich würde da aber eine CMOS Version bevorzugen, da diese einfacher ist.
Schaltpläne habe ich gerade keine zur Verfügung, kann aber bei bedarf
danach suchen.
Lars S. schrieb:> Ich würde da aber eine CMOS Version bevorzugen, da diese einfacher ist.
Man muss kein Programm schreiben, aber die Schaltung wird mit µC
wesentlich einfacher. Das µC Programm für eine einfache Binäruhr sollte
auch kein Hexenwerk sein.
Wenn ich eine Binäruhr bauen müsste würde ich sie so aufbauen:
https://www.mikrocontroller.net/attachment/214613/Binaeruhr.pdf
Das CMOS bevorzugen war auf den vergleich TTL/CMOS bezogen.
So ähnlich ist meine auch, nur dass ich die Zahlen getrennt habe, also
x|0 x|0 x|1
x|1 1|1 0|0
0|0 0|1 0|0
1|1 0|0 0|1
15:46:09 Uhr
aber das macht nicht so den großen Unterschied.
Am Programm bin ich gerade dran, habe aber aktuell immernoch nur
Bruchteile.
Für heute ist eh erstmal Schluss. Ich schreibe morgen nochmal.
Andere Idee:
Dein 1Hz Signal auf einen InputCapture und dann intern gleich den Zähler
verwenden.
Entweder nimmst du diesen nur für die Sekunden oder du schaust gleich,
dass du einen 32Bit erwischst, dessen Maximum du auf 86399 beschränkst.
So hast du gleich einen ganzen Tag und musst den Zählerwert nur noch
entsprechen maskieren, dividieren und dann an die LEDs ausgeben.
Max H. schrieb:> Harald Wilhelms schrieb:>> Und wo findet man die? :-)> Bei so gut wie jedem Elektronikhändler, z.B.:> TME, Reichelt, Farnell, Conrad, Mouser, RS Components,...
Dann gib doch mal D e i n e Bezeichnung bei google ein. :-)
Max H. schrieb:> Wenn wir auf diesem Niveau sind, wofür stehen diese 5 einzelnen> Buchstaben?
Ooooch, jetze isser beleidigt. Smilies von Harald nicht gesehen?
Patrick B. schrieb:> Andere Idee: Dein 1Hz Signal auf einen InputCapture und> dann intern gleich den Zähler verwenden.
Das wäre mal echt technischer Overkill. Ich würde sagen, ein Anfänger
tut sich am Anfang leichter, wenn er das Problem mit ein paar Zeilen
Quelltext erschlagen kann. Dann ist es nämlich auch einfach simulierbar.
Und bei Events, die im Sekundentakt anfallen, sollte das Behandeln der
Aufgabe in einer einzigen Schleife kein Problem sein....
Max H. schrieb:> Harald Wilhelms schrieb:>> D e i n e> Wenn wir auf diesem Niveau sind, wofür stehen diese 5 einzelnen> Buchstaben?
Hast Du immer noch nicht gesehen, auf was ich hinaus wollte?
Ich hab mal was ausprobiert und wollte mal wissen, ob der Code
wenigstens richtig ist.
Noch ohne Ausgabe an die LED's über PORT A/C/D.
In dieser Version auch ohne den Quarz, sondern mit warten.
Lars S. schrieb:> ob der Code wenigstens richtig ist.
Da ist kein Code. Da ist nur eine Textdatei.
Oder andersrum: menn deine Assemblerfiles einfach*.asm. Du wirst
staunen...
> ob der Code wenigstens richtig ist.
Sicher nicht! Wozu wartest du? Wo ist da eine Flankenerkennung? Was
schreibe ich denn eigentlich im
Beitrag "Re: Binär Uhr Selbst Bauen", wenn du es nicht
liest?
Das ist mir bewusst, dass ich es noch in *.asm umbennen muss um es dann
auf den µC zu schicken.
Ganz einfach: Weil ich die Flankenerkennung, so wie sie im Tutorial
beschrieben ist, nicht verstehe. Deswegen hab ich es jetzt mit einer
wartefunktion gemacht.
Lars S. schrieb:> Das ist mir bewusst, dass ich es noch in *.asm umbennen muss um es dann> auf den µC zu schicken.
Ähm nein, wenn du hier eine *.asm-Datei anhängst, dann wirst du mit
Syntax-Highlighting belohnt.
> Ganz einfach: Weil ich die Flankenerkennung, so wie sie im Tutorial> beschrieben ist, nicht verstehe.
Das war mein Verdacht. Dann frag doch...
> Deswegen hab ich es jetzt mit einer wartefunktion gemacht.
"Ich weiß zwar, dass es Murks ist, habe aber einfach mal weitergemacht!"
Oder andersrum:
Malermeister zum Stift:
"Fenster streichen!"
Nach einer Stunde ruft der Stift:
"Fertig! Soll ich jetzt die Rahmen auch noch streichen?"
Als kleine Hilfe:
1
hauptschleife:
2
mov R26,R25 ; alten Eingangspegel merken
3
in R25,PB ; neuen Eingangspegel einlesen
4
sbrs R25,0 ; Eingang abfragen, wenn high: überspringen
5
rjmp hauptschleife ; Eingang ist low --> nix zu tun
6
sbrc R26,0 ; Merker abfragen, wenn low: überspringen
7
rjmp hauptschleife ; Merker ist high --> nix zu tun
8
9
steigende_flanke: ; unsere steigende Flanke pro Sekundenimpuls
10
11
inc r21 ; addieren +1
12
cpi r3, 60 ; vergleichen
13
brsh minuten ; wenn 60, springe zu minuten
14
rjmp hauptschleife ; zurück zur Hauptschleife
> ldi r21, 0x01 ; +1 für addieren
Es gibt einen inc Befehl...
> .equ r3=60> .equ r4=24
Sicher?
Ich hab deine Hilfe jetzt mal verwendet und das draus gebaut. *Verweiß
auf Anhang*
Lothar Miller schrieb:> Ähm nein, wenn du hier eine *.asm-Datei anhängst, dann wirst du mit> Syntax-Highlighting belohnt.
So wie jetzt im Anhang?
>> ldi r21, 0x01 ; +1 für addieren> Es gibt einen inc Befehl...
Danke, dachte mir schon, dass es sowas gibt.
>> .equ r3=60>> .equ r4=24> Sicher?
So hab ich das mal gefunden. Deswegen hab ich das verwendet.
Lars S. schrieb:> So wie jetzt im Anhang?
Probiers aus. Oder simuliere es einfach mal...
> So hab ich das mal gefunden.
Wofür war das dann?
Beim AVR könntest du es so machen:
1
.EQU sec = R18
2
.EQU min = R19
3
.EQU hrs = R20
4
5
:
6
:
7
8
clr sec ; sekungen löschen
9
inc min ; addieren +1
10
cpi min, 60 ; vergleichen
Die Kommentare, die nur das beschreiben, was der Befehl an sich schon
beschreibt, kannst du dir sparen. Denn sonst änderst du mal den Befehl
und schwuppdibohne steht da ein sinnloser Kommentar.
Hi
>Beim AVR könntest du es so machen:> .EQU sec = R18> .EQU min = R19> .EQU hrs = R20
Dann aber
.def sek = R18 ( sec ist ein Befehl )
.def min = R19
.def hrs = R20
MfG Spess
Müsste ich erstmal ein Programm dafür haben.
Noch schreibe ich alles mit dem Editor. (ich weiß, nicht die eleganteste
Lösung.)
Wo ist der unterschied zwischen .equ und .def?
Hi
>Müsste ich erstmal ein Programm dafür haben.>Noch schreibe ich alles mit dem Editor. (ich weiß, nicht die eleganteste>Lösung.)
Was, kein AVR-Studio?
Wenn nicht, hol dir das AVR Studio 4.19 (build 730) von
http://www.atmel.com/tools/studioarchive.aspx
Reicht für Assembler vollkommen.
>Wo ist der unterschied zwischen .equ und .def?
The EQU directive assigns a value to a label. This label can then be
used in later expressions. A label assigned to a value by the EQU
directive is a constant and can not be changed or redefined.
Syntax:
.EQU label = expression
The DEF directive allows the registers to be referred to through
symbols. A defined symbol can be used in the rest of the program to
refer to the register it is assigned to. A register can have several
symbolic names attached to it. A symbol can be redefined later in the
program.
Syntax:
.DEF Symbol=Register
MfG Spess
Jetzt ja, hab aber von einem Kollegen die aktuelle Version bekommen, da
wir die auf dem Firmennetz haben.
Versuche mich gerade damit einzuarbeiten.
Und danke für die Erklärung.
Ich habe mal eine andere Frage:
Ich nutze PORTB,1 als Eingang, in der Simulation beim AVR-Studio 4
funktioniert das auch. Aber in der Schaltung klappt es nicht. Ich habe
auch schon nachgeschaut es liegt auch ein High-Signal an dem Port an
(4,93V). Kann es sein, dass ich den irgendwie von T1 wechseln muss? (Er
ist auch über "ldi r16 0x00 / out DDRB, r16" als Ausgang definiert.)
Lars S. schrieb:> Ich habe mal eine andere Frage:> Ich nutze PORTB,1 als Eingang,
PORTx und Eingang passen nicht zusammen (mal vom Pullup abgesehen)
Wenn du von einem Pin lesen willst, dann ist das PINx Register dafür
zuständig!
AVR-Tutorial: IO-Grundlagen
Wer etwas bauen will, muss auch die Grundlagen lernen.