przerwania pcint a bascom lub assembler

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
Michał17
Użytkownik
Posty: 329
Rejestracja: 07 sty 2006, 14:25
Lokalizacja: Łódź

przerwania pcint a bascom lub assembler

Post autor: Michał17 » 13 sty 2007, 20:43

Witam.
Jak w Bascomie lub assmie obsłóżyć przerwania PCINT??
pozdro for [you]
Michal17

ZbeeGin

Post autor: ZbeeGin » 13 sty 2007, 22:52

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:

Kod: Zaznacz cały

    .org   0x000b
    rjmp   PCINT_hadler

;dalsza cześć programu

PCINT_Handler:
;   ...
    reti
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. :grin:

michal17 pisze:pozdro for ZbeeGin
W podpisie nie wystarczy??? :evil:
Ostatnio zmieniony 14 sty 2007, 19:19 przez ZbeeGin, łącznie zmieniany 1 raz.

mathieiov
Moderator
Posty: 829
Rejestracja: 31 lip 2005, 9:04
Lokalizacja: --

Post autor: mathieiov » 14 sty 2007, 10:02

ZbeeGin pisze:W podpisie nie wystarczy??? :evil:
Na forum chyba zapanowała nowa moda: im więcej tagów [ you] tym lepiej :roll:

ZbeeGin

Post autor: ZbeeGin » 14 sty 2007, 10:10

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

Michał17
Użytkownik
Posty: 329
Rejestracja: 07 sty 2006, 14:25
Lokalizacja: Łódź

Post autor: Michał17 » 14 sty 2007, 12:08

program ma być w BASCOMie a z assma zrobiłbym wstawki

Kod: Zaznacz cały

Enable interrupts
$asm
    .org   0x000b 
    rjmp  PCINT 
$end asm
 ...
 ...

PCINT:
wykonać po przerwaniu
return
Czy tak będzie dobrze ??

ZbeeGin

Post autor: ZbeeGin » 14 sty 2007, 12:34

Niestety nie, bo pseudo instrukcja ORG nie przejdzie kompilacji. :( Nie można sobie żonglować adresami w BASCOMie.
Ostatnio zmieniony 14 sty 2007, 20:30 przez ZbeeGin, łącznie zmieniany 3 razy.

Michał17
Użytkownik
Posty: 329
Rejestracja: 07 sty 2006, 14:25
Lokalizacja: Łódź

Post autor: Michał17 » 14 sty 2007, 12:36

a jest inny sposób ??

ZbeeGin

Post autor: ZbeeGin » 14 sty 2007, 13:01

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:

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 Address
i można użyć konstrukcji:

Kod: Zaznacz cały

On Pcint0 Pcint
Enable Pcint0
Enable Interrupts
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ć...

Michał17
Użytkownik
Posty: 329
Rejestracja: 07 sty 2006, 14:25
Lokalizacja: Łódź

Post autor: Michał17 » 14 sty 2007, 18:46

planowałem używać tiny2313 i mega 88

[ Dodano: 2007-01-14, 18:54 ]
a co gdyby zmienić attiny2313def.dat :?:

ZbeeGin

Post autor: ZbeeGin » 14 sty 2007, 19:06

AtMega88 posiada trzy źródła:

Kod: Zaznacz cały

PCINT0=$003     ;Pin Change Interrupt0
PCINT1=$004	;Pin Change Interrupt1
PCINT2=$005	;Pin Change Interrupt2
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.

Michał17
Użytkownik
Posty: 329
Rejestracja: 07 sty 2006, 14:25
Lokalizacja: Łódź

Post autor: Michał17 » 14 sty 2007, 19:08

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

Post autor: ZbeeGin » 14 sty 2007, 19:13

michal17 pisze:a co gdyby zmienić attiny2313def.dat
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.
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
Włączy reakcje na koncówkach od PB4 do PB0. Nie ma jescze żadnej instrukcji CONFIG PCI obsługujących grupę przerwań PCINT... :(
Ostatnio zmieniony 14 sty 2007, 19:15 przez ZbeeGin, łącznie zmieniany 1 raz.

Michał17
Użytkownik
Posty: 329
Rejestracja: 07 sty 2006, 14:25
Lokalizacja: Łódź

Post autor: Michał17 » 14 sty 2007, 19:15

czyli można w bascomie w attiny2313 używać pcint :?:

ZbeeGin

Post autor: ZbeeGin » 14 sty 2007, 19:17

michal17 pisze:czyli można w bascomie w attiny2313 używać pcint
Owszem można, przykład - z forum MCS - miałeś podany pięć postów wyżej. Wymaga to nieco robótek ręcznych, ale działa.

Michał17
Użytkownik
Posty: 329
Rejestracja: 07 sty 2006, 14:25
Lokalizacja: Łódź

Post autor: Michał17 » 14 sty 2007, 19:18

no to tyle.
Dzięki
Temat można zamknąć.

ODPOWIEDZ