Empecé a trabajar con AVRs hace unos días. Comenzó con ensamblador y simulando en Proteus.
Mi objetivo actual es habilitar la interrupción de cambio de pin en PCINT0, que es PB0 en mi attiny13 . En este momento estoy siguiendo el problema. He habilitado external interrupt request
, pero no puedo hacer que el chip active la interrupción en el pin PCINT0.
Elcódigoes
.deviceattiny13;---Codesegment---.CSEG.ORG$0;interruptvectortablerjmpReset;resethandlernop;IRQ0rjmpPCINT;PCINT0(pinINT0toINT5)PCMSK,MCUCRnop;Timer0overflownop;EEPROMreadynop;Analogcomparatornop;Timer0compareAnop;Timer0compareBnop;watchdognop;ADCconversion.ORG0x10;staringafterinterruptvectortablerjmpStartPCINT:retiReset:ldir16,low(RAMEND)outSPL,r16sei;enablinginterruptsStart:ldir16,0b000000outDDRB,r16inr16,MCUCR;changetriggeringedgefortheinterruptorir16,0x03outMCUCR,r16ldir16,0x60outGIMSK,r16;PCIEoutGIFR,r16ldir16,0x01outPCMSK,r16Loop:rjmpLoop
EnlaseccióndespuésdeetiquetarStart
,todoslosregistrosymarcasquehabilitanlasinterrupcionesseconfigurandeacuerdoconlasI
en SREG
, ISC00
y ISC01
en MCUCR
, PCINT0
en PCMSK
, PCIE, INT0
en GIMSK
y PCIF
en GIFR
.
La depuración en Proteus, sin embargo, muestra que se está activando INT0 (segundo vector), pero no PCINT0 (tercer vector).
¿Puedes decirme, por favor, qué estoy haciendo mal?
Actualizar
Se sugirieron varios cambios en el código en los comentarios y así es como he modificado el código, que todavía no causa una interrupción al presionar el botón mientras simulaba en Proteus.
Reset:
ldi r16, low(RAMEND)
out SPL, r16
Start:
ldi r16, 0b000000
out DDRB, r16 ; port B input/output
ldi r16, 0x20
out GIFR, r16 ; clearing interrupt flag
out GIMSK, r16 ; Pin change interrupt enable
ldi r16, 0x01
out PCMSK, r16 ; enable PCINT0
sei
Actualización 2
Estoy usando Proteus 8 v8.1 con simulación avanzada en Windows 8 (x64), luego de eso actualicé a Proteus 8.4. El resultado sigue siendo el mismo.