-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 24

Thema: Interupt 0 und 1 ohne Funktion

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

    Interupt 0 und 1 ohne Funktion

    Anzeige

    Hallo,
    ich möchte die Zeit zwischen Interrupt0 und Interrupt1 messen. Wenn bei Int0 ein high Signal kommt soll der Timer1 gestartet werden und wenn high bei Interrupt2 kommt soll der Timer gestoppt werden. Aber irgendwie reagiert das Programm nicht auf die Interrupts. Weiß jemand warum?

    Code:
    '7Segmentanzeige mit 5 (oder 4) Anzeigen
    
    $regfile = "ATtiny2313.dat"                                 'ATTiny2313
    $crystal = 18432000                                         '18,4320MHz Quarz
    
    $hwstack = 64                                               ' default use 32 for the hardware stack
    $swstack = 64                                               ' default use 10 for the SW stack
    
    
    '_______________________________________________________________________________
    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
    
    '_______________________________________________________________________________
    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
    I = 1
    
    Dim Zeit As Single                                          'gemessene Zeit von Timer1
    Dim Kmh As Single                                          'Geschwindigkeit
    
    '_______________________________________________________________________________
    'TIMER0 Konfiguration für Ziffernwechsel:
    Config Timer0 = Timer , Prescale = 256                      ' Timer0 für Anzeige
    Const T0_preload = &H70                                     ' Startwert Timer0 für 500Hz
    Tcnt0 = T0_preload
    
    On Timer0 Timer_irq_led                                     ' Timer0-Overflow-Interrupt
    
    Enable Timer0                                               ' Timer0 starten
    Sreg.7 = 1                                                  'Globale Interruptfreigabe
    
    '_______________________________________________________________________________
    'TIMER1 Konfiguration für Messzeit:
    Config Timer1 = Timer , Prescale = 1024
    Const Timervorgabe = 0                                      '29535 -> 0,5 Hz
    On Timer1 Timer_irq_kmh                                         'Unteprogramm aufrufen
    
    'Enable Interrupts
    
    '_______________________________________________________________________________
    
    Do                                                          ' Dauerschleife als Hauptprogramm
    Waitms 250
    Anzeige_akt = Timer1                                        'Zeit                                          'Wert zum anzeigen
    
    
    
    Loop
    
    
    
    '_______________________________________________________________________________
    Timer_irq_led:
    
          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)
    
          Portd = 0                                             'Ghosting vermeiden
    
          Select Case Anzeige_ziffer                            'Ziffer auf Port
    
               Case "0" : Portb = 63                            'NULL
               Case "1" : Portb = 6                             'EINS
               Case "2" : Portb = 91                            'ZWEI
               Case "3" : Portb = 79                            'DREI
               Case "4" : Portb = 102                           'VIER
               Case "5" : Portb = 109                           'FÜNF
               Case "6" : Portb = 125                           'SECHS
               Case "7" : Portb = 7                             'SIEBEN
               Case "8" : Portb = 127                           'ACHT
               Case "9" : Portb = 111                           'NEUN
               Case Else : Portb = 0
    
          End Select
    
         'Segment wählen
          If I = 1 Then Portd.0 = 1                             'EINER
          'If I = 2 Then Portd.1 = 1                            'ZEHNER
          If I = 2 Then
          Portd.4 = 1                                           'HUNDERTER
          'Portb.7 = 1                                           'Kommastelle
           End If
          If I = 3 Then Portd.5 = 1                             'TAUSENDER
          If I = 4 Then Portd.6 = 1                             'ZEHNTAUSENDER
    
          I = I + 1                                             'Nächste Ziffer
          If I >= 6 Then I = 1                                  'max Anzeigen angeben! damit Anzeige möglichst hell ist(bei 5Anzeigen muss bei der 6. wieder bei 1 Angefangen werden)
    
    
    Return
    
    Irq0:                                                       'Aufruf bei Lichtschranke 1 per Interrupt
     Timer1 = 0                                                 'Timer auf 0 setzen
     Start Timer1                                               'Timer starten
     Portb.7 = 1
     Return
    
    Irq1:                                                       'Aufruf bei Lichtschranke 2 per Interrupt
     Stop Timer1                                                'Timer stoppen
     'Zeit = Timer1
     Portb.7 = 0
     Return
    
    
    Timer_irq_kmh:                                              'Aufruf jede oder jede halbe Sekunde
     Timer1 = Timervorgabe                                      'AUF TIMER EINSTELLUNG ACHTEN!!!!!!!
    
    Return
    ...

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hi,

    also in diesem Beispiel ist die Zeile mit dem Enable Interrupts auskommentiert, dann kann das nicht gehen !

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    48
    Beiträge
    1.254
    Hallo TobiasBlome,

    du hast vergessen, anzugeben was passieren soll:
    On Int0 Irq0
    On Int1 Irq1
    Enable Interrupts muß vermutlich auch ausgeklammert werden

    Gruß, Michael

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    Hallo und vielen Dank!
    Enable Interrupts hab ich jetzt benutzt und On Int0 Irq0
    On Int1 Irq1 steht auch drinn! Ergebnis es funktioniert!
    aber was meins tdu mit:
    Enable Interrupts muß vermutlich auch ausgeklammert werden. Wie ausklammern?

    Tobias
    ...

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    Tja dank euch funktioniert Teil 1 von meinem Programm - aber mal von vorne:

    Also ich möchte eine Geschwindigkeit mit zwei Lichtschranken messen. Abstand 30cm und jede löst einen Interrupt aus(INT0 und INT1). Wenn INT0 kommt wird Timer1 gestartet. Nun möchte ich zählen wie oft Timer1 überläuft bis INT1 den Timer stoppt.
    Irgendwie klappt das zählen vom Timerüberlauf nicht.
    Kann mir jemand sagen warum und ob meine Vorgehensweise im Prinzip richtig ist?

    Tobias



    Code:
    '7Segmentanzeige mit 5 (oder 4) Anzeigen
    
    $regfile = "ATtiny2313.dat"                                 'ATTiny2313
    $crystal = 18432000                                         '18,4320MHz Quarz
    
    $hwstack = 64                                               ' default use 32 for the hardware stack
    $swstack = 64                                               ' default use 10 for the SW stack
    '$baud = 9600
    
    '_______________________________________________________________________________
    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
    I = 1
    
    
    Dim T1ueberlauf As Single                                   'gemessene Zeit von Timer1
    Dim Kmh As Single                                           'Geschwindigkeit
    
    '_______________________________________________________________________________
    'TIMER0 Konfiguration für Ziffernwechsel:
    Config Timer0 = Timer , Prescale = 256                      ' Timer0 für Anzeige
    Const T0_preload = &H70                                     ' Startwert Timer0 für 500Hz
    Tcnt0 = T0_preload
    
    On Timer0 Timer_irq_led                                     ' Timer0-Overflow-Interrupt
    
    Enable Timer0                                               ' Timer0 starten
    Sreg.7 = 1                                                  'Globale Interruptfreigabe
    
    '_______________________________________________________________________________
    'TIMER1 Konfiguration für Messzeit Lichtschranke:
    Config Timer1 = Timer , Prescale = 1024
    Const Timervorgabe = 0                                      '29535 -> 0,5 Hz
    On Timer1 Timer_irq_kmh                                     'Unteprogramm aufrufen
    Stop Timer1
    Enable Interrupts
    
    '_______________________________________________________________________________
    
    T1ueberlauf = 0                                             'Timer1Zähler auf 0 setzen
    Do                                                          ' Dauerschleife als Hauptprogramm
    'Waitms 250
    Anzeige_akt = T1ueberlauf                                   'Wert zum anzeigen
    
    
    
    Loop
    
    
    
    '_______________________________________________________________________________
    Timer_irq_led:
    
          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)
    
          Portd = 0                                             'Ghosting vermeiden
    
          Select Case Anzeige_ziffer                            'Ziffer auf Port
    
               Case "0" : Portb = 63                            'NULL
               Case "1" : Portb = 6                             'EINS
               Case "2" : Portb = 91                            'ZWEI
               Case "3" : Portb = 79                            'DREI
               Case "4" : Portb = 102                           'VIER
               Case "5" : Portb = 109                           'FÜNF
               Case "6" : Portb = 125                           'SECHS
               Case "7" : Portb = 7                             'SIEBEN
               Case "8" : Portb = 127                           'ACHT
               Case "9" : Portb = 111                           'NEUN
               Case Else : Portb = 0
    
          End Select
    
         'Segment wählen
          If I = 1 Then Portd.0 = 1                             'EINER
          'If I = 2 Then Portd.1 = 1                            'ZEHNER
          If I = 2 Then
          Portd.4 = 1                                           'HUNDERTER
          Portb.7 = 1                                           'Kommastelle
           End If
          If I = 3 Then Portd.5 = 1                             'TAUSENDER
          If I = 4 Then Portd.6 = 1                             'ZEHNTAUSENDER
    
          I = I + 1                                             'Nächste Ziffer
          If I >= 6 Then I = 1                                  'max Anzeigen angeben! damit Anzeige möglichst hell ist(bei 5Anzeigen muss bei der 6. wieder bei 1 Angefangen werden)
    
    
    Return
    
    Irq0:                                                       'Aufruf bei Lichtschranke 1 per Interrupt
     Timer1 = 0                                                 'Timer auf 0 setzen
     T1ueberlauf = 0                                            'Timer1Zähler auf 0 setzen
     Start Timer1                                               'Timer starten
     Return
    
    Irq1:                                                       'Aufruf bei Lichtschranke 2 per Interrupt
     Stop Timer1                                                'Timer stoppen
     Return
    
    
    Timer_irq_kmh:                                              'Aufruf jede oder jede halbe Sekunde
     Timer1 = Timervorgabe                                      'AUF TIMER EINSTELLUNG ACHTEN!!!!!!!
     T1ueberlauf = T1ueberlauf + 1                              'Timer1Zähler hoch zählen
    Return
    ...

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    48
    Beiträge
    1.254
    Hallo TobiasBlome,

    Im Int0 wird Timer1 gelöscht und von 0 gestartet.
    Ungefähr jede Millisekunde beim Überlauf von Timer1 wird eine Variable hochgezählt, die erst bei Unterbrechung der 1. Lichtschranke wieder auf 0 gesetzt wird.
    Im Int1 wird Timer1 gestoppt.

    Wozu startest und löschst du Timer1 überhaupt? Du willst doch letztendlich die Takte zwischen beiden Ereignissen zählen?

    Welche zu messende Geschwindigkeit erwartest du denn ungefähr?

    Gruß, Michael

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    Hallo
    also ich möchte ca. 10ms bis 1 sec messen und deswegen zähle ich wie oft der Timer überläuft. Deshalb wird der Timer auch einmalig mit der 1. Lichtschanke INT0 auf 0 gesetzt

    Tobias
    ...

  8. #8
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    48
    Beiträge
    1.254
    Hallo TobiasBlome,

    Ungefähr jede Millisekunde beim Überlauf von Timer1
    ups, ich habe mich geirrt.
    Timer1 wird ja mit 18432000/1024 = 18000 Hz getaktet
    Ein Überlauf kommt dann alle 3,6 Sekunden.
    Dein Timerinterrupt kommt also nicht in der erwarteten Zeit, deine Variable T1ueberlauf bleibt leer.

    Wozu startest und löschst du Timer1 überhaupt? Du willst doch letztendlich die Takte zwischen beiden Ereignissen zählen?
    Gruß, Michael

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    ups
    ich dachte der kommt 18000 mal pro sek....
    das passt ja garnicht....

    Eigendlich wollte ich den Timer mit INT0 Starten mit INT1 stoppen und dan die Zeit vom Timer ablesen. Weil ich dachte das dem 18000/sek durchläuft habe ich nur noch die Interrupts gezählt.
    Wie würdest du das machen?

    Tobias
    ...

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    aber... ist 18000Hz nicht = 18000 mal pro Sekunde
    ...

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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