Hallo!

Die Hardware ist komplett fertig, bis auf einige Feinheiten. Allerdings macht mir die Software einige Probleme. Das Display läuft, ich kann auch schon durch die Menüs blättern und verschiedene Funktionen aufrufen. Allerdings tut sich puunkto Geschwindigkeit/Kilometerstand absolut gar nichts. Messungen haben ergeben, dass der Reed-Kontakt Int0 gegen Masse zieht (wie vorgesehen), aber anscheinend kein Interrupt ausgelöst wird, beziehnungsweise, es wird nicht in die Interruptroutine gesprungen. Weiters wäre eventuell noch ein Fehler in der Interruptroutine denkbar, besonders, was das Starten von Timer0 betrifft habe ich Zweifel, ob ich das wirklich richtig gelöst habe.

Zum Testen habe ich den Code etwas reduziert, die Tastenentprellung und einige Menüs wurden entfernt. Dies ist der Code, der momentan am AVR in Betrieb ist:
Code:
'Name:.............Bordcomputer
'Version:..........1.0a
'Datum:............11.01.2009
'Autor:............Thomas Edlinger
'---------------------------------
'Beschreibung: Bordcomputer
'              Ausgabemasken: 0  |  Grundbild
'                             1  |  Hauptmenü
'                             2  |  Einstellungen 1
'                             3  |  Einstellungen 2
'                             4  |  Status
'                             5  |  Störungstexte


$regfile = "m8def.dat"
$crystal = 1000000


'KONFIGURATION EINGÄNGE
Config Pind.2 = Input
Config Pind.3 = Input
Config Pinb.6 = Input
Config Pinb.7 = Input
Config Pind.5 = Input
Config Pinb.0 = Input
Config Pinc.0 = Input


'KONFIGURATION AUSGÄNGE
Config Portd.0 = Output
Config Portd.1 = Output
Config Portd.4 = Output
Config Portc.5 = Output
Config Portc.4 = Output
Config Portc.3 = Output
Config Portc.2 = Output
Config Portc.1 = Output
Config Portb.2 = Output
Config Portb.1 = Output


'PULLUPS EINSCHALTEN
Portd.2 = 1
Portd.3 = 1
Portb.6 = 1
Portb.7 = 1
Portd.5 = 1
Portb.0 = 1


'VERGABE ALIAS-ADRESSEN
T_auf Alias Pind.3
T_ab Alias Pinb.6
T_links Alias Pinb.7
T_rechts Alias Pind.5
T_enter Alias Pinb.0
D1_betrieb Alias Portd.0
D2_busy Alias Portd.1
D3_stoerung Alias Portd.4



'VARIABLEN
Dim Adc_wert As Word
Dim Spg As Single
Dim Stat_timer0 As Bit
Dim Time_umdrehung_n As Long
Dim Time_umdrehung_ms As Long
Dim Time_umdrehung_s As Single
Dim Radumfang As Single
Dim V_meter_sekunde As Single
Dim V_kmh As Single
Dim Kmges As Single
Dim Kmtag As Single
Dim Spg_ausgabe As String * 5
Dim V_meter_sekunde_ausgabe As String * 4
Dim V_kmh_ausgabe As String * 4
Dim Kmges_ausgabe As String * 7
Dim Kmtag_ausgabe As String * 7
Dim Radumfang_ausgabe As String * 7
Dim Ausgabemaske As Byte
Dim Status As Bit
Dim Status_nr As Byte
Dim Auswahl As Byte
Dim Sparmodus As Bit
Radumfang = 0.628


'KONSTANTEN
Const Adc_faktor = 0.017578
Const V_faktor = 3.6


'KONFIGURATION INT0
Config Int0 = Falling
On Int0 Int0_isr


'KONFIGURATION ADC
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc


'KONFIGURATION TIMER0
Config Timer0 = Timer , Prescale = 8
Timer0 = 131
On Timer0 Timer0_isr
Enable Timer0
Stop Timer0


'KONFIGURATION LCD
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portb.2 , Rs = Portc.5 , E = Portc.4
Config Lcd = 16 * 4
Config Lcdbus = 4
Waitms 100
Initlcd
Waitms 100


'EEPROM LESEN
Readeeprom Kmges , 16
Readeeprom Kmtag , 32


'STARTBILD
Rem noch nicht ganz fertiggestellt
Cls
Locate 1 , 1
Wait 2
Lcd "Willkommen!"
Wait 2
Locate 2 , 1
Lcd "Bordcomputer"
Wait 2
Locate 3 , 1
Lcd "V1.0"
Wait 2
Locate 4 , 1
Lcd "(c) TE"
Wait 2
Cls


'### HAUPTSCHLEIFE ###
Do

   'ADC auslesen
   Adc_wert = Getadc(0)
   'ADC-Wert in Spannung umwandeln
   Spg = Adc_wert * Adc_faktor
   'Sub aufrufen, wenn Versorgungsspannung abfällt
   If Spg < 9 Then Gosub Power_fail

   'Berechnung Geschwindigkeit
   Time_umdrehung_s = Time_umdrehung_ms * 1000
   V_meter_sekunde = Radumfang / Time_umdrehung_s
   V_kmh = V_meter_sekunde * V_faktor

   'Umwandlung Werte für LCD
   Spg_ausgabe = Fusing(spg , "##.##")
   V_meter_sekunde_ausgabe = Fusing(v_meter_sekunde , "##.#")
   V_kmh_ausgabe = Fusing(v_kmh , "##.#")
   Kmges_ausgabe = Fusing(kmges , "####.##")
   Kmtag_ausgabe = Fusing(kmtag , "####.##")
   Radumfang_ausgabe = Fusing(radumfang , "#.####")

   'Ausgabe Lcd
   Select Case Ausgabemaske
      Case 0 : Gosub Maske0
      Case 1 : Gosub Maske1
      Case 2 : Gosub Maske2
      Case 3 : Gosub Maske3
      Case 4 : Gosub Maske4
      Case 5 : Gosub Maske5
   End Select

   'Abfragen Störungen usw.
   'Abfrage Versorgungsspannung
   If Spg < 10 Then
      Status = 1
      Status_nr = 1
   End If

Loop


'### SUBS ###
Int0_isr:

   Time_umdrehung_n = Time_umdrehung_ms
   Time_umdrehung_n = 0
   Toggle Stat_timer0
   If Stat_timer0 = 1 Then Start Timer0 Else Stop Timer0
   Kmges = Kmges + Radumfang
   Kmtag = Kmtag + Radumfang

Return


Timer0_isr:

   Timer0 = 131
   Incr Time_umdrehung_n

Return


Power_fail:

Writeeeprom Kmges , 16
Writeeeprom Kmtag , 32
Powerdown

Return


'MASKEN
Maske0:

   'Ausgabe Geschwindigkeit
   Locate 1 , 1
   Lcd V_kmh_ausgabe ; "km/h"
   Locate 1 , 10
   Lcd V_meter_sekunde_ausgabe ; "m/s"
   'Ausgabe Tageskilometerstand
   Locate 2 , 1
   Lcd Kmtag_ausgabe ; "km"
   'Ausgabe Gesamtkilometerstand
   Locate 3 , 1
   Lcd Kmges_ausgabe ; "km"
   'Ausgabe Spg
   Locate 4 , 1
   Lcd Spg_ausgabe ; "V"
   'Ausgabe Status
   Locate 4 , 9
   If Status = 0 Then Lcd "OK" Else Lcd "Stoerung"

   'Tasterabfrage
   If T_enter = 0 Then
      Ausgabemaske = 1
      Cls
   End If

   '----------
   Locate 4 , 12
   Lcd Stat_timer0
   '----------

Return


Maske1:

   'Ausgabe Hauptmenü
   Locate 1 , 3
   Lcd "Grundbild"
   Locate 2 , 3
   Lcd "Einst. 1"
   Locate 3 , 3
   Lcd "Einst. 2"
   Locate 4 , 3
   Lcd "Status"

   'Abfrage Taster
   If T_auf = 0 Then
      Decr Auswahl
      Cls
   End If
   If T_ab = 0 Then
      Incr Auswahl
      Cls
   End If

   If Auswahl = 4 Then Auswahl = 0
      If Auswahl = 0 Then
         Locate 1 , 1
         Lcd "+"
            If T_enter = 0 Then
               Ausgabemaske = 0
               Cls
            End If
      Elseif Auswahl = 1 Then
         Locate 2 , 1
         Lcd "+"
            If T_enter = 0 Then
               Ausgabemaske = 2
               Cls
            End If
      Elseif Auswahl = 2 Then
         Locate 3 , 1
         Lcd "+"
            If T_enter = 0 Then
               Ausgabemaske = 3
               Cls
            End If
      Elseif Auswahl = 3 Then
         Locate 4 , 1
         Lcd "+"
            If T_enter = 0 Then
               Ausgabemaske = 4
               Cls
            End If
      End If

Return


