www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM Versuche mit Bascom


Autor: Fabian Wolf (fabi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Sorry bin noch blutiger Anfänger in der Mikrocontrollerprogrammierung.

ich bin gerade dabei meine ersten Versuche mit der Hardware PWM 
durchzuführen. Deshalb wollte ich erstmal zum testen eine LED dimmen. 
Leider funktioniert das mit dem dimmen nicht, die Led blinkt zwar aber 
sie wird weder dunkler noch heller. Die zweite Led soll nur anzeigen ob 
er die Tastendrücke registriert hat.

Was muss ich an dem Programm ändern damit es geht?

Vielen dank schonmal für eure Antworten.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn du dir mal im Datenblatt durchliest welche Parameter was tun und 
danach mal über deine Prescalereinstellung nachdenkst (oder sogar mal 
nachrechnest), dann könntest du schon selbst auf die Lösung kommen. 
Ansonsten gibts dazu ne sehr schöne Erklärung im Roboternetz.

bye

Frank

Autor: Fabian Wolf (fabi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich habs gerade nochmal getestet es funktioniert immer noch net richtig.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst du 'funktioniert immer noch net richtig'
etwas präzisieren?

Hast du eine Ahnung davon, wie schnell so ein µC arbeitet?
So kurz kannst du gar nicht auf den Taster drücken, dass
deine Schleife nicht das A um jeweils 30 Einheiten
von 0 weg bis zum Overflow hochzählt.
1 Millisekunde sind für dich verdammt kurz. Für einen
µC ist das aber eine halbe Ewigkeit.

Autor: Fabian Wolf (fabi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der MC dimmt halt nicht sauber, sondern ab und zu leuchtet die Led 
heller, obwohl ich eigentlich den Taster zum dunkler dimmen gedrückt 
habe, wie könnte ich denn am besten das Problem, dass du weiter oben 
beschrieben hast lösen?

Mit Waitms?

Autor: Kallius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Inkremetiere bzw. dekrementiere A mal nur um 30, wenn die Taste gedrückt 
UND dann wieder losgelassen wurde.

Autor: Kallius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... mit

If Pind.2 = 1 Then
  Bitwait Pind.2, Reset
  A = A + 30
End If

... oder so

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zb Indem du einen Tastendruck nur dann in einem
Schleifendurchlauf akzeptierst, wenn sie im
unmittelbar vorhergehenden Schleifendurchlauf
noch nicht gedrückt war.
Du musst dir also in einer Variablen merken,
ob die Taste gedrückt ist oder nicht.

In der Schleife machst du dann (Pseudocode)

   jetziger Tastenzustand = Taste abfragen

   if jetziger Tastezustand nicht gleich vorherigem Tastenzustand

     ; -- Tastenzustand hat sich verändert

     if jetziger Tastenzustand ist gleich gedrückt
       ; -- die Taste wurde gedrückt

       mach was immer beim Drücken einer Taste notwendig ist

     end if

     ; -- der jetzige Tastenzustand wird für den nächsten
     ; -- Schleifendurchlauf zum vorhergehenden Tastenzustand

     vorheriger Tastenzustand = jetziger Tastenzustand

   end if


PS: Bei einer 8 Bit PWM sind 30 Stufen schon etwas heftig.

Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Veränderung des Tastgrades hat keinerlei Begrenzung nach oben und 
unten. Wird die Up-Taste länger gedrückt, dann läuft der Wert oben raus 
und unten wieder rein, bei Down-Taste genauso.

Um sowas zu programmieren musst Du erstmal ganz klein beginnen. Du musst 
erstmal eine Tastenentprellung mit Flankenerkennung verstehen und 
programmieren. Ansonsten vera..lbert sich Dein Programm nach allen 
Regeln der Kunst.

In ASM könnte ich Dir ein paar Tips geben (in C Karl Heinz), aber in 
BASCOM ist mir das zu blöd.

Ich manipuliere übrigens die I/O-Register des AVRs lieber selbst (statt 
"config xyz"-Zauberformeln), dann weiß ich wenigstens was passiert, denn 
das Datenblatt ist in Punkto Funktionsbeschreibung verbindlich und auch 
recht konkret. Das dürfte auch in BASCOM funktionieren, wird bei 
entsprechender Schreibweise (Bits beim Namen nennen) dann auch von 
Leuten verstanden, die in ASM oder C zu Hause sind.

...

Autor: Fabian Wolf (fabi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deinen Tipp Kallius, dein Vorschlag hat schon etwas gebracht, 
jetzt würde nur noch die Begrenzung nach oben und unten fehlen. Wenn ich 
nämlich die Led ganz ausschalten will, geht das nicht sondern sie 
leuchtet immer noch ein bisschen. Weißt du zufällig wie ich das 
programmiern muss um den Taster gedrückt halten zu können um die Led zu 
dimmen? Ich hab das zwar mit Loop Until gemacht aber das hat nicht 
richtig funktioniert. So ich hab jetzt die Schrittweite geändert jetzt 
geht das Ausschalten ganz gut.

Jetzt fehlt nur noch die Tastenhalt Funktion.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> geht das nicht sondern sie
> leuchtet immer noch ein bisschen.

Compare1a = 130 + A

Logisch. Dein Compare Wert wird ja auch nicht kleiner
als 130


Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
auch wenn Compare auf NUll steht, wird die LED noch schwach leuchten.
[Datenblatt Mega48 Seite 97]

>> If the OCR0A is set equal to BOTTOM, the output will
>> be a narrow spike for each MAX+1 timer clock cycle.

Hier hilft nur: PWM in diesem speziellen Fall abschalten!

Das lässt sich mit BASCOM sicher auch irgentwie bewerkstelligen, weiss 
ich aber nun auch nicht im Detail wie.

Be ner LED ist das evtl. noch akzeptabel - bei einer Vollbrücke 
(Fahrregler mit Richtungsumkehr) knallts dann immer

Gruß
AxelR.
#define PWM_ROT  OCR0A

if (PWM_ROT==0 && rt == 1){
  TCCR0A&= ~(1<<COM0A1);  
  rt=0;
}
if (PWM_ROT>0 && rt == 0){
  TCCR0A|= (1<<COM0A1);
  rt=1;
}

Autor: Fabian Wolf (fabi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi danke für eure Antworten, weiß denn jemand zufällig wie ich das mit 
dem Taster gedrückt halten programmieren kann?

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
'Hardware PWM fürs LED dimmen mit Timer 1

$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 8000000





Dim A As Integer

Config Pind.5 = Output

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1 
'Timer 1 einrichten: 8bit Modus

Do
waitms 100
If Pind.2 = 1 Then              'Taster 1 wird gedrückt
   waitms 10
  If Pind.2 = 1 Then
     If A < 255 Then
        A = A + 1                 'LED um 1 Stufe heller dimmen
     End If
  End If

End If

If Pind.3 = 1 Then              'Taster 2 wird gedrückt
   waitms 10
  If Pind.3 = 1 Then
     If A > 0 Then
        A = A - 1                 'LED um 1 Stufe dunkler dimmen
     End If
  End If

End If

Compare1a =  A

Loop

End

BASCOM -, was kommt da am Ende wohl als ASM raus??

Gruß
AxelR.

Autor: jack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich schätze mal 2 kByte.

Autor: Fabian Wolf (fabi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für das Programm Axel,

Ich wollte halt zum Einstieg zuerst mit Bascom programmieren und dann 
später auf Assembler umsteigen. Außerdem kann ich da auch mein 
bescheidenes Programmierwissen aus der Schule mit Visual Bascic 
anwenden.

Da ich später auch unter Linux programmieren will ist Assembler 
natürlich schon besser.

Autor: Paul Baumann (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So sieht es aus, wenn man die .obj-Datei in AVR-Studio einliest. :-)
MfG Paul

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Paul
>PWM_mit_Timer1.asm (9,7 KB, 7 Downloads)
Hätte ich auch so geschrieben :-))

@Fabian
ist ja keine Schande - so meinte ich das nicht.
Dein Problem scheint ja auch nicht die Programmiersprache ansich zu 
sein, sondern das Verständnis für die logischen Abläufe...

Mal Dir doch zuerst ein Ablaufplan ("PAP" sagt mein Chef immer -> 
Flowchart).

Das wird schon.

achja:
Gehts denn jetzt?

Gruß
xlR.

Autor: Fabian Wolf (fabi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja danke es tut, jetzt kann ich mal gucken ob ich das Programm für die 
Radioabstimmung hinbekomme die Led dimmen war dafür die Vorübung. Falls 
ihr mir noch weiter helfen wollt dann schaut mal in diesen Beitrag rein. 
Für eure Tipps wär ich sehr dankbar.

Beitrag "PLL per Software"

Autor: Fabian Wolf (fabi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi ich bins nochmal und zwar hab ich jetzt nen zweites Programm 
geschrieben. Leider tut es noch nicht richtig, ich will jetzt nen 
Schritt weiter gehen und
zwar folgendes: Wenn ich die Taster rauf runter drücke, dann soll er 
solang die Spannung erhöhen bzw senken bis an PD4 ein High Signal 
anliegt will ich noch mit ner Led machen später kommt da dann nen 
Lowpassfilter hin und ne PWM Schaltung von Läubi (siehe Link). 
Gleichzeitig soll dann an PD6 ne zweite Led solange aufleuchten wie der 
Mc noch die Spannung erhöht, bis das High Signal anliegt. Im Moment tut 
sich die Led noch garnicht verändern.

Autor: Fabian Wolf (fabi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier das Programm

Autor: Fabian Wolf (fabi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, eine weitere Frage, wie kann ich denn folgendes Programmieren?

Wenn ich nen Taster einmal drücke soll er ständig eine bestimmte Aktion 
durchführen, solange bis ich den Taster wieder drücke.

Das mach ich ja , mit Loop aber wie geht das genau, ich hab schon 
ziemlich viel probiert aber es hat nicht richtig funktioniert???

Danke für eure Hilfe.

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der Schleife ein ein Bit setzen, wenn Du den Taster drückst. Wenn Das 
Bit 1 ist, die Schleife immer wieder ausführen. Wenn der Taster erneut 
gedrückt wird UND das Bit immer noch 1 ist, das Bit auf 0 setzen und die 
Schleife verlassen. Mit EXIT kannst Du "schadlos" aus Schleifen 
springen.

MfG Paul

Autor: Fabian Wolf (fabi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habs jetzt einige Male probiert,
leider funktioniert das immer noch nicht: ich will das auf Tastendruck 
die Led solange hoch runter dimmt bis ich einen der Taster hoch runter 
erneut drücke. Kann hier vielleicht bitte jemand nen Codeausschnitt 
reinstellen?

Autor: Fabian Wolf (fabi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Mein verwendeter Code

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal, ob es zu Deinem BASCOM eine Dokumentation oder Hilfe gibt. 
Wenn ja, dann schau Dir mal den Befehl "debounce" an.

...

Autor: RDSAnfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jetzt mal wie ich das machen würde: (kein Quelltext)

If Taster.hoch=1 then
Do
PWMSpannung=PwmSpannung+1 (und natürlich setzen (wie geht das?))
Loop until Sender.da=1 bis an der anderen Leitung ein high signal 
anliegt
end if

Ich arbeite ja noch an der anderen Version und habe mir dafür sogar ein 
(analoges) Speicheroszi zugelegt. Leider ziehe ich gerade um und kann 
deswegen das Radio noch nicht optimieren.

Autor: RDSAnfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier mal ob das geht. Ich konnte es nicht testen, aber an dem kannst 
du ja villeicht erkennen was bei dir nicht geht (wenn das überhaupt 
funktioniert)

Config Portd.6 = Output                                     'LED
Config Pind.5 = Output
Config Pind.4 = Input                                       'taster gedrueckt
Config Pind.3 = Input                                       ' sender verfügbar?
Dim I As Byte                                               'Spannung
                                                          'Hauptschleife
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1
Do
   If Pind.4 = 1 Then  'wenn taster hoch gedrückt ist
   Portd.6 = 1                                              'Led an
      Do
      I = I + 1                                             'spannungsvariable um 1 erhöhen
      Compare1a = I                                         'spannung setzen
      Waitms 10                                             'warten
      Loop Until Pind.3 = 1
   End If
   Portd.6 = 0
Loop
End


Autor: Fabian Wolf (fabi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
Danke für eure Antworten jetzt tuts so wie es soll !
Dann werde ich schauen ob ich das Programm jetzt fürs Radio entwerfen 
kann.

RDSAnfänger schön dich hier im Forum mal wieder zu sehen.
Hast du mal wieder in den Thread Einfaches Radio basteln oder Pll per 
Software geschaut? Da wurden schon ein paar Lösungsvorschläge gepostet.

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
fein

Autor: Fabian Wolf (fabi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Mein ihr das Programm wäre so ok oder könnte ich es noch optimieren?
Funktionieren tut es in der Form

Autor: Fabian Wolf (fabi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mir ist gerade noch ein Problem aufgefallen und zwar funktioniert die 
Begrenzung nach unten noch nicht richtig? Wenn er ganz runtergedimmt 
hat, dann leuchtet die Led wieder in voller Stärke. Der $crystal Wert 
muss natürlich nur einmal vorhanden sein und 8000000 betragen. Nach oben 
geht sie, aber warum geht sie nicht nach unten?

Autor: RDSAnfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe auch keine Idee woran das liegt. Villeicht geht es ja wenn du 
>1 einsetzt statt >0. Das mit der Frequenzfolgung hab ich gelesen. 
Leider kann ich momentan noch keinen Frequenzteiler beziehen und auch 
meine Schaltung befindet sich in irgendeinem Container. Das mit dem PWM 
habe ich übrigens auch mal versucht, allerdings sofort wieder 
aufgegeben, weil ich nicht wusste wie man einen guten Filter baut

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.