-         
+ Antworten
Ergebnis 1 bis 9 von 9

Thema: Anfängerproblem mit PWM

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    30.10.2004
    Beiträge
    13

    Anfängerproblem mit PWM

    Hallo

    Bin Anfänger in der ganzen Sache und möchte nun folgendes machen.
    Eine Dimmerschaltung, die wenn zb. Pin PD7 nach Masse gezogen wird
    der Mega8 selbständig die PWM von 0 nach Max innerhalb von 3 sec durchfährt.
    und wenn PD6 nach Masse gezogen wird das ganze natürlich umgekehrt!
    (also von max auf 0 runter) und das wiedrum innerhalb 3 sec.

    Nun habe ich folgendes Listing gefunden in der die PWM mit Hilfe der UART eingestellt wird (0-255), das möchte ich aber nicht, den das soll ja ohne PC laufen.
    '0607.BAS: LED-Helligkeit mit phasenkorrektem Timer1-PWM
    'Hardware: Pin PB1/OC1A zur LED, Nullmodemkabel zum PC
    '----------------------------------------------------------
    $Regfile="m8def.dat" 'ATmega8-Deklarationen
    $Crystal=3686400 'Verwendeter Quarz: 3,6864 MHz
    $Baud =9600 '9600 Baud
    '
    DDRB.1=1 'Pin PB1/OC1A ist Ausgang
    '
    TCCR1A=&B10000001 'Pin OC1A nicht invertiert, 8-Bit-
    TCCR1B=&B00000010 '...PWM phasenkorrekt, Timer1 1/8
    '----------------------------------------------------------
    Do 'Hauptschleife
    If UCSRA.RXC=1 Then 'Falls ein Byte im UART-Puffer...
    OCR1AL=UDR 'Neuen Helligkeitswert setzen
    End If
    Loop

    wer kann mir helfen, und das Listing so verändern, damit ich was anfangen kann??
    Danke

  2. #2
    Erfahrener Benutzer Begeisterter Techniker Avatar von albundy
    Registriert seit
    16.10.2004
    Beiträge
    282
    Dim Dimmen as Byte
    $crystal = 8000000

    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Prescale = 64 ----> entspricht etwa 245 Hz
    Pwm1a = 0
    Enable Timer1
    Enable Interrupts

    If Pind.7 = 0 Then
    For Dimmen = 0 to 255 ----------> von dunkel nach hell
    Pwm1a = Pwm1a+1
    waitms 10
    next ---------->dauert 255 * 10 ms = 2,55 sek
    end if
    If Pind.6 = 0 Then
    For Dimmen = 255 to 0 ----------> von hell nach dunkel
    Pwm1a = Pwm1a-1
    waitms 10
    next
    end if

    Das gilt für 8MHz Quarz. Bei anderem Quarz, Timer1 ändern, damit etwa 245Hz rauskommen

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    30.10.2004
    Beiträge
    13
    Hallo

    danke erstmal, werde das ganze mal testen.
    unterscheidet sich aber gewaltig von meinem listing
    aber meins ist ja auch nur aus einem Buch abgeschrieben
    danke nochmals

  4. #4
    Erfahrener Benutzer Begeisterter Techniker Avatar von albundy
    Registriert seit
    16.10.2004
    Beiträge
    282
    Es sind 2 verschiedene Verfahren. In deinem Beispiel wird der Timer über OCR1AL voreingestellt, sodass sich die Frequenz ändert.
    Ich nehme eine feste Frequenz und verändere das Verhältnis zwischen Low und High.

    Kannst ja auch dein Beispiel nehmen und dann,

    If Pind.7 = 0 Then
    For Dimmen = 0 to 255 ----------> von dunkel nach hell
    OCR1AL=Dimmen
    waitms 10
    next ---------->dauert 255 * 10 ms = 2,55 sek
    End If

    If Pind.6 = 0 Then
    For Dimmen = 255 to 0 ----------> von hell nach dunkel
    OCR1AL=Dimmen
    waitms 10
    next
    end if

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    30.10.2004
    Beiträge
    13
    Hallo

    Hmmm
    Habe das Heute mal getestet.
    $regfile = "m8def.dat" 'ATmega8-Deklarationen
    $crystal = 3686400 'Verwendeter Quarz: 3,6864 MHz
    Dim Dimmen As Byte
    Config Pind.3 = Input
    Config Pind.4 = Input

    Portd.3 = 1
    Portd.4 = 1
    Ddrb.1 = 1 'Pin PB1/OC1A ist Ausgang

    Tccr1a = &B10000001 'Pin OC1A nicht invertiert, 8-Bit-
    Tccr1b = &B00000010 '...PWM phasenkorrekt,Timer1 1/8
    '----------------------------------------------------------

    Do

    If Pind.3 = 0 Then
    For Dimmen = 0 To 255 ' ----------> von dunkel nach hell
    Ocr1al = Dimmen
    Waitms 15
    Next Dimmen ' ---------->dauert 255 * 10 ms = 2,55 sek
    End If
    If Pind.4 = 0 Then
    For Dimmen = 255 To 0 ' ----------> von hell nach dunkel
    Ocr1al = Dimmen
    Waitms 15
    Next Dimmen
    End If

    Loop

    Ergebniss:
    Bei Pind2 gegen masse passiert garnix.
    bei Pind3 gegen Masse geht die leuchte langsam an bis zur vollen Helligkeit, ist aber der Pin noch gegen Masse, so wird die Lampe schlagartig dunkel und langsam wieder hell.
    Wird Pind3 aber von Masse getrennt so leuchtet die lampe mit voller Helligkeit (das sollte sie auch machen so aber trotz das Pind3 noch gegen Masse ist sollte die Lampe voll weiterleuchten)

    Ein Dimmen von Hell nach Dunkel ist nicht möglich.
    Hmmm schade aber irgendwas passt da noch nicht
    reini

  6. #6
    Erfahrener Benutzer Begeisterter Techniker Avatar von albundy
    Registriert seit
    16.10.2004
    Beiträge
    282
    >Bei Pind2 gegen masse passiert garnix.

    Klar, Pind.2 müßte dafür Eingang sein.

    >Config Pind.3 = Input
    >Config Pind.4 = Input
    >Portd.3 = 1
    >Portd.2 = 1


    >bei Pind3 gegen Masse geht die leuchte langsam an bis zur vollen >Helligkeit, ist aber der Pin noch gegen Masse, so wird die Lampe >schlagartig dunkel und langsam wieder hell.

    Das Beispiel war für einen kurzen Impuls an Pind.2 oder 3.
    Versuch das mal.

    If Pind.3 = 0 And Dimmen < 255 Then
    For Dimmen = 0 To 255 ' ----------> von dunkel nach hell
    Ocr1al = Dimmen
    Waitms 15
    Next Dimmen ' ---------->dauert 255 * 10 ms = 2,55 sek
    End If
    If Pind.2 = 0 And Dimmen > 0 Then
    For Dimmen = 255 To 0 ' ----------> von hell nach dunkel
    Ocr1al = Dimmen
    Waitms 15
    Next Dimmen
    End If

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    30.10.2004
    Beiträge
    13
    Hallo

    ja schon klar, hab den Fehler mit den Pins auch bemerkt, aber selbst nach den berichtigen war nix mit dem Dimmen nach dunkel!
    der Pin für dunkel ist ohne ledliche Funktion

    werde jetzt mal das Listing ändern.

    Habe es nun geändert, aber alles beim alten!!
    keinerlei Änderung zum ersten Listing

    reini

  8. #8
    Erfahrener Benutzer Begeisterter Techniker Avatar von albundy
    Registriert seit
    16.10.2004
    Beiträge
    282
    Ich weis jetzt nicht, welchen pin du wirklich benutzt ?
    Habe es mit pind.3 und 4 probiert und funktioniert jetzt.

    If Pind.3 = 0 And Ocr1al < 255 Then
    For Dimmen = 0 To 255
    Ocr1al = Dimmen
    Waitms 15
    Next Dimmen
    End If
    If Pind.4 = 0 And Ocr1al > 0 Then
    For Dimmen = 255 To 0 Step -1
    Ocr1al = Dimmen
    Waitms 15
    Next Dimmen
    End If

    Ich hatte in der unteren schleife "Step -1" vergessen, deshalb wurde nicht runtergezählt.
    Außerdem muß bei If ...... Ocr1l und nicht Dimmen rein.

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    30.10.2004
    Beiträge
    13
    Hallo

    Besten Dank albundy
    werde natürlich auch noch Deine Lösung testen,
    aber ich habe es nun auch geschaft mit dieser Lösung:
    Do
    If Pind.3 = 0 And Pwm1a = 0 Then
    Do
    Pwm1a = Pwm1a + 1
    Waitms 20
    Loop Until Pwm1a = 255
    End If
    If Pind.4 = 0 And Pwm1a = 255 Then
    Do
    Pwm1a = Pwm1a - 1
    Waitms 20
    Loop Until Pwm1a = 0
    End If
    Loop

    funst jedenfals bestens
    Aber nochmals meinen Dank an albundy ohne seine Vorschläge wäre ich nicht auf diese Lösung gekommen
    reini

+ Antworten

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •