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++...
>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.
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?
Du must einen Timerinterrupt benutzen. Peter
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?
>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.
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ß
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
>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!
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 ...
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 :/
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 :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.