Software PWM Bascom

Gast #855543
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
Gast #855562
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? :-)
Gast #855573
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
Gast #855588
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).
Gast #855607
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.
Gast #855619
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..
Gast #855641
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.
Gast #855656
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
Gast #855660
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren