Forum: Mikrocontroller und Digitale Elektronik Atmega 16: Hilfe bei 7 Segment Multiplex Programmierung


von Sören R. (iopodx)


Angehängte Dateien:

Lesenswert?

Quelltext ist im Anhang.

Also es funktioniert alles soweit, ist im Moment einfach nur ein 4 Kanal 
Thermometer mit zweistelligem 7 Segment Display. Nicht wundern über 
komische 7 Segment Belegungen, war so dass es einfach zu löten ist :).

Das Problem ist: Die Zehnerstelle ist dunkler als die Einerstelle. Ist 
mir im Moment aber nicht klar warum.

Kann mir ja jemand den entscheidenen Tipp geben?

Vielen Dank,
Sören

PS: Ich bin neu in der µC Programmierung, ist mein erstes Projekt, nur 
ein bisschen basteln... Bin froh dass relativ schnell alles ging (mal 
abgesehen vom Datenblattsuchen für's VQE 24...)

Ich Programmiere sonst eher OOP, allerdings kein C++...

von holger (Gast)


Lesenswert?

>Das Problem ist: Die Zehnerstelle ist dunkler als die Einerstelle. Ist
>mir im Moment aber nicht klar warum.

>Kann mir ja jemand den entscheidenen Tipp geben?

Deine Zehnerstelle wird 1ms angezeigt und deine Einerstelle
für die gesamte 1Wire Messzeit + den Rest der Loop.

von Sören R. (iopodx)


Lesenswert?

Ahh okay, jetzt seh ich auch warum... Was soll das Portb = &B00000000 
auch in der Case Anweisung...

Danke.

Aber wenn ich das nun korrigiere und zusehe dass beide gleichlange an 
sind, dann habe ich z.Bsp. bei je 5ms also etwa 100Hz eine gewisse 
Helligkeit, aber ein flackern.

Wie wäre nun der richtige Ansatz, um kein Flackern und trotzdem eine 
vernünftige Helligkeit zu erhalten?

von Peter D. (peda)


Lesenswert?

Du must einen Timerinterrupt benutzen.


Peter

von Sören R. (iopodx)


Angehängte Dateien:

Lesenswert?

So...

Timer ist also das Schlagwort. Schade dass es so nicht wirklich geht...

Was wären denn 'gute' Werte für den Prescaler, die Schaltzeiten für die 
Transistoren der einzelnen 7-Segment-Anzeigen und vor allem Timer1?

Oder besser gefragt: Wie werden die berechnet?

Der Timer zählt mit jedem Takt um Prescaler hoch, oder? Sobald er 
überläuft wird ein Interrupt ausgeführt, oder? Während dieser läuft, 
zählt der Timer nicht weiter, oder?

von STK500-Besitzer (Gast)


Lesenswert?

>Wie werden die berechnet?
Man nehme die Taktfrequenz des Controllers und teile sie gewünschte 
"Blinkfrequenz". Damit hat man eine Zahl, die das Teilerverhältnis 
widerspiegelt.
Manchmal passt sie als Vergleichswert*), manchmal ist sie aber zu groß.

>Der Timer zählt mit jedem Takt um Prescaler hoch, oder?
Hä?
Der Timer wird mit einer Frequenz gespeist. Das ist überwiegend die 
Taktfrequenz des Controllers. Ein Prescaler ist wie der Name schon sagt 
ein Vorteiler: Das Timer-Register wird nicht bei jedem Taktperiode 
verändert, sondern erst nach der Anzahl von Perioden, die durch den 
Prescaler eingestellt wurden.

>Sobald er überläuft wird ein Interrupt ausgeführt, oder?
Muss nicht, kann.

>Während dieser läuft, zählt der Timer nicht weiter, oder?
Doch.


*) Genaues Timing macht man u.a. mit dem CTC-Modus.

von Masl (Gast)


Lesenswert?

Der Prescaler teilt den Takt des Taktgebers (z.B. Quarz oder interne 
Taktquelle) nochmals um den eingestellten Wert.
Beispiel: Wenn du also einen Takt von 8MHz hast und den prescaler auf 8 
gestellt hast, dann wird dein Takt durch 8 geteilt und der Zähler wird 
nurnoch 1.000.000 in der Sekunde erhöht. Ohne prescaler logischerweise 
8.000.000 mal. Mit 16er Prescaler 500.000 mal usw.

Jetzt kannst du ja ausrechnen wann der Zähler sein Maximum (bei 8-Bit: 
255 bei 16 bit 65.536) erreicht und die Overflow-Routine auslöst, falls 
aktiviert

Gruß

von Sören R. (iopodx)


Lesenswert?

Okay, möchte ich also 100Hz haben, habe ich 16MHz/100Hz = 160.000

Würde bedeuten, ich müsste alle 160.000 Takte einen Interrupt haben.

Mit einem Prescaler von 256 wären das 625 Schritte?!

Ergo Timer1 = 65536-625 = 64911!?

Besten Dank soweit,
Sören

von STK500-Besitzer (Gast)


Lesenswert?

>Ergo Timer1 = 65536-625 = 64911!?

Und wie kriegst du den Timer dazu, immer mit diesen Wert zu arbeiten?
Guck dir im Datenblatt den CTC-Modus an!

von Hannes L. (hannes)


Lesenswert?

Schau auch mal hier, könnte hilfreich für Dich sein, obwohl es kein 
1Wire enthält und auch mit einem kleinen Tiny24 zurecht kommt:

http://www.hanneslux.de/avr/divers/pm24/index.html
Weiter geht es dann hier:
http://www.hanneslux.de/avr/divers/pm24/vm24.html
und einen BASCOM-Quältext dazu findest Du hier:
http://www.hanneslux.de/avr/divers/pm24/VM_tn24_1.bas

...

von Sören R. (iopodx)


Lesenswert?

Leider bringen mich eure Antworten nicht wirklich weiter...

Und langsam hab ich auch keine Lust mehr, ständig zu googlen und jedes 
mal eine andere Formel zu finden, andere Quelltexte die ganz andere 
Ansätze haben als ich vorgesetzt zu bekommen...

Was mache ich falsch?

Wieso ist

[QUOTE]
Okay, möchte ich also 100Hz haben, habe ich 16MHz/100Hz = 160.000

Würde bedeuten, ich müsste alle 160.000 Takte einen Interrupt haben.

Mit einem Prescaler von 256 wären das 625 Schritte?!

Ergo Timer1 = 65536-625 = 64911!?

Besten Dank soweit,
Sören
[/QUOTE] falsch?

Was ist am Quellcode 20:06 falsch?

Ich dreh mich im Kreis :/

von Sören R. (iopodx)


Lesenswert?

Ich bin doch nicht zu blöd:

Passiert halt, wenn man den ganzen PORTB ständig setzt, aber PORTB.7 das 
1wire Interface ist.

Danke für eure Geduld :)

von Axel K. (axel)


Angehängte Dateien:

Lesenswert?

Hier hast du mal einen Code, wie er funktioniert (OHNE TIMER!) um 4 7 
Segment Anzeigen flimmerfrei in gleicher Helligkeit in Multiplex an nem 
Atmega8 zu treiben.

du musst natürlich noch um paar Einzelheiten ergänzen - ich habe die 
unwichtigen Dinge mal gelöscht.

gruss Axel

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
Noch kein Account? Hier anmelden.