logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[AVR Studio] Symulacja przerwań

Mess-gd 07 Gru 2004 00:27 3666 15
REKLAMA
  • #1 1042260
    Mess-gd
    Poziom 14  
    Zabrałem sie do pracy na AVR Studio... Mam pytanie jak zasymulować wtym programie przerwania ?

    Pozdrawiam.
  • REKLAMA
  • #2 1042380
    LordBlick
    VIP Zasłużony dla elektroda
    Trzeba tak samo, jak w procesorze, włączyć je i skonfigurować w procedurze inicjalizacji/resetu. Pauzujesz symulację i przełączasz się na pracę krokową i udajesz kwarc... ;) Np. po odpowiedniej ilości cykli zegara pojawi się przerwanie od timera/licznika, jeżeli wcześniej je włączysz w TIMSK i ustawisz preskaler w TCCR0 dla Timer0. Zmieniasz wartość PORTD3, podajesz jeden CLK i masz wywołane przerwanie INT1, jeżeli zostało wcześniej włączone w GIMSK i ustawiony sposób wyzwalania (poziom, zbocze itp.) itd...
    Pozdrawiam, LightHouser
  • REKLAMA
  • #3 1044326
    Mess-gd
    Poziom 14  
    Cos nie działa... Ustawiłem SREG, GIFR, i ustawiam "1" na wejsciu INT0. I nic!!! Przerwanie działa niezaleznie od wejscia INT0 jak ustawie odpowiednoi bit w rejestrze GICR (odrazu przerywa).
  • #4 1044560
    LordBlick
    VIP Zasłużony dla elektroda
    Nie GIFR, tylko GICR, no i sposób wyzwalania w MCUCR (bity ISCXX) fajnie jest ustawić w procedurze inicalizującej, lub ręcznie się tym pobawić.
    Ogólnie rzecz ujmując to poprzeglądaj sobie notki katalogowe (pdf) od procesorka, który symulujesz, tam jest wszystko, co trzeba do szczęścia... ;)
    Pozdrawiam, LightHouser
  • #5 1044594
    Mess-gd
    Poziom 14  
    Ok... Przerywania mi działaja :)... Teraz mam tylko 1 jeszcze pytanko. Czy jest jakies polecenie które ustawia bezpośrednio bit w rejestrach takich własnie jak GICR albo MCURC ??
  • #7 1045789
    Mess-gd
    Poziom 14  
    No własnie w tym problem ze nie działa SBI. Komplilator wyswietla, że wystąpił błąd. Chodzi o to ze SBI działa do rejestrów od $0 do $1F a rejestr np. MCUCR jest w $35.
  • #8 1046259
    LordBlick
    VIP Zasłużony dla elektroda
    Ustawianie bitu :
    	in r16, MCUCR
    	sbr r16, (1<<ISC10)
    	out MCUCR, r16

    Kasowanie bitu :
    	in r16, MCUCR
    	cbr r16, (1<<ISC10)
    	out MCUCR, r16

    Można za jednym razem ustawiać i bity do ustawienia i kasować do skasowania :
    	in r16, MCUCR
    	sbr r16, (1<<ISC10)+(1<<ISC00)
    	cbr r16, (1<<ISC01)+(1<<ISC11)
    	out MCUCR, r16

    Pozdrawiam, LightHouser
  • REKLAMA
  • #9 1046694
    Mess-gd
    Poziom 14  
    Ok doszedłem w inny sposób... Jeszcze kolejne pytanie. Czy można definiować zmienne np. PORT miałby się równać rejestrowi we/wy w komórce $18 ?
  • REKLAMA
  • #10 1046869
    LordBlick
    VIP Zasłużony dla elektroda
    Zajrzyj do katalogu, gdzie masz zainstalowane AVRStudio, pod katalog "AvrAssembler\Appnotes\", najczęściej "C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\", masz tam stado plików "*.inc", a w nich praktycznie wszystkie rejestry są zdefiniowane (np. ".equ PORTD =$12"), możesz podejrzeć w nich co i jak, gdyby jednak coś pominięto. Np. dla ATmega8 jest "m8def.inc", a na początku projektu wpisujesz
    .include "m8def.inc"
    lub w najnowszym AVRStudio 4.10 z AVRasm2 :
    #include <m8def.inc>
    Pozdrawiam, LightHouser
  • #11 1046916
    Mess-gd
    Poziom 14  
    A mozna definiować rejestr ? Chodzi o to, że chciałbym żeby 1 rejestr był rejestrem informacyjnym nazwanym np. RI. I czy można zdefiniować połowe rejestru? Np. Mam pod PORT A podpięte 2 urządzenia zajmujące 4 piny. 1 urządzenie nazwałbym U1, a 2 U2 i teraz poleceniem SBR ustawiałbym połowe portu.

    Acha!!! Co do zdefiniowanych zmiennych typu GICR. Okazuje sie, że te zmienne są nie tak skonfigurowane. Zamiast GICR wpisuje mi w PORTA. Czy konfiguracja ta jest do programatora ? Możliwe ze w symulatorze nie są brane pod uwage adresy rejestrów które są od $00 do $1F, co powoduje ze rej. we/wy zaczynają się zamiast od $20 to od $00 co wprowadza pomyłke... Jeżeli tak to jak to zmienić ?
  • #12 1046947
    LordBlick
    VIP Zasłużony dla elektroda
    Mess-gd napisał:
    A mozna definiować rejestr ? Chodzi o to, że chciałbym żeby 1 rejestr był rejestrem informacyjnym nazwanym np. RI. I czy można zdefiniować połowe rejestru? Np. Mam pod PORT A podpięte 2 urządzenia zajmujące 4 piny. 1 urządzenie nazwałbym U1, a 2 U2 i teraz poleceniem SBR ustawiałbym połowe portu.

    Nic nie stoi na przeszkodzie, abyś sobie zrobił podprocedurkę, w której np. do rejestru r16 wstawiasz tylko 4 bity dla jednego urządzenia, a w rejestrze r17 - dla drugiego, a ona środku sobie robi :
    	and r16, 0x11110000
    	lsl r16
    	lsl r16
    	lsl r16
    	lsl r16
    	and r17, 0x00001111
    	or r16, r17
    	out PORTA, r16

    Mozna to rozwiązać też na odczytywaniu PORTA i odpowiednich operacjach logicznych.
    Zapis tylko dla r16 :
    	lsl r16
    	lsl r16
    	lsl r16
    	lsl r16
    	in r17, PORTA
    	and r17, 0x00001111
    	or r16, r17
    	out PORTA, r16

    Odczyt tylko dla r16 :
    	in r16, PORTA
    	lsr r16
    	lsr r16
    	lsr r16
    	lsr r16
    	and r16, 0x11110000
    Itd...
    Mess-gd napisał:
    Acha!!! Co do zdefiniowanych zmiennych typu GICR. Okazuje się, że te zmienne są nie tak skonfigurowane. Zamiast GICR wpisuje mi w PORTA. Czy konfiguracja ta jest do programatora ? Możliwe ze w symulatorze nie są brane pod uwage adresy rejestrów które są od $00 do $1F, co powoduje ze rej. we/wy zaczynają się zamiast od $20 to od $00 co wprowadza pomyłke... Jeżeli tak to jak to zmienić ?

    Generalnie wszystkie stałe w plikach "*inc" są dla kompilowanych programów. A w symulatorze masz możliwość wyboru procesora, który chcesz symulować (Debug/Select Platform and Device...) i od tego zależy gdzie lądują adresy poszczególnych portów.
    Pozdrawiam, LightHouser
  • #13 1047269
    Mess-gd
    Poziom 14  
    No tak, ale jak wybrałem procesor ATMEGA8515 i plik m8515def.inc to wszystko powinno być dorze, a jednak nie jest...

    Nie odpowiedziałeś czy można definiować rejestr, np. RI = r17
  • #14 1048200
    LordBlick
    VIP Zasłużony dla elektroda
    Mess-gd napisał:
    No tak, ale jak wybrałem procesor ATMEGA8515 i plik m8515def.inc to wszystko powinno być dorze, a jednak nie jest...

    No cóż, bugi się zdarzają... Ja przestałem się bawić w symulację, to co chcę sprawdzić to najczęściej wypluwam na wyświetlacz.
    Mess-gd napisał:
    Nie odpowiedziałeś czy można definiować rejestr, np. RI = r17

    Jak najbardziej, nawet wszystkie : ;)
    .equ	Xtal=16000000 ;16 MHz => ~62,5e-9 s ~=62,5ns clock tick
    .def	MemoByteLo =r0		;Used for EEPROM & Program Flash Memory access and Lo byte for result of multiply
    .def	MemoByteHi =r1		; Hi byte for result of multiply
    .def	IntSaveMemoByteLo =r2	;
    .def	IntSaveSREGByte =r3		;
    .def	IntSaveTempA =	r4	;
    .def	IntSaveTempB = r5
    .def	IntSaveDataByte =r6		;
    .def	IntSaveXLByte = r7
    .def	IntSaveXHByte = r8
    .def	IntSaveZLByte = r9
    .def	IntSaveZHByte = r10
    .def	StoreZL = r11
    .def	StoreZH = r12
    .def	ZeroByte =	r13	;
    .def	IntMul =	r14	;
    .def	DummyByte=r15	;used in decrement and increment X, Y, Z by (ld DummyByte, (-)X/Y/Z(+)
    .def	DataByte =r16		;
    .def	TempA =	r17	;
    .def	TempB =	r18	;
    .def	CountBtL =r19	;
    .def	CountBtH =r20	;
    .def	TempCInt =	r21	;
    .def	TL =	r22	;
    .def	TH =	r23	;
    .def	AddWordL =r24		;
    .def	AddWordH =r25		;
    ;r26-r31 -> X, Y, Z
    .equ	IFlag=7
    .equ	TFlag=6
    .equ	HFlag=5
    .equ	SFlag=4
    .equ	VFlag=3
    .equ	NFlag=2
    .equ	ZFlag=1
    .equ	CFlag=0
    
    To jest taka moja prywatna koncepcja nazywania rejestrów. Z zasady uzywam tych wyższych (r16-r31), bo ldi działa tylko z nimi, a tamte służą do pośledniejszych operacji, np. r13 służy mi jako "szybkie zero", przechowywanie wartości najczęściej uzywanych innych rejestrów podczas przerwań itd...
    Pozdrawaim, LightI
  • #15 1048741
    Mess-gd
    Poziom 14  
    Ok... Ostatnie pytanie... Bo juz nie mam pomysłów. Jaki stan ma wiszący pin ustawiony jako wejście ? To bedzie tak samo jak dla TTL-i ? Czyli wisząca nóżka jest w stanie wysokim ?
  • #16 1049003
    LordBlick
    VIP Zasłużony dla elektroda
    Pomysły, jak zwykle najlepiej czerpać z not katalogowych, bo nie nadążam wklejać... ;)
    W AVR każdy port "zewnętrzny" ma 3 rejestry:
    - kierunku danych DDRX (1 - wyjście; 0 - wejście)
    - danych wychodzących PORTX
    - danych wchodzących PINX
    jeżeli ustawimy dany pin w porcie (albo cały port) jako wejście, to teraz jeżeli ustawimy odpowiadający bit w rejestrze danych wyjściowych PORTX na 1, to wejście bedzie podciągnięte do Vcc, a jeżeli 0 - pin jest w stanie wysokiej impedancji, czyli sobie "lata" (można go w projekcie wtedy np. ściągnąć do GND, w każdym bądź razie pin w takim stanie stanowi niezbyt znaczące obciążenie dla innych wyść).
    Pozdrawiam, LightI
REKLAMA