Autor |
|
|
|
BID = 707180
freakypete Neu hier
![](/phpBB/images/stars/star.gif)
Beiträge: 37
|
|
Hallo!
Ich arbeite schon länger an einer LCD 7 Segment Anzeige.
Bisher funktioniert es hardwaremäßig sehr gut, doch mit der Software happerts bei mir.
Ich programmiere den Mikrocontroller Atmega8515 mit Bascom.
Jetzt zu meinem Problem: Ich benötige für LCD ja Phase. Also eine Rechtecksschwingung mit 50% duty cicle. Diese möchte ich mit dem Mikrocontroller erzeugen:
Code : |
Porte.2 = 1
Waitms 50
Porte.2 = 0
Waitms 50 |
|
Wie kann ich diesen Code als Schleife parallel mit dem Hauptprogramm laufen lassen? Ist das überhaupt mit Bascom möglich?
L.G.
freakypete |
|
BID = 707184
Kleinspannung Urgestein
![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif)
Beiträge: 13373 Wohnort: Tal der Ahnungslosen
|
|
Zitat :
freakypete hat am 11 Aug 2010 20:02 geschrieben :
|
Ich benötige für LCD ja Phase.
|
Wie meinen?
Phasen gibts wo anders,und meine LCD laufen ohne die mit Bascom.
Kannst einem doofem mal erklären was nun meinst?
_________________
Manche Männer bemühen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z.B. der Relativitätstheorie.
(Albert Einstein) |
|
BID = 707186
Rafikus Inventar
![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) Beiträge: 4183
|
Und am besten ganz normal deutsch schreiben, wir verstehen das dann schon und es unterlaufen einem weniger Fehler in den englischen Ausdrücken.
Rafikus
|
BID = 707187
perl Ehrenmitglied
![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif)
Beiträge: 11110,1 Wohnort: Rheinbach
|
Zitat :
| Also eine Rechtecksschwingung mit 50% duty cicle. |
Ist das denn ein LCD mit nur einer Backplane?
Bei mehr als 4 Stellen wird gerne gemultiplext und dann braucht man komplizierte Wellenformen.
[ Diese Nachricht wurde geändert von: perl am 11 Aug 2010 20:17 ]
|
BID = 707188
freakypete Neu hier
![](/phpBB/images/stars/star.gif)
Beiträge: 37
|
Nun ja. Ich hab kein fertig gekauftes/bestelltes LCD Board, sondern eine Anzeige, bei der für jedes Segment die Pins herausgeführt sind und einen LCD-Controller: CD4543. Dieser hat an Pin6 den Anschluss "Phase".
Der wird benötigt, um die Anzeige mit Wechselstrom zu versorgen, damit diese nicht kaputt geht (Elektrolyse).
Möchteb also diese Rechtecksschwingung direkt mit dem Mikrocontroller erzeugen.
|
BID = 707195
Her Masters Voice Inventar
![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif)
Avatar auf fremdem Server ! Hochladen oder per Mail an Admin
Beiträge: 5312 Wohnort: irgendwo südlich von Berlin
|
wie du schon geschrieben hast geht das Display kaputt wenn dieser Takt nicht stimmt. Hast du einen Controller der NIE abstürzt? Wenn du einen Solchen hast, dann löst man sowas nicht mit Delays sondern mittels Timer und Interrupt. Dann ist der Rechenknecht nicht mit Vollzeitwarten beschäftigt sondern kann auch noch andere Aufgaben erledigen.
_________________
Tschüüüüüüüs
Her Masters Voice
aka
Frank
***********************************
Der optimale Arbeitspunkt stellt sich bei minimaler Rauchentwicklung ein...
***********************************
|
BID = 707201
freakypete Neu hier
![](/phpBB/images/stars/star.gif)
Beiträge: 37
|
Danke für den Tipp.
Der Controller ist mir bisher noch nie abgestürzt. Aber vermutlich auch deshalb, weil ich noch nichts umfangreicheres programmiert habe. Auch dieses Programm soll nur ganz simpel sein. Kannst du mir, da ich mich so gar nicht auskenne ein ganz kurzes Beispielprogramm schreiben? Wäre dir dafür wirklich sehr dankbar!
|
BID = 707208
perl Ehrenmitglied
![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif)
Beiträge: 11110,1 Wohnort: Rheinbach
|
Du brauchst auch nicht jedesmal eine eigene Warteschleife davor, denn dann besteht die Gefahr, dass das Signal unsymmetrisch wird, wenn der Prozessor sich anschliessend eine Zeitlang im Hauptprogramm aufhält.
Einfacher und genauer ist es das PortBit im Kopf der Hauptschleife nur umzupolen und dann evtl. noch etwas zu warten, falls die Hauptschleife sonst zu schnell durchlaufen wird.
[ Diese Nachricht wurde geändert von: perl am 11 Aug 2010 21:05 ]
|
BID = 707228
freakypete Neu hier
![](/phpBB/images/stars/star.gif)
Beiträge: 37
|
OK. Ich danke euch vielmals für die Hilfe!
Nun denke ich dass ich das hinbekomme.
Nochmal dickes Dankeschön
|
BID = 707246
Nukeman Schriftsteller
![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif)
Beiträge: 754 Wohnort: bei Kleve
|
Ergänzend zu Perls Vorschlag: Am besten dazu im Programm-Kopf darauf warten,
dass ein Timer überläuft, dann sollte das mit dem 50% Duty-Cycle genau genug
klappen und man kann auch bequem eine definierte Frequenz vorgeben.
Danach Timer ggf. neu laden, Timer-Overflow-Flag löschen und wieder weiter im
Programm.
Gruß
Stefan
|
BID = 707272
perl Ehrenmitglied
![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif)
Beiträge: 11110,1 Wohnort: Rheinbach
|
Fortgeschrittene verzichten aber auf einen Decoder wie den CD4543 überhaupt und lassen statt dessen den µC die Decodierung machen.
Ausgabe dann über ein Schieberegister wie den CD4094.
Das hat den Vorteil, dass man nur 3 Pins des µC für Displays mit beliebig vielen Stellen braucht, und dass man überdies auch jedes beliebige Bitmuster im Display darstellen kann, z.B. 'Error'. Mit dem Decoder geht das nicht.
Ausserdem erleichtert es das Layout der Schaltung, weil man nicht mehr festgelegt ist, welcher Ausgang des SR an welchem Segment des Displays landet. Die Software kann das ja beliebig positionieren.
Die Wechselspannung erzeugt man einfach dadurch, dass man bei jeden Durchlauf der Hauptschleife das Bitmuster, welches in das Schieberegister geladen wird, invertiert.
Ein Bit, welches zwar ins SR geladen, aber nicht dargestellt wird, entspricht dabei einem niemals leuchtenden Segment und erzeugt das Signal für die Backplane.
[ Diese Nachricht wurde geändert von: perl am 11 Aug 2010 23:53 ]
|
BID = 707274
DonComi Inventar
![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif)
Beiträge: 8605 Wohnort: Amerika
|
Moin,
Es gibt auch die Möglichkeit, einen Timer in den CTC-Modus zu versetzen und die Kontrolle über den OCn-Pin der Timerhardware zu überlassen.
Damit kann man Frequenzen per Hardware erzeugen und es ist fortan überhaupt nicht mehr nötig, sich um irgendwelche Timings zu kümmern.
Siehe dazu im Datenblatt die Sektion "Output Compare Unit" und suche nach "Clear Timer on Compare".
_________________
|
BID = 707384
freakypete Neu hier
![](/phpBB/images/stars/star.gif)
Beiträge: 37
|
Wow, da sind ja wieder einige Vorschläge dazugekommen!
Ich habe mir jetzt das mit dem Timer und Interrupt genauer angeschaut und schon probiert. Hier mein Code:
Code : |
$regfile = "m8515.dat"
$crystal = 1638400
Config Portc = Output
Config Porte = Output
Config Timer0 = Timer , Prescale = 64
Enable Timer0
On Timer0 Isr_von_timer0
Enable Interrupts
Load Timer0 , 100
Do
Portc.0 = 0
Portc.1 = 0
Portc.2 = 0
Portc.3 = 1
Loop
End
Isr_von_timer0:
Load Timer0 , 100
Toggle Porte.2
Return |
|
Damit erscheint auf dem Display auch schon eine satte 8.
Nun aber Zeitverzögerungen im Hauptprogramm:
Code : |
Portc.0 = 1
Portc.1 = 0
Portc.2 = 0
Portc.3 = 1
Wait 1
Portc.0 = 0
Portc.1 = 0
Portc.2 = 0
Portc.3 = 0
Wait 1
|
|
Hiermit sollte im Sekundentakt zwischen 0 und 1 gewechselt werden. Tut es aber nicht. Es dauert nämlich ca. 1,7 Sekunden.
Und zuallerletzt komplette Verwirung bei mir
Mit einer Soudcard Oszillograph-Software habe ich mir die erzeugte Welle am Ausgang angesehen. Siehe Bild. Die Frequenz ist angeblich rund 20 Hz und nicht die von mir berechneten 50 Hz. (1638400/64)/256 = 100. Also jede 1/100 s sollte porte.2 getoggelt werden...
Woran könnte das denn liegen? Oder ist diese Oszillograph-Software nicht ernst zu nehmen? Denn die Ziffer ist gut erkennbar.
|
BID = 707387
perl Ehrenmitglied
![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif) ![](/phpBB/images/stars/star.gif)
Beiträge: 11110,1 Wohnort: Rheinbach
|
Zitat :
| Die Frequenz ist angeblich rund 20 Hz |
Das ist aber ein guter Wert fürs LCD.
Deine Frequenzmessung kannst du leicht überprüfen, indem du ein bischen Brummspannung einspeist. Evtl reicht es den Finger auf den Kontakt des Mikrofoneingangs zu legen.
Da sollten dann genau 50Hz angezeigt werden
|
BID = 707389
freakypete Neu hier
![](/phpBB/images/stars/star.gif)
Beiträge: 37
|
Stimmt, es werden wenn ich den Finger auf den Kontakt lege genau 50 Hz angezeigt.
Zitat :
| Das ist aber ein guter Wert fürs LCD.
|
Na dann ist ja gut!
Nur wie steht es mit der Welle? Sieht nämlich nicht so aus wie eine Rechtecksschwingung! Kanns sein, dass die Spannung nicht gehalten werden kann und abstürzt? Wo könnte dann der Auslöser dafür liegen?
@DonComi: Welches Datenblatt meinst du?
|