- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 8 von 8

Thema: Timer0 stoppen und weiterlaufen lassen?

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627

    Timer0 stoppen und weiterlaufen lassen?

    Anzeige

    Praxistest und DIY Projekte
    Hallo,
    ich gebe über den Timer0 einen Wert für die PWM vor.
    Nun möchte ich, wenn der Zähler den Wert 255 erreicht hat, das der Wert für 1 Sekunde auf 255 bleibt und dann normal wieder runter zählt. Wenn der Zähler den Wert 0 hat, soll auch eine Sekunde gewartet werden:

    Es wird damit eine LED angesteuert: dunkel - 1 sekunde warten - langsam hoch dimmen - 1 sekunde warten - und wieder runter dimmen.

    Wer kann mir sagen wie ich diese sekunde wartezeit hinbekomme?

    vielen Dank, Tobias

    Der Timer0 wird im Unterprogramm Ledcount aufgerufen:
    Config Timer0 = Timer , Prescale = 256 'Teiler
    Enable Timer0 'timer einschalten
    On Timer0 Ledcount 'Unteprogramm aufrufen
    Enable Interrupts 'interrupts einschalten


    Unterprogramme:
    '_______________

    Ledcount: 'Farbwechsel über Timer1

    Timer0 = 150 'LED´s wechseln die Farbe mit ca 2 Hz



    If Led1 = 255 Then 'Wenn Led1 100% dann Merker zum hochzählen setzen
    Led1m = 0
    End If

    If Led1 = 0 Then 'Wenn Led1 0% dann Merker zum runterzählen setzen
    Led1m = 1
    End If

    'Zähler1 hoch/runter
    If Led1m = 1 Then
    Incr Led1 'Wenn Merker Led1m = 1 -> um 1 hochzählen
    End If

    If Led1m = 0 Then
    Decr Led1 'um 1 runterzählen
    End If


    '-------
    If Led2 = 255 Then
    Led2m = 0
    End If

    If Led2 = 0 Then
    Led2m = 1
    End If

    'Zähler1 hoch/runter
    If Led2m = 1 Then
    Incr Led2 'um 1 hochzählen
    End If

    If Led2m = 0 Then
    Decr Led2 'um 1 runterzählen
    End If


    Return

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627
    Hab noch etwas vergessen:
    Den Timer1 kann ich nicht mehr benutzen, da er schon für PWM genutzt wird

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    wait 1
    oder halt mit Timer2
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627
    wenn ich den wait befehl nehme stoppt doch der ganze µC oder? Und der µC kann keine anderen Dinge mehr erledigen oder?

    Wie würde es denn mit dem Timer2 gehen?

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    richtig, beim wait steht das Programm an dem Punkt,
    bis eben die Zeitspanne durch ist.
    Interrupts wie Timer UART oder Int0 Int1 sind davon allerdings nicht betroffen,
    es seidenn der Wait ist in der Interruptroutine selbst drinne.
    Bei Verwendung von 8-Bit-Timern kannste ja in der Interruptroutine
    selbst ne Variable hochzählen lassen und die somit einen 16 oder 24-Bit Timer selbst softwaremäßig erzeugen. Das Hochzählen selbst ist keine
    groß zeitkritische Geschichte.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627
    Hallo Vitis,
    ich war über Wochenende nicht da, aber nun:

    Also: Für die PWM bunutze ich 2 Variablen die immmer gleichzeitig hoch- und runtergezählt werden: Led1 und Led2. Ich denke es würde ausreichen, wenn Led1 = 255, dann soll ein Merker z.B. Led1merker auf 1 gesetzt werden. Und solange der auf 1 ist, soll der restliche Teil vom Unterprogramm Ledcout übersprungen werden (mit goto?) und natürlich muss eine weitere Variable hochgezählt werden(Led2merker?). Wenn diese einen bestimmten Wert erreicht hat, muss Led1merker wieder auf 0 gesetzt werden. Habe ich das richtig verstanden?

    Hier noch das "alte" Unterprogramm:



    'Unterprogramm
    Ledcount: 'Farbwechsel über Timer1

    Timer0 = 150 'LED´s wechseln die Farbe mit ca 2 Hz



    If Led1 = 255 Then 'Wenn Led1 100% dann Merker zum hochzählen setzen
    Led1m = 0
    End If

    If Led1 = 0 Then 'Wenn Led1 0% dann Merker zum runterzählen setzen
    Led1m = 1
    End If

    'Zähler1 hoch/runter
    If Led1m = 1 Then
    Incr Led1 'Wenn Merker Led1m = 1 -> um 1 hochzählen
    End If

    If Led1m = 0 Then
    Decr Led1 'um 1 runterzählen
    End If


    '-------
    If Led2 = 255 Then
    Led2m = 0
    End If

    If Led2 = 0 Then
    Led2m = 1
    End If

    'Zähler1 hoch/runter
    If Led2m = 1 Then
    Incr Led2 'um 1 hochzählen
    End If

    If Led2m = 0 Then
    Decr Led2 'um 1 runterzählen
    End If


    Return

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627
    Also ich habe mal das unterprogramm "umgebaut" aber nun leuchtet nur noch eine Farbe. Kann sein das ich die wartezeit zu hoch gesetzt habe.
    Wer kann mir sagen, warum ich über UART keine Informationen bekomme? Mit anderen Programen geht es! Wo ist der Fehler in meinem Programm?

    Tobias


    Code:
    '-------------------------------------------------------------------------------
    'Konfiguration µC:
    $regfile = "ATtiny2313.dat"                                 'ATtiny2313-Deklarationen
    $crystal = 20000000                                         'Quarz: 20.0 MHz
    $baud = 9600                                                'Baudrate der UART: 9600 Baud
    
    '-------------------------------------------------------------------------------
    'Ein- Ausgänge:
    Ddrd = &B1000011                                            '1 Ausgang, 0 Eingang = Pin PD6,1+0 als Ausgang / PD5-2 als Eingang
    Ddrb = &B11111111                                           '1 Ausgang, 0 Eingang = Pin PB7-0 als Ausgang
    Portb = &B11111111                                          'PB0...PB7 auf High setzen
    
    '-------------------------------------------------------------------------------
    'Variablen auswertung FB
     Dim Pulsbreite1 As Word                                    'Knüppelstellung Knüppel 1                  '
     Dim Pulsbreite2 As Word
     Dim Pulsbreite3 As Word
     Dim Pulsbreite4 As Word
    
     Dim Kanal1o As Bit                                         'Speicher von Knüppel 1 OBEN
     Dim Kanal1u As Bit                                         'Speicher von Knüppel 1 UNTEN
     Dim Kanal2o As Bit
     Dim Kanal2u As Bit
     Dim Kanal3o As Bit
     Dim Kanal3u As Bit
    
     Dim Led1 As Byte
     Dim Led1m As Byte                                          'LED1 Merker
     Dim Led2 As Byte
     Dim Led2m As Byte
     Dim Led1pause As Word                                      'Als Pause zwischen den Lichteffekten für die UnterBodenbel.
    
     Dim Portb3 As Byte                                         'PWM
     Dim Portb4 As Byte                                         'PWM
    
    
    '-------------------------------------------------------------------------------
    'Konfiguration Timer:
     Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
     Config Timer0 = Timer , Prescale = 256                     'Teiler
     Enable Timer0                                              'timer einschalten
     On Timer0 Ledcount                                         'Unteprogramm aufrufen
     Enable Interrupts                                          'interrupts  einschalten
    
    
    '-------------------------------------------------------------------------------
    ' HAUPTPROGRAMM
    '-------------------------------------------------------------------------------
     Led1 = 255                                                 'PWM Startwert vorgeben
     Led2 = 1                                                   'PWM Startwert vorgeben
    
    
    
    Do                                                          'Do Loop Schleife
    
    Print "Led1: " ; Led1
    Print "Led2: " ; Led2
    Print "Led1Pause: " ; Led1pause
    
    'Hardware PWM mit Timer1   U N D
    'FB auswerten: Umschaltung von normal auf PWM
    
     If Portb3 = 0 And Portb4 = 0 Then
    
     Compare1a = Led1                                           '=PB3  /  max 255
     Compare1b = Led2                                           '=PB4  /  max 255
    
     Else
       If Portb3 = 0 Then
       Compare1a = 255
       Else
       Compare1a = 0
       End If
    
       If Portb4 = 0 Then
       Compare1b = 255
       Else
       Compare1b = 0
       End If
    
     End If
    
    
    
    
    'FB auswerten:
    'Umschaltung von normal auf PWM
    
    
    'Kanal 1 LICHT HINTEN:
    '____________________
    
    Pulsein Pulsbreite1 , Pind , 5 , 1                          'Pulsbreite auslesen (1=High Impuls)
    'Knüppel rastend OBEN
        If Pulsbreite1 > 9 And Kanal1o = 0 Then                 'wenn Knüppel oben und Kanal1oben=0 dann
        Toggle Portb.1                                          'Pin 1 mal schalten (entweder auf Hi oder Low je nach vorherigem zustand)
        Kanal1o = 1                                             'Variable Kanal1o setzen damit nicht neu getoggled werden kann
        End If
        If Pulsbreite1 < 9 Then                                 'Wenn Knüppel nicht oben dann
        Kanal1o = 0                                             'Variable Kanal1o RÜCKsetzen damit neu getoggled werden kann
        End If
    'Knüppel rastend UNTEN
        If Pulsbreite1 < 6 And Kanal1u = 0 Then
        Toggle Portb.0
        Kanal1u = 1
        End If
        If Pulsbreite1 > 6 Then
        Kanal1u = 0
        End If
    
    
    
    'Kanal 2 UNTERBODEN:
    '___________________
    
    Pulsein Pulsbreite2 , Pind , 4 , 1                          'Pulsbreite auslesen (1=High Impuls)
    'Knüppel rastend OBEN
        If Pulsbreite2 > 9 And Kanal2o = 0 Then
        Toggle Portb3
        Kanal2o = 1
        End If
        If Pulsbreite2 < 9 Then
        Kanal2o = 0
        End If
    'Knüppel rastend UNTEN
        If Pulsbreite2 < 6 And Kanal2u = 0 Then
        Toggle Portb4                                           'ACHTUNG PB4!!! nicht PB2!!!
        Kanal2u = 1
        End If
        If Pulsbreite2 > 6 Then
        Kanal2u = 0
        End If
    
    
    
    'Kanal 3:
    '________
    
    Pulsein Pulsbreite3 , Pind , 3 , 1                          'Pulsbreite auslesen (1=High Impuls)
    'Knüppel rastend OBEN
        If Pulsbreite3 > 9 And Kanal3o = 0 Then
        Toggle Portb.5
        Kanal3o = 1
        End If
        If Pulsbreite3 < 9 Then
        Kanal3o = 0
        End If
    'Knüppel rastend UNTEN
        If Pulsbreite3 < 6 And Kanal3u = 0 Then
        Toggle Portb.2                                          'ACHTUNG PB2!!!  nicht PB4!!!
        Kanal3u = 1
       End If
        If Pulsbreite3 > 6 Then
        Kanal3u = 0
        End If
    
    
    
    'Kanal 4 (Taster / Taster):
    '________
    
    Pulsein Pulsbreite4 , Pind , 2 , 1                          'Pulsbreite auslesen (1=High Impuls)
    'Knüppel tastend OBEN
        If Pulsbreite4 > 9 Then                                 'Knüppel oben
        Portb. 7 = 0                                            'Port PB 7 setzen
        Else                                                    'sonst
        Portb. 7 = 1                                            'Port PB 7 zurücksetzen
        End If
    'Knüppel tastend UNTEN
        If Pulsbreite4 < 6 Then                                 'Knüppel unten
        Portb. 6 = 0                                            'Port PB 6 setzen
        Else                                                    'sonst
        Portb. 6 = 1                                            'Port PB 6 zurücksetzen
        End If
    
    
    
    'Automatikfunktion für Scheinwerfer:    GEPRÜFT MIT HARDWARE OK
    '___________________________________
    
        If Portb.0 = 0 Or Portb.1 = 0 Then                      'Wenn PB0 oder PB1 Hi sind dann
        Portd.6 = 0                                             ' PD6 setzen
        Else                                                    'sonst
        Portd.6 = 1                                             'PD6 RÜCKsetzen
        End If
    
     Loop
    
    
    
     'Unterprogramme:
     '_______________
    
     Ledcount:                                                  'Farbwechsel über Timer1
    
        Timer0 = 150                                            'LED´s wechseln die Farbe mit ca 2 Hz
    
    
     While Led1pause > 1000                                     'wenn Led1Pause > 1000 dann Schleife bearbeiten
     Incr Led1pause
    
    
    
        If Led1 = 255 Then                                      'Wenn Led1 100% dann Merker zum hochzählen setzen
         Led1m = 0
        End If
    
        If Led1 = 0 Then                                        'Wenn Led1 0% dann Merker zum runterzählen setzen
         Led1m = 1
        End If
    
        'Zähler1 hoch/runter
        If Led1m = 1 Then
         Incr Led1                                              'Wenn Merker Led1m = 1 -> um 1 hochzählen
        End If
    
        If Led1m = 0 Then
         Decr Led1                                              'um 1 runterzählen
        End If
    
    
        '-------
        If Led2 = 255 Then
         Led2m = 0
        End If
    
        If Led2 = 0 Then
         Led2m = 1
        End If
    
        'Zähler1 hoch/runter
        If Led2m = 1 Then
         Incr Led2                                              'um 1 hochzählen
        End If
    
        If Led2m = 0 Then
         Decr Led2                                              'um 1 runterzählen
        End If
    
    
    
     Wend
    
    
        If Led1pause = 2000 Then
        Led1pause = 0
        End If
    
    Return

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627
    Hat denn keiner eine Idee warum meine UART nicht will?

Berechtigungen

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

Labornetzteil AliExpress