mikrocontroller.net

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


Autor: Sören R. (iopodx)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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++...

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sören R. (iopodx)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du must einen Timerinterrupt benutzen.


Peter

Autor: Sören R. (iopodx)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Masl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Sören R. (iopodx)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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

...

Autor: Sören R. (iopodx)
Datum:

Bewertung
0 lesenswert
nicht 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 :/

Autor: Sören R. (iopodx)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Axel Krüger (axel)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.