Hallo Leute!
Ich beschäftige mich seit vorgestern mit Mikrocontrollern, daher habt
etwas Nachsicht :) Hab so gut wie keine Ahnung.
Habe folgende Frage:
Ich bastel mir seit einiger Zeit kleinere Schaltungen, wie Uhren etc.
mit cmos bzw. ttl-ics. Ist ja ne feine Sache, nur etwas langweilig. Nun
dachte ich mir, man kann das alles viel einfacher mit nem Microcontoller
tun, spart ne Menge Bauteile.
So, hab mir Freitag das AVR STK 500 bestellt und n paar Tutorials
gelesen. Sieht alles ganz gut aus...
D. h., ich weiß jetzt, wie man ne LED zum Leuchten bringt, hehe. Nun
möchte ich aber ne Laufschrift auf nen alphanumerisches Display zaubern.
Also n Display, was nicht sieben sondern 16 Segmente hat, zum Buchstaben
darstellen eben.
Wenn ich es direkt verdrahte, kriege ich nur 2 von den Dingern
angekorkt, da ich ja nur 32 Ports habe. Daher muß ich die wohl per
multiplexer ansprechen.
Jetzt endlich meine Frage :):
Kann mir da einer nen Tip geben, wie ich die überhaupt angesteuert
kriege, kann natürlich für jede LED Code schreiben, aber is lästig und
wahrscheinlich völlig überflüssig. Und kann mir einer nen Tip geben, wie
ich die gemultiplext anspreche? Brauche ich da noch n cmos-baustein oder
kann der µC das alles übernehmen.
Vielen Dank für Eure Mühe :-)
Gruß
Jan
das mit den 32 ports ist blödsinn.
im 4.bit modus brauchst du 7 ports, um mit dem display kommunizieren zu
können, das genügt. die software im mikrocontroller sorgt dann dafür,
dass das display das anzeigt, was es soll.
das display kennt die ASCII-Tabelle. Da sind alle Zeichen, Zahlen etc.
vordefiniert. alle diese zeichen kannst du am lcd darstellen.
du brauchst zunächst mal die Ansteuersoftware für das lcd.
dann musst du in der software festlegen, was du ausgeben willst. mit der
laufschrift, das würde ich noch etwas warten lassen. du musst erstmal
lernen, wie das prinzipiell geht, bzw. wie man text oder zahlen, oder
sonst was ausgibt.
ich selber habe da einige Ansteuerroutinen, aber nur für
PIC-mikrocontroller, die laufen bei dir nicht.
in der codesammlung hier im forum sollte so was für avr aber zu finden
sein.
oder von anderen leuten hier im forum.
Hi!
Danke für Deine Antwort!
Ich möchte aber eine LED-Segmentanzeige ansteuern, kein LCD. Die Anzeige
hat keine eigene Logik, sondern besteht eben nur aus 16 dummen LEDs.
Vielleicht hat noch einer ne Idee.
Danke und Gruß
Jan
Hallo Jan,
hab' ich das richtig verstanden: Du hast mehrere einzelne
16-Segment-LED-Anzeigen? Was HDW beschreibt ist ein LCD mit Controller.
Die sind viel einfacher anzusteuern.
Fertigen Code für 16-Segment-Anzeigen habe ich noch nie gesehen, aber Du
willst ja auch was lernen. ;-)
Zum Multiplexen:
Im Prinzip kann der Microcontroller das selber, allerdings muß man den
Strombedarf beachten. Der AVR liefert am Portpin 20/25mA, das sind bei 4
Stellen dann durchschnittlich 5-6mA, was für die meisten Anzeigen recht
wenig ist. Außerdem ist noch der maximale Gesamtstrom des AVRs zu
beachten. Ist bei 7-Segment noch nicht so kritisch, bei 16-Segment
vermutlich zu viel. Hier bei Bedarf entweder mit Einzeltransistoren oder
mit Treibern wie dem ULN2803 nachhelfen.
Der gemeinsame Anschluß an den Anzeigen braucht natürlich die 16fache
Menge Strom, hier muß man auf jedenfall mit Transistoren nachhelfen.
Es gibt im Internet viele Beispiele für gemultiplexte
7-Semgent-Anzeigen, schau Dir das doch mal an, das Prinzip ist ja das
gleiche.
Wenn Du weitere Fragen hast, stell sie ruhig. Mir ist jetzt nicht ganz
klar geworden was Du über Multiplexen weist und was nicht.
bye
Markus
Hallo Markus!
Du hast mich richtig verstanden; ich habe hier sagen wir 4
alphanumerische Anzeigen und möchte nen Text "drüberscrollen".
Leider kann ich ja nur 2 direkt anschließen, wegen den begrenzten Port,
daher muß ich das Ganze im Multiplexverfahren machen. Das Multiplexen
ist per externer Hardware kein Problem, das krieg ich hin, nur wie
steuer ich das jetzt an? Wahrscheinlich ist das aber alles noch viel zu
schwierig für mich, da ich ja keine Ahnung habe :) Wenn ich mir also nen
externen multiplexer bastel, habe ich bei 4 Anzeigen nur noch 20 Ports
belegt + den Clock für den Multiplexer. Schonmal nicht schlecht, nur
wiegesagt, ICH kann das nicht programmieren :-)
N anderen Ansatz, den ich mir überlegt habe: Ich baue mir das mit nem
dot-matrix display auf, sprich, ich nehme mir n Displays mit ner 5x7
Matrix, wäre wohl mächtig einfacher anszusteuern?! Würde ich 5 Stück
drankriegen, mal abgesehen von dem Strom, aber das regel ich eh über
Transen.
Wäre das einfacher zu realisieren?
Danke!
Gruß
Jan
Hi Jan,
ich denke, das ein 5x7 Matrix schwerer zu programmieren ist als ein
7-Seg-Element. Warum nimmst Du nicht ein 74HC595 in Kombination mit zwei
74LS47 (oder ähnlichen)? Der 74HC595 ist eine 8Bit Porterweiterung die
Du per SPI ansteuern kannst. Somit kannst Du an einen 595'er und zwei
74LS47 (BCD-zu-7 Segment) zwei 7-Seg-Elemente betreiben. Einfacher geht
es nicht und Du benötigst nur drei Leitungen. Der Programmieraufwand
wird auf ein minimum reduziert (ideal für Einsteiger).
Gruss... Hans
Hallo Hans,
danke für Deine Antwort.
Die Idee ist nicht schlecht, hatte mir auch überlegt, die Displays mit
nem LED-Treiber von Maxim anzusteuern, der ebenfalls nen SPI-Interface
hat.
Bevor ich anfange zu suchen, kannst Du mir vielleicht n Sample geben,
wie ich das per SPI ansteuern kann?
Danke und GRuß
Jan
Bei Reichelt kostet der 74HC595 0,33Euro und der 7447 1,60Euro. Das
würde für vier Segment 7,03Euro kosten.
Ich habe hier noch ein paar V40511D (baugleich zum 7447, zeigt sogar A
bis F an, neu ungebraucht) rumliegen für 1,00Euro pro Stück.
Hi!
Das mit der Hardware ist soweit ok, die Bausteine hab ich hier
größtenteils rumliegen. Nur wie steuer ich das Geraffel denn nu an?
Wiegesagt, mehr als led an und aus kann ich noch nicht, hehe. Muß mich
wohl erstmal mit Tonnen von Tutorials beschäftigen :-)
Gruß
Jan
@Jan:
Der Multiplexer braucht keinen externen Clock.
Programmtechnisch geht das so:
Du benutzt einen Timerinterrupt (z.B. mit 200Hz), damit Du in
regelmäßigen und gleichmäßigen Abständen zum nächsten Element umschalten
kannst.
Die Ansteuerung geht so: Du gibst die Werte für das aktuelle Element aus
(16 Segmente, also zwei komplette Ports des AVRs) und dann aktivierst Du
diese Stelle, d.h. Du hast für 4 Stellen 4 Portpins und schaltest einen
auf High und die anderen 3 auf Low. Beim nächsten Interrupt schreibst Du
wieder die 16Segmente raus und aktivierst die nächste Stelle.
Bei 5x7 Matrizen ist das Prinzip das gleiche, Du hast aber bei 5 Stellen
insgesamt 25 Spalten, d.h. Du hast den 25-fachen Strom auf den LEDs (Im
Datenblatt nachschauen ob die das können). Wenn das Programm
hängenbleibt und nicht mehr weiterschaltet, dann brennt die gerade
aktive Spalte wohl durch. Man braucht dazu im Prinzip 7+25 Pins, kann
das aber durch geeignete Maßnahmen (z.B. Schieberegister) aber deutlich
reduzieren.
Du solltest Dir aber ernsthaft überlegen, ob Du nicht einfach ein LCD
nimmst. Da gibts 1000 Beispiele dafür; das LCD im Bascom (Basic
Programmierumgebung) zu benutzen ist eine Sache von 5 Minuten. Außerdem
haben LCDs viel mehr Stellen, so daß man auch längere Texte darstellen
kann.
bye
Markus
Im Anhang findest Du ein kleines Programm, welches ich zum testen und
Verstehen der SPI-Schnittstelle geschrieben habe (Mega8 mit 8MHz). Du
müsstest eigentlich nur die include-Datei ändern, es sei denn Du benutzt
auch ein Mega8. In das Register R17 habe ich den Wert rein geschrieben,
der ausgegeben werden soll.
Gruss... Hans
@Markus
Der Nachteil beim Multiplexing ist doch der, das man die Anzeige
permanet refreshen muss und somit Prozessorleistung verlohren geht. Und
zum anderen ist es für ein Anfänger doch sehr aufwändig eine solche
Routine zu schreiben. Während bei der SPI-Variante man nur was ausgeben
muss wenn man es wirklich benötigt. Der Bauteileaufwand ist ungefair der
gleiche.
Gruss... Hans
Hallo Markus!
Also im Klartext korke ich jetzt die segmente alle an die beiden Ports
und die 4 CA-Pins (gem. Anode) jeweils an den dritten Port!? Geeignete
Widerstände und Transen mal vorausgesetzt.
So, dann gebe ich im ersten Durchlauf die Kombination des Buchstabens,
den ich haben will, auf die "Segment-Ports" und setze gleichzeitig den
ersten CA-Pin vom dritten Port auf High. Damit seh ich dann den
Buchstaben auf dem ersten Display.
Beim nächsten Durchgang gebe ich den nächsten Buchstaben raus und
aktiviere den zweiten CA-Pin.
Und das alles mit nem Timerinterrupt von 200Hz gesteuert, damits nicht
flimmert.
War das alles soweit korrekt?
Wenn ja, wie programmier ich das, hihi...Ok, blöde Frage, ich sollte
weiter tuts lesen..
Gruß
Jan
@Hans:
Danke, werd ich mir gleich mal anschauen.
Habe Freitag n STK 500 bestellt, das kommt mit nem 8515 on-board, habe
auch noch nen 8535 rumliegen.
Leider weiß ich jetzt noch nicht, wie ich das IC an den AVR anknote.
Ich fand die Idee von Tobias mit dem bcd to hex decoder auch
interessant, spart auch n paar Kabels :) Aber mit SPI is eben noch
einfacher.
Aber Ziel is eben die Ansteuerung der 16-Segment Anzeigen (oder ner
5x7Matrix), nicht der 7 Segment anzeigen und dafür gibt eben keinen
BCD-to-16Seg.-Decoder, hehe...
Außerdem WILL ich das nicht mit nem LCD machen, sondern mit feinen,
selbstleuchtenden LED-Anzeigen :-)
Wenn Du das Multiplexen vermeiden willst, ist die Variante mit den
74HC595 eine gute Lösung.
Für 4 16 Segmente sind das dann 8 74HC595 und 64 Vorwiderstände.
Das mit den V40511D oder 7447 vergiß mal ganz schnell, die sind doch nur
für 7-Segment geeignet.
Peter
Ich schon wieder:
Habe gerade das hier gesehen:
http://s-huehn.de/elektronik/multiuhr/multiuhr.htm
Sieht richtig gut aus. Er hat die einzelnen Anzeigen mit nem 4028
angesteuert, also nem bcd-zu-dec decoder.
@peter
Ich würde dann jeweils 2 HC595 für eine Anzeige benötigen, da er ja acht
outputs hat. Wären wir wieder beim SPI gelandet :)
Wenn ich schon soweit bin, kann man es ja auch hiermit machen, oder?
http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3379
Der kann gleich 4 5x7-Displays treiben.
@Jan:
Hast Du mal geschaut, was dieser Chip von Maxim kostet?
Reichelt hat ihn nicht, Segor will 45 Euro dafür...
@Hans:
Die Rechenleistung die verlorengeht ist vernachlässigbar. Wenn man
annimmt, daß man bei jedem Durchgang 100 Takte braucht, dann sind das
bei 200Hz 20.000 Takte/Sekunde. Das sind bei 8MHz Prozessortakt 0,25%
der Gesamtleistung.
Daß Multiplexing für einen Anfänger relativ kompliziert ist stimmt, aber
Jan weis ja schon was das ist und die SPI-Schnittstelle zu aktivieren
ist sicher genauso aufwendig wie einen Timerinterrupt zu aktivieren.
bye
Markus
Hmm, wollte mir das IC als Sample von Maxim holen, ist aber alles zu
aufwändig.
Und 45 Euro sind mir viel zu teuer.
Für mich kommt jetzt entweder Multiplexing oder SPI in Frage.
Die Bauteile hab ich bis auf den hc595 alle da. Ich weiß aber trotzdem
immer noch nicht, wie ich den 595 ansteuere.
Ich werd es als erstes mit Multiplexing versuchen, da ich dafür alles da
hab (bis auf das stk 500, hehe).
@Markus: Kannst Du mir dafür n Sample proggen? Also mit Timerinterrupt
usw.? Wär Dir sehr dankbar!
Suche schon die ganze Zeit im Web danach, aber so richtig schlau werd
ich davon nicht. Muß mir erstmal die Bedeutung der ganzen Instructions
reinziehen. Hab da noch 1000 Fragen, aber dazu später mehr :-)
Danke und Gruß
Jan
@Jan:
Bin auch erst gerade dabei, mich in die AVRs einzuarbeiten. Mein erstes
Beispiel (Fernbedienungsempfägner) hab' ich in Basic programmiert. Da
braucht man sich nämlich nicht um die ganzen Registernamen kümmern.
Da geht das z.B. so
On Timer0 Ontimer0 '
Interrupt-Routine für Timer0-Overflow
Config Timer0 = Timer , Prescale = 8 'Takt:
Quarz/8
Enable Timer0 '
Timer0-Overflow-Interrupt einschalten
Enable Interrupts
Und die eigentliche Interruptroutine:
Ontimer0: '
Interrupt-Routine
Timer0 = 210 ' ca. 10kHz
...
Return
Der Compiler ist Bascom, die Demoversion ist auf maximal 2KB Code
beschränkt, was für den Anfang aber erstmal reicht. Es gibt hier
http://www.rowalt.de/mc/ eine nette Einführung über die AVRs mit Bascom.
bye
Markus
Hmm, kann mir mal einer sagen, ob ich das ganze Geraffel jetzt in
AVR-Studio, also Assembler oder in Bascom-avr proggen soll? Die einen
sagen, Assembler ist das einzig Wahre, die anderen, bascom ist viel
einfacher und genauso effizient.
Bitte um Auskunft :)
Hi
Weder ASM noch BASCOM
C :-)
Ein Beispiel zum Multiplexen von 7-Segment-Anzeigen in C kannst du auf
meiner Homepage finden
www.matwei.de -> Elektronik -> Lüfter-Drehzahlmesser
Matthias
Hi,
Bascom ist als Anfaenger fuer etwas groessere Sachen ganz ok. Asm ist
besonders gut wenn man seinen Mikrocontroller richtig verstehen will. Zu
C kann ich so nix sagen.
@Markus Kaufmann
Dein FB Empfaenger Prg ist nen bischen umstaendlich.'use byte
library for smaller code
$lib "mcsbyte.lbx"
$regfile = "8535def.dat"
$crystal = 7372800 '
Taktfrequenz
$baud = 19200
Dim Address As Byte , Command As Byte
Dim Wcount As Word
Config Rc5 = Pinc.1
Config Timer1 = Timer , Prescale = 1024
Enable Interrupts
Print "Waiting for RC5..."
Do
Getrc5(address , Command)
If Address = 0 Then
Command = Command And &B01111111
Print Address ; " " ; Command
End If
wCount = Timer1 'Erst Wert sichern
Timer1 = 0 'Sofort Timer-Reset
wCount = wCount \ 36 '1/100 Sekunde
Print wCount;" ";
Loop
End
so ist es einfacher musst dich nicht mit dem timer beschaefigtigen
Mfg
Dirk
Bascom: Schön einfach. Der Code ist meines erachtens nicht so wirklich
effizient, aber es gibt "für alles und jedes" schon fertige Routinen.
LCD, I2C-Bus, One-Wire-Bus, Infrarot (aber nur RC5) usw. usf.
C (gcc/WinAVR): Ist wohl effizienter als BasCom (am konkreten Vergleich
arbeite ich noch), man muß sich die Routinen oft erst aus dem Internet
zusammensuchen. Deutlich hardwarenaher als Bascom, d.h. man muß oft die
Registernamen kennen usw. usf.
Der gcc ist kostenlos, d.h. wenn man mal die 2K der Demoversion
überschreitet ist der gcc billiger
Asm (AVRStudio): Die höchste Performance und die kleinsten Programme
bekommt man nur mit Assembler. Und den höchsten Schwierigkeitsgrad
verbunden mit der geringsten Flexibilität. Wenn ich z.B. in Basic oder C
merke, daß mein Wert doch nicht in eine 8Bit-Variable paßt, dann ändere
ich den Variablentyp (Aufwand: 5 Sekunden) und gut ist. In Assembler
fängst du an, alle Vorkommen dieser Variable zu überprüfen und
entsprechend anzupassen. Auch gibts gewisse Dinge (z.B.
Fließkommazahlen) in Assembler (auf Microcontrollern) einfach nicht.
Allerdings denke ich auch, daß man Assembler auf jeden Fall können
sollte, auch wenn man es normalerweise nicht benutzt. Nur so kann man
seine Hardware richtig verstehen und kann bei Compiler-Problemen einfach
mal nachschauen was da passiert oder eben nicht passiert.
Meine Empfehlung: Für den Anfang Bascom, damit bekommt man schnell
Ergebnisse. Später dann C. Zeitkritische Sachen kann man ja trotzdem in
Assembler machen, das schließt sich ja nicht aus.
Ich habe mein erstes Projekt in Basic gemacht, bin gerade dabei das nach
C umzusetzen und werde es anschließend in Assembler programmieren. Dann
habe ich einen schönen Vergleich und kenne mich mit allem aus.
bye
Markus
@Dirk:
Als ich die Bascom-Doku gelesen habe, da hab' ich mich voll gefreut,
weil er RC5-Codes empfangen kann. Gleich ausprobiert, funktioniert
leider nicht. Also kleine Routine geschrieben um die Werte vom
IR-Empfänger (längencodiert) in ein Array zu schreiben. Ergebnis: Keine
meiner 5 Fernbedienungen spricht RC5.
Die von meinem Videorekorder (JVC) habe ich jetzt mal näher angeschaut,
es wohl so ein japanisches Format. Das taste ich mit 10kHz ab und
analysiere es dann.
bye
Markus
Moin!
Wenn ich Bascom nehme, könnt Ihr mir da n Buch empfehlen? Habe von Claus
Kühnel gehört, der soll eins geschrieben haben, allerdings hat das sehr
schlechte Bewertung bekommen. Aber im Inhalt stehen interessante Dinge,
die ich wohl brauche, wie LED-Matrix ansteuerung usw...
Jemand noch n anderes parat?
bye
Jan
Hi,
das Buch von Claus Kuehnel kannst Du Dir sparen, wenn du englisch
kannst. Die Online Hilfe ist extrem gut. Der nette Herr Kuehnel hat die
Online Hilfe genommen und ins dt. uebersetzt (zum Teil). Saug Dir
einfach mal die Demoversion und schau es Dir an.
Mfg
Dirk
Hey,
habe diesen Code für Bascom gefunden. Leider hab ich mein stk 500 noch
nicht, aber hiermit kann ich wohl ne dotmatrix ansteuern.
Leider versteh ich da gar nix, hehe. Wenn also ma jemand Lust hast, mir
den Code kurz zu erläutern, ist nicht lang.
Danke und Gruß
Jan
Ich wieder.
Werde die Matrizen jetzt mit nem 4514 und nem 74hc138 ansteuern. damit
krieg ich bei 7 outputs 3 Matrizen angekorkt, also bei 32 ports
insgesamt 12 Displays :-) Sollte reichen.
Danke für all die Hilfe.
Gruß
Jan
PS. Werde erstmal mit Bascom arbeiten, sieht recht easy aus; im
Simulator hab ich den ersten Text schon fertig :) Muß nur noch laufen
lernen...
Hallo,
ich beschäftige mich auch zum ersten mal mit avr und deren
programmierung.
bin zwar auch noch ein newbie, kann aber evtl. etwas zu dem problem
beisteuern.
ich habe hier das elektorheft 11/2003 vor mir liegen.
darin geht es auch um eine laufschrift mit 12Stk. 5x8 Dot-Matrix LED
Anzeigen die über einen avr angesteuert werden.
Dort wurde das Multiplexen ganz einfach gelöst ! die Zeilen sind ja je
8Bit breit, belegen also einen port. Muß also nur noch immer die Spalte
gemultiplext werden. Dies machen die hardwaremäßig mit einem
schieberegister ! (avr -> 74HCT164 -> ULN 2803 -> LED Anzeige und avr
-> LED-Anzeige)
Den Quellcode kann man bei Elektor runterladen !
Hallo an alle LED-Matrixer. Vielleicht etwas zu uneffizient und nicht
umständlich genug, aber ich habe mit nur einem Zusatz IC ne LED-Matrix
gebaut. Der CD4017 wird vom AVR getaktet und der AVR steuert die LEDs
an. So kann ich insgesamt 10 Reihen Multiplexen, geht natürlich auch
mit 7 oder 16 Segmentanzeigen. Da ich aber mehr als nur 1 1/2
Buchstaben drauf haben wollte, habbich insgesamt 15 Reihen gebaut, und
mit entsprechenden ICs durchgetickt. Siehe Fotoanhang. Viel mir grad
ein, wo alle die wildesten Ideen zum Thema Multiplex haben.