Forum: Mikrocontroller und Digitale Elektronik wie 2 Timer gleichzeitig auf ATMega8


von Hannes (Gast)


Angehängte Dateien:

Lesenswert?

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

von Sam .. (sam1994)


Lesenswert?

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.

von Hannes (Gast)


Lesenswert?

Vielen Dank für die Antwort, dann muss ich mir wohl was neues überlegen 
...

von Karl H. (kbuchegg)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Stefan E. (sternst)


Lesenswert?

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.

von Sam .. (sam1994)


Lesenswert?

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.

von Hannes (Gast)


Lesenswert?

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)

von Thomas E. (thomase)


Lesenswert?

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.

von Hannes (Gast)


Lesenswert?

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ß

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

@Hannes (Gast)

Kleine Anfrage

Warum benutzt du nicht das PWM von Timer 1 ?

von Hannes (Gast)


Lesenswert?

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?

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

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.

...

von Karl H. (kbuchegg)


Lesenswert?

@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.

von Hannes L. (hannes)


Lesenswert?

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.

...

von Hannes L. (hannes)


Lesenswert?

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.

...

von Karl H. (kbuchegg)


Lesenswert?

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 :-)

von Codeumgebung (Gast)


Lesenswert?

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.

von Hannes L. (hannes)


Lesenswert?

Karl Heinz Buchegger schrieb:
> ALso bin ich doch nicht blind :-)

Oder ich bin genauso blind...

Gruß in die Berge...

...

von Hannes (Gast)


Lesenswert?

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!

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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

...

von Karl H. (kbuchegg)


Lesenswert?

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?

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

vielleicht floatet ja ein Pin und sorgt für ungewollte IRQs (falls 
enabled)
reset beschaltung war schon erfragt?

Namaste

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

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.

von Hannes (Gast)


Lesenswert?

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!

von Hannes (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.