Atmega 16: Hilfe bei 7 Segment Multiplex Programmierung

OP #1420833
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++...
Angehängte Dateien:
Gast #1420847
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.
OP #1420854
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?
OP #1420928
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?
Angehängte Dateien:
Gast #1420934
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.
Gast #1420940
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ß
OP #1421014
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 :/

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren