Archiv verlassen und diese Seite im Standarddesign anzeigen : Programm und Timer vertragen sich nicht
Hallo Bascom-Fans,
ich hätte da mal 'ne Frage. Ich bin noch etwas neu in der Branche und habe nun endlcih mal ein etwas umfangreiches Programm zum laufen gebracht. Nun sollte zum Schluss nur noch eine Blinkfunktion eingebaut werden. Dazu habe ich einen Timer aktiviert nach dem Vorbild wie es in jedem Toutorial angezeigt ist.
Config Timer1 = Timer , Prescale = 8
Enable Timer1
On Timer1 Timer1_isr
Enable Interrupts
Const Timer1startwert = 49911
Timer1 = Timer1startwert
Programm...
Timer1_isr:
Timer1 = Timer1startwert
Toggle Leds_reset
Return
Probehalber habe ich hier erst einmal einen Ausgang mit LED blinken lassen. Das funktioniert auch gut. Doch leider sind keine Taster mehr bedienbar und das Programm rührt sich nicht mehr. Wenn ich "Enable Interrupts" herauskommentiere geht alles ganz normal.
Ich habe keine Ahnung wo der Fehler liegen könnte und bitte mal um Hilfe.
Sauerbruch
11.09.2013, 20:58
Moin Behri!
Dazu müssten wir mal wissen was die Taster mit dem Controller überhaupt machen, was es für ein Controller ist, etc., etc. Am besten postest Du mal den ganzen (!) Code, dann lässt sich der Fehler schon viel einfacher finden als wenn wir die berühmte Glaskugel verwenden müssen :-)
Und wenn Du vor den Code das Steuerzeichen CODE in eckigen Klammern schreibst, und nach dem Code [/CODE], wird das Programm auch viel besser lesbar, weil man es rauf- und runterscrollen kann!
Danke dass Ihr Euch der Sache annehmt. 
Das ganze soll eine Spielsstandsanzeige für Tischtennis sein.
Es ist ein ATMega8.Takterzeugung intern. Programmiert habe ich über die SPI-Schnittstelle. An ihr befindet sich auch ein Portexpander mit 74HC595 für die 7-Segmentanzeigen. Die LEDs befinden sich in den Tastern und sollen signalisieren welche Taster gerade zu bedienen sind. es funktioniert alles sehr gut und es soll nur das blinken mit "waitms" durch einen Timer ersetzt werden.  Die Leds_reset blinken zu lassen ist nur der Versuch den Timer generell zu testen. Ich will später stattdessen eine bit-Variable toggeln und die im Code verarbeiten. 
'
'$sim
$regfile = "m8def.dat"
$crystal = 1000000
Config Timer1 = Timer , Prescale = 8
Enable Timer1
On Timer1 Timer1_isr
Enable Interrupts
Const Timer1startwert = 49911
Timer1 = Timer1startwert
Config Portc.0 = Output
Config Portc.1 = Output
Config Portc.2 = Output
Config Portc.3 = Output
Config Portc.4 = Output
Config Pinb.0 = Input
Config Pinb.1 = Input
Portb.0 = 1
Portb.1 = 1
Ddrd = &B00000011
Portd = &B11111100
Ddrc = &B00011111
Leds_zaehlen Alias Portc.0
Led_rueckwaerts Alias Portc.1
Leds_wahl Alias Portc.2
Led_weiter Alias Portc.3
Leds_reset Alias Portc.4
Poti Alias Portc.5
Ta_reset Alias Pind.2
Ta_weiter Alias Pind.3
Ta_wahl_gs Alias Pind.4
Ta_wahl_seite_aufschl Alias Pind.5
Ta_wahl_seite_gast Alias Pind.6
Ta_rueckwaerts Alias Pind.7
Ta_baelle_li Alias Pinb.0
Ta_baelle_re Alias Pinb.1
Dim Var_hauptschleife As Byte
Const Const_anz_start = 0
Const Const_anz_wahl = 1
Const Const_anz_00 = 2
Const Const_anz_01 = 3
Const Const_anz_satzende = 4
Const Const_anz_satzpause = 5
Const Const_anz_seitenwechsel = 6
Const Const_anz_spielende_1 = 7
Const Const_anz_spielende_2 = 8
Const Ein = 1
Const Aus = 0
Const Ja = 1
Const Nein = 0
Dim Var_ausgabearray(8) As Byte
Dim Flag_aufschlagseite_gewaehlt As Bit
Dim Flag_gast_gewaehlt As Bit
Dim Flag_ende As Bit
Dim Flag_heim_gewaehlt As Bit
Dim Var_anzahl_der_gewinnsaetze As Byte
    Var_anzahl_der_gewinnsaetze = 3
Dim Flag_satzende As Bit
Dim Flag_spielende As Bit
Dim Flag_gh As Bit
Dim Flag_hg As Bit
Dim Flag_gh_start As Bit
Dim Flag_hg_start As Bit
Dim Flag_aufschlag As Bit
Dim Flag_aufschlag_li As Bit
Dim Flag_aufschlag_re As Bit
Dim Var_baelle_li As Byte
Dim Var_baelle_re As Byte
Dim Var_saetze_li As Byte
Dim Var_saetze_li_2 As Byte                                 'nur für spielendeprüfung
Dim Var_saetze_re As Byte
Dim Var_saetze_re_2 As Byte                                 'nur für spielendeprüfung
'Dim Var_ziffer_baelle_li As Word                            'At Var_baelle_li_ziffer Overlay
'Dim Var_ziffer_baelle_re As Word                            'At Var_baelle_re_ziffer Overlay
Dim Var_baelle_li_ziffer_e As Byte                          'At Var_ziffer_baelle_li Overlay
Dim Var_baelle_li_ziffer_z As Byte                          'At Var_ziffer_baelle_li + 1 Overlay
Dim Var_baelle_re_ziffer_e As Byte                          'At Var_ziffer_baelle_re Overlay
Dim Var_baelle_re_ziffer_z As Byte                          'At Var_ziffer_baelle_re + 1 Overlay
Dim Var_saetze_li_ziffer As Byte
Dim Var_saetze_re_ziffer As Byte
Dim Var_einer_baelle_li As Byte
Dim Var_zehner_baelle_li As Byte
Dim Var_einer_baelle_re As Byte
Dim Var_zehner_baelle_re As Byte
Dim Var_ziffernwahl As Byte
Dim Var_ziffernwahl_baelle_li As Byte
Dim Var_ziffernwahl_baelle_re As Byte
Dim Var_ziffer As Byte
Dim Var_betaetigt_gh As Bit
Dim Var_betaetigt_aufschlagwahl As Bit
Dim Var_alles_gewaehlt__weiter_moegl As Byte
Dim Var_summe_baelle As Byte
Dim Var_differenz_baelle As Integer
Dim Var_summe_gs As Byte
Dim Flag_seitenwechsel_erfolgt As Bit
Dim Var_seite_im_spiel_vor_sw_ent As Byte
Dim Var_seite_im_spiel_nach_sw_ent As Byte
Dim Flag_aufschlag_2 As Byte
Dim Flag_rw_gezaehlt As Bit
Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim D As Byte
Dim E As Word
Dim F As Byte
Dim G As Byte
Dim H As Byte
Declare Sub Sub_ausgabe_anzeige                             'gibt die aktuellen Bytes aus ohne sie zu verändern
Declare Sub Sub_ausgabe_anzeige_00
Declare Sub Sub_ausgabe_anzeige_satzpause
Declare Sub Sub_schleife_anz_start
Declare Sub Sub_schleife_anz_wahl
Declare Sub Sub_schleife_anz_00
Declare Sub Sub_schleife_anz_satzende
Declare Sub Sub_schleife_anz_satzpause
Declare Sub Sub_schleife_anz_spielende
Declare Sub Sub_gewinnsaetze_festlegen
Declare Sub Sub_seitenwahl_1
Declare Sub Sub_seitenwahl_2
Declare Sub Sub_aufschlagwahl_1
Declare Sub Sub_aufschlagwahl_2
Declare Sub Sub_zaehlen_li
Declare Sub Sub_zaehlen_re
Declare Sub Sub_ziffernwahl
Declare Sub Sub_ziffernwahl_baelle_li
Declare Sub Sub_ziffernwahl_baelle_re
Declare Sub Sub_rechnung_aufschlag
Declare Sub Sub_seitenwechsel_satzende
Declare Sub Sub_seitenwechsel_entscheid_1
Declare Sub Sub_seitenwechsel_entscheid_2
Declare Sub Sub_seitenwechsel_entscheid_3
Declare Sub Sub_saetze_hochzaehlen
Declare Sub Sub_saetze_hochzaehlen_2
Config Spi = Hard , Interrupt = On , Data Order = Lsb , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 4
Spiinit
Config Debounce = 50
      Hauptschleife:
         Do
            Select Case Var_hauptschleife 
            Case Const_anz_start : Goto Schleife_anz_start 
            Case Const_anz_wahl : Goto Schleife_anz_wahl 
            Case Const_anz_00 : Goto Schleife_anz_00
            Case Const_anz_satzende : Goto Schleife_anz_satzende 
            Case Const_anz_satzpause : Goto Schleife_anz_satzpause 
            Case Const_anz_spielende_1 : Goto Schleife_anz_spielende_1
            Case Const_anz_spielende_2 : Goto Schleife_anz_spielende_2 
            End Select
         Loop
Schleife_anz_start:
Do
      Var_ausgabearray(1) = 0                               'ev.LED's Tablau      -gfedcba
      Var_ausgabearray(2) = 0                               'rechts Sätze
      Var_ausgabearray(3) = 0                               'Bälle rechts Einer
      Var_ausgabearray(4) = 0                               'Bälle rechts Zehner
      Var_ausgabearray(5) = 0                               'G/H + Satzende + Aufschlaganzeige
      Var_ausgabearray(6) = 0                               'Bälle links Einer
      Var_ausgabearray(7) = 0                               'Bälle links Zehner
      Var_ausgabearray(8) = 0                               'links Sätze
      Leds_zaehlen = 0                                      'Tableau Bedienung
      Led_rueckwaerts = 0                                   'Tableau Bedienung
      Leds_wahl = 0                                         'Tableau Bedienung
      Led_weiter = 1                                        'Tableau Bedienung
      Leds_reset = 0                                        'Tableau Bedienung
   Gosub Sub_ausgabe_anzeige
   Debounce Ta_weiter , 0 , Sub_schleife_anz_wahl , Sub
   Goto Hauptschleife
Loop
Schleife_anz_wahl:
Do
      Var_ausgabearray(1) = 0                               'ev.LED's Tablau      -gfedcba
      Var_ausgabearray(2) = 0                               'rechts Sätze
      Var_ziffernwahl = Var_anzahl_der_gewinnsaetze
      Gosub Sub_ziffernwahl
      Var_ausgabearray(3) = Var_ziffer                      'Bälle rechts Einer
      Var_ausgabearray(4) = 0                               'Bälle rechts Zehner
      Var_ausgabearray(5) = &B00000000                      '0=heim.1=gast/.2=AUF-re/.3=Ende/.4=AUF-li .
         Var_ausgabearray(5).0 = Flag_gh                    'Flag_gh
         Var_ausgabearray(5).1 = Flag_hg                    'Flag_hg
         Var_ausgabearray(5).2 = Flag_aufschlag_li
         Var_ausgabearray(5).3 = Flag_ende
         Var_ausgabearray(5).4 = Flag_aufschlag_re
      Var_ausgabearray(6) = &B01101101                      'Bälle links Einer
      Var_ausgabearray(7) = &B00111101                      'Bälle links Zehner
      Var_ausgabearray(8) = 0                               'links Sätze
      Leds_zaehlen = 0                                      'Tableau Bedienung
      Led_rueckwaerts = 1                                   'Tableau Bedienung
      Leds_wahl = 1                                         'Tableau Bedienung
      Led_weiter = 0                                        'Tableau Bedienung
      Leds_reset = 0                                        'Tableau Bedienung
   Gosub Sub_ausgabe_anzeige
   If Var_alles_gewaehlt__weiter_moegl = 2 Then
   Led_weiter = 1
