mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Software PWM Bascom


Autor: bartjaysimpson (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
$regfile = "m8def.dat" N
$crystal = 3579545
$baud = 9600

Dim Timerwert As Byte
Dim Pwmwert As Byte
Dim Pwmwerton As Byte
Dim Pwmwertoff As Byte
Config Portc = Output
Config Timer0 = Timer , Prescale = 1
On Timer0 Ablauf
Enable Timer0
Enable Interrupts


Do
Pwmwert = 100
Pwmwerton = Pwmwert
Pwmwertoff = 255 - Pwmwert

If Pwmwerton = Timer0 Then Toggle Portc.1
If Pwmwertoff = Timer0 And Timerwert = 1 Then Toggle Portc.1
If Timerwert = 1 Then Timerwert = 0
Print Timer0
Lcd Pwmwerton
Loop
End

Ablauf:
Incr Timerwert
Return

Autor: bascommaherundguckda (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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? :-)

Autor: bartjaysimpson (Gast)
Datum:

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

Autor: bascommaherundguckda (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: bartjaysimpson (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab es jetzt noch mal verändert:
$regfile = "m8def.dat"
$crystal = 3579545
$baud = 9600
Dim I As Byte
Dim Timerwert As Byte
Dim Pwmwert As Byte
Dim Pwmwerton As Byte
Dim Pwmwertoff As Byte
Config Portc = Output
Config Timer0 = Timer , Prescale = 1
On Timer0 Ablauf
Enable Timer0
Enable Interrupts
Pwmwert = 240

Do
I = Udr
Select Case I
Case "+"
Gosub Wert
End Select

Pwmwertoff = 255 - Pwmwert

If Pwmwert => Timer0 Then Set Portc.1
If Pwmwertoff => Timer0 And Timerwert = 1 Then Reset Portc.1
Loop
End

Ablauf:
Incr Timerwert
If Timerwert = 2 Then Timerwert = 0
Return

Wert:
Input "" , Pwmwert
Return


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

Autor: bascommaherundguckda (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: bartjaysimpson (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: bascommaherundguckda (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: bartjaysimpson (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: bascommaherundguckda (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
na einverstanden, dann statt waitus eben

for i = 1 to PausenVariable1 : next

Autor: bartjaysimpson (Gast)
Datum:

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

Autor: bascommaherundguckda (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.. 
:-)

Autor: Marko (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.