Forum: Mikrocontroller und Digitale Elektronik Atmega8 Timer probleme


von Tobi88 (Gast)


Angehängte Dateien:

Lesenswert?

Guten abend zusammen ich hab ein Problem ich möchte eine Soft-PWM machen 
bei dem der Takt von einem HW-Timer generiert wird.

Also dachte ich nehm ich einen 8 -Bit Timer  lass den zykisch bis 100 
zählen und  packe den in eine globale Variable mit der die einzelen 
Kanäle verglichen wird. Aber irgendwie bin ich zu blöd das zu 
relaisieren denn  wenn ich statt Zeile 10 und 14 zeile 11 und 15 
einkommentiere geht es

von Tobi88 (Gast)


Angehängte Dateien:

Lesenswert?

Tobi88 schrieb:
> Guten abend zusammen ich hab ein Problem ich möchte eine Soft-PWM
> machen
> bei dem der Takt von einem HW-Timer generiert wird.
>
> Also dachte ich nehm ich einen 8 -Bit Timer  lass den zykisch bis 100
> zählen und  packe den in eine globale Variable mit der die einzelen
> Kanäle verglichen wird. Aber irgendwie bin ich zu blöd das zu
> relaisieren denn  wenn ich statt Zeile 10 und 14 zeile 11 und 15
> einkommentiere geht es

von Tobi88 (Gast)


Angehängte Dateien:

Lesenswert?

mir is im Code ein Fehler unterlaufen (Zeile 11 TCNT2) es muss natürlich 
TCNT0 heissen aber trotz korrektur läuft es nicht :-(

von Thomas E. (thomase)


Lesenswert?

Dein Timer läuft mit F_CPU. Der rennt dir glatt weg. Ehe das Programm 
sich durch die drei ifs gewurstelt hat, ist TCNT0 schon fast wieder bei 
100 angelangt. Oder sogar schon drüber. Setz den Prescaler auf 256. Das 
sollte für Leds reichen.

Nächstes mal den Code bitte als *.c posten, nicht als *.txt.

mfg.

von Tobi88 (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> Dein Timer läuft mit F_CPU. Der rennt dir glatt weg. Ehe das
> Programm
> sich durch die drei ifs gewurstelt hat, ist TCNT0 schon fast wieder bei
> 100 angelangt. Oder sogar schon drüber. Setz den Prescaler auf 256. Das
> sollte für Leds reichen.
>
> mfg.

Danke für den Tipp......aber ich dachte das der Mikrocontroller für 3 
IFs nicht so lange braucht... ok zugegeben ich habe dahinter auch noch 2 
Stakemaschinen aber trotzdem das sind nur 2 switches wo nichts gemacht 
wird....also ist in dem fall dein Tipp den Prescaler rauf zu setzen? 
hätte gedacht dass  es eig gut is wenn der Presclaer klein is

von Martin K. (maart)


Lesenswert?

Hat jetzt mit deinem Problem nicht direkt was zu tun: Warum gibst du 
alle Interrupts mit sei() frei, wenn du gar keine benutzt?

von Tobi88 (Gast)


Lesenswert?

Martin Kreiner schrieb:
> Hat jetzt mit deinem Problem nicht direkt was zu tun: Warum gibst
> du
> alle Interrupts mit sei() frei, wenn du gar keine benutzt?

stimmt danke ist ein Überbleibsel von  meinem vorherigen Code

von Martin K. (maart)


Lesenswert?

Tobi88 schrieb:
> Danke für den Tipp......aber ich dachte das der Mikrocontroller für 3
> IFs nicht so lange braucht...

Braucht er auch nicht.
Ich würde die ganzen if-Abfragen komplett in die ISR packen, dann läuft 
die PWM unabhängig von deinem restlichen Programm.

von Thomas E. (thomase)


Lesenswert?

Tobi88 schrieb:
> Danke für den Tipp......aber ich dachte das der Mikrocontroller für 3
> IFs nicht so lange braucht... ok zugegeben ich habe dahinter auch noch 2
> Stakemaschinen aber trotzdem das sind nur 2 switches wo nichts gemacht
> wird....also ist in dem fall dein Tipp den Prescaler rauf zu setzen?
> hätte gedacht dass  es eig gut is wenn der Presclaer klein is
100 Takte sind gar nichts. Guck dir mal im *.lss an, was der Compiler 
daraus gemacht hat. Jeder Befehl braucht min. 1 Takt.

Aber deine Lösung taugt nichts.
Schalt den Timer Interrupt ein.
1
ISR(Timer0_OVF_vect)
2
{
3
  counter++;
4
  if(counter == 101) Counter = 0;
5
}
6
.
7
.
8
while(1)
9
{
10
  if (counter >= PWM1) PORTB |= (1 << PB1); else PORTB &= ~(1 << PB1);
11
  //Das darf auch in der ISR stehen.
12
.
13
.
14
}

Dann kannst du den Timer auf Prescaler = 1 lassen. Ich würde aber soweit 
runter gehen, daß es gerade nicht flackert. Wenn es Leds sind.
Und der sei() bleibt dann auch stehen.

mfg.

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.