Hallo zusammen,
hab da ein kleines Problem. Ich brauche für eine Krippenbeleuchtung eine
PWM Dimmung für die LEDs und eine Uhr, damit ich verschiedene
Beleuchtungsmodi zeitabhängig einstellen kann.
An meinem Testaufbau hab ich 2 LEDs (Port C) für den PWM Test und
weitere 6 LEDs (Port D), die ich benutze um die Uhr zu testen. Ausgabe
der Sekunden binär an den 6 LEDs, aber fürs optische Debugging reichts
allemal ;-)
PWM über Timer 0 alleine funtioniert einwandfrei.
Sekundenzählen über Timer 1 alleine funktioniert auch.
Wenn ich nun beide Timer zusammen aktiviere funktioniert PWM noch, aber
die Sekundenanzeige wird zu einer Lichtorgel.
Kommt mir so vor als wenn der Interrupt für Timer 1 auch schon nach 256
Takten kommt anstelle der gewünschten 15625 Takten (Mega8 @ 1Mhz).
Kann mir da jemand weiterhelfen? Code im Anhang.
Danke schon mal
Hannes schrieb:> Kommt mir so vor als wenn der Interrupt für Timer 1 auch schon nach 256> Takten kommt anstelle der gewünschten 15625 Takten (Mega8 @ 1Mhz).
Weil die Obergrenze des PWMs bei 256 liegt, ist hier schon der Overflow.
Ich denke nicht, dass die Antwort hier zutreffend war.
Die Timer sind voneinander unabhängig und Timer 1 ist ja auf CTC
konfiguriert. Und soweit ich das analysiert habe, stimmt das auch alles.
Allerdings sehe ich auch nicht, wo jetzt das Problem in deinem Programm
liegt. Eventuell ein Hardware-Problem? Abblockkondensatoren hast du am
µC?
Karl Heinz Buchegger schrieb:> anders rum.> Bei 16 Bit Registern immer erst High beschreiben und dann erst Low.
Das gilt aber nur für solche 16-Bit-Register, die mit einem
"Zwischenregister" arbeiten, damit die 16 Bit komplett in einem Rutsch
geschrieben werden können. Der Stack-Pointer gehört nicht dazu, ergo ist
dort die Reihenfolge egal.
Karl Heinz Buchegger schrieb:> Ich denke nicht, dass die Antwort hier zutreffend war.> Die Timer sind voneinander unabhängig und Timer 1 ist ja auf CTC> konfiguriert. Und soweit ich das analysiert habe, stimmt das auch alles.
sorry, das stimmt, ich hab zu schnell gelesen und dachte beides macht
ein Timer.
Stefan Ernst schrieb:> Der Stack-Pointer gehört nicht dazu, ergo ist> dort die Reihenfolge egal.
Man sollte es sich trotzdem angewöhnen, erst das Highbyte zu
beschreiben.
Karl Heinz Buchegger schrieb:> Allerdings sehe ich auch nicht, wo jetzt das Problem in deinem Programm> liegt. Eventuell ein Hardware-Problem? Abblockkondensatoren hast du am> µC?
Ähm nein, hab ich keine angebaut. Wo kämen die denn hin? (Sorry für die
augenscheinliche Anfängerfrage)
Hannes schrieb:> Ähm nein, hab ich keine angebaut. Wo kämen die denn hin? (Sorry für die> augenscheinliche Anfängerfrage)
Je 100nF zwischen Vcc und GND bzw. AVcc und GND. So nah dran wie geht.
mfg.
So ... hab die Kondensatoren eingelötet => kein Unterschied
Hab meine gelötete Schaltung auf dem Steckbrett nachgebaut => kein
Unterschied
Hab den uC getausch => kein Unterschied
High und Lowbyte hab ich auch mal spaßeshalber getauscht ... nix.
Externer Oszillator hab ich für Spaß auch mal rangehangen (und Werte
geändert) ... leider auch nix.
Allerdings konnte ich etwas leider nicht reproduzierbares beobachten.
Manchmal werden die LEDs ganz dunkel - und dann stimmt auch das Timing.
Von der Beschaltung und Stromversorgung her hab ich mich an den Aufbau
aus dem Tutorial gehalten (jetzt sogar mit Kondensatoren, wer lesen kann
ist im Vorteil ;-))
Noch jemand ne Idee?
Danke und Gruß
Dennis Heynlein schrieb:> Warum benutzt du nicht das PWM von Timer 1 ?
Es sollen später 8 LED in unterschiedlichen Helligkeiten angesteuert
werden. Soweit ich das verstanden habe, kann Timer 1 doch nur 1 PWM
Stufe ausgeben?
Hannes schrieb:> Es sollen später 8 LED in unterschiedlichen Helligkeiten angesteuert> werden. Soweit ich das verstanden habe, kann Timer 1 doch nur 1 PWM> Stufe ausgeben?
PWM für LEDs kann man auch in Software machen. Ich hänge Dir mal ein 4
Jahre altes Beispiel an.
...
@Hannes Lux
Das wurmt mich, dass ich im TO-Programm den Fehler nicht finde.
Kannst du dir das mal ansehen. Meiner Meinung nach, ist es in Ordnung.
> Allerdings konnte ich etwas leider nicht reproduzierbares beobachten.> Manchmal werden die LEDs ganz dunkel - und dann stimmt auch das Timing.
Hä?
Sieht für mich immer mehr nach einem Hardware-Problem aus.
Karl Heinz Buchegger schrieb:> @Hannes Lux>> Das wurmt mich, dass ich im TO-Programm den Fehler nicht finde.> Kannst du dir das mal ansehen.
Beim ersten Reinschaun (als der Thread neu war) habe ich es schnell
wieder geschlossen, da ich diesen Stil nicht besonders mag.
> Meiner Meinung nach, ist es in Ordnung.
Ich hab's mir jetzt (wegen Dir) nochmal genauer angesehen. Ich hätte
zwar Vieles anders gemacht *), aber einen offensichtlichen Fehler kann
ich auch nicht sehen.
>>> Allerdings konnte ich etwas leider nicht reproduzierbares beobachten.>> Manchmal werden die LEDs ganz dunkel - und dann stimmt auch das Timing.>> Hä?> Sieht für mich immer mehr nach einem Hardware-Problem aus.
Das sehe ich auch so. Aber wegen dieses einfachen Programms werde ich
keine Hardware aufbauen.
Ich weiß nun nicht, womit die Hexdatei geflasht wird. Mein uralter (und
längst verschrotteter) Eigenbau-Brenner mit Eigenbau-(Pfusch-)Software
in QBASIC von M$-Doof hätte da Mist gebrannt, weil die Hexdatei aufgrund
der Lücken in der Interrupt-Sprungtabelle fragmentiert ist.
*) Anders gemacht hätte ich z.B.:
- "Tabs durch Spaces ersetzen" eingestellt, damit die
Flatterformatierung unterbleibt, wenn man den Quältext außerhalb
des AVR-Studios betrachtet.
- Die komplette Interrupt-Sprungtabelle kopiert (wegen
Übersichtlichkeit).
- 16-Bit-Zahlen mit Low() und High() in Bytes zerlegt und dezimal
angegeben.
- Oder statt Plus beim Zusammensetzen der Bits benutzt.
- Auf SREG-Sicherung verzichtet, solange die Mainloop leer ist, bzw.
dafür ein Exklusiv-Register verwendet.
- Exklusivregister für ISR eingerichtet, um unnötige Push/Pop zu
sparen, der AVR hat immerhin 32 Register.
- Vergleichswerte für die Zeit-Zählung dezimal angeben, damit man sie
als Mensch ohne Umrechnen lesen kann.
- Etwas umfangreicher kommentiert.
All das sind keine Fehler im klassischen Sinne, erhöhen aber die
Lesbarkeit von Quältexten. Ich fühle mich dabei einfach wohler.
...
Hannes schrieb:> Noch jemand ne Idee?
Kann es sein, dass Du AVcc und AGND nicht angeschlossen hast?
Das würde zumindest erklären, warum PortC spinnt.
...
Hannes Lux schrieb:> Ich hab's mir jetzt (wegen Dir) nochmal genauer angesehen. Ich hätte> zwar Vieles anders gemacht *), aber einen offensichtlichen Fehler kann> ich auch nicht sehen.
Danke.
ALso bin ich doch nicht blind :-)
Wie sieht denn die Hardware aus?
Schaltplan o.ä. wäre nicht schlecht!
Evtl. keine/falsche Widerstände an den LEDs?
Dann würde evtl. der Spannungsregler/Baterie einbrechen --> Chaos aufm
uC.
Hannes Lux schrieb:> Kann es sein, dass Du AVcc und AGND nicht angeschlossen hast?> Das würde zumindest erklären, warum PortC spinnt.
Ist angeschlossen ...
Codeumgebung schrieb:> Schaltplan o.ä. wäre nicht schlecht!
Hab mich an den Aufbau aus dem Tutorial gehalten. Poste in Kürze mal den
Schaltplan.
Vielen Dank schon mal für alle Mühe!
Es ginge natürlich auch mit nur einem Timer und in einer ISR
Der System Timer mus auf der Zeitbasis auf des Grösten gemeinasmen
Teilers laufen und static integer softwarezähler für jeden kanal
inklusive Uhr inkrementieren, vergleichen, zurücksetzen und die Portbits
setzen.
Namaste
Winfried J. schrieb:> Es ginge natürlich auch mit nur einem Timer und in einer ISR>> Der System Timer mus auf der Zeitbasis auf des Grösten gemeinasmen> Teilers laufen und static integer softwarezähler für jeden kanal> inklusive Uhr inkrementieren, vergleichen, zurücksetzen und die Portbits> setzen.
Richtig...
Ist hier z.B. so realisiert:
Beitrag "Re: Kann man während einer PWM noch nebenbei was auf dem Display anzeigen!?">> Namaste
...
Also:
Es hat mir keine Ruhe gelassen.
Mega8 hab ich keinen mehr da. Aber ich habe das Programm, so wie es ist,
in einen Mega16 gebrannt (include natürlich angepasst). Hat auf Anhieb
funktioniert.
Ich denke, es ist irgendeine Hardware Sache.
Mach doch mal ein Photo von deinem Aufbau / Schaltplan
Was nimmst du als Spannungsversorgung?
Wie wild leuchten denn die "Debug-LED's" der Sekunden ?
gibts bei dir vielleicht nen Logikanalyser um das Aufzuzeichnen ?
Externer Taktgeber der anfängt zu Spinnen schließe ich mal eben aus.
Karl Heinz Buchegger schrieb:> Was nimmst du als Spannungsversorgung?
Hab ein Steckernetzteil auf 9V eingestellt. Reduziert auf 5V wird dann
mit der Schaltung hier aus dem Tutorial über den 7805.
Dennis Heynlein schrieb:> Wie wild leuchten denn die "Debug-LED's" der Sekunden ?
Grob würd ich sagen, dass in 1 Sekunde auf 59 hochgezählt wird.
> gibts bei dir vielleicht nen Logikanalyser um das Aufzuzeichnen ?
Leider nein.
Winfried J. schrieb:> reset beschaltung war schon erfragt?
Standard, 10k auf VCC.
Hannes Lux schrieb:> Ich weiß nun nicht, womit die Hexdatei geflasht wird.
Benutze inzwischen den mySmartUSB light. Vorher über LPT Marke Eigenbau.
(Die Widerstände sind übrigens noch angelötet.)
Ich find es echt super, dass ihr euch so viel Kopfzerbrechen mit meinem
Problem macht!
Karl Heinz Buchegger schrieb:> Mega8 hab ich keinen mehr da. Aber ich habe das Programm, so wie es ist,> in einen Mega16 gebrannt (include natürlich angepasst). Hat auf Anhieb> funktioniert.
Hab meinen Aufbau mit komplett neuen Bauteilen inkl. ganz frischen uC
neu aufgesteckt. Leider wieder das gleiche Ergebnis. Hab das ganze mal
fotografiert. Also so langsam zweifel ich an meinem Verstand ...
(Der uC ist separat, damit ich ihn später aufm Brett in die Krippe
einsetzen kann. Zur besseren Übersicht hab ich dem Quarz für das Foto
entfernt.)
Viele Grüße