- Labornetzteil AliExpress         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Interrupts in ASM gehe nede

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.02.2005
    Alter
    36
    Beiträge
    470

    Interrupts in ASM gehe nede

    Anzeige

    Powerstation Test
    Hallo,
    ich bin gerade an einem kleine ASM-Projekt dran, jetzt hab ich ein Prog getippt, das alle 0,01sec in eine Interruptroutine springen soll und dort ein Bit eines Ports auf Hi setzt, nur es tut sich nichts, aber ich kann ums verrecken den fehler nicht finden, könnt ihr mir sagen was hier nicht stimmt?

    Code:
    ;Includedatei für AT90S2313 laden
    .include "2313def.inc"
    
    ;Arbeitsregister definieren
    .def temp = r16
    
    ;Interupt Config.
    .org 0000
    rjmp start
    nop
    nop
    nop
    nop
    rjmp t1int
    
    Start:
    
    ;Interupt Config II
    sei
    
    ldi temp,0b10000010
    out tccr1a,temp
    
    ldi temp,0xb4
    out tcnt1l, temp
    
    ldi temp,0xe2
    out tcnt1h, temp
    
    ;Stack einrichten
    ldi temp,low(ramend)
    out spl,temp
    
    ;PortB I/O-Config
    ldi temp,0b01111111
    out ddrb, temp
    
    ;PortD I/O-Config
    ldi temp,0b00111111
    out ddrd, temp
    
    ;Hauptprogramm
    Main:
    
     ldi temp,0b00000001
     out portd,temp
    
     ldi temp,0b00000000
     out portb,temp
    
    End: rjmp End
    
    ;Interuptroutine
    
    t1int:
     ldi temp,0b00000001
     out portb,temp
    Reti

    Grüße teslanikola

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Hallo, ohne jetzt die ganzen 0bxxxxxxxx aufzuschlüsseln, ein paar
    Sachen, die mir aufgefallen sind:
    Hat der 90s2313 wirklich nur 256 Bytes Ram ?
    sehe Stackpointer Zuweisung : out spl,blabla aber kein sph ?

    Manche Doppelregister möchten zuerst in High und dann in Low beschrieben werden,
    Code:
    ldi temp,0xb4
    out tcnt1l, temp
    
    ldi temp,0xe2
    out tcnt1h, temp
    in deiner ISR solltest Du tcnt1h u. tcnt1l neu beschreiben.
    Stimmt die Vektor Adresse wirklich ?
    Zwischen rjmp start und rjmp t1int gehören keine nop's sontern reti's hin...
    Tja, das wär's fürs erste, vielleicht trifft hier was zu, am sonsten muß man sich das näher angucken...

    Gruß Sebastian

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.02.2005
    Alter
    36
    Beiträge
    470
    also der Stackpointer besteht beim 2313 wirklich nur aus einem Byte, den rest werde ich auch mal geschwind probieren.

    Edit:

    Also es funkt tioniert immer noch ned ich hab jetzt den code noch mals vereinfacht und alles umgestellt und noch mal angeschaut, aber immer noch nede!?!?!
    Code:
    ;Includedatei für AT90S2313 laden 
    .include "2313def.inc" 
    
    ;Arbeitsregister definieren 
    .def temp = r16 
    
    ;Interupt Config. 
    .org 0000 
    rjmp start 
    reti
    reti
    reti 
    reti 
    rjmp t1int 
    
    Start: 
    
    ;Interupt Config II 
    sei 
    
    ldi temp,0b00000000
    out tccr1a,temp 
    
    ldi temp,0b10000010 
    out tccr1b,temp 
    
    ldi temp,0xe2 
    out tcnt1h, temp 
    
    ldi temp,0xb4 
    out tcnt1l, temp 
    
    ;Stack einrichten
    ldi temp,low(ramend)
    out spl,temp
    
    ;PortB I/O-Config
    ldi temp,0b11111111
    out ddrb, temp
    
    ;PortD I/O-Config
    ldi temp,0b11111111
    out ddrd, temp
    
    ;Hauptprogramm
    main:
    
    rjmp main
    
    ;Interuptroutine
    
    t1int:
    
     ldi temp,0b00000001
     out portd,temp
    
    Reti

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    *Sebastian immer noch zu faul um die 0bxxxxxxxx zu entschlüsseln*,
    aber was mir nochmal auffällt:
    Gibt es bei dem 2313 kein "Timer/Counter Interrupt Mask Register", auch TIMSK genannt, wenn nicht, habe ich nichts gesagt, wenn ja, schau Dir seine Bedeutung an denn ohne denn ist nix mit Interrupts beim Timer...(wenn es denn wirklich gibt)

    Gruß Sebastian

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.02.2005
    Alter
    36
    Beiträge
    470
    also der 2313 HAT DEFINITIV Interupts, auch T1 und T0 interrupts, ok schaue mal nach dem TIMSK, aber so wirklich blicke ich mit den register noch ned durch, ich komm vom basic, da geht das anders,

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    also der 2313 HAT DEFINITIV Interupts
    Ich hab auch nichts anderes behauptet...
    Nur der Register TIMSK ist ziemlich wichtig für die Timerinterrupts, und den haben sogar die kleinen TINY's womit der 2313 den auch haben müßte...
    ich komm vom basic
    Ich kann mir schon vorstellen, daß es nicht einfach ist, aber es wird schon werden...

    Gruß Sebastian

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.02.2005
    Alter
    36
    Beiträge
    470
    ok laut Datasheet muss ich um die Inits zu aktivieren das bit7 auf Hi des Timsk Register setzen und wie mach ich das mit den befehlen zur bitmanipulation sbi und sbr hatte ich keine erfolg

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Na gut ein Tip:

    Ich habe jetzt hier Dattenblatt von einem Tiny, es ist egal, als Beispiel reicht es,
    um Timer Overflow Interrupt vom Timer 1 einzuschalten muß ich im Register Timsk bit Nr. 2 setzen, das ist aber einfach nur eine Zahl, bei Dir ist das Bit 7 wie Du sagst.
    Besser ist den "Namen" zu setzen und der Bit heißt bei mir TOV1

    mithin schreibe ich
    ldi tmp,(1<<TOV1)
    out TIMSK,tmp
    damit hab ich bit 2 im Register TIMSK gesetzt.

    Will ich später mal noch den Timer 0 dazunehmen schreib ich einfach
    ldi tmp,(1<<TOV1)|(1<<TOV0)
    out TIMSK,tmp
    ich hoffe, daß es verständlich ist, so kannst Du auch mit allen Registern machen anstatt nichtssagende 0bxxxxxxxx zu schreiben.

    Gruß Sebastian

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.02.2005
    Alter
    36
    Beiträge
    470
    jo ich habs schon ne weile hin bekommen, hab einfach mein 0bxxxxxxxx reigeschrieben, das mit dem >>> und so versteh ich noch nede, vlt erklärts mir ja einer ?! naja noch eine 2. Frage wie kann ich ein bit negieren also wenn ein bit 0 hat 1 reinschreiben und wenns 1 hat 0, wie macht man das für reg und wie für ports?

    Aber jungs trotzdem ien fettes lob an eure hilfe, die vom µC-forum ham ja nichmal anstant gemacht zu antworten

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    schön das es klappt,
    die vom µC-forum ham ja nichmal anstant gemacht zu antworten
    vielleicht hat das was mit dieser Aussage zu tun :
    *Sebastian immer noch zu faul um die 0bxxxxxxxx zu entschlüsseln*
    [-(
    Deine Fragen naja, ich hab mir mal die Finger wundgetippt, schau mal hier Ich habe hier alle Deine Fragen beantwortet, ist zwar ziemlich viel Material zum Lesen , aber ich denke, das versteht jeder...

    Gruß Sebastian

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress