przerwania pcint a bascom lub assembler
przerwania pcint a bascom lub assembler
Witam.
Jak w Bascomie lub assmie obsłóżyć przerwania PCINT??
pozdro for [you]
Michal17
Jak w Bascomie lub assmie obsłóżyć przerwania PCINT??
pozdro for [you]
Michal17
-
ZbeeGin
W BASCOM może być problem, bo nie rozpoznaje on pełnego nazewnictwa przyjętego przez ATMEL-a dla źródeł przerwań. Musiałbym sprawdzić...
Jeśli chodzi o asm to wystarczy skok do odpowiedniej procedury umieścić pod adresem przerwania. Dla Tiny2313 będzie to:
Poźniej włączyć sygnał zgłoszenia dla danej końcówki w rejestrze PCIMSK oraz właczyć źródło przerwania PCINT w rejestrze GIMSK, i włączyć globany system przerwań przez umieszczenie w programie instrukcji sei.
Pamiętaj też o ustawieniu stosu, inaczej pójdzie w krzaki.

Jeśli chodzi o asm to wystarczy skok do odpowiedniej procedury umieścić pod adresem przerwania. Dla Tiny2313 będzie to:
Kod: Zaznacz cały
.org 0x000b
rjmp PCINT_hadler
;dalsza cześć programu
PCINT_Handler:
; ...
retiPamiętaj też o ustawieniu stosu, inaczej pójdzie w krzaki.
W podpisie nie wystarczy???michal17 pisze:pozdro for ZbeeGin
Ostatnio zmieniony 14 sty 2007, 19:19 przez ZbeeGin, łącznie zmieniany 1 raz.
-
ZbeeGin
Dla przykładu:
Kod: Zaznacz cały
.include "tn2313def.inc"
;----------------------------------------------------------
.org 0
rjmp after_reset ;po resecie
.org 0x000b ;jak PCInt się zgłosi
rjmp pcint_Handler
;----------------------------------------------------------
;przerwanie PCINT
pcint_Handler:
push r16
in r16, PORTD ;przesuniemy sobie 1
rol r16 ;po porice D
out PORTD, r16
pop r16
reti
;----------------------------------------------------------
;główny program - inicjalizacja
after_reset:
ldi r16, (RAMEND - 2) ;najpierw stos
out SPL, r16
ldi r16, (1<<PCIE) ;włączymy przerwania PCINT
out GIMSK, r16
ldi r16, (1<<PCINT0) ;reakcja na zmianę na pinie PB0
out PCMSK, r16
sei ;startuj z przerwaniami
;główny program - głowna pętla
sbi PORTD, 0 ;taki mały efekt
_loop:
rjmp _loop ;pusta pętla
program ma być w BASCOMie a z assma zrobiłbym wstawki
Czy tak będzie dobrze ??
Kod: Zaznacz cały
Enable interrupts
$asm
.org 0x000b
rjmp PCINT
$end asm
...
...
PCINT:
wykonać po przerwaniu
return
-
ZbeeGin
-
ZbeeGin
Dla niektórych mikrokontrolerów jest jednak furtka w postaci wpisania nazwy przerwania jaka występuje w plikach DEF. Dla przykładu, zdefiniowane źródła dla Mega48:
i można użyć konstrukcji:
Oczywiście samo włączenie wektorów przerwań nie pomoże. Należy jeszcze ustawić co nieco w rejestrach związanych z Pin Change Interrupts.
Dla Tiny2313 wyżej wymieniony sposób działa ale nie do końca. Nie można użyć polecenia Enable Pcint gdyż nie jest zdefiniowany bit PCIE. Jeśli używasz właśnie tego procka to zajrzyj na forum MCS Electronics: http://www.mcselec.com/index2.php?optio ... pic&t=2602 Luciano napisał tam dość ciekawy programik.
Nie wiem jakiego mikrokontrolera będziesz używał. Jeśli będzie to nieco starszy układ z rodziny Mega lub Tiny to podany sposób może zadziałać. Należy spróbować...
Kod: Zaznacz cały
[INTS]
INT0=$001 ; External Interrupt0 Vector Address
INT1=$002 ; External Interrupt1 Vector Address
PCINT0=$003 ;Pin Change Interrupt0
PCINT1=$004 ;Pin Change Interrupt1
PCINT2=$005 ;Pin Change Interrupt2
WDT=$006 ;Watchdog Timeout
OC2A =$007 ; Output Compare2 Interrupt Vector Address
OC2B =$008 ; Output Compare2 Interrupt Vector Address
OVF2=$009 ; Overflow2 Interrupt Vector Address
ICP1=$00A ; Input Capture1 Interrupt Vector Address
OC1A=$00B ; Output Compare1A Interrupt Vector Address
OC1B=$00C ; Output Compare1B Interrupt Vector Address
OVF1=$00D ; Overflow1 Interrupt Vector Address
OC0A=$00E ; Output Compare2 Interrupt Vector Address
OC0B=$00F ; Output Compare2 Interrupt Vector Address
OVF0=$010 ; Overflow0 Interrupt Vector Address
SPI =$011 ; SPI Interrupt Vector Address
URXC=$012 ; USART Receive Complete Interrupt Vector Address
UDRE=$013 ; USART Data Register Empty Interrupt Vector Address
UTXC=$014 ; USART Transmit Complete Interrupt Vector Address
ADCC=$015 ; ADC Interrupt Vector Address
ERDY=$016 ; EEPROM Interrupt Vector Address
ACI =$017 ; Analog Comparator Interrupt Vector Address
TWI =$018 ; Irq. vector address for Two-Wire Interface
SPM =$019 ; SPM complete Interrupt Vector AddressKod: Zaznacz cały
On Pcint0 Pcint
Enable Pcint0
Enable InterruptsDla Tiny2313 wyżej wymieniony sposób działa ale nie do końca. Nie można użyć polecenia Enable Pcint gdyż nie jest zdefiniowany bit PCIE. Jeśli używasz właśnie tego procka to zajrzyj na forum MCS Electronics: http://www.mcselec.com/index2.php?optio ... pic&t=2602 Luciano napisał tam dość ciekawy programik.
Nie wiem jakiego mikrokontrolera będziesz używał. Jeśli będzie to nieco starszy układ z rodziny Mega lub Tiny to podany sposób może zadziałać. Należy spróbować...
-
ZbeeGin
AtMega88 posiada trzy źródła:
Dodatkowo interesować cię będą rejestry:
PCIFR - wskazuje z której grupy przewanie było zgłoszone PCINT0, PCINT1, PCINT2,
PCIMSK0, PCIMSK1, PCIMSK2 - ustawiasz które końcówki mają reagować na zmiany stanu,
PCICR - włącza zgłaszanie przerwań przez zmiany stanu.
Kod: Zaznacz cały
PCINT0=$003 ;Pin Change Interrupt0
PCINT1=$004 ;Pin Change Interrupt1
PCINT2=$005 ;Pin Change Interrupt2PCIFR - wskazuje z której grupy przewanie było zgłoszone PCINT0, PCINT1, PCINT2,
PCIMSK0, PCIMSK1, PCIMSK2 - ustawiasz które końcówki mają reagować na zmiany stanu,
PCICR - włącza zgłaszanie przerwań przez zmiany stanu.
a gdyby na końcu dopisać:
Kod: Zaznacz cały
PCINT0=$013 ;Pin Change Interrupt0
PCINT1=$014 ;Pin Change Interrupt1
PCINT2=$015 ;Pin Change Interrupt2
PCINT3=$016 ;Pin Change Interrupt3
PCINT4=$017 ;Pin Change Interrupt4
PCINT5=$018 ;Pin Change Interrupt5
PCINT6=$019 ;Pin Change Interrupt6
PCINT7=$020 ;Pin Change Interrupt7
-
ZbeeGin
W jakim celu chcesz go zmienić? On Interrupt rozpoznaje PCINT jako źródło przerwania. Zamiast Enable PCINT możesz napisać przecież: Set GIMSK.5 - analogicznie Disable PCINT przez Reset GIMSK.5.michal17 pisze:a co gdyby zmienić attiny2313def.dat
Co do ustawiania reakcji na określonych końcówkach, to musisz i tak wpisywać maski bitowe do PCMSK. Na przykład:
Kod: Zaznacz cały
PCIMSK = &B00001111
Ostatnio zmieniony 14 sty 2007, 19:15 przez ZbeeGin, łącznie zmieniany 1 raz.
-
ZbeeGin