Forum: Mikrocontroller und Digitale Elektronik Lauflicht auf Matrixdisplay


von Jackson02 (Gast)


Lesenswert?

Hallo,

ich habe hier ein kleines Problem mit einem Attiny2313 und einem 
Lauflicht auf einem Dot-Matrix Display. Und zwar wäre im Programm alles 
soweit richtig; Display und Attiny2313 sind ebenfalls ordnungsgemäß 
verdrahtet bzw. beschaltet.
Wie bereits erwähnt schließe ich einen Fehler im Programmablauf aus, da 
dies sehr übersichtlich und für jeden leicht verständlich in BASIC 
formuliert wurde.
Nun zum eigentlichen Problem:
Bei besagtem Programm springt er ab ca. der Mitte des Ablaufs (Nach 
"Strich4") wieder auf "Strich" zurück und stoppt und zeigt ein 
zufälliges Bild (meistens die gesamte rechte Linie von oben nach unten 
auf dem Matrix Display) an.
Werte für HWstack, SWstack etc. hab ich schon alle möglichen 
Kombinationen getestet - Leider erfolglos.

Ich poste mal hier mein Programm - in der Hoffnung, dass mir jemand 
einen Fehler nennen kann.

------------------------------------------------------------------------ 
-
$regfile = "attiny2313.dat"
$crystal = 1200000
$noramclear                                                 ' RAM nicht 
initialisieren
$hwstack = 0                                                ' 
Stackinitialisierung wird durch $TINY unterdrückt
$swstack = 0                                                ' Software 0
$framesize = 0                                              ' Framesize 
= 0
Dim A As Long
A = 0

Config Portd = Output
Config Portb = Output

Do



Strich01:
  A = A + 1
 If A < 10 Then
  Gosub Strich
 Else
  Gosub Null
  Gosub Strich02
 End If


Strich02:
  A = A + 1
 If A < 10 Then
  Gosub Strich2
 Else
  Gosub Null
  Gosub Strich03
 End If

 Strich03:
  A = A + 1
 If A < 10 Then
  Gosub Strich3
 Else
  Gosub Null
  Gosub Strich04
 End If

 Strich04:
  A = A + 1
 If A < 10 Then
  Gosub Strich4
 Else
  Gosub Null
  Gosub Strich05
 End If

 Strich05:
  A = A + 1
 If A < 10 Then
  Gosub Strich5
 Else
  Gosub Null
  Gosub Strich06
 End If

 Strich06:
  A = A + 1
 If A < 10 Then
  Gosub Strich6
 Else
  Gosub Null
  Gosub Strich07
 End If

 Strich07:
  A = A + 1
 If A < 10 Then
  Gosub Strich7
 Else
  Gosub Null
  Gosub Strich01
 End If
Loop
End



Strich:
  Portd = 1 : Portb = &B01111111 : Waitms 1
  Portd = 2 : Portb = &B00000001 : Waitms 1
  Portd = 4 : Portb = &B00000001 : Waitms 1
  Portd = 8 : Portb = &B00000001 : Waitms 1
  Portd = 16 : Portb = &B01111111 : Waitms 1
  Gosub Strich01
Strich2:
  Portd = 1 : Portb = &B01111111 : Waitms 1
  Portd = 2 : Portb = &B00000010 : Waitms 1
  Portd = 4 : Portb = &B00000010 : Waitms 1
  Portd = 8 : Portb = &B00000010 : Waitms 1
  Portd = 16 : Portb = &B01111111 : Waitms 1
  Gosub Strich02
Strich3:
  Portd = 1 : Portb = &B01111111 : Waitms 1
  Portd = 2 : Portb = &B00000100 : Waitms 1
  Portd = 4 : Portb = &B00000100 : Waitms 1
  Portd = 8 : Portb = &B00000100 : Waitms 1
  Portd = 16 : Portb = &B01111111 : Waitms 1
  Gosub Strich03
Strich4:
  Portd = 1 : Portb = &B01111111 : Waitms 1
  Portd = 2 : Portb = &B00001000 : Waitms 1
  Portd = 4 : Portb = &B00001000 : Waitms 1
  Portd = 8 : Portb = &B00001000 : Waitms 1
  Portd = 16 : Portb = &B01111111 : Waitms 1
  Gosub Strich04
Strich5:
  Portd = 1 : Portb = &B01111111 : Waitms 1
  Portd = 2 : Portb = &B00010000 : Waitms 1
  Portd = 4 : Portb = &B00010000 : Waitms 1
  Portd = 8 : Portb = &B00010000 : Waitms 1
  Portd = 16 : Portb = &B01111111 : Waitms 1
  Gosub Strich05
Strich6:
  Portd = 1 : Portb = &B01111111 : Waitms 1
  Portd = 2 : Portb = &B00100000 : Waitms 1
  Portd = 4 : Portb = &B00100000 : Waitms 1
  Portd = 8 : Portb = &B00100000 : Waitms 1
  Portd = 16 : Portb = &B01111111 : Waitms 1
  Gosub Strich06
Strich7:
  Portd = 1 : Portb = &B01111111 : Waitms 1
  Portd = 2 : Portb = &B01000000 : Waitms 1
  Portd = 4 : Portb = &B01000000 : Waitms 1
  Portd = 8 : Portb = &B01000000 : Waitms 1
  Portd = 16 : Portb = &B0111111 : Waitms 1
  Gosub Strich07
Null:
  Portd = 1 : Portb = &B00000000 : Waitms 1
  Portd = 2 : Portb = &B00000000 : Waitms 1
  Portd = 4 : Portb = &B00000000 : Waitms 1
  Portd = 8 : Portb = &B00000000 : Waitms 1
  Portd = 16 : Portb = &B00000000 : Waitms 1
  A = 0
  Return
------------------------------------------------------------------------ 
-

Da es sich nur um ein Testprogramm handelt bitte nicht über diese 
Funktion wundern.


Mit den besten Grüßen und der Hoffnung auf ne baldige Antwort


Manuel

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Stichwort Stacküberlauf

Du machst alle Sprünge mit GOSUB, hast aber keine RETURNs drin.

Gruß,
Magnetus

von Jackson02 (Gast)


Lesenswert?

Danke erstmal für die schnelle Antwort.
Die Gosubs, mit denen ich zum nächsten "Abschnitt" z.B. Strich02 springe 
kann ich ja weglassen. Müsste deshalb genauso funktionieren.
Kann ich vllt. statt den Gosub07 unten bei den Musterfeldern Goto07 
verwenden? Oder hätte das den selben Fehler als Folge?

Grüßle

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.