Forum: Mikrocontroller und Digitale Elektronik PWM Versuche mit Bascom


von Fabian W. (fabi)


Angehängte Dateien:

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.

von Frank (Gast)


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

von Fabian W. (fabi)


Angehängte Dateien:

Lesenswert?

Ich habs gerade nochmal getestet es funktioniert immer noch net richtig.

von Karl H. (kbuchegg)


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.

von Fabian W. (fabi)


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?

von Kallius (Gast)


Lesenswert?

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

von Kallius (Gast)


Lesenswert?

... mit

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

... oder so

von Karl H. (kbuchegg)


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.

von Hannes (Gast)


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.

...

von Fabian W. (fabi)


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.

von Karl H. (kbuchegg)


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


von Axel R. (Gast)


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.
1
#define PWM_ROT  OCR0A
2
3
if (PWM_ROT==0 && rt == 1){
4
  TCCR0A&= ~(1<<COM0A1);  
5
  rt=0;
6
}
7
if (PWM_ROT>0 && rt == 0){
8
  TCCR0A|= (1<<COM0A1);
9
  rt=1;
10
}

von Fabian W. (fabi)


Lesenswert?

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

von Axel R. (Gast)


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.

von jack (Gast)


Lesenswert?

Ich schätze mal 2 kByte.

von Fabian W. (fabi)


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.

von Paul Baumann (Gast)


Angehängte Dateien:

Lesenswert?

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

von Axel R. (Gast)


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.

von Fabian W. (fabi)


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"

von Fabian W. (fabi)


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.

von Fabian W. (fabi)


Angehängte Dateien:

Lesenswert?

Hier das Programm

von Fabian W. (fabi)


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.

von Paul Baumann (Gast)


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

von Fabian W. (fabi)


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?

von Fabian W. (fabi)


Angehängte Dateien:

Lesenswert?

Mein verwendeter Code

von Hannes L. (hannes)


Lesenswert?

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

...

von RDSAnfänger (Gast)


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.

von RDSAnfänger (Gast)


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)
1
Config Portd.6 = Output                                     'LED
2
Config Pind.5 = Output
3
Config Pind.4 = Input                                       'taster gedrueckt
4
Config Pind.3 = Input                                       ' sender verfügbar?
5
Dim I As Byte                                               'Spannung
6
                                                          'Hauptschleife
7
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1
8
Do
9
   If Pind.4 = 1 Then  'wenn taster hoch gedrückt ist
10
   Portd.6 = 1                                              'Led an
11
      Do
12
      I = I + 1                                             'spannungsvariable um 1 erhöhen
13
      Compare1a = I                                         'spannung setzen
14
      Waitms 10                                             'warten
15
      Loop Until Pind.3 = 1
16
   End If
17
   Portd.6 = 0
18
Loop
19
End

von Fabian W. (fabi)


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.

von Axel R. (Gast)


Lesenswert?

fein

von Fabian W. (fabi)


Angehängte Dateien:

Lesenswert?

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

von Fabian W. (fabi)


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?

von RDSAnfänger (Gast)


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

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.