-
        

Ergebnis 1 bis 2 von 2

Thema: Timer zählt nicht weiter?

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

    Timer zählt nicht weiter?

    Anzeige

    Hallo,
    ich habe 4 7-Segmentanzeigen programmiert. zum testen wollte ich mit Timer1 die Variable Test hochzählen. Nur leider zählt der Timer nur bis 8 auf der 7-Segmentanzeige. Zur Kontrolle sende ich mit Print auf den PC mit dem Selben Ergebnis!?

    Woran liegt das?

    Tobias


    Code:
    '7Segmentanzeige mit 4 Anzeigen
    
    $regfile = "m8def.dat"                                      'AT-Mega8
    $crystal = 8000000                                          '18432000                                         '18,4320MHz Quarz
    
    $baud = 9600                                                '38400
    
    '_______________________________________________________________________________
    Ddrb = &B11111111                                           'PortB = Ausgang (PB0=A usw.)
    Ddrd = &B1110011                                            'PortD = Ausgang (PD0=Anzeige1, PD4=A2, PD5=A3, PD6=A4) PD2/3 =INT
    
    'Config Int0 = Rising                                        'Falling                                       'wechsel von High auf Low
    'Config Int1 = Rising                                        'Falling                                       'wechsel von High auf Low
    'Enable Int0
    'Enable Int1
    'On Int0 Irq0
    'On Int1 Irq1
    
    
    '_______________________________________________________________________________
    Dim Anzeige_akt As Word                                     'Aktuelle Zeitmessung
    Dim Anzeige_str As String * 5                               'Zeit als String
    Dim Anzeige_str_len As Byte                                 'String-Länge
    Dim Anzeige_ziffer As String * 1                            'Aktuelle Ziffer
    Dim Anzeige_pos As Byte                                     'Aktuelle Ziffer im String
    Dim I As Byte                                               'Allgem. Laufzahl
    
    
    
    'Dim Zeit As Word
    'Dim Zeitfake As Word                                        'damit nicht mit dem Wert 0 gerechnet wird 0=108km/h!!!                                            'gemessene Zeit von Timer1
    'Dim Zeit1 As Single
    'Dim Zeit2 As Single
    'Dim Zeit3 As Single
    
    Dim Test As Integer
    
    'Dim Int0_merker As Byte                                     'als verriegelung für den int0 Eingang
    'Dim Int1_merker As Byte                                     'als verriegelung für den int1 Eingang
    'Dim Timer0merker As Word                                    'um intMerker zurück zu setzen
    
    
    '_______________________________________________________________________________
    'TIMER0 Konfiguration für Ziffernwechsel:
    Config Timer0 = Timer , Prescale = 64                       ' Timer0 für Anzeige
    Const T0_preload = 130                                      ' Startwert Timer0 für 500Hz
    'Tcnt0 = T0_preload
    On Timer0 Timer_irq_led                                     ' Timer0-Overflow-Interrupt
    Enable Timer0                                               ' Timer0 starten
    Enable Interrupts
    'Sreg.7 = 1                                                  'Globale Interruptfreigabe
    
    '_______________________________________________________________________________
    'TIMER1 Konfiguration für Messzeit Lichtschranke:
    Config Timer1 = Timer , Prescale = 1024
    Const Timervorgabe = 62000                                  '29535 -> 0,5 Hz
    On Timer1 Timer_irq_kmh                                     'Unteprogramm aufrufen
    Enable Timer1
    Enable Interrupts
    
    '_______________________________________________________________________________
    'Int0_merker = 0                                             'als verriegelung für den int0 Eingang
    'Int1_merker = 0                                             'als verriegelung für den int1 Eingang
    I = 1
    'Zeit = 0                                                    'gemessene Zeit auf 0 setzen
    Test = 1
    Do                                                          ' Dauerschleife als Hauptprogramm
    
    Anzeige_akt = Test                                          'Zeit3        'Wert zum anzeigen
    
    'If Zeit =< 500 Or Zeit => 18615 Then                        'damit nicht mit dem Wert 0 gerechnet wird 0=108km/h!!!
    'Zeitfake = 18616
    'Else
    'Zeitfake = Zeit
    'End If
    
    
    'Zeit1 = Zeit * 0.0058579
    'Zeit2 = 109.05442 - Zeit1
    'Zeit3 = Zeit2 * 10                                          'damit ich eine nachkommastelle habe!!!
    
    
    'If Timer0merker => 1000 Then
    'Timer0merker = 0
    'Int0_merker = 0                                             'als verriegelung für den int0 Eingang
    'Int1_merker = 0                                             'als verriegelung für den int1 Eingang
    'End If
    Print Test
    Gosub Anzeige
    
    Loop
    
    
    
    '_______________________________________________________________________________
    Timer_irq_led:
          'Gosub Anzeige
    
    Return
    
    Anzeige:
    Tcnt0 = T0_preload                                    'Timer wieder laden
    
          Anzeige_str = Str(anzeige_akt)                        ' Wert in String umwandeln
          Anzeige_str_len = Len(anzeige_str)                    ' Stringlänge messen
    
          Anzeige_pos = Anzeige_str_len - I
          Anzeige_pos = Anzeige_pos + 1
    
          Anzeige_ziffer = Mid(anzeige_str , Anzeige_pos , 1)
    
          Portc = 0                                             'Ghosting vermeiden (Ziffern nicht Segmente)
    
          Select Case Anzeige_ziffer                            'Ziffer auf Port
    
               Case "0" : Portb = 126                           'NULL
               Case "1" : Portb = 12                            'EINS
               Case "2" : Portb = 182                           'ZWEI
               Case "3" : Portb = 158                           'DREI
               Case "4" : Portb = 204                           'VIER
               Case "5" : Portb = 218                           'FÜNF
               Case "6" : Portb = 250                           'SECHS
               Case "7" : Portb = 14                            'SIEBEN
               Case "8" : Portb = 254                           'ACHT
               Case "9" : Portb = 222                           'NEUN
               Case Else : Portb = 0                            'NICHTS ANZEIGEN!!! Wenn Stelle leer!!!
    
          End Select
    
         'Segment wählen
          If I = 1 Then Portc.1 = 1                             'EINER
          If I = 2 Then
          Portc.2 = 1                                           'ZEHNER
          'Portb.0 = 1                                           'mti einer Nachkommastelle
          End If
    
          If I = 3 Then Portc.3 = 1                             'HUNDERTER
          If I = 4 Then Portc.4 = 1                             'TAUSENDER
    
          I = I + 1                                             'Nächste Ziffer
          If I => 5 Then I = 1                                  'max Anzeigen +1 angeben! damit Anzeige möglichst hell ist(bei 5Anzeigen muss bei der 6. wieder bei 1 Angefangen werden)
    
          'Timer0merker = Timer0merker + 1                       '+1 um intMerker zurück zu setzen
    Return
    
    
    Timer_irq_kmh:                                              'Aufruf jede oder jede halbe Sekunde
     Timer1 = Timervorgabe                                      'AUF TIMER EINSTELLUNG ACHTEN!!!!!!!
     Incr Test
    
    Return
    ...

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    hat denn keiner eine Idee?!
    mir ist noch so durch den Kopf geschossen, was wäre wenn der µC überlastet ist? Also wenn der zulange in der Anzeigen Routine hängt (Gosub Anzeige)

    mal etwas übersichtlicher...

    Code:
    '7Segmentanzeige mit 4 Anzeigen
    
    $regfile = "m8def.dat"                                      'AT-Mega8
    $crystal = 8000000                                          '18432000                                         '18,4320MHz Quarz
    
    $baud = 9600                                                '38400
    
    '_______________________________________________________________________________
    Ddrb = &B11111111                                           'PortB = Ausgang (PB0=A usw.)
    Ddrd = &B1110011                                            'PortD = Ausgang (PD0=Anzeige1, PD4=A2, PD5=A3, PD6=A4) PD2/3 =INT
    
    
    '_______________________________________________________________________________
    Dim Anzeige_akt As Word                                     'Aktuelle Zeitmessung
    Dim Anzeige_str As String * 5                               'Zeit als String
    Dim Anzeige_str_len As Byte                                 'String-Länge
    Dim Anzeige_ziffer As String * 1                            'Aktuelle Ziffer
    Dim Anzeige_pos As Byte                                     'Aktuelle Ziffer im String
    Dim I As Byte                                               'Allgem. Laufzahl
    
    
    Dim Test As Integer
    
    
    '_______________________________________________________________________________
    'TIMER0 Konfiguration für Ziffernwechsel:
    Config Timer0 = Timer , Prescale = 64                       ' Timer0 für Anzeige
    Const T0_preload = 130                                      ' Startwert Timer0 für 500Hz
    'Tcnt0 = T0_preload
    On Timer0 Timer_irq_led                                     ' Timer0-Overflow-Interrupt
    Enable Timer0                                               ' Timer0 starten
    Enable Interrupts
    'Sreg.7 = 1                                                  'Globale Interruptfreigabe
    
    '_______________________________________________________________________________
    'TIMER1 Konfiguration für Messzeit Lichtschranke:
    Config Timer1 = Timer , Prescale = 1024
    Const Timervorgabe = 62000                                  '29535 -> 0,5 Hz
    On Timer1 Timer_irq_kmh                                     'Unteprogramm aufrufen
    Enable Timer1
    Enable Interrupts
    
    '_______________________________________________________________________________
    
    I = 1
    Test = 1
    
    Do                                                          ' Dauerschleife als Hauptprogramm
    
    Anzeige_akt = Test                                          'Zeit3        'Wert zum anzeigen
    
    Print Test
    Gosub Anzeige
    
    Loop
    
    
    
    '_______________________________________________________________________________
    Timer_irq_led:
          'nix
    
    Return
    
    Anzeige:
    Tcnt0 = T0_preload                                    'Timer wieder laden
    
          Anzeige_str = Str(anzeige_akt)                        ' Wert in String umwandeln
          Anzeige_str_len = Len(anzeige_str)                    ' Stringlänge messen
    
          Anzeige_pos = Anzeige_str_len - I
          Anzeige_pos = Anzeige_pos + 1
    
          Anzeige_ziffer = Mid(anzeige_str , Anzeige_pos , 1)
    
          Portc = 0                                             'Ghosting vermeiden (Ziffern nicht Segmente)
    
          Select Case Anzeige_ziffer                            'Ziffer auf Port
    
               Case "0" : Portb = 126                           'NULL
               Case "1" : Portb = 12                            'EINS
               Case "2" : Portb = 182                           'ZWEI
               Case "3" : Portb = 158                           'DREI
               Case "4" : Portb = 204                           'VIER
               Case "5" : Portb = 218                           'FÜNF
               Case "6" : Portb = 250                           'SECHS
               Case "7" : Portb = 14                            'SIEBEN
               Case "8" : Portb = 254                           'ACHT
               Case "9" : Portb = 222                           'NEUN
               Case Else : Portb = 0                            'NICHTS ANZEIGEN!!! Wenn Stelle leer!!!
    
          End Select
    
         'Segment wählen
          If I = 1 Then Portc.1 = 1                             'EINER
          If I = 2 Then
          Portc.2 = 1                                           'ZEHNER
          'Portb.0 = 1                                           'mti einer Nachkommastelle
          End If
    
          If I = 3 Then Portc.3 = 1                             'HUNDERTER
          If I = 4 Then Portc.4 = 1                             'TAUSENDER
    
          I = I + 1                                             'Nächste Ziffer
          If I => 5 Then I = 1                                  'max Anzeigen +1 angeben! damit Anzeige möglichst hell ist(bei 5Anzeigen muss bei der 6. wieder bei 1 Angefangen werden)
    
          'Timer0merker = Timer0merker + 1                       '+1 um intMerker zurück zu setzen
    Return
    
    
    Timer_irq_kmh:                                              'Aufruf jede oder jede halbe Sekunde
     Timer1 = Timervorgabe                                      'AUF TIMER EINSTELLUNG ACHTEN!!!!!!!
     Incr Test
    
    Return
    ...

Berechtigungen

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