Forum: Mikrocontroller und Digitale Elektronik [BASCOM ] Soft PWM


von Tom (Gast)


Lesenswert?

Hallo,

ich versuche auf dem Mega32 mit 16Mhz eine Software PWM zu bauen.
Wenn ich eine Taktfrequenz von ca. 122Hz erzeugen will, dann sollte das 
doch mit einem prescaler von 256 zu machen sein ?!

Das erzeugt aber nur ein wirres hektisches blinken, <Erst mit einem 
prescaler von 1 ist soetwas wie dimmen zu erkennen.

Was mach ich da falsch ??


$regfile = "m32def.dat"
$crystal = 16000000

$lib "mcsbyte.lbx"


Dim Pwm_stufen As Byte
Dim Pwm_wert As Byte
Dim Pwm_zaehler As Byte


Config Portd.4 = Output
Config Portd.5 = Output

Led1 Alias Portd.5
Led2 Alias Portd.4

Const An = 1
Const Aus = 0

Pwm_stufen = 254
Pwm_wert = 0
Pwm_zaehler = 0


'-------- Timer initialisieren ---

Config Timer0 = Timer , Prescale = 1

Enable Timer0
Enable Interrupts

On Timer0 timer0_ueberlauf


Do

' no loop

Loop

End



timer0_ueberlauf:


 If Pwm_zaehler >= Pwm_stufen Then
       Pwm_zaehler = 0
       Incr Pwm_wert
       Else
       Incr Pwm_zaehler

  End If

   If Pwm_wert >= Pwm_stufen Then
    Pwm_wert = 20
   End If


  If Pwm_zaehler < Pwm_wert Then
      Led2 = An
      Else
      Led2 = Aus
 End If


Return

von Tom (Gast)


Lesenswert?

kann mir niemand etwas zu meinen Timingproblemen sagen ?

von Hannes L. (hannes)


Lesenswert?

Bascom-Verfechter schwören auf den Simulator. Klappere es doch einfach 
mal damit durch.

...

von Tom (Gast)


Lesenswert?

Ja danke, das wäre schon mal ein Idee.

von Rainer U. (r-u)


Lesenswert?

Deine ISR wird schon mit dieser Frequenz aufgerufen (je nach prescaler) 
- aber Du schaltest ja bei weitem nicht bei jedem Aufruf die LEDs um.. 
deshalb geht es langsamer als Du denkst.

von Tom (Gast)


Lesenswert?

@Rainer

aber ich dachte, mein Zähler wird im 122Hz Takt hochgezählt und damit 
auch der Vergleich

Pwm_zaehler < Pwm_wert

durchgeführt ??

von Rainer U. (r-u)


Lesenswert?

ja, die ISR wird schon so angesprungen. Der zähler wird ja nur im 
Else-Zweig hochgezählt.. evtl. hast Du einen Denkfehler drin.


versuch es doch mal einfacher so in der ISR:

OnTimer0:
   if Zaehler < Helligkeit then LED=An else LED=aus
   incr Zaehler
return

(Zähler und Helligkeit sind Bytes, Helligkeit setzt Du im Hauptprogramm, 
zähler läßt Du immer überlaufen, somit von 0 bis 255)

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.