AVR assembler nybörjar hjälp
Postat: 25 oktober 2007, 15:46:02
Hej!
jag har precis börjat microprocessorteknink i skolan och vi har börjat använda en ATmega8515 med STK500 labbplatta grejen
jag har lyckats blinka och fladdra runt med lysdioder och sånt så nu skulle jag vilja testa använda en extern interrupt så jag funderar lite på hur man gjör
jag kan visa min kod och förklara vad jag vill göra
den funkar så att först kommer man till start och där får man välja med knappar vilket "program" man vill köra på pinne 7 kommer man till en tärning och på pinne 6 kommer man till en program som räknar upp till sex och på 5an är det bara lite fladder på dioderna
det jag skulle vilja göra är att ha en knapp som man trycker på och den ska avbryta allt och gå till "huvud menyn"
och vad jag har förståt så måste man ha en interrupt knapp för de.
jag har läst lite i databladet men förstår inte riktigt hur man gör
av det jag har förstod så måste man aktivera int1 för att få en "igång" och det gör man i SREG och GICR eller nåt?
så nu till det oluddiga
hur gör man en "avbryt knapp" = en interrupt
det här kanske vart jätte luddigt hoppas ni förstår
mvh
Sebastian
jag har precis börjat microprocessorteknink i skolan och vi har börjat använda en ATmega8515 med STK500 labbplatta grejen
jag har lyckats blinka och fladdra runt med lysdioder och sånt så nu skulle jag vilja testa använda en extern interrupt så jag funderar lite på hur man gjör
jag kan visa min kod och förklara vad jag vill göra
Kod: Markera allt
.include "8515def.inc"
.org 0x0000
rjmp reset
rjmp START
.org 0x0009
.def Temp =r16
.def Temp2 =r17
.def Delay2 =r18
RESET:
ldi Temp, 0xFF
out DDRB,Temp
ldi Temp, 0x00
out DDRD,Temp
ldi Temp, 0xff
out PINB,Temp
START:
ldi Temp2, low(RAMEND)
out SPL, Temp2
ldi Temp2, high(RAMEND)
out SPH, Temp2
ldi Temp , 0b10001111
out MCUCR, Temp
sei
ldi Temp, 0b11111111
out PORTB,Temp
sbis PIND,6
rjmp rakna
sbis PIND,7
rjmp LOOP
sbis PIND,5
rjmp snurr
rjmp START
rakna:
ldi Temp, 0b11101111
out PORTB,Temp
rcall delay_05
ldi Temp, 0b11010111
out PORTB,Temp
rcall delay_05
ldi Temp, 0b11000111
out PORTB,Temp
rcall delay_05
ldi Temp, 0b01010101
out PORTB,Temp
rcall delay_05
ldi Temp, 0b01000101
out PORTB,Temp
rcall delay_05
ldi Temp, 0b00010001
out PORTB,Temp
rcall delay_05
rcall delay_05
rjmp START
snurr:
ldi Temp, 0b11111101
out PORTB,Temp
rcall delay_05
ldi Temp, 0b11111011
out PORTB,Temp
rcall delay_05
ldi Temp, 0b11101111
out PORTB,Temp
rcall delay_05
ldi Temp, 0b10111111
out PORTB,Temp
rcall delay_05
ldi Temp, 0b11011111
out PORTB,Temp
rcall delay_05
ldi Temp, 0b10111111
out PORTB,Temp
rcall delay_05
ldi Temp, 0b01111111
out PORTB,Temp
rcall delay_05
ldi Temp, 0b10111111
out PORTB,Temp
rcall delay_05
ldi Temp, 0b11101111
out PORTB,Temp
rcall delay_05
ldi Temp, 0b11111011
out PORTB,Temp
rcall delay_05
ldi Temp, 0b11110111
out PORTB,Temp
rcall delay_05
ldi Temp, 0b11111011
out PORTB,Temp
rcall delay_05
rjmp START
LOOP:
pett: sbic PIND,1
rjmp ptva
rjmp ett
ptva: sbic PIND,1
rjmp ptre
rjmp tva
ptre: sbic PIND,1
rjmp pfyra
rjmp tre
pfyra: sbic PIND,1
rjmp pfem
rjmp fyra
pfem: sbic PIND,1
rjmp psex
rjmp fem
psex: sbic PIND,1
rjmp LOOP
rjmp sex
ett:
ldi Temp, 0b11101111
out PORTB,Temp
rjmp pett
tva:
ldi Temp, 0b11010111
out PORTB,Temp
rjmp ptva
tre:
ldi Temp, 0b11000111
out PORTB,Temp
rjmp ptre
fyra:
ldi Temp, 0b01010101
out PORTB,Temp
rjmp pfyra
fem:
ldi Temp, 0b01000101
out PORTB,Temp
rjmp pfem
sex:
ldi Temp, 0b00010001
out PORTB,Temp
rjmp psex
delay_05:
ldi Temp2, 8
outer_loop:
ldi r24, low(3037)
ldi r25, high(3037)
delay_loop:
adiw r24, 1
brne delay_loop
dec Temp2
brne outer_loop
ret
den funkar så att först kommer man till start och där får man välja med knappar vilket "program" man vill köra på pinne 7 kommer man till en tärning och på pinne 6 kommer man till en program som räknar upp till sex och på 5an är det bara lite fladder på dioderna
det jag skulle vilja göra är att ha en knapp som man trycker på och den ska avbryta allt och gå till "huvud menyn"
och vad jag har förståt så måste man ha en interrupt knapp för de.
jag har läst lite i databladet men förstår inte riktigt hur man gör
av det jag har förstod så måste man aktivera int1 för att få en "igång" och det gör man i SREG och GICR eller nåt?
så nu till det oluddiga

hur gör man en "avbryt knapp" = en interrupt
det här kanske vart jätte luddigt hoppas ni förstår

mvh
Sebastian