-         

Ergebnis 1 bis 4 von 4

Thema: Counter als Zeitgeber

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    21.12.2007
    Beiträge
    22

    Counter als Zeitgeber

    Anzeige

    hallo,

    ich nehme meistens counter als timer her. wenns genauer gehen muß nen timer als takt und counter zum vervielfachen. im folgenden beispiel blinkt sekbyte im sekundentakt (nicht genau, aber das spielt hier keine rolle) und minbyte soll alle 9 sek blinken.
    meine problem: manchmal blinkt minbyte alle 9 sek, manchmal alle 10 sek.
    irgendwie denk ich, liegt es daran dass ich bei xxxbyte=0 gleichzeitig ein anderes byte runterzählen lasse und das xxxbyte wieder auf den anfangswert setze.
    läuft jetzt die schleife nochmal durch und xxxbyte ist immer noch 0, dann wird eben das andere byte nochmal runtergezählt.
    so ganz hab ich das leider noch nicht kapiert, wann ein befehl gelesen wird und wann er ausgeführt wird.
    oder liegts an was anderem

    Code:
    $regfile = "attiny26.dat"
    $crystal = 1000000
    
    Ddrb = &B00011100                                           'Bit 0, 1 auf Eingang
    Portb = &B00000011
    
    
    
    Config Timer0 = Timer , Prescale = 1024                     'Timer0 als timer definieren, teiler 1024                  '
    Const Preset = 5                                            'zählt von 1 bis 255
    
    
    On Timer0 Marke
    Timer0 = 230
    
    Enable Timer0
    Enable Interrupts
    
    Dim Sekbyte As Byte
    Dim Minbyte As Byte
    Sekbyte = 0
    Minbyte = 9
    
    Do
    
    If Sekbyte < 5 Then
     Portb.4 = 1
     Else
     Portb.4 = 0
    End If
    
    If Sekbyte = 20 Then
    Decr Minbyte
    End If
    
    If Sekbyte = 20 Then
    Sekbyte = 0
    End If
    
    If Minbyte = 9 Then
    Portb.3 = 1
    Else
    Portb.3 = 0
    End If
    
    If Minbyte = 0 Then
    Minbyte = 9
    End If
    
    Loop
    
    
    Marke:
    Timer0 = 230
    If Pinb.0 = 0 Then
    Incr Sekbyte
    End If
    
    Return

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    Was meinst du mit

    so ganz hab ich das leider noch nicht kapiert, wann ein befehl gelesen wird und wann er ausgeführt wird.
    Prinzipiell werden alle Befehle nacheinander ausgeführt, Schritt für Schritt
    wie sie im Programm stehen, es sein denn es gibt immer ein "Aber" es kommt ein Interrupt dazwischen. Dann wird nämlich Dein Programmablauf an der Stelle unterbrochen und die ISR, die Interrupt Service Routine, ausgeführt, es sein denn ... und da gibts dann wieder ein Aber, zumindest beim AVR, der Controller ist schon am Abarbeiten einer anderen ISR
    Du hast eine Abfrage " = 20" drinnen für den Sekundenzähler, doch was passiert, wenn der Zähler 20 erreicht, aber in der Mainloop noch nicht wieder an der Abfragestelle ankommt und die ISR nochmal ausgelöst wird? ... er zählt auf 21 weiter und die Bedingung wird nicht ausgeführt, erst wieder wenn der Zähler die 255 überlaufen hat und wieder bei 0 anfängt zu zählen.

    Probiers mal so:

    Code:
    $regfile = "attiny26.dat"
    $crystal = 1000000
    
    $hwstack = 32     ' default use 32 for the hardware stack
    $swstack = 10      ' default use 10 for the SW stack
    $framesize = 20
    
    Ddrb = &B00011100                                           'Bit 0, 1 auf Eingang
    Portb = &B00000011
    
    Config Timer0 = Timer , Prescale = 1024   'Timer0 als timer definieren, teiler 1024                  '
    On Timer0 Marke
    Timer0 = 230n
    
    Enable Timer0
    Enable Interrupts
    
    Const Preset = 5                                            'zählt von 1 bis 255
    
    
    
    Dim Sekbyte As Byte
    Dim Minbyte As Byte
    Sekbyte = 0
    Minbyte = 9
    
    Do
    
    If Sekbyte < 5 Then
     Portb.4 = 1
     Else
     Portb.4 = 0
    End If
    
    If Sekbyte > 19 Then
    Decr Minbyte
    Sekbyte = Sekbyte - 20
    End If
    
    If Minbyte = 0 Then
    Minbyte = 9
    End If
    
    If Minbyte = 9 Then
    Portb.3 = 1
    Else
    Portb.3 = 0
    End If
    
    Loop
    
    
    Marke:
    Timer0 = 230
    If Pinb.0 = 0 Then
    Incr Sekbyte
    End If
    
    Return
    End
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    21.12.2007
    Beiträge
    22
    Danke!!!
    funktionieren tuts, muß mir nur mal in ner ruhigen minute durch den kopf gehen lassen, warums funktioniert

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    Da liegt das "Geheimnis":


    If Sekbyte > 19 Then
    Decr Minbyte
    Sekbyte = Sekbyte - 20
    End If
    Vor den Erfolg haben die Götter den Schweiß gesetzt

Berechtigungen

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