Maske2:

   'Ausgabe Einstellungen1
   Locate 1 , 3
   Lcd "Reset Km-Tag"
   Locate 2 , 3
   Lcd "Sparmodus:"
   Locate 2 , 12
   Lcd Sparmodus
   Locate 3 , 3
   Lcd "Km. speichern"
   Locate 4 , 3
   Lcd "Zurück"

   'Abfrage Taster
   If T_auf = 0 Then
      Decr Auswahl
      Cls
   End If
   If T_ab = 0 Then
      Incr Auswahl
      Cls
   End If

   If Auswahl = 4 Then Auswahl = 0
      If Auswahl = 0 Then
         Locate 1 , 1
         Lcd "+"
            If T_enter = 0 Then
               Kmtag = 0
               Cls
            End If
      Elseif Auswahl = 1 Then
         Locate 2 , 1
         Lcd "+"
            If T_enter = 0 Then
               If Sparmodus = 0 Then Sparmodus = 1 Else Sparmodus = 0
               Cls
            End If
      Elseif Auswahl = 2 Then
         Locate 3 , 1
         Lcd "+"
            If T_enter = 0 Then
               Gosub Power_fail
               Cls
            End If
      Elseif Auswahl = 3 Then
         Locate 4 , 1
         Lcd "+"
            If T_enter = 0 Then
               Ausgabemaske = 1
               Cls
            End If
      End If


Return


Maske3:

   'Ausgabe Einstellungen2
   Locate 1 , 3
   Lcd "u="
   Locate 1 , 5
   Lcd Radumfang_ausgabe ; "m"
   Locate 2 , 3
   Lcd "Reserviert"
   Locate 2 , 12
   Lcd Sparmodus
   Locate 3 , 3
   Lcd "Reserviert"
   Locate 4 , 3
   Lcd "Zurück"

   'Abfrage Taster
   If T_auf = 0 Then
      Decr Auswahl
      Cls
   End If
   If T_ab = 0 Then
      Incr Auswahl
      Cls
   End If

   If Auswahl = 4 Then Auswahl = 0
      If Auswahl = 0 Then
         Locate 1 , 1
         Lcd "+"
            If T_links = 0 Then Radumfang = Radumfang - 0.001
            If T_rechts = 0 Then Radumfang = Radumfang + 0.001
      Elseif Auswahl = 1 Then
         Locate 2 , 1
         Lcd "+"
            If T_enter = 0 Then Lcd "RESERVIERT"
      Elseif Auswahl = 2 Then
         Locate 3 , 1
         Lcd "+"
            If T_enter = 0 Then Lcd "RESERVIERT"
      Elseif Auswahl = 3 Then
         Locate 4 , 1
         Lcd "+"
            If T_enter = 0 Then
               Ausgabemaske = 1
               Cls
            End If
      End If

Return


Maske4:

   'Ausgabe Status
   Locate 1 , 1
   If Status = 0 Then Lcd "System OK" Else Lcd "Störung"
   Locate 2 , 1
   Lcd Status_nr
   Locate 3 , 3
   Lcd "Störung quit"
   Locate 4 , 3
   Lcd "Zurück"

   'Abfrage Taster
   If T_auf = 0 Then
      Decr Auswahl
      Cls
   End If
   If T_ab = 0 Then
      Incr Auswahl
      Cls
   End If

   If Auswahl = 3 Then Auswahl = 0
      If Auswahl = 0 Then
         Locate 3 , 1
         Lcd "+"
            If T_enter = 0 Then
               Ausgabemaske = 5
               Cls
            End If
      Elseif Auswahl = 1 Then
         Locate 4 , 1
         Lcd "+"
            If T_enter = 0 Then
               Ausgabemaske = 1
               Cls
            End If
      End If

Return


Maske5:

   'Ausgabe Störungstexte
   Locate 1 , 1
   Lcd "Störungstexte"
   Locate 2 , 1
   Lcd "werden nicht"
   Locate 3 , 1
   Lcd "unterstützt!"
   Locate 4 , 1
   Lcd "Warte auf v1.1"

   'Tasterabfrage
   If T_enter = 0 Then
      Waitms 20
         If T_enter = 0 Then
         Ausgabemaske = 4
         Status = 0
         Status_nr = 0
         Cls
      End If
   End If

Return


End
In der Interruptroutine "Int0_isr" werden erst einmal die Daten an Variablen übergeben, dann wird "Stat_timer0" getoggelt. Die anschließende Abfrage startet oder stoppt Timer0. Genau hier habe ich meine Zweifel. Wird der Timer wirklich gestartet/gestoppt?.

Danke für die Hilfe
Thomas