PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : atmel 90s1200 durch attiny2313 ersetzen problem



Morpheus85
05.10.2006, 09: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]

SprinterSB
05.10.2006, 12:14
Hast du die Vector-Tabelle und EEPROM-Routinen angepasst?

Morpheus85
05.10.2006, 13:22
Also in der inc datei die ich da anhäng ist das angepasst mit so nem equ befehl, aber die Vektoren hmmm damit kenn ich mich nicht so aus da mit den Interrupts ich weis halt net wie ich des ändern sol und so weil ich hab noch nicht wirklich aso was programmiert. Es ist blos keiner hier in der Firma der so was kann und ich auch nicht wirklich. kannst du mir des bissle genauer sagen. hab auch schon mal mit nem techniker von dort wo wir des kaufen gesprochen aber der weis auch net so viel der hat mir was gesagt das der Enterrupt evtl an der falschen Stelle reinspringt oder so.

MFG Chris

stegr
05.10.2006, 14:29
verschoben nach avr -> assembler

uwegw
05.10.2006, 15:57
Von Atmel gibts ne Appnote zum Thema Wechsle von 1200 zu T2313:
http://atmel.com/dyn/resources/prod_documents/doc4299.pdf
Da sind alle relevanten Unterschiede aufgelistet.



.cseg
.org 0000
ldi r16,low(RAMEND) ;
out SPL,r16 ;
rjmp START ; Anfangsvectoren
rjmp START ;
rjmp TINT ;

was ist das denn für ein Mischmasch aus Interruptvektoren und Programmcode? Das kann ja nicht gutgehen!
Welche Interrupts sollen überhaupt benutzt werden? Der Timer? Sonstnochwas?

Morpheus85
06.10.2006, 06:54
also den mischmasch mit dem zeug da hab ich mir nicht ausgedacht des hat mir jemand anders gesagt das ich des mit ramend irgendwo ganz oben hintuen soll. Die Appnote hab ich schon und ich glaub des liegt irgendwie an den vectoren oder so.
ich hab mal ne simulation gemacht im avr studio einmal mit dem attiny 2313 und einmal mit at90s1200. Der unterschied zwischen beiden war das der wenn der timer gezählt hat bei dem einen an die eine und bei dem anderen an eine andere stelle springt die 4 zeilen darunter liegt. blos weis ich net wie ich das ändern soll. ich hab noch nie einen ic programmiert das programm ist ja auch nicht von mir ich soll blos machen das es wieder geht.

MFG chris

Morpheus85
06.10.2006, 06:56
Aso und wegen den Interrupts. Soweit ich des Programm versteh gibts blos den Timer mit dem Interrupt.

Morpheus85
06.10.2006, 09:55
Tachle
Hab das Problem gefunden und beseitigt. Es war der Interrupt von dem Timer overflow der ist dann an die falsche stelle gesprungen weil der sich bei dem neuen IC geändert hat. Jetzt versteh ich auch was Interrupts überhaupt sind.

@ uwegw der mischmasch der oben drann steht stört das Programm aber nicht, bisher zumindest nicht, also lass ich den drann. Du könntest mir aber trotzdem mal sagen warum des nicht gut ist.

MFG Chris