Debounce Ta_weiter , 0 , Sub_schleife_anz_satzpause , Sub
   End If
Debounce Ta_wahl_gs , 0 , Sub_gewinnsaetze_festlegen , Sub
   If Var_betaetigt_gh = 0 Then
Debounce Ta_wahl_seite_gast , 0 , Sub_seitenwahl_1 , Sub
   Else
Debounce Ta_wahl_seite_gast , 0 , Sub_seitenwahl_2 , Sub
   End If
      If Var_betaetigt_aufschlagwahl = 0 Then
Debounce Ta_wahl_seite_aufschl , 0 , Sub_aufschlagwahl_1 , Sub
   Else
Debounce Ta_wahl_seite_aufschl , 0 , Sub_aufschlagwahl_2 , Sub
   End If
   Goto Hauptschleife
Loop
Schleife_anz_00:
Do
Flag_satzende = 0
Flag_ende = 0
Debounce Ta_baelle_li , 0 , Sub_zaehlen_li , Sub
Debounce Ta_baelle_re , 0 , Sub_zaehlen_re , Sub
Gosub Sub_rechnung_aufschlag
Gosub Sub_ausgabe_anzeige_00
      Leds_zaehlen = 1                                      'Tableau Bedienung
      Led_rueckwaerts = 0                                   'Tableau Bedienung
      Leds_wahl = 0                                         'Tableau Bedienung
      Led_weiter = 0                                        'Tableau Bedienung
      Leds_reset = 0                                        'Tableau Bedienung
Pruefung_sw_vorwaerts:
A = Var_saetze_li + 1
B = Var_saetze_re + 1
If A < Var_anzahl_der_gewinnsaetze Then
Goto Kein_seitenwechsel
      Else
      If B < Var_anzahl_der_gewinnsaetze Then
      Goto Kein_seitenwechsel
            Else
            If Flag_seitenwechsel_erfolgt = 1 Then
            Goto Kein_seitenwechsel
                     Else
                     If Var_baelle_li = 5 Then
                           Zurueck1:
                           Leds_zaehlen = 0                 'Tableau Bedienung
                           Led_rueckwaerts = 0              'Tableau Bedienung
                           Leds_wahl = 0                    'Tableau Bedienung
                           Led_weiter = 1                   'Tableau Bedienung
                           Leds_reset = 0                   'Tableau Bedienung
                           Debounce Ta_weiter , 0 , Sub_seitenwechsel_entscheid_1 , Sub
                           Var_ausgabearray(6) = 0          'Blinken der"5"
                           Gosub Sub_ausgabe_anzeige        '
                           Waitms 30                        '
                           Var_ziffernwahl = Var_baelle_li  '
                           Gosub Sub_ziffernwahl_baelle_li  '
                           Gosub Sub_ausgabe_anzeige_00     '
                           Waitms 30                        '
                           Select Case C
                           Case 1 :
                           Flag_seitenwechsel_erfolgt = 1
                           Sub_seitenwechsel_entscheid_2
                           Case 0 : Goto Zurueck1
                           End Select
                           C = 0
                           Leds_zaehlen = 1                 'Tableau Bedienung
                           Led_rueckwaerts = 0              'Tableau Bedienung
                           Leds_wahl = 0                    'Tableau Bedienung
                           Led_weiter = 0                   'Tableau Bedienung
                           Leds_reset = 0                   'Tableau Bedienung
                        Else
                        If Var_baelle_re = 5 Then
                           Zurueck2:
                           Leds_zaehlen = 0                 'Tableau Bedienung
                           Led_rueckwaerts = 0              'Tableau Bedienung
                           Leds_wahl = 0                    'Tableau Bedienung
                           Led_weiter = 1                   'Tableau Bedienung
                           Leds_reset = 0                   'Tableau Bedienung
                           Debounce Ta_weiter , 0 , Sub_seitenwechsel_entscheid_1 , Sub
                           Var_ausgabearray(4) = 0          'Blinken der"5"
                           Gosub Sub_ausgabe_anzeige        '
                           Waitms 30                        '
                           Var_ziffernwahl = Var_baelle_re  '
                           Gosub Sub_ziffernwahl_baelle_re  '
                           Gosub Sub_ausgabe_anzeige_00     '
                           Waitms 30
                           Select Case C
                           Case 1 :
                           Flag_seitenwechsel_erfolgt = 1
                           Sub_seitenwechsel_entscheid_2
                           Case 0 : Goto Zurueck2
                           End Select
                           C = 0
                           Leds_zaehlen = 1                 'Tableau Bedienung
                           Led_rueckwaerts = 0              'Tableau Bedienung
                           Leds_wahl = 0                    'Tableau Bedienung
                           Led_weiter = 0                   'Tableau Bedienung
                           Leds_reset = 0                   'Tableau Bedienung
                        End If
                     End If
            End If
      End If
End If
A = 0
B = 0
Kein_seitenwechsel:
'Sub_satzendepruefung
Var_differenz_baelle = Var_baelle_li - Var_baelle_re
If Var_baelle_li > 10 Then
   Goto Differenztest
End If
If Var_baelle_re > 10 Then
   Goto Differenztest
      Else
      Goto Kein_satzende
End If
Differenztest:
If Var_differenz_baelle > 1 Then
   Flag_satzende = 1
   Var_hauptschleife = Const_anz_satzende
   Gosub Sub_saetze_hochzaehlen_2
         Else
            If Var_differenz_baelle < -1 Then
            Flag_satzende = 1
            Var_hauptschleife = Const_anz_satzende
            Gosub Sub_saetze_hochzaehlen_2
        Else
        Goto Kein_satzende
   End If
