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.
Vielen Dank für die Antwort, dann muss ich mir wohl was neues überlegen ...
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?
1 | ldi temp, LOW(RAMEND) ; Stackpointer |
2 | out SPL, temp |
3 | ldi temp, HIGH(RAMEND) |
4 | out SPH, temp |
anders rum. Bei 16 Bit Registern immer erst High beschreiben und dann erst Low.
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ß
@Hannes (Gast) Kleine Anfrage Warum benutzt du nicht das PWM von Timer 1 ?
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.
Karl Heinz Buchegger schrieb: > ALso bin ich doch nicht blind :-) Oder ich bin genauso blind... Gruß in die Berge... ...
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?
vielleicht floatet ja ein Pin und sorgt für ungewollte IRQs (falls enabled) reset beschaltung war schon erfragt? Namaste
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
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.