Zur Erklärung:
Ich hatte im Urlaub angefangen das Programm zu schreiben!
Zu Hause trat dann der von mir beschriebene Fehler ein.
Also hab ich das gesamte Programm zerpflückt, weil ich zuerst auch an einen Programmfehler gedacht habe!
Wundert euch quasi nicht über den Sinn des Programms (vom Orginalprogramm ist nur noch die Einleitung übrig geblieben)!
Wie ihr sehen könnt, ist ein Test mit den Pins B6 & B7 zugefügt wurden.
Und selbst diese kleine Bearbeitung funtioniert nur bei jedem 2. oder 3. einschalten.
Meistens flackern die Ausgänge viel schneller als programmiert.
Und die sogenannte Reset-Funktion führt zu keinerlei Veränderungen.
Ich wette ihr werdet keinen Fehler finden!!!!, oder?
Blos woher kommt dann dieses Fehlverhalten des µC?
Schaltung gibt's noch keine! Alles steckt auf einem Experimentierboard.
Das sind der µC AT90S8515, Quarz 8MHz (mit 4MHz auch probiert), einen Treiber 4050, 2 Widerstände und 2 Led's!
.NOLIST
.INCLUDE "C:\8515def.inc"
.LIST
.ESEG ;EEPROM
.DB 20+96, 26+96, 30+96, 36+96, 43+96
.DB 0, 0, 0, 0, 0
.DB 0, 0, 0, 0, 0
.DB 0, 0, 0, 0, 0
;0b3xFunktion,5xTimer (Funk: 000=aus;001=dunkel;010=hell;100=an)
.DB 0x03,0x82,0x04,0x89,0x04,0x9F
.DB 0x05,0x8B,0x05,0x9F
.DB 0x0A,0x82,0x01,0x81,0x11,0x9F
.DB 0x11,0x82,0x8B,0x03,0x82,0x03,0x9F
.DB 0x18,0x9F
.DW 0xFFFF,0xFFFF,0xFFFF,0xFFFF ;Füllmaterial
.DW 0xFFFF,0xFFFF,0xFFFF,0xFFFF ;Füllmaterial
.DW 0xFFFF,0xFFFF,0xFFFF,0xFFFF ;Füllmaterial
.DW 0xFFFF,0xFFFF,0xFFFF,0xFFFF ;Füllmaterial
.DW 0xFFFF,0xFFFF,0xFFFF,0xFFFF ;Füllmaterial
.DW 0xFFFF,0xFFFF,0xFFFF,0xFFFF ;Füllmaterial
.DW 0xFFFF,0xFFFF,0xFFFF,0xFFFF ;Füllmaterial
.DW 0xFFFF,0xFFFF,0xFFFF,0xFFFF ;Füllmaterial
.DW 0xFFFF,0xFFFF ;Füllmaterial
.DB 0xFF ;Füllmaterial
.DB 96 ;Zufallsgenerator
.DB 1 ;Steuerung Hell/Dunkel
.DW 0xFFFF,0xFFFF,0xFFFF,0xFFFF ;Füllmaterial
.DW 0xFFFF,0xFFFF,0xFFFF,0xFFFF ;Füllmaterial
.DW 0xFFFF,0xFFFF,0xFFFF,0xFFFF ;Füllmaterial
.DW 0xFFFF,0xFFFF,0xFFFF,0xFFFF ;Füllmaterial
.DW 0xFFFF,0xFFFF,0xFFFF,0xFFFF ;Füllmaterial
.DW 0xFFFF,0xFFFF ;Füllmaterial
.DB 6,0,6,0,6,0,6,0,6,0 ;Taster
.DB 0,0,0,0,0 ;SpeicherpositionA1
.DB 0,0,0,0,0 ;SpeicherpositionB1
.DB 0,0,0,0,0 ;SpeicherpositionC1
.DB 0,0,0,0,0 ;SpeicherpositionD1
.DB 0,0,0,0,0 ;SpeicherpositionE1
.DB 0,0,0,0,0 ;DatenA1
.DB 0,0,0,0,0 ;DatenB1
.DB 0,0,0,0,0 ;DatenC1
.DB 0,0,0,0,0 ;DatenD1
.DB 0,0,0,0,0 ;DatenE1
.DB 31,31,31,31,31 ;TimerA1
.DB 31,31,31,31,31 ;TimerB1
.DB 31,31,31,31,31 ;TimerC1
.DB 31,31,31,31,31 ;TimerD1
.DB 31,31,31,31,31 ;TimerE1
.DB 50 ;Timer Bremse
.DB 1 ;Timer Hell/Dunkel
.CSEG
.EQU Zufall = 210 ;Zufallsgenerator
.EQU T1 = 211 ;Timer Ausgang Hell/Dunkel
;ZPointer(high) = 1
.EQU Taster = 0 ;Taster
.EQU SA1 = 10 ;SpeicherpositionA1
.EQU SB1 = 15 ;SpeicherpositionB1
.EQU SC1 = 20 ;SpeicherpositionC1
.EQU SD1 = 25 ;SpeicherpositionD1
.EQU SE1 = 30 ;SpeicherpositionE1
.EQU DA1 = 35 ;DatenA1
.EQU DB1 = 40 ;DatenB1
.EQU DC1 = 45 ;DatenC1
.EQU DD1 = 50 ;DatenD1
.EQU DE1 = 55 ;DatenE1
.EQU TA1 = 60 ;TimerA1
.EQU TB1 = 65 ;TimerB1
.EQU TC1 = 70 ;TimerC1
.EQU TD1 = 75 ;TimerD1
.EQU TE1 = 80 ;TimerE1
.EQU TA1_E1 = 85 ;Timer (Bremse = x100)
;***** Vergabe von Namen für Register *****
.def Temp1 = R16
.def Temp2 = R17
.def Temp3 = R18
.def Temp4 = R19
.def Data = R20
.def XPointer= R26
.def XPoint = R27
.def YPointer= R28
.def YPoint = R29
.def ZPointer= R30
.def ZPoint = R31
Neustart:
;***** Vorbereiten Stack *****
LDI Temp1,high(ramend)
OUT SPH,Temp1
LDI Temp1,low(ramend)
OUT SPL,Temp1
;***** Vorbereiten der PIN's *****
LDI Temp1,0b11100000
OUT DDRA,Temp1
LDI Temp1,0b11111110
OUT DDRB,Temp1
LDI Temp1,0b11111111
OUT PORTA,Temp1
OUT PORTB,Temp1
OUT DDRC,Temp1
OUT PORTC,Temp1
OUT DDRD,Temp1
OUT PORTD,Temp1
;***** Vorbereiten der Register *****
CLR R16 ;Temporär1
CLR R17 ;Temporär2
CLR R18 ;Temporär3
CLR R19 ;Temporär4
CLR R20 ;Zähler Daten
CLR R28 ;YPointer
CLR R29 ;YPointer
CLR R30 ;ZPointer
CLR R31 ;ZPointer
;***** Vorprogramm ****
;V01*** EEPROM auslesen ***
CLR Temp1
LDI ZPointer,0b01100000
CLR ZPoint
V01_1:
SBIS EECR,0
SBIC EECR,1
RJMP V01_1
OUT EEARL,Temp1
SBI EECR,0
IN Temp2,EEDR
ST Z+,Temp2
INC Temp1
CPI Temp1,0xFF
BRNE V01_1
;V02*** SRAM kontrollieren ***
CLR Temp1
LDI ZPointer,0b01100000
CLR ZPoint
V02_1:
SBIS EECR,0
SBIC EECR,1
RJMP V02_1
OUT EEARL,Temp1
SBI EECR,0
IN Temp2,EEDR
LD Temp3,Z+
CP Temp2,Temp3
BREQ V02_2
RJMP Neustart
V02_2:
INC Temp1
CPI Temp1,0xFF
BRNE V02_1
;V03*** Voreinstellungen Timer ***
LDI Temp1,3 ;Vorteiler Timer
OUT TCCR0,Temp1 ;1 Durchlauf = 2ms (500Hz)
CBI PORTA,5 ;Betriebsbereit anzeigen
;***** Hauptprogramm *****
Hauptprogramm:
;Timer
IN Temp1,TIFR ;interner Timer fertig (500Hz = 2ms)
SBRS Temp1,1
RJMP S21_1
SBI PORTB,0
LDI Temp1,0b00000010
OUT TIFR,Temp1 ;internen Timer zurücksetzen
LDI ZPointer,TA1_E1 ;ZPointer vorbereiten
LD Temp1,Z
DEC Temp1
ST Z+,Temp1
S21_1:
; Timerverzögerung
LDI YPointer,T1
LD Temp1,Y
LDI ZPointer,TA1_E1
LD Temp2,Z
SBRC Temp1,0
CPSE Temp2,XPoint
RJMP S23_1
SBR Temp1,2
CBR Temp1,1
SBI PORTB,7
CBI PORTB,6
LDI Temp2,200
ST Z,Temp2
S23_1:
SBRC Temp1,1
CPSE Temp2,XPoint
RJMP S23_2
SBR Temp1,1
CBR Temp1,2
CBI PORTB,7
SBI PORTB,6
LDI Temp2,200
ST Z,Temp2
S23_2:
ST Y,Temp1
RJMP Hauptprogramm