End If
Kein_satzende:
'spielendepruefung:
If Var_anzahl_der_gewinnsaetze = Var_saetze_li_2 Then
   Var_hauptschleife = Const_anz_spielende_1
   Flag_spielende = 1
End If
         If Var_anzahl_der_gewinnsaetze = Var_saetze_re_2 Then
         Var_hauptschleife = Const_anz_spielende_1
         Flag_spielende = 1
         End If
'Gosub Sub_satzendepruefung
'Gosub Sub_spielendepruefung
Flag_ende = Flag_satzende
Goto Hauptschleife
Loop
Schleife_anz_satzende:
Do
   Flag_ende = 1
   Flag_aufschlag_li = 0
   Flag_aufschlag_re = 0
      Leds_zaehlen = 0                                      'Tableau Bedienung
      Led_rueckwaerts = 0                                   'Tableau Bedienung
      Leds_wahl = 0                                         'Tableau Bedienung
      Led_weiter = 1                                        'Tableau Bedienung
      Leds_reset = 0                                        'Tableau Bedienung
   Gosub Sub_ausgabe_anzeige_00
   If Flag_spielende = 1 Then
      Debounce Ta_weiter , 0 , Sub_schleife_anz_spielende_1 , Sub
         Else
         Debounce Ta_weiter , 0 , Sub_seitenwechsel_satzende , Sub
   End If
   Goto Hauptschleife
Loop
Schleife_anz_satzpause:
Do
Gosub Sub_ausgabe_anzeige_satzpause
      Leds_zaehlen = 0                                      'Tableau Bedienung
      Led_rueckwaerts = 0                                   'Tableau Bedienung
      Leds_wahl = 0                                         'Tableau Bedienung
      Led_weiter = 1                                        'Tableau Bedienung
      Leds_reset = 0                                        'Tableau Bedienung
Debounce Ta_weiter , 0 , Sub_schleife_anz_00 , Sub
Goto Hauptschleife
Loop
Schleife_anz_spielende_1:
Do
   Flag_ende = 1
   Flag_aufschlag_li = 0
   Flag_aufschlag_re = 0
      Leds_zaehlen = 0                                      'Tableau Bedienung
      Led_rueckwaerts = 0                                   'Tableau Bedienung
      Leds_wahl = 0                                         'Tableau Bedienung
      Led_weiter = 1                                        'Tableau Bedienung
      Leds_reset = 0                                        'Tableau Bedienung
   Gosub Sub_ausgabe_anzeige_00
Debounce Ta_weiter , 0 , Sub_schleife_anz_spielende_2 , Sub
'Goto Hauptschleife
If Var_hauptschleife = Const_anz_spielende_2 Then
Goto Schleife_anz_spielende_2
End If
Loop
Schleife_anz_spielende_2:
Gosub Sub_saetze_hochzaehlen
Do
Gosub Sub_ausgabe_anzeige_satzpause
                           Leds_zaehlen = 0                 'Tableau Bedienung
                           Led_rueckwaerts = 0              'Tableau Bedienung
                           Leds_wahl = 0                    'Tableau Bedienung
                           Led_weiter = 0                   'Tableau Bedienung
                           Leds_reset = 1                   'Tableau Bedienung
'Debounce Ta_weiter , 0 , Sub_reset , Sub
If Var_hauptschleife = Const_anz_start Then
Goto Hauptschleife
End If
Loop
End
'_________________________________________________ __________________________________________________ __________________
Sub_ausgabe_anzeige:
   Spiout Var_ausgabearray(1) , 8
Return
'_________________________________________________ ______________________________
Sub_ausgabe_anzeige_satzpause:
   Var_ziffernwahl = Var_baelle_li
   Gosub Sub_ziffernwahl_baelle_li
   Var_ziffernwahl = Var_baelle_re
   Gosub Sub_ziffernwahl_baelle_re
   Var_ziffernwahl = Var_saetze_li
   Gosub Sub_ziffernwahl
   Var_saetze_li_ziffer = Var_ziffer
   Var_ziffernwahl = Var_saetze_re
   Gosub Sub_ziffernwahl
   Var_saetze_re_ziffer = Var_ziffer
   Flag_ende = 1
      Var_ausgabearray(1) = 0                               'ev.LED's  -gfedcba
      Var_ausgabearray(2) = Var_saetze_re_ziffer            'rechts Sätze
      Var_ausgabearray(3) = 0                               'Bälle rechts Einer
      Var_ausgabearray(4) = 0                               'Bälle rechts Zehner
      Var_ausgabearray(5) = 0                               '0=heim.1=gast/.2=AUF-re/.3=Ende/.4=AUF-li)
         Var_ausgabearray(5).0 = Flag_gh                    'Flag_gh
         Var_ausgabearray(5).1 = Flag_hg                    'Flag_hg
         Var_ausgabearray(5).2 = 0
         Var_ausgabearray(5).3 = Flag_ende
         Var_ausgabearray(5).4 = 0
      Var_ausgabearray(6) = 0                               'Bälle links Einer
      Var_ausgabearray(7) = 0                               'Bälle links Zehner
      Var_ausgabearray(8) = Var_saetze_li_ziffer            'links Sätze
   Spiout Var_ausgabearray(1) , 8
Return
Sub_ausgabe_anzeige_00:
   Var_ziffernwahl = Var_baelle_li
   Gosub Sub_ziffernwahl_baelle_li
   Var_ziffernwahl = Var_baelle_re
   Gosub Sub_ziffernwahl_baelle_re
   Var_ziffernwahl = Var_saetze_li
   Gosub Sub_ziffernwahl
   Var_saetze_li_ziffer = Var_ziffer
   Var_ziffernwahl = Var_saetze_re
   Gosub Sub_ziffernwahl
   Var_saetze_re_ziffer = Var_ziffer
      Var_ausgabearray(1) = 0                               'ev.LED's  -gfedcba
      Var_ausgabearray(2) = Var_saetze_re_ziffer            'rechts Sätze
      Var_ausgabearray(3) = Var_einer_baelle_re             'Bälle rechts Einer
      Var_ausgabearray(4) = Var_zehner_baelle_re            'Bälle rechts Zehner
      Var_ausgabearray(5) = 0                               '0=heim.1=gast/.2=AUF-re/.3=Ende/.4=AUF-li)
         Var_ausgabearray(5).0 = Flag_gh                    'Flag_gh
         Var_ausgabearray(5).1 = Flag_hg                    'Flag_hg
         Var_ausgabearray(5).2 = Flag_aufschlag_li
         Var_ausgabearray(5).3 = Flag_ende
         Var_ausgabearray(5).4 = Flag_aufschlag_re
      Var_ausgabearray(6) = Var_einer_baelle_li             'Bälle links Einer
      Var_ausgabearray(7) = Var_zehner_baelle_li            'Bälle links Zehner
      Var_ausgabearray(8) = Var_saetze_li_ziffer            'links Sätze
   Spiout Var_ausgabearray(1) , 8
Return
'Subs für den Taster "Weiter"__________________
Sub_schleife_anz_start:
   Var_hauptschleife = Const_anz_start
Return
Sub_schleife_anz_wahl:
   Var_hauptschleife = Const_anz_wahl
Return
Sub_schleife_anz_00:
   Var_hauptschleife = Const_anz_00
Return
Sub_schleife_anz_01:
   Var_hauptschleife = Const_anz_01
Return
Sub_schleife_anz_satzende:
   Var_hauptschleife = Const_anz_satzende
Return
Sub_schleife_anz_satzpause:
   Var_hauptschleife = Const_anz_satzpause
Return
Sub_schleife_anz_seitenwechsel:
   Var_hauptschleife = Const_anz_seitenwechsel
Return
Sub_schleife_anz_spielende_1:
   Var_hauptschleife = Const_anz_spielende_1
Return
Sub_schleife_anz_spielende_2:
   Var_hauptschleife = Const_anz_spielende_2
Return
'Subs "Wahl"______________
Sub_gewinnsaetze_festlegen:
   If Ta_rueckwaerts = 0 Then
      If Var_anzahl_der_gewinnsaetze > 1 Then
      Var_anzahl_der_gewinnsaetze = Var_anzahl_der_gewinnsaetze - 1
      End If
   End If
   If Ta_rueckwaerts = 1 Then
      If Var_anzahl_der_gewinnsaetze < 9 Then
      Var_anzahl_der_gewinnsaetze = Var_anzahl_der_gewinnsaetze + 1
      End If
   End If
Return
Sub_seitenwahl_1:                                           'wenn die Seitenwahl noch nicht betätigt wurde
   Var_betaetigt_gh = 1
   'Flag_gh_start = 1
   Var_summe_gs = Var_saetze_li + Var_saetze_re
   Flag_gh = Var_summe_gs.0
   Flag_hg = Not Flag_gh
Var_alles_gewaehlt__weiter_moegl = Var_betaetigt_gh + Var_betaetigt_aufschlagwahl
Return
Sub_seitenwahl_2:                                           'wenn die Seitenwahl schon einmal erfolgt ist
   Var_betaetigt_gh = 1
   Var_alles_gewaehlt__weiter_moegl = Var_betaetigt_gh + Var_betaetigt_aufschlagwahl
   Toggle Flag_gh_start
   'Toggle Flag_hg_start
   Var_summe_gs = Var_saetze_li + Var_saetze_re
   Var_seite_im_spiel_vor_sw_ent = Var_summe_gs + Flag_gh_start
   Var_seite_im_spiel_nach_sw_ent = Var_seite_im_spiel_vor_sw_ent + Flag_seitenwechsel_erfolgt
   Flag_gh = Var_seite_im_spiel_nach_sw_ent.0
   Flag_hg = Not Flag_gh
Return
Sub_aufschlagwahl_1:
   Var_betaetigt_aufschlagwahl = 1
   Flag_aufschlag = 1
   Flag_aufschlag_li = Flag_aufschlag
   Var_alles_gewaehlt__weiter_moegl = Var_betaetigt_gh + Var_betaetigt_aufschlagwahl
Return
Sub_aufschlagwahl_2:
   Var_betaetigt_aufschlagwahl = 1
   Var_alles_gewaehlt__weiter_moegl = Var_betaetigt_gh + Var_betaetigt_aufschlagwahl
   Toggle Flag_aufschlag
   Flag_aufschlag_li = Flag_aufschlag
   Flag_aufschlag_re = Not Flag_aufschlag_li
   'Toggle Flag_aufschlag_re
Return
Sub_ziffernwahl:
Select Case Var_ziffernwahl
   Case 0 : Var_ziffer = &B00111111
   Case 1 : Var_ziffer = &B00000110
   Case 2 : Var_ziffer = &B01011011
   Case 3 : Var_ziffer = &B01001111
   Case 4 : Var_ziffer = &B01100110
   Case 5 : Var_ziffer = &B01101101
   Case 6 : Var_ziffer = &B01111101
   Case 7 : Var_ziffer = &B00000111
   Case 8 : Var_ziffer = &B01111111
   Case 9 : Var_ziffer = &B01101111
   Case Else : Var_ziffer = &B01000000
End Select
Return
Sub_ziffernwahl_baelle_li:
Var_einer_baelle_li = Var_ziffernwahl Mod 10
Var_ziffernwahl = Var_ziffernwahl - Var_einer_baelle_li
Var_ziffernwahl = Var_ziffernwahl / 10
Var_zehner_baelle_li = Var_ziffernwahl Mod 10
Var_ziffernwahl = Var_ziffernwahl - Var_zehner_baelle_li
Var_ziffernwahl = Var_ziffernwahl / 10
If Var_baelle_li < 10 Then
Select Case Var_einer_baelle_li
   Case 0 : Var_einer_baelle_li = &B00111111
   Case 1 : Var_einer_baelle_li = &B00000110
   Case 2 : Var_einer_baelle_li = &B01011011
   Case 3 : Var_einer_baelle_li = &B01001111
   Case 4 : Var_einer_baelle_li = &B01100110
   Case 5 : Var_einer_baelle_li = &B01101101
   Case 6 : Var_einer_baelle_li = &B01111101
   Case 7 : Var_einer_baelle_li = &B00000111
   Case 8 : Var_einer_baelle_li = &B01111111
   Case 9 : Var_einer_baelle_li = &B01101111
   Case Else : Var_einer_baelle_li = &B01000000
End Select
Var_zehner_baelle_li = 0
Else
Select Case Var_einer_baelle_li
   Case 0 : Var_einer_baelle_li = &B00111111
   Case 1 : Var_einer_baelle_li = &B00000110
   Case 2 : Var_einer_baelle_li = &B01011011
   Case 3 : Var_einer_baelle_li = &B01001111
   Case 4 : Var_einer_baelle_li = &B01100110
   Case 5 : Var_einer_baelle_li = &B01101101
   Case 6 : Var_einer_baelle_li = &B01111101
   Case 7 : Var_einer_baelle_li = &B00000111
   Case 8 : Var_einer_baelle_li = &B01111111
   Case 9 : Var_einer_baelle_li = &B01101111
   Case Else : Var_einer_baelle_li = &B01000000
End Select
Select Case Var_zehner_baelle_li
   Case 0 : Var_zehner_baelle_li = &B00111111
   Case 1 : Var_zehner_baelle_li = &B00000110
   Case 2 : Var_zehner_baelle_li = &B01011011
   Case 3 : Var_zehner_baelle_li = &B01001111
   Case 4 : Var_zehner_baelle_li = &B01100110
   Case 5 : Var_zehner_baelle_li = &B01101101
   Case 6 : Var_zehner_baelle_li = &B01111101
   Case 7 : Var_zehner_baelle_li = &B00000111
   Case 8 : Var_zehner_baelle_li = &B01111111
   Case 9 : Var_zehner_baelle_li = &B01101111
   Case Else : Var_zehner_baelle_li = &B01000000
End Select
End If
   Return
Sub_ziffernwahl_baelle_re:
Var_einer_baelle_re = Var_ziffernwahl Mod 10
Var_ziffernwahl = Var_ziffernwahl - Var_einer_baelle_re
Var_ziffernwahl = Var_ziffernwahl / 10
Var_zehner_baelle_re = Var_ziffernwahl Mod 10
Var_ziffernwahl = Var_ziffernwahl - Var_zehner_baelle_re
Var_ziffernwahl = Var_ziffernwahl / 10
If Var_baelle_re < 10 Then
Select Case Var_einer_baelle_re
   Case 0 : Var_zehner_baelle_re = &B00111111
   Case 1 : Var_zehner_baelle_re = &B00000110
   Case 2 : Var_zehner_baelle_re = &B01011011
   Case 3 : Var_zehner_baelle_re = &B01001111
   Case 4 : Var_zehner_baelle_re = &B01100110
   Case 5 : Var_zehner_baelle_re = &B01101101
   Case 6 : Var_zehner_baelle_re = &B01111101
   Case 7 : Var_zehner_baelle_re = &B00000111
   Case 8 : Var_zehner_baelle_re = &B01111111
   Case 9 : Var_zehner_baelle_re = &B01101111
   Case Else : Var_zehner_baelle_re = &B01000000
End Select
Var_einer_baelle_re = 0
Else
Select Case Var_einer_baelle_re
   Case 0 : Var_einer_baelle_re = &B00111111
   Case 1 : Var_einer_baelle_re = &B00000110
   Case 2 : Var_einer_baelle_re = &B01011011
   Case 3 : Var_einer_baelle_re = &B01001111
   Case 4 : Var_einer_baelle_re = &B01100110
   Case 5 : Var_einer_baelle_re = &B01101101
   Case 6 : Var_einer_baelle_re = &B01111101
   Case 7 : Var_einer_baelle_re = &B00000111
   Case 8 : Var_einer_baelle_re = &B01111111
   Case 9 : Var_einer_baelle_re = &B01101111
   Case Else : Var_einer_baelle_re = &B01000000
End Select
Select Case Var_zehner_baelle_re
   Case 0 : Var_zehner_baelle_re = &B00111111
   Case 1 : Var_zehner_baelle_re = &B00000110
   Case 2 : Var_zehner_baelle_re = &B01011011
   Case 3 : Var_zehner_baelle_re = &B01001111
   Case 4 : Var_zehner_baelle_re = &B01100110
   Case 5 : Var_zehner_baelle_re = &B01101101
   Case 6 : Var_zehner_baelle_re = &B01111101
   Case 7 : Var_zehner_baelle_re = &B00000111
   Case 8 : Var_zehner_baelle_re = &B01111111
   Case 9 : Var_zehner_baelle_re = &B01101111
   Case Else : Var_zehner_baelle_re = &B01000000
End Select
End If
Return
Sub_zaehlen_li:
   If Ta_rueckwaerts = 0 Then
      If Var_baelle_li > 0 Then
      Decr Var_baelle_li
      Flag_rw_gezaehlt = 1
   End If
   End If
   If Ta_rueckwaerts = 1 Then
      Incr Var_baelle_li
      Flag_rw_gezaehlt = 0
   End If
Return
Sub_zaehlen_re:
   If Ta_rueckwaerts = 0 Then
      If Var_baelle_re > 0 Then
      Decr Var_baelle_re
      Flag_rw_gezaehlt = 1
   End If
   End If
   If Ta_rueckwaerts = 1 Then
      Incr Var_baelle_re
      Flag_rw_gezaehlt = 0
   End If
Return
Sub_rechnung_aufschlag:
Var_summe_baelle = Var_baelle_li + Var_baelle_re
Flag_aufschlag_2 = Flag_aufschlag + Flag_seitenwechsel_erfolgt
If Var_summe_baelle > 19 Then
   Goto Satzverlaengerung
   Else
      If Flag_aufschlag_2.0 = 0 Then
      Flag_aufschlag_li = Var_summe_baelle.1
      Flag_aufschlag_re = Not Flag_aufschlag_li
      Goto Ende_aufschlagrechnung
   Else
      If Flag_aufschlag_2.0 = 1 Then
      Flag_aufschlag_re = Var_summe_baelle.1
      Flag_aufschlag_li = Not Flag_aufschlag_re
      Goto Ende_aufschlagrechnung
   End If
   End If
End If
Satzverlaengerung:
   If Flag_aufschlag_2.0 = 0 Then
      Flag_aufschlag_li = Var_summe_baelle.0
      Flag_aufschlag_re = Not Flag_aufschlag_li
   End If
   If Flag_aufschlag_2.0 = 1 Then
      Flag_aufschlag_re = Var_summe_baelle.0
      Flag_aufschlag_li = Not Flag_aufschlag_re
   End If
Ende_aufschlagrechnung:
Return
Sub_seitenwechsel_satzende:
'If Var_baelle_li > Var_baelle_re Then
'Incr Var_saetze_li
'End If
'If Var_baelle_re > Var_baelle_li Then
'Incr Var_saetze_re
'End If
'Return
Gosub Sub_saetze_hochzaehlen
A = Var_saetze_li                                           'Sätze Tauschen
B = Var_saetze_re
Var_saetze_li = B
Var_saetze_re = A
A = 0
B = 0
A = Var_saetze_li_2                                         'Sätze Tauschen_2
B = Var_saetze_re_2
Var_saetze_li_2 = B
Var_saetze_re_2 = A
A = 0
B = 0
'Toggle Flag_gh                                              'Heim/Gast tauschen
'Toggle Flag_hg
   Var_summe_gs = Var_saetze_li + Var_saetze_re
   Var_seite_im_spiel_vor_sw_ent = Var_summe_gs + Flag_gh_start
   Var_seite_im_spiel_nach_sw_ent = Var_seite_im_spiel_vor_sw_ent + Flag_seitenwechsel_erfolgt
   Flag_gh = Var_seite_im_spiel_nach_sw_ent.0
   Flag_hg = Not Flag_gh
Var_baelle_li = 0
Var_baelle_re = 0
Var_hauptschleife = Const_anz_satzpause
Return
Sub_saetze_hochzaehlen:
If Var_baelle_li > Var_baelle_re Then                       'Sätze weiterzählen
Incr Var_saetze_li
End If
If Var_baelle_re > Var_baelle_li Then
Incr Var_saetze_re
End If
Return
Sub_saetze_hochzaehlen_2:
If Var_baelle_li > Var_baelle_re Then                       'Sätze weiterzählen
Incr Var_saetze_li_2
End If
If Var_baelle_re > Var_baelle_li Then
Incr Var_saetze_re_2
End If
Return
Sub_seitenwechsel_entscheid_1:
C = 1
Return
Sub_seitenwechsel_entscheid_2:
   'Flag_seitenwechsel_erfolgt = 1
   Var_summe_gs = Var_saetze_li + Var_saetze_re
   Var_seite_im_spiel_vor_sw_ent = Var_summe_gs + Flag_gh_start
   Var_seite_im_spiel_nach_sw_ent = Var_seite_im_spiel_vor_sw_ent + Flag_seitenwechsel_erfolgt
   Flag_gh = Var_seite_im_spiel_nach_sw_ent.0
   Flag_hg = Not Flag_gh
   A = Var_baelle_li                                        'Bälle Tauschen
   B = Var_baelle_re
   Var_baelle_li = B
   Var_baelle_re = A
   A = 0
   B = 0
Return
Sub_seitenwechsel_entscheid_3:
   'Flag_seitenwechsel_erfolgt = 1
   Var_summe_gs = Var_saetze_li + Var_saetze_re
   Var_seite_im_spiel_vor_sw_ent = Var_summe_gs + Flag_gh_start
   Var_seite_im_spiel_nach_sw_ent = Var_seite_im_spiel_vor_sw_ent - Flag_seitenwechsel_erfolgt
   Flag_gh = Var_seite_im_spiel_nach_sw_ent.0
   Flag_hg = Not Flag_gh
   A = Var_baelle_li                                        'Bälle Tauschen
   B = Var_baelle_re
   Var_baelle_li = B
   Var_baelle_re = A
   A = 0
   B = 0
Return
Timer1_isr:
'nop
Timer1 = Timer1startwert
Toggle Leds_reset
Return
Sauerbruch
12.09.2013, 09:34
O-kay - durch DIESEN Code werde ich so schnell nicht durchsteigen....   :shock:
Macht aber fast nix. Du beschreibst ja zwei Dinge: Erstens steht und fällt das Problem mit dem Freigeben der Interrupts, und zweitens führt das Problem dazu, dass der Controller "stehenbleibt". Das ganze klingt ein bisschen nach einem Stack-Overflow, d.h. der Speicherbereich, in dem alle möglichen Register bei Interrupts, Subs und ähnlichem abgelegt werden, reicht nicht aus. Ist das der Fall, hängt sich der Controller auf.
Um zu verifizieren ob es tatsächlich der Timer1-Interrupt ist, könntest Du ja mal das Enable Interrupts stehen lassen, und stattdessen "Enable Timer1" aus dem Code löschen. Wenn der Fehler sich dann genauso verhält, kann es eigentlich nur mit dem Timer1-Interrupt zu tun haben.
Du könntest dann mal versuchen, den Hardware- und Software-Stack zu vergrößern. Wenn nichts anderes definiert wird, legt Bascom sie beim Mega8 m.W. mit je 32 Bytes an. Probier doch mal z.B. 40:
$hwstack = 40
$swstack = 40
o-kay - durch diesen code werde ich so schnell nicht durchsteigen....   :shock:
hatte ich schon fast geahnt. Deshalb war auch der code nicht im ersten beitrag. Ich will von niemandem verlangen, sich den code zu verinnerlichen. Ich musste auch ein paar kommentare löschen, damit es in den beitrag passt. Ich bin guter dinge, dass wir weiterhin nach dem ausschlussverfahren der sache auf dem grund kommen.
Um zu verifizieren ob es tatsächlich der timer1-interrupt ist, könntest du ja mal das enable interrupts stehen lassen, und stattdessen "enable timer1" aus dem code löschen. Wenn der fehler sich dann genauso verhält, kann es eigentlich nur mit dem timer1-interrupt zu tun haben.
das hatte keinen Erfolg
Du könntest dann mal versuchen, den hardware- und software-stack zu vergrößern. Wenn nichts anderes definiert wird, legt bascom sie beim mega8 m.w. Mit je 32 bytes an. Probier doch mal z.b. 40:
$hwstack = 40
$swstack = 40
Ich hab's auch noch mal verdoppelt (ob auch immer das Sinn macht) es tat sich nichts.
Ich hatte auch mal statt Timer1 den Timer0 verwendet. es war das gleiche Spiel.
Es scheint als ob es etwas mit den Interrupts zu tun hat. Wenn ich nur die Interrups einschalte um sie im Timer zu verwenden muss ich doch nicht die Interrupts ausschalten die sonst durch PINs ausgelöst werden, oder? Es ist doch auch egal, ob solche PINs Ein- oder Ausgänge sind, oder?
Eine Sache die ich beobachte habe und die vielleicht wichtig sein könnte:
Wenn ich die Reset-Taste betätige (PIN1) und unmittelbar hinterher die anderen Tasten, dann funktioniert das Programm für eine Sekunde für 1 bis drei Schritte und bleibt dann erst stehen. 
Das Compiliern zeigt mir 67% Speicheauslastung (weis nicht ob diese Info gebraucht wird).
Behri
Sauerbruch
12.09.2013, 21:05
Wenn ich die Reset-Taste betätige (PIN1) und unmittelbar hinterher die anderen Tasten, dann funktioniert das Programm für eine Sekunde für 1 bis drei Schritte und bleibt dann erst stehen. 
Dann wäre doch mal interessant, ob diese Zeit sich deutlich verlängert, wenn Du den Timer ordentlich langsamer machst. Nimm doch mal einem Prescaler von 64 und keinen Timerstartwert, dann sollte Timer1 alle ca. 4 Sekunden überlaufen  anstatt alle 125 ms wie bisher. 
(*im-trüben-rumstocher...)
P.S.: Und es ist absolut richtig, dass man all die anderen Interrupts nicht extra "ausschalten" muss. Das sind sie ganz von alleine nach dem Power-On-Reset, und nur die explizit aktivierten Interrupts (enable...) werden ausgeführt.
Danke für die Tips.
Nun, solange man gerne fischen geht, hat das Fischen im trüben Wasser seinen besonderen Reiz. Denn man sieht den Fisch erst wenn man ihn gefangen hat und man hatte vorher nicht die geringste Ahnung wie das Prachtstück aussieht.
Jedenfalls glaube ich, dass wir das Tierchen schon ein bischen in die Enge getrieben haben.
folgende aktuelle Einstellungen:
$hwstack = 40
$swstack = 40
.
.
.
prescale = 64
Const Timer1startwert = 5
folgende sonderbare Erscheinung:
das Programm läuft erst mal und die LED blitzt kaum sichtbar aller 4 Sekunden.
manchmal fängt sie auch an ordentlich zu zu toggeln und dann steht das Programm wieder wie angenagelt.
Behri
Ich hab gerade noch mal gelesen, Du meintest "keinen" Timerstartwert.
Einstellung:
'Keinen Timerstartwert
Prescale = 8
die LED "blitzt" 8 mal (immer wenn das umschalten beim toggeln dran wäre). Dann Toggelt die LED (nach ca. 4 Sekunden, ca im Sekunden-Takt).
Wenn die LED dann das erste mal geleuchtet hat, steht das Programm. In der "Blitzphase"  läuft das Programm. Wenn ich in dieser Phase schnell und viele andere Tasten betätige, kann ich das Toggeln - und somit das Stoppen des Programmes um ein paar Sekunden rausgezögert werden. ???
Behri
Sauerbruch
14.09.2013, 22:38
Also, ob Du nun gar keinen Timer-Vorladewert nimmst oder ihn aber von 5 starten lässt, dürfte beim 16-Bit-Timer absolut keinen Unterschied machen. Er zählt ja immerhin bis 65535...  Dass die LED "blitzt" und nicht blinkt, ist ja aber schon mal sehr suspekt, da Du sie in der Timer-ISR ja toggelst.
Und wenn der Timer1-Interrupt nicht aktiviert ist, läuft das Programm ordnungsgemäß - habe ich das richtig verstanden?
Ja, richtig verstanden.
oft steckt der Teufel ja im Detail. Deshalb noch mal von 5 auf nichts. Das war nun mein erster Versuch mit einem Timer zu arbeiten und lt. der Bücher die ich vorher studiert hatte schien es nicht so schwer zu sein. Das mit dem "Blitzen" erscheint mir auch suspekt. Aber ich mit meinen Kenntnissen kann nichts daraus schließen. Ich weiß nicht wie der Bascom-Code im µC so abläuft und wie das ist mit Registern, Speicherbereichen, Zeigern... . Vieleicht braucht das ein Timer um zu starten, sowas wie "Vorglühen" :-). (Nein, natürlich nicht, ich denke da collidiert irgendwo etwas)
Was könnte ich noch so probieren?
 
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.