Morpheus85
05.10.2006, 10:40
also ich wollte den at90s1200 durch den attiny2313 ersetzen weils den 1200 ja nimmer gibt. ich hab dann ein programm draufgespielt und das ging dann nimmer, datenblatt gelesen fuses gesetz und dann gings. aber bei nem anderen programm das vorher auch auf dem 1200 lief geht das so eben nicht und ich weis nicht wo der fehler steckt. vielleicht im timer oder bei dem interrupt hab ka kenn mich damit net aus. ich hab des programm mal hier mit rein geschrieben vielleicht könnt ihr mir ja helfen.
MFG chris
;
;
; ************************************************** *********
; * E-Schütz V1.1 *
; * Blach-Roentgen Assamstadt *
; * P.Blach 10/1998 *
; ************************************************** *********
;
;
.device ATtiny2313
.include "tn2313def.inc"
; * Definitionen *
;
; ## Register ##
.def S_TEMP = r11
.def S_A = r12
.def VZCOUNT = r16
.def VZCOUNT1 = r17
.def PCOUNT = r18
.def MEM_0 = r19
.def MEM_1 = r20
.def A = r21
.def FLAGS = r22
.def MATH_0 = r24
.def MATH_1 = r25
.def MATH_2 = r23
.equ RB = PORTB
.equ RD = PORTD
.equ POLA = 3 ; PB,3
.equ SYNC = 2 ; PB,2
.equ M1 = 4 ; PB,4
.equ LED = 0 ; PD,0
.equ RATE = 205
.equ EINGABE = 5
.equ EINGABES = 32
.equ PRELL = 0
.equ PRELLS = 1
.equ VZZ = 1
.equ VZZS = 2
.equ WAVE = 2
.equ WAVES = 4
.equ BCKCOUNT = 3
.equ BCKCOUNTS = 8
.equ PRELLZEIT = 30
.eseg
test: .db 0,0,0,0,0x03,0x99,0,1
.cseg
.org 0000
ldi r16,low(RAMEND) ;
out SPL,r16 ;
rjmp START ; Anfangsvectoren
rjmp START ;
rjmp TINT ;
START:
clr FLAGS ;
clr VZCOUNT ;
clr PCOUNT ;
rcall SCHUSSREAD ;
rcall WAVEREAD ;
INIT_1: rcall PORT_INIT ;
rcall TIMER_INIT ;
rcall IRQ_INIT ;
HAUPT:
sbic PIND,EINGABE ; EIN-Signal da?
rjmp HAUPT ; nein
cli ; IRQ aus
sbr FLAGS,PRELLS ; Entprelltimer starten
sbr FLAGS,VZZS ; Mitlaufzähler starten
sei ; IRQ an
H_1: sbrc FLAGS,PRELL ; Läuft Entprellen noch?
rjmp H_1 ; ja
sbic PIND,EINGABE ; Ein-Signal noch da?
rjmp H_END ; nein, dann aus
sbrc FLAGS,WAVE ; jetzt zur richtigen Halbwelle
rjmp NEG_START ;
POS_START:
sbic PIND,EINGABE ; Ein-Signal noch da?
cbr FLAGS,VZZS ; nein dann Mitlaufzähler stoppen
sbis PINB,POLA ; Welche Halbwelle ist gerade dran?
rjmp POS_START ; erst weiter bei Negativer...
POS_1:
sbic PIND,EINGABE ; Ein-Signal noch da?
cbr FLAGS,VZZS ; nein dann Mitlaufzähler stoppen
sbis PINB,SYNC ; auf Netznulldurchgang warten
rjmp POS_1 ;
POS_1_1:
sbic PIND,EINGABE ; Ein-Signal noch da?
cbr FLAGS,VZZS ; nein dann Mitlaufzähler stoppen
sbic PINB,SYNC ; warten auf fallende Flanke
rjmp POS_1_1 ;
cbr FLAGS,VZZS ; Mitlaufzähler stoppen
sbi RB,M1 ; Schütz an
cbi RD,LED ; Kontroll-Led an
POS_2:
sbis PIND,EINGABE ; Ein-Signal noch da?
rjmp POS_2 ; ja warten
mov VZCOUNT1,VZCOUNT ; Zählerwert merken
sbr FLAGS,BCKCOUNTS ; Abwärtszähler starten
ldi PCOUNT,2 ; 0,2ms entprellen
sbr FLAGS,PRELLS ; starten
POS_20:
sbrc FLAGS,PRELL ;
rjmp POS_20 ; Entprellzeit warten
sbic PIND,EINGABE ;
rjmp POS_3 ; nein, dann wirklich beenden
cli ;
mov VZCOUNT,VZCOUNT1 ; Abwärtszähler erneuern
cbr FLAGS,BCKCOUNTS ; und sein Flag loeschen
sei ;
rjmp POS_2 ; und warten
POS_3:
sbrc FLAGS,BCKCOUNT ;
rjmp POS_3 ; Rücklaufzähler abwarten
sbr FLAGS,WAVES ; nächste Halbwelle merken
sbic PINB,POLA ;
cbr FLAGS,WAVES ;
cbi RB,M1 ; Schütz aus
sbi RD,LED ; Kontroll-Led aus
rcall SCHUSSADDIER ;
rcall SCHUSSWR ;
rjmp H_END ;
NEG_START:
sbic PIND,EINGABE ; Ein-Signal noch da?
cbr FLAGS,VZZS ; nein Mitlaufzähler stoppen
sbic PINB,POLA ; Welche Halbwelle ist grade dran?
rjmp NEG_START ; und erst weiter bei Positiver...
NEG_1:
sbic PIND,EINGABE ; Ein-Signal noch da?
cbr FLAGS,VZZS ; nein, Mitlaufzähler aus
sbis PINB,SYNC ; Netz-Sync?
rjmp NEG_1 ; nein,warten
NEG_1_1:
sbic PIND,EINGABE ; Ein-Signal noch da?
cbr FLAGS,VZZS ; nein dann Mitlaufzähler stoppen
sbic PINB,SYNC ; und zwar auf fallende Flanke
rjmp NEG_1_1 ;
cbr FLAGS,VZZS ; Mitlaufzähler stoppen
sbi RB,M1 ; Schütz an
cbi RD,LED ; Kontroll-Led an
NEG_2:
sbis PIND,EINGABE ; Ein-Signal noch da?
rjmp NEG_2 ; ja warten
mov VZCOUNT1,VZCOUNT ; Zählerwert merken
sbr FLAGS,BCKCOUNTS ; Abwärtszähler starten
ldi PCOUNT,2 ; 0,2ms entprellen
sbr FLAGS,PRELLS ; starten
NEG_20:
sbrc FLAGS,PRELL ;
rjmp NEG_20 ; Entprellzeit warten
sbic PIND,EINGABE ;
rjmp NEG_3 ; nein, dann wirklich beenden
cli ;
mov VZCOUNT,VZCOUNT1 ; Abwärtszähler erneuern
cbr FLAGS,BCKCOUNTS ; und sein Flag loeschen
sei ;
rjmp NEG_2 ; und warten
NEG_3:
sbrc FLAGS,BCKCOUNT ;
rjmp NEG_3 ; Rücklaufzähler abwarten
sbr FLAGS,WAVES ; nächste Halbwelle merken
sbic PINB,POLA ;
cbr FLAGS,WAVES ;
cbi RB,M1 ; Schütz aus
sbi RD,LED ; Kontroll-Led aus
rcall SCHUSSADDIER ;
rcall SCHUSSWR ;
rjmp H_END ;
H_END:
clr PCOUNT ; alles zurücksetzen und
clr VZCOUNT ;
cbr FLAGS,PRELLS ;
cbr FLAGS,VZZS ;
rcall WAVEMERK ; Letzte Polarität speichern
rjmp HAUPT ; zurück...
TINT: in S_TEMP,SREG ; STATUS retten
mov S_A,A ; Akku retten
ldi A,RATE ;
out TCNT0,A ; Timerrefresh
sbrs FLAGS,PRELL ; Prelltimer starten?
rjmp T_1 ; nein
inc PCOUNT ;
cpi PCOUNT,PRELLZEIT; Prellzeit erreicht?
brlo T_1 ; dito
cbr FLAGS,PRELLS ; ja, Prellflag aus
clr PCOUNT ; Zähler nullen
T_1:
sbrs FLAGS,VZZ ; Vorlaufzähler an?
rjmp T_2 ; nein
inc VZCOUNT ; Vorlaufzähler+1
rjmp TINT_END ;
T_2:
sbrs FLAGS,BCKCOUNT ; Nachlaufzähler an?
rjmp TINT_END ; nein
tst VZCOUNT ;
breq T_2_1 ; schon Null?
dec VZCOUNT ;
tst VZCOUNT ;
breq T_2_1 ; Null?
rjmp TINT_END ; nein
T_2_1:
cbr FLAGS,BCKCOUNTS ; Nachlaufzählerflag = Null
TINT_END: mov A,S_A ; Akku zurück
out SREG,S_TEMP ; Status zurück
reti ; alles gelaufen und zurück
PORT_INIT: ldi A,0b00000001 ;
out DDRD,A ; Port D definieren
ldi A,0b11111111 ;
out RD,A ;
ldi A,0b00010000 ; Port B definieren
out DDRB,A ;
ldi A,0b11101111 ;
out RB,A ;
sbi RD,LED ; Kontroll-LED aus
ret ; und zurueck
TIMER_INIT: ldi A,RATE ;
out TCNT0,A ; Zaehler zaehlt Wert von RATE zum Überlauf
ldi A,0b00000010 ; 1:8 Prescale
out TCCR0B,A ; Timer damit anschalten
clr VZCOUNT ; 8 Bit Vorlaufzähler
clr PCOUNT ; 8 Bit Entprellzähler
ret ;
IRQ_INIT: ldi A,0b00000010 ; Timer IRQ möglich
out TIFR,A ; Ereignisflag löschen
out TIMSK,A ; dann möglich machen
reti ; zurück und GIE setzen
WAVEMERK:
clr MEM_0 ;
sbrc FLAGS,WAVE ;
ldi MEM_0,1 ;
ldi A,3 ; EEPROM-Adresse ist 3!
out EEAR,A ;
out EEDR,MEM_0 ; Daten anlegen
sbi EECR,EEWE ; Schreiben an
WAVE_1:
sbic EECR,EEWE ; Fertig?
rjmp WAVE_1 ; nein
ret ; zurück
WAVEREAD:
ldi A,3 ; EEPROM-Adresse 3
out EEAR,A ;
sbi EECR,EERE ; auslesen
in A,EEDR ;
cbr FLAGS,WAVES ;
tst A ;
breq WV_1 ;
sbr FLAGS,WAVES ;
WV_1:
ret ;
SCHUSSADDIER:
ldi A,1 ; 8Bit zu 24Bit addieren
add MATH_0,A ;
ldi A,0 ;
adc MATH_1,A ;
adc MATH_2,A ;
ret ;
SCHUSSREAD:
ldi A,2 ; EEPROM-Adresse 2
out EEAR,A ;
sbi EECR,EERE ; auslesen
in MATH_0,EEDR ; nach MATH_0
ldi A,1 ; EEPROM-Adresse 1
out EEAR,A ;
sbi EECR,EERE ; auslesen
in MATH_1,EEDR ; nach MATH_1
ldi A,0 ; EEPROM-Adresse 0
out EEAR,A ;
sbi EECR,EERE ; auslesen
in MATH_2,EEDR ; nach MATH_2
ret ; zurück
SCHUSSWR:
ldi A,2 ; EEPROM-Adresse 2
out EEAR,A
out EEDR,MATH_0 ; Daten nach EEDR
sbi EECR,EEWE ; Schreiben an
WR_1:
sbic EECR,EEWE ; Fertig?
rjmp WR_1 ; nein
ldi A,1 ; EEPROM-Adresse 1
out EEAR,A
out EEDR,MATH_1 ; Daten nach EEDR
sbi EECR,EEWE ; Schreiben an
WR_2:
sbic EECR,EEWE ; Fertig?
rjmp WR_2 ; nein
ldi A,0 ; EEPROM-Adresse 0
out EEAR,A
out EEDR,MATH_2 ; Daten nach EEDR
sbi EECR,EEWE ; Schreiben an
WR_3:
sbic EECR,EEWE ; Fertig?
rjmp WR_3 ; nein
ret ; zurück
[/scroll]
MFG chris
;
;
; ************************************************** *********
; * E-Schütz V1.1 *
; * Blach-Roentgen Assamstadt *
; * P.Blach 10/1998 *
; ************************************************** *********
;
;
.device ATtiny2313
.include "tn2313def.inc"
; * Definitionen *
;
; ## Register ##
.def S_TEMP = r11
.def S_A = r12
.def VZCOUNT = r16
.def VZCOUNT1 = r17
.def PCOUNT = r18
.def MEM_0 = r19
.def MEM_1 = r20
.def A = r21
.def FLAGS = r22
.def MATH_0 = r24
.def MATH_1 = r25
.def MATH_2 = r23
.equ RB = PORTB
.equ RD = PORTD
.equ POLA = 3 ; PB,3
.equ SYNC = 2 ; PB,2
.equ M1 = 4 ; PB,4
.equ LED = 0 ; PD,0
.equ RATE = 205
.equ EINGABE = 5
.equ EINGABES = 32
.equ PRELL = 0
.equ PRELLS = 1
.equ VZZ = 1
.equ VZZS = 2
.equ WAVE = 2
.equ WAVES = 4
.equ BCKCOUNT = 3
.equ BCKCOUNTS = 8
.equ PRELLZEIT = 30
.eseg
test: .db 0,0,0,0,0x03,0x99,0,1
.cseg
.org 0000
ldi r16,low(RAMEND) ;
out SPL,r16 ;
rjmp START ; Anfangsvectoren
rjmp START ;
rjmp TINT ;
START:
clr FLAGS ;
clr VZCOUNT ;
clr PCOUNT ;
rcall SCHUSSREAD ;
rcall WAVEREAD ;
INIT_1: rcall PORT_INIT ;
rcall TIMER_INIT ;
rcall IRQ_INIT ;
HAUPT:
sbic PIND,EINGABE ; EIN-Signal da?
rjmp HAUPT ; nein
cli ; IRQ aus
sbr FLAGS,PRELLS ; Entprelltimer starten
sbr FLAGS,VZZS ; Mitlaufzähler starten
sei ; IRQ an
H_1: sbrc FLAGS,PRELL ; Läuft Entprellen noch?
rjmp H_1 ; ja
sbic PIND,EINGABE ; Ein-Signal noch da?
rjmp H_END ; nein, dann aus
sbrc FLAGS,WAVE ; jetzt zur richtigen Halbwelle
rjmp NEG_START ;
POS_START:
sbic PIND,EINGABE ; Ein-Signal noch da?
cbr FLAGS,VZZS ; nein dann Mitlaufzähler stoppen
sbis PINB,POLA ; Welche Halbwelle ist gerade dran?
rjmp POS_START ; erst weiter bei Negativer...
POS_1:
sbic PIND,EINGABE ; Ein-Signal noch da?
cbr FLAGS,VZZS ; nein dann Mitlaufzähler stoppen
sbis PINB,SYNC ; auf Netznulldurchgang warten
rjmp POS_1 ;
POS_1_1:
sbic PIND,EINGABE ; Ein-Signal noch da?
cbr FLAGS,VZZS ; nein dann Mitlaufzähler stoppen
sbic PINB,SYNC ; warten auf fallende Flanke
rjmp POS_1_1 ;
cbr FLAGS,VZZS ; Mitlaufzähler stoppen
sbi RB,M1 ; Schütz an
cbi RD,LED ; Kontroll-Led an
POS_2:
sbis PIND,EINGABE ; Ein-Signal noch da?
rjmp POS_2 ; ja warten
mov VZCOUNT1,VZCOUNT ; Zählerwert merken
sbr FLAGS,BCKCOUNTS ; Abwärtszähler starten
ldi PCOUNT,2 ; 0,2ms entprellen
sbr FLAGS,PRELLS ; starten
POS_20:
sbrc FLAGS,PRELL ;
rjmp POS_20 ; Entprellzeit warten
sbic PIND,EINGABE ;
rjmp POS_3 ; nein, dann wirklich beenden
cli ;
mov VZCOUNT,VZCOUNT1 ; Abwärtszähler erneuern
cbr FLAGS,BCKCOUNTS ; und sein Flag loeschen
sei ;
rjmp POS_2 ; und warten
POS_3:
sbrc FLAGS,BCKCOUNT ;
rjmp POS_3 ; Rücklaufzähler abwarten
sbr FLAGS,WAVES ; nächste Halbwelle merken
sbic PINB,POLA ;
cbr FLAGS,WAVES ;
cbi RB,M1 ; Schütz aus
sbi RD,LED ; Kontroll-Led aus
rcall SCHUSSADDIER ;
rcall SCHUSSWR ;
rjmp H_END ;
NEG_START:
sbic PIND,EINGABE ; Ein-Signal noch da?
cbr FLAGS,VZZS ; nein Mitlaufzähler stoppen
sbic PINB,POLA ; Welche Halbwelle ist grade dran?
rjmp NEG_START ; und erst weiter bei Positiver...
NEG_1:
sbic PIND,EINGABE ; Ein-Signal noch da?
cbr FLAGS,VZZS ; nein, Mitlaufzähler aus
sbis PINB,SYNC ; Netz-Sync?
rjmp NEG_1 ; nein,warten
NEG_1_1:
sbic PIND,EINGABE ; Ein-Signal noch da?
cbr FLAGS,VZZS ; nein dann Mitlaufzähler stoppen
sbic PINB,SYNC ; und zwar auf fallende Flanke
rjmp NEG_1_1 ;
cbr FLAGS,VZZS ; Mitlaufzähler stoppen
sbi RB,M1 ; Schütz an
cbi RD,LED ; Kontroll-Led an
NEG_2:
sbis PIND,EINGABE ; Ein-Signal noch da?
rjmp NEG_2 ; ja warten
mov VZCOUNT1,VZCOUNT ; Zählerwert merken
sbr FLAGS,BCKCOUNTS ; Abwärtszähler starten
ldi PCOUNT,2 ; 0,2ms entprellen
sbr FLAGS,PRELLS ; starten
NEG_20:
sbrc FLAGS,PRELL ;
rjmp NEG_20 ; Entprellzeit warten
sbic PIND,EINGABE ;
rjmp NEG_3 ; nein, dann wirklich beenden
cli ;
mov VZCOUNT,VZCOUNT1 ; Abwärtszähler erneuern
cbr FLAGS,BCKCOUNTS ; und sein Flag loeschen
sei ;
rjmp NEG_2 ; und warten
NEG_3:
sbrc FLAGS,BCKCOUNT ;
rjmp NEG_3 ; Rücklaufzähler abwarten
sbr FLAGS,WAVES ; nächste Halbwelle merken
sbic PINB,POLA ;
cbr FLAGS,WAVES ;
cbi RB,M1 ; Schütz aus
sbi RD,LED ; Kontroll-Led aus
rcall SCHUSSADDIER ;
rcall SCHUSSWR ;
rjmp H_END ;
H_END:
clr PCOUNT ; alles zurücksetzen und
clr VZCOUNT ;
cbr FLAGS,PRELLS ;
cbr FLAGS,VZZS ;
rcall WAVEMERK ; Letzte Polarität speichern
rjmp HAUPT ; zurück...
TINT: in S_TEMP,SREG ; STATUS retten
mov S_A,A ; Akku retten
ldi A,RATE ;
out TCNT0,A ; Timerrefresh
sbrs FLAGS,PRELL ; Prelltimer starten?
rjmp T_1 ; nein
inc PCOUNT ;
cpi PCOUNT,PRELLZEIT; Prellzeit erreicht?
brlo T_1 ; dito
cbr FLAGS,PRELLS ; ja, Prellflag aus
clr PCOUNT ; Zähler nullen
T_1:
sbrs FLAGS,VZZ ; Vorlaufzähler an?
rjmp T_2 ; nein
inc VZCOUNT ; Vorlaufzähler+1
rjmp TINT_END ;
T_2:
sbrs FLAGS,BCKCOUNT ; Nachlaufzähler an?
rjmp TINT_END ; nein
tst VZCOUNT ;
breq T_2_1 ; schon Null?
dec VZCOUNT ;
tst VZCOUNT ;
breq T_2_1 ; Null?
rjmp TINT_END ; nein
T_2_1:
cbr FLAGS,BCKCOUNTS ; Nachlaufzählerflag = Null
TINT_END: mov A,S_A ; Akku zurück
out SREG,S_TEMP ; Status zurück
reti ; alles gelaufen und zurück
PORT_INIT: ldi A,0b00000001 ;
out DDRD,A ; Port D definieren
ldi A,0b11111111 ;
out RD,A ;
ldi A,0b00010000 ; Port B definieren
out DDRB,A ;
ldi A,0b11101111 ;
out RB,A ;
sbi RD,LED ; Kontroll-LED aus
ret ; und zurueck
TIMER_INIT: ldi A,RATE ;
out TCNT0,A ; Zaehler zaehlt Wert von RATE zum Überlauf
ldi A,0b00000010 ; 1:8 Prescale
out TCCR0B,A ; Timer damit anschalten
clr VZCOUNT ; 8 Bit Vorlaufzähler
clr PCOUNT ; 8 Bit Entprellzähler
ret ;
IRQ_INIT: ldi A,0b00000010 ; Timer IRQ möglich
out TIFR,A ; Ereignisflag löschen
out TIMSK,A ; dann möglich machen
reti ; zurück und GIE setzen
WAVEMERK:
clr MEM_0 ;
sbrc FLAGS,WAVE ;
ldi MEM_0,1 ;
ldi A,3 ; EEPROM-Adresse ist 3!
out EEAR,A ;
out EEDR,MEM_0 ; Daten anlegen
sbi EECR,EEWE ; Schreiben an
WAVE_1:
sbic EECR,EEWE ; Fertig?
rjmp WAVE_1 ; nein
ret ; zurück
WAVEREAD:
ldi A,3 ; EEPROM-Adresse 3
out EEAR,A ;
sbi EECR,EERE ; auslesen
in A,EEDR ;
cbr FLAGS,WAVES ;
tst A ;
breq WV_1 ;
sbr FLAGS,WAVES ;
WV_1:
ret ;
SCHUSSADDIER:
ldi A,1 ; 8Bit zu 24Bit addieren
add MATH_0,A ;
ldi A,0 ;
adc MATH_1,A ;
adc MATH_2,A ;
ret ;
SCHUSSREAD:
ldi A,2 ; EEPROM-Adresse 2
out EEAR,A ;
sbi EECR,EERE ; auslesen
in MATH_0,EEDR ; nach MATH_0
ldi A,1 ; EEPROM-Adresse 1
out EEAR,A ;
sbi EECR,EERE ; auslesen
in MATH_1,EEDR ; nach MATH_1
ldi A,0 ; EEPROM-Adresse 0
out EEAR,A ;
sbi EECR,EERE ; auslesen
in MATH_2,EEDR ; nach MATH_2
ret ; zurück
SCHUSSWR:
ldi A,2 ; EEPROM-Adresse 2
out EEAR,A
out EEDR,MATH_0 ; Daten nach EEDR
sbi EECR,EEWE ; Schreiben an
WR_1:
sbic EECR,EEWE ; Fertig?
rjmp WR_1 ; nein
ldi A,1 ; EEPROM-Adresse 1
out EEAR,A
out EEDR,MATH_1 ; Daten nach EEDR
sbi EECR,EEWE ; Schreiben an
WR_2:
sbic EECR,EEWE ; Fertig?
rjmp WR_2 ; nein
ldi A,0 ; EEPROM-Adresse 0
out EEAR,A
out EEDR,MATH_2 ; Daten nach EEDR
sbi EECR,EEWE ; Schreiben an
WR_3:
sbic EECR,EEWE ; Fertig?
rjmp WR_3 ; nein
ret ; zurück
[/scroll]