Forum: Mikrocontroller und Digitale Elektronik Software PWM Bascom


von bartjaysimpson (Gast)


Lesenswert?

Hallo,

ich bin dabei mit Bascom eine Software PWM Regelung zu proggen doch 
leider funktioniert es überhaupt garnicht. Hier mein Programm findet ihr 
villeicht den Fehler?
1
$regfile = "m8def.dat" N
2
$crystal = 3579545
3
$baud = 9600
4
5
Dim Timerwert As Byte
6
Dim Pwmwert As Byte
7
Dim Pwmwerton As Byte
8
Dim Pwmwertoff As Byte
9
Config Portc = Output
10
Config Timer0 = Timer , Prescale = 1
11
On Timer0 Ablauf
12
Enable Timer0
13
Enable Interrupts
14
15
16
Do
17
Pwmwert = 100
18
Pwmwerton = Pwmwert
19
Pwmwertoff = 255 - Pwmwert
20
21
If Pwmwerton = Timer0 Then Toggle Portc.1
22
If Pwmwertoff = Timer0 And Timerwert = 1 Then Toggle Portc.1
23
If Timerwert = 1 Then Timerwert = 0
24
Print Timer0
25
Lcd Pwmwerton
26
Loop
27
End
28
29
Ablauf:
30
Incr Timerwert
31
Return

von bascommaherundguckda (Gast)


Lesenswert?

Erstmal ist die Frage, on Du wirklich die 3 Zeilen nach dem "DO" in der 
Schleife haben wolltest. Außerdem wird der Interrupt während des Print- 
und LCD-Befehls mehrmals feuern. Außerdem wäre es reiner Zufall, wenn 
die Bedingung "If Pwmwerton = Timer0" zutrifft - der Timer0 Läuft ja 
auch währtend der anderen Befehle weiter.

reicht erstmal? :-)

von bartjaysimpson (Gast)


Lesenswert?

Ja da hast du absolut recht, hab das programm mal kurz etwas geändert 
doch leider funktioniert es immer noch nicht.
1
Do
2
Pwmwertoff = 255 - Pwmwert
3
If Pwmwert => Timer0 Then Set Portc.1
4
If Pwmwertoff => Timer0 And Timerwert = 1 Then Reset Portc.1
5
If Timerwert = 1 Then Timerwert = 0
6
Loop

von bascommaherundguckda (Gast)


Lesenswert?

die erste Zeile nach dem DO ist immer noch überflüssig in der Schleife, 
weil Pwmwert sich nicht ändert.

Ich glaube in deinem Kopf ist noch ein großes Wirrwar aus Timerwert 
(nimmt bei diesem Programmablauf Werte von 0-255 an), Timer0 (genauso, 
nur rückwärts) und PWMWert (=100).

von bartjaysimpson (Gast)


Lesenswert?

Hab es jetzt noch mal verändert:
1
$regfile = "m8def.dat"
2
$crystal = 3579545
3
$baud = 9600
4
Dim I As Byte
5
Dim Timerwert As Byte
6
Dim Pwmwert As Byte
7
Dim Pwmwerton As Byte
8
Dim Pwmwertoff As Byte
9
Config Portc = Output
10
Config Timer0 = Timer , Prescale = 1
11
On Timer0 Ablauf
12
Enable Timer0
13
Enable Interrupts
14
Pwmwert = 240
15
16
Do
17
I = Udr
18
Select Case I
19
Case "+"
20
Gosub Wert
21
End Select
22
23
Pwmwertoff = 255 - Pwmwert
24
25
If Pwmwert => Timer0 Then Set Portc.1
26
If Pwmwertoff => Timer0 And Timerwert = 1 Then Reset Portc.1
27
Loop
28
End
29
30
Ablauf:
31
Incr Timerwert
32
If Timerwert = 2 Then Timerwert = 0
33
Return
34
35
Wert:
36
Input "" , Pwmwert
37
Return

Wäre auch für komplett andere Vorschläge offen. Habe i Internet leider 
nichts passendes dazu gefunden.

von bascommaherundguckda (Gast)


Lesenswert?

warum machst Du jetzt noch ne neue Baustelle mit PC-Kommunikation auf? 
fang erstmal enfacher an:

'einfachste PWM
do
   Set Portc.1
   'hier eine veränderbar lange Pause
   waitus 10
   reSet Portc.1
   'hier eine veränderbar lange Pause
   waitus 10
loop

Wöfür genau willst Du Timer0 verwenden in Deinem o.g. Beispiel? 
Beschreib mal mit Worten..

von bartjaysimpson (Gast)


Lesenswert?

der vorschlag mit der veränderbaren Waitus Zeit ist zwar nicht schlecht 
doch leider kann ch für den Zeitwert keine Variable verwenden, doch ich 
möchte später über die Com-schnittstelle denn PWM-Wert vorgeben. Ich 
dachte es würde nur mit einem Timer funktionieren deshalb habe ich ihn 
benutzt. Wie gesagt ich bin für Vorschläge wie man es anders lösen 
könnte offen.

von bascommaherundguckda (Gast)


Lesenswert?

Wenn es denn ein reiner Software-PWM sein soll, brauchst Du eben ein 
klein wenig Rechenzeit zum Abfragen/Ändern des Wertes:

do
   Set Portc.1
   'hier eine veränderbar lange Pause
   waitus PausenVariable1

   ReSet Portc.1
   'hier eine veränderbar lange Pause
   waitus PausenVariable2

   'Schnittstelle abfragen
   If Usr.rxc = 1 Then gosub subEmpfangeUndSetzeVariablenNeu
loop

von bartjaysimpson (Gast)


Lesenswert?

ja bloß das Problem ist in der Hilfe bei Bascom steht zu Waitus 
fogendes:

This must be a constant. Not a variable!

Also kann ich doch keine Variable für den Zeitwert des Waitus einsetzen.

von bascommaherundguckda (Gast)


Lesenswert?

na einverstanden, dann statt waitus eben

for i = 1 to PausenVariable1 : next

von bartjaysimpson (Gast)


Lesenswert?

Ja das funktioniert so weit ganz gut. Doch ich komme egal mit welchen 
Werten nicht unter 3,3V am Ausgang.

von bascommaherundguckda (Gast)


Lesenswert?

womit gemessen? Spannung geglättet? (R-C-Glied). Wenn Pause1 gegen 0 und 
Pause2 gegen unendlich geht, sollte sie Spannung schon gegen 0 gehen.. 
:-)

von Marko (Gast)


Lesenswert?

du kannst auch den Servo-Befehlt von Bascom nehmen
um fast beliebig viele Soft-PWM zu generieren

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.