PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programm und Timer vertragen sich nicht



Behri
11.09.2013, 17:50
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, 19: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!

Behri
11.09.2013, 20:47
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, 08: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

Behri
12.09.2013, 16:55
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, 20: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.

Behri
14.09.2013, 10:45
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

Behri
14.09.2013, 20:26
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, 21: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?

Behri
14.09.2013, 23:28
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?