PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupts in ASM gehe nede



teslanikola
13.03.2006, 20:15
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?


;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

izaseba
13.03.2006, 20:58
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,


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

teslanikola
13.03.2006, 21:19
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!?!?!


;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

izaseba
13.03.2006, 21:46
*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

teslanikola
13.03.2006, 21:55
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,

izaseba
13.03.2006, 22:04
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

teslanikola
13.03.2006, 22:19
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

izaseba
13.03.2006, 22:30
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

teslanikola
13.03.2006, 22:41
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

izaseba
13.03.2006, 23:01
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 (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=11488&highlight=assembler+anf%E4nger) Ich habe hier alle Deine Fragen beantwortet, ist zwar ziemlich viel Material zum Lesen , aber ich denke, das versteht jeder...

Gruß Sebastian

teslanikola
14.03.2006, 13:10
Danke were mich da mal durchhängeln, scheinst ja recht gut ASM zu können, danke für deine Hilfe!