Guten Abend!
Zur Zeit bastel ich an einer Uhr mit elektromechanischen 7-Segment Anzeigen (HH:MM). Zeit wird über DCF77 geholt. Und an sich lief mein Programm auch prima. Seit einiger Hab ich aber das Problem, dass der Controller einfach hängen bleibt. Das Programm wird einfach nicht weiter ausgeführt. Reset funktioniert dann auch nichtmehr. Spannung muss komplett abgeschaltet werden. Nach erneutem zuschalten der Spannungsversorgung geht es dann wieder bis der Fehler erneut auftritt. Und so wie ich das beobachten konnte, setzt der Hänger immer dann ein, wenn in eine der Subroutinen gesprungen wird. Ich nutze die Soubroutinen um die Ziffern auf den einzelnen Stellen zu setzen.
Hier nochmal der Ablauf, wie der Fehler sich darstellt.
-Spannungsversorgung wird eingeschaltet
-Variable "_sec" ist zu beginn = 0 -> If-then Schleife wird aktiviert und Select-Case Abfragen werden abgearbeitet.
-Variablen "_hour" und "_min" sind zu beginn auch noch = 0 -> Anzeige wird aktualisiert und zeigt "00:00". Da werden also die Subroutinen noch angesprungen und bearbeitet. Und somit werden auch alle Segmente korrekt gesetzt.
-Nach einer Minute ist "_sec" wieder = 0. Zu diesem Zeitpunkt ist "_hour" noch = 0 und natürlich "_min" = 01
-Es wird in die Subroutine gesprungen um die erste Stelle zu aktualisieren. In der ersten Stelle werden alle Segmente zurück gesetzt. Und dann Feierabend. Controller streikt.
Die Subroutine wird also praktisch bis Zeile 39 oder 40 bearbeitet und dann streikt alles.
Das komplette Programm habe ich in den Anhang verfrachtet. Es würde sonst die maximale Anzahl an Zeichen pro Beitrag sprengen.
Ich weiß das mein Code unglaublich ineffizient geschrieben ist und das man das ganze mit wesentlich weniger Codeaufwand und viel eleganter machen kann. Leider lassen meine Fähigkeiten das momentan nicht zu. Bitte jagd mich also nicht gleich mit Fackeln und Mistgabeln davon
Noch ein Gedanke. Bei den ganzen Subroutinen die ich verwende. Kann es da zu Problemen mit dem HW Stack kommen, bzw. dem verfügbaren SRAM? Mit den Stackwerten habe ich in allen Variationen rumprobiert. Die Werte die zur Zeit im Programm stehen, sind also eher zufällig. Empfehlungen werden dankend angenommen.
Auf Seiten der Hardware sollte alles in Ordnung sein, meiner Meinung nach. Es sollte auch kein Problem mit dem Reset Eingang des Controllers sein. Der schaut sauber aus und die Spannung sackt auch nicht irgendwie mal ein.
Habe auch schon andere Mega32 Controller ausprobiert. Selbes Spiel.
Alles anzeigen
Zur Zeit bastel ich an einer Uhr mit elektromechanischen 7-Segment Anzeigen (HH:MM). Zeit wird über DCF77 geholt. Und an sich lief mein Programm auch prima. Seit einiger Hab ich aber das Problem, dass der Controller einfach hängen bleibt. Das Programm wird einfach nicht weiter ausgeführt. Reset funktioniert dann auch nichtmehr. Spannung muss komplett abgeschaltet werden. Nach erneutem zuschalten der Spannungsversorgung geht es dann wieder bis der Fehler erneut auftritt. Und so wie ich das beobachten konnte, setzt der Hänger immer dann ein, wenn in eine der Subroutinen gesprungen wird. Ich nutze die Soubroutinen um die Ziffern auf den einzelnen Stellen zu setzen.
Hier nochmal der Ablauf, wie der Fehler sich darstellt.
-Spannungsversorgung wird eingeschaltet
-Variable "_sec" ist zu beginn = 0 -> If-then Schleife wird aktiviert und Select-Case Abfragen werden abgearbeitet.
-Variablen "_hour" und "_min" sind zu beginn auch noch = 0 -> Anzeige wird aktualisiert und zeigt "00:00". Da werden also die Subroutinen noch angesprungen und bearbeitet. Und somit werden auch alle Segmente korrekt gesetzt.
-Nach einer Minute ist "_sec" wieder = 0. Zu diesem Zeitpunkt ist "_hour" noch = 0 und natürlich "_min" = 01
-Es wird in die Subroutine gesprungen um die erste Stelle zu aktualisieren. In der ersten Stelle werden alle Segmente zurück gesetzt. Und dann Feierabend. Controller streikt.
Die Subroutine wird also praktisch bis Zeile 39 oder 40 bearbeitet und dann streikt alles.
Das komplette Programm habe ich in den Anhang verfrachtet. Es würde sonst die maximale Anzahl an Zeichen pro Beitrag sprengen.
Ich weiß das mein Code unglaublich ineffizient geschrieben ist und das man das ganze mit wesentlich weniger Codeaufwand und viel eleganter machen kann. Leider lassen meine Fähigkeiten das momentan nicht zu. Bitte jagd mich also nicht gleich mit Fackeln und Mistgabeln davon
Noch ein Gedanke. Bei den ganzen Subroutinen die ich verwende. Kann es da zu Problemen mit dem HW Stack kommen, bzw. dem verfügbaren SRAM? Mit den Stackwerten habe ich in allen Variationen rumprobiert. Die Werte die zur Zeit im Programm stehen, sind also eher zufällig. Empfehlungen werden dankend angenommen.
Auf Seiten der Hardware sollte alles in Ordnung sein, meiner Meinung nach. Es sollte auch kein Problem mit dem Reset Eingang des Controllers sein. Der schaut sauber aus und die Spannung sackt auch nicht irgendwie mal ein.
Habe auch schon andere Mega32 Controller ausprobiert. Selbes Spiel.
BASCOM-Quellcode
- Sub Dig1char0
- 'Lokale Variablen deklarieren
- Local Cleardig0hsr As Byte
- Local Cleardig0lsc As Byte
- Local Setchar0ondig1hsc As Byte
- Local Setchar0ondig1lsr As Byte
- 'Variableninhalte setzen
- Cleardig0hsr = &B10000000
- Cleardig0lsc = &B11111111
- Setchar0ondig1hsc = &B11111100
- Setchar0ondig1lsr = &B10000000
- 'Setzen der Treiberausgänge zum löschen der bisher angezeigten Ziffer
- Cshsr = 0
- Spiout Cleardig0hsr , 1
- Cshsr = 1
- Cslsc = 0
- Spiout Cleardig0lsc , 1
- Cslsc = 1
- 'Alle zuvor gesetzten Ausgänge wieder abschalten. Anzeige ist bistabil.
- 'Ansonsten thermische Zerstörung der Spulen.
- Cshsr = 0
- Spiout Lowbyte , 1
- Cshsr = 1
- Cslsc = 0
- Spiout Lowbyte , 1
- Cslsc = 1
- Waitms 10
- 'Setzen der Treiberausgänge um neue Ziffer zu setzen. In diesem Fall Ziffer "0" auf der ersten Stelle.
- Cslsr = 0
- Spiout Setchar0ondig1lsr , 1
- Cslsr = 1
- Cshsc = 0
- Spiout Setchar0ondig1hsc , 1
- Cshsc = 1
- 'Alle zuvor gesetzten Ausgänge wieder abschalten. Anzeige ist bistabil.
- 'Ansonsten thermische Zerstörung der Spulen.
- Cslsr = 0
- Spiout Lowbyte , 1
- Cslsr = 1
- Cshsc = 0
- Spiout Lowbyte , 1
- Cshsc = 1
- End Sub
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von 128er ()