Anzeige:

PWM -> ATMega8 auf Pb.3 mit Timer2?

Hier finden sie die archivierten Beiträge des alten PHPBB Forums von www.loetstelle.net

PWM -> ATMega8 auf Pb.3 mit Timer2?

Von pcprofi am 09.02.2009 15:06

Hallo Jungens,

weiß einer von euch, wie ich das hinbekomme? Ich hab diversese im Internet gefunden - aber keine Lösung die funktioniert gefunden.

Ich programmiere übrigens mit Basom...

Gruß Rainer

Re: PWM -> ATMega8 auf Pb.3 mit Timer2?

Von gerold am 09.02.2009 15:24

Hallo Rainer!

Irgendwann mal habe ich dieses Beispiel gestrickt:

Code:
$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 100
$swstack = 100
$framesize = 100

'PWM-Ausgänge
Config Portb.1 = Output       'OC1A
Config Portb.2 = Output       'OC1B
Config Portb.3 = Output       'OC2

'PWM aktivieren (244 Hz)
Config Timer1 = Pwm , Prescale = 8 , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up
Config Timer2 = Pwm , Compare Pwm = Clear Down , Prescale = 8

'Tastverhältnisse einstellen
Compare1a = 125
Compare1b = 125
Ocr2 = 125

'Hauptschleife (die nichts tut)
Do
   !nop
Loop

End

Suche dir das raus was du brauchst.

lg
Gerold
Smile

Von pcprofi am 09.02.2009 16:13

Danke Gerold - Es tuts mit genau der Zeile von Timer2 - ich habe meinen Fehler gefunedn...

Ich hab irrtümlich angenommen, je kleiner ocr2 ist desto kürzer die Intervalle - es ist aber genau umgekehrt...

Von meka8 am 31.12.2010 18:03

Hallo Gerold,

habe mich gerade als neuer Forennutzer registriert und bin noch ein blutiger Anfänger im Umgang mit µPs und Bascom, der sich aber von den Tücken und Geheimnissen des Programmierens noch oftmals recht beeindruckt zeigt.

Deinen "Kleinen Bascom AVR Kurs" habe ich studiert und hoffe, dass einiges hängen geblieben ist. Diesen Kurs hast Du so verständlich und übersichtlich gestaltet, dass man danach leicht glauben könnte, nun mal loslegen zu können! So hatte ich mich nun intensiver mit den Timern befasst, die sehr vielfältig genutzt werden können.

So hatte ich mich nun aktuell mit dem Timer 2 des Atmega 8 intensiver befasst, um mal verschiedene PWM-Möglichkeiten ausprobieren zu wollen. Beim Durchstöbern des Forums bin ich dann auf Deinen Code gestoßen.

Deinen Code versuche ich nun so zu ändern, dass bei Betätigung eines Tasters sich der OCR2-Wert so ändern soll, dass eine an B.3 angeschlossene LED einmal heller oder dunkler leuchtet. Ich stelle mal den von mir geänderten Code ein, der in dieser Form leider noch nicht das macht, was ich mir so ausgedacht hatte. Sad

Für Tipps wäre ich sehr dankbar. Bleibt mir noch, allen einen guten Rutsch und einen ebenso guten wie erfolgreichen Start ins Neue Jahr zu wünschen.




Code:

$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 100
$framesize = 100
$swstack = 100

Config Pinc.1 = Input

Config Pind.3 = Input
'Portd.3 = 0

Config Pind.1 = Input
Portd.1 = 0

Config Portb.3 = Output
Portb.3 = 1

Config Pind.0 = Input
Portd.0 = 0



Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Config Timer2 = Pwm , Compare Pwm = Clear Down , Prescale = 8
Enable Timer2
Timer2 = 0
Start Timer2

Dim M As Byte
M = 0

Dim N As Byte
N = 200

Do

Debounce Pind.3 , 0 , Wechsel , Sub

Loop

Wechsel:
If Portd.3 = 0 Then
Ocr2 = M
Else
Ocr2 = N
End If

Return


Very Happy

Von gerold am 31.12.2010 19:58

meka8 hat folgendes geschrieben:
Code:
Wechsel:
   If Portd.3 = 0 Then
      Ocr2 = M
   Else
      Ocr2 = N
   End If
Return

Hallo meka8!

Mir fällt im ersten Moment nur das hier auf:
Code:
If Pind.3 = 0 Then

PORT <> PIN

mfg
Gerold
Smile

Von pcprofi am 01.01.2011 12:24

Das war mir auch aufgefallen...

Zum anderen könnte es sein, dass du die Interrupts noch enablen musst...

Gruß Rainer

Von meka8 am 02.01.2011 00:24

Hallo Gerold, hallo PC Profi,

vielen Dank für Eure Hilfe! Pin<>Port - oh, Gott, schon wieder dieser Kardinalfehler!!! Embarassed Ich hab's geändert, dann funktionierte es! Ich hatte auch den Interrupt "eingebaut", doch es hatte keinen Einfluss.

Nun habe ich mich etwas weiter gewagt, habe zwei Taster an den Pins D.1 und D.3 angeschlossen, habe dann von konstanten OCR-Werten Konstanten subtrahiert oder addiert und habe die unterschiedlichen Möglichkeiten, die sich mit "Compare Pwm = Clear Up bzw. Down durchführen lassen, durchgespielt. Danach habe ich für den konstanten OCR2-Wert einen variablen Wert mit Hilfe eines Potis und des ADCs erzeugt. Das funktioniert soweit auch ganz gut. Verändere ich aber die Potistellung so, dass die an PinB.3 angeschlossene LED immer dunkler wird, so überschreite ich, nachdem die LED ganz dunkel war, den Schwellwert und die LED leuchtet wieder ganz hell. Das verstehe ich nicht, da ich glaubte, mit diesen Befehlen die obere als auch die untere Grenze des OCR-Wertes festgelegt zu haben:

Code:
If Ocr2 > 255 Then
Ocr2 = 255
If Ocr2 < 0 Then
Ocr2 = 0



Unerklärlich ist für mich ebenfalls, weshalb die LED stark flackert, wenn die Potistellung so verändert wird, dass die LED immer dunkler wird. Prescale hatte ich schon von 8 auf 1 reduziert, scheint aber wohl die Taktfrequenz mit 1 MHz wohl noch zu gering zu sein? Hier der aktuelle Code nochmals und ich hoffe, darin nicht nochmals einen so kapitalen Bock geschossen zu haben Embarassed Für jeden Tipp bin ich sehr dankbar.

Code:
$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 100
$framesize = 100
$swstack = 100




Config Pinc.0 = Input



Config Pind.3 = Input
Portd.3 = 1


Config Pind.1 = Input
Portd.1 = 1

Config Portb.3 = Output
'Portb.3 = 1

Config Pind.0 = Input
Portd.0 = 0



Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Config Timer2 = Pwm , Compare Pwm = Clear Up , Prescale = 1

Enable Timer2
Timer2 = 0
Start Timer2
Enable Interrupts


Dim Potiwert As Byte
Dim M As Byte
M = 100

Dim N As Byte
N = 50

Do

Potiwert = Getadc(0)
Potiwert = Potiwert / 4
Ocr2 = Potiwert

If Ocr2 > 255 Then
Ocr2 = 255
If Ocr2 <= 0 Then
Ocr2 = 0

End If
End If




If Pind.3 = 0 Then
   Ocr2 = Ocr2 - M
   Else
   Ocr2 = Ocr2
End If


If Pind.1 = 0 Then
   Ocr2 = Ocr2 - N
   Else
   Ocr2 = Ocr2
      End If

Loop


Schöne Grüße
Willi

Von caargoo am 02.01.2011 07:49

Hallo!


Deklarier mal den Potiwert als Word.


MfG

Von meka8 am 02.01.2011 14:09

Hallo caargoo,

ja, da hatte ich auch schon dran gedacht, ausprobiert, brachte aber leider keinen Erfolg. Aber vielen Dank für Deinen Tipp!

Schöne Grüße

Von caargoo am 02.01.2011 15:36

Hallo!


If Ocr2 > 255 Then
Ocr2 = 255
If Ocr2 <= 0 Then
Ocr2 = 0

Diese Abfrage ist sinnfrei, da Ocr2 nie größer als 255 und nie kleiner
als 0 werden kann.

Desweiteren wird Dein Ocr2 Wert nie größer als 63.
Und wenn Du jetzt von 63 noch 100 abziehst, was erhälst Du dann?

Geh Dein Programm Zeile für Zeile durch. Überleg dabei welches Ergebnis Du nach jeder Zeile hast. Da geht Dir viel eher ein Licht auf, als andere Leute Deine Fehler suchen zu lassen.

MfG

Anzeige: