-         

Ergebnis 1 bis 8 von 8

Thema: atmel 90s1200 durch attiny2313 ersetzen problem

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    25.09.2006
    Beiträge
    9

    atmel 90s1200 durch attiny2313 ersetzen problem

    Anzeige

    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]

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Hast du die Vector-Tabelle und EEPROM-Routinen angepasst?
    Disclaimer: none. Sue me.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    25.09.2006
    Beiträge
    9
    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

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.10.2004
    Ort
    Nordschwarzwald
    Alter
    34
    Beiträge
    506
    verschoben nach AVR -> assembler

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    Von Atmel gibts ne Appnote zum Thema Wechsle von 1200 zu T2313:
    http://atmel.com/dyn/resources/prod_...ts/doc4299.pdf
    Da sind alle relevanten Unterschiede aufgelistet.


    Code:
    .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?

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    25.09.2006
    Beiträge
    9
    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

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    25.09.2006
    Beiträge
    9
    Aso und wegen den Interrupts. Soweit ich des Programm versteh gibts blos den Timer mit dem Interrupt.

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    25.09.2006
    Beiträge
    9
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •