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

"modyfikator sygnału' - kilka pytań praktycznych??

bocian_s 12 Kwi 2005 13:18 2198 14
  • #1 1398468
    bocian_s
    Poziom 12  
    Posty: 74
    Pomógł: 1
    Ocena: 4
    Witam.

    W ramach poznania procesorów atmela chciałbym zrealizować układ "modyfikatora sygnału" Jego zadaniem będzie modyfikacja czasu trwania sygnału wejściowego poprzez wydłużenie bądź skrócenie o stałą wartość lub też poprzez przemnożenie przez stały współczynnik z zakresu 1.00 do 2.55.

    Algorytm programu i część kodu już stworzyłem. NIe było to trudne bo w czasach edukacyjnych bawiło mnie pisanie programów na mikroprocesory. Na chwilę obecną jestem na etapie pisania programu w assemblerze pod procesor AT90S2313, kompilacji i symulacji w AVRstudio4.

    Do dzisiaj miałem problem ze stosem i wywoływaniem podprogramów ale po przeczytaniu kilku tematów na tym forum chyba już wiem jak to będzie:

    ldi (rejestr),ramend
    out spl,(rejestr)

    Jak się mylę to poprawcie. Ram ma zasadniczo wolny więc stos może być naprawdę spory.

    MOje pytania bardzije będa się tyczyły zaprojektowania jakiejś prostej klawiatury na 5 klawiszy. 2 do regulacji współczynnika mnożenia, dwa do wydłużania bądź skracania, 1 do zapisania nastaw do eeproma. Do podłaczenia i skonfigurowania klawiatury mam do dyspozycji cały port D.
    Myślałem nad tym aby obsługę klawiatury zrealizować na przerwaniach zewnętrznych INT0 i INT1, tak żeby INT0 reagowało na zmianę współczynników a INT1 realizował zapis do eeproma.
    Pomysł jest taki żeby przez jakieś inwertery z przerzutnikiem "szmita" sterować wejściami INT0 i trzema innymi do regulacji oraz INT1. NIe wiem tylko co zrobić z drganiem styków bo czas obsługi przerwań jest istotny.

    Czy przerwania reagują na zbocze czy poziom logiczny??

    I na koniejc jeszcze jedno pytanko odnośnie wejść-wyjść. PortB jest zdeklarowany jako 4 wejścia i odpowiadajace im 4 wyjścia. Czy zmianę stanów wyjściowych uzyskuje się poprzez zmianę rejestru PORTB czy PINB. Jeśli PINB to jak zrealizować żeby stan utrzymywał się ciągle przez jakiś okres czasu.

    Przepraszam za tak długi tekst i proszę o odrobinę wyrozumiałości dla mnie. Dopiero zaczynam zabawę z AVRami i pytam o to czego nie doczytałem albo przegapiłem w PDFach. Wszelkie konstruktywne odpowiedzi będą mile widziane.

    Pozdrawiam
    Bocian_s
  • #2 1401976
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    bocian_s napisał:
    [...]Do dzisiaj miałem problem ze stosem i wywoływaniem podprogramów ale po przeczytaniu kilku tematów na tym forum chyba już wiem jak to będzie:

    ldi (rejestr),ramend
    out spl,(rejestr)

    Jak się mylę to poprawcie. Ram ma zasadniczo wolny więc stos może być naprawdę spory.
    To jest w porządku, jakbyś później przenosił program na procesorek z większą ilością RAM to nie zapomnij, że wtedy wskaźnik stosu jest przechowywany w SPL:SPH :
    ldi TempA, HIGH(RAMEND)
    	out SPH, TempA
    	ldi TempA, LOW(RAMEND)
    	out SPL, TempA

    bocian_s napisał:
    MOje pytania bardzije będa się tyczyły zaprojektowania jakiejś prostej klawiatury na 5 klawiszy. 2 do regulacji współczynnika mnożenia, dwa do wydłużania bądź skracania, 1 do zapisania nastaw do eeproma. Do podłaczenia i skonfigurowania klawiatury mam do dyspozycji cały port D.

    W twoim projekcie swobodnie można się zmieścić w 4 klawiszach : [+]; [-]; [SHIFT] (wciśnięty - regulujesz współczynnik mnożenia, puszczony - regulujesz opóźnienie/przyspieszenie) i [WRITE EE]
    bocian_s napisał:
    Myślałem nad tym aby obsługę klawiatury zrealizować na przerwaniach zewnętrznych INT0 i INT1, tak żeby INT0 reagowało na zmianę współczynników a INT1 realizował zapis do eeproma.
    Pomysł jest taki żeby przez jakieś inwertery z przerzutnikiem "szmita" sterować wejściami INT0 i trzema innymi do regulacji oraz INT1. NIe wiem tylko co zrobić z drganiem styków bo czas obsługi przerwań jest istotny.
    Obsługa klawiatury przez wywołanie zewnątrzne, też miałem kiedyś taki pomysł... ;) Szybko jednak przerzuciłem się na Timer0 i w obsłudze jego przepełnienia sprawdzam stan klawiszy. Ma to podstawową zaletę, nie jesteś przyklejony do konkretnego wyprowadzenia. Wciśnięcie klawisza można sobie wykrywać nawet 300 ms wcześniej lub później, nie będzie to miało istotnego wpływu na działanie projektu. INT0/1 stosuje sie w czasowo istotnych momentach, np. jak budujesz układ sterujący regulacją mocy napięcia przemiennego, to tu podajesz sygnał przejścia napięcia przez zero, aby procedurka obsługi właczyła timer odliczający do momentu załaczenia trystora.
    bocian_s napisał:
    Czy przerwania reagują na zbocze czy poziom logiczny??
    :arrow: pdf od AT90S8515, s. 30 tabelki 5, 6... ;)

    bocian_s napisał:
    I na koniejc jeszcze jedno pytanko odnośnie wejść-wyjść. PortB jest zdeklarowany jako 4 wejścia i odpowiadajace im 4 wyjścia. Czy zmianę stanów wyjściowych uzyskuje się poprzez zmianę rejestru PORTB czy PINB. Jeśli PINB to jak zrealizować żeby stan utrzymywał się ciągle przez jakiś okres czasu.
    W/w pdf, np. s.64, tabelka 19
    No i żeby nie było, że temat nie był omawiany - klik... ;)
    Możesz tez do wyszukiwarki na górze tej strony ("Szukaj") wrzucić hasła : "PIN" "PORT" "INT0" "INT1"
    Pozdrawiam, Daniel
  • #3 1415845
    bocian_s
    Poziom 12  
    Posty: 74
    Pomógł: 1
    Ocena: 4
    Dzięki za odpowiedź. Niestety układ który próbuję zrealizwowac ma bardzo rygorystyczne wytyczne odnośnie czasów. Chodzi o to że procesor musi być gotowy na nadejście sygnału wejściowego w niemal dowolnej chwili czasowej. Nacisnięcie klawisza będzie występować sporadycznie a właściwie po zestrojeniu urzadzenia w określonych warunkach to praktycznie wcale. Z tego powodu opcja z timerami choć cokolwiek kusząca raczej będzie niepraktyczna w tym zastosowaniu.

    Jeśli chodiz natomiast o klawisz "shift" to też nie bardzo mi się widzi ta opcja. Urządzenie ma być obsługiwane w jak najprostrzy sposób więc żeby uniknąć niedomowień lepiej rozdzielić funkcje regulacyjne tymbardziej że są jeszcze wolne zasoby sprzętowe. Zasadniczo to klawiatura bedzie odpinana a sam procesor pozostanie w funkcjonującym urządzeniu.

    Może w najbliższym czasie umieszczę część programu którą już stworzyłem.
  • #4 1416485
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    bocian_s napisał:
    Niestety układ który próbuję zrealizwowac ma bardzo rygorystyczne wytyczne odnośnie czasów.
    Wszystko zależy od względności pojęcia "rygor". W asemblerze pod AVR rygor zaczyna się, przynajmniej dla mnie ;), poniżej 100µs, a i to jeszcze zależy od użytego zegara - najnowsze konstrukcje latają na 20 MHz, a podejrzewam, że na 24MHz też taki pójdzie... Co do klawiatury to dalej bym się upierał na timerze, w trakcie jednego przerwania moga być wykonwane operacje cząstkowe, które nie trwałyby zbyt długo, albo dołożyć zewnętrzny układ dekodujący klawiaturę na np. 74HC139 i paru bramkach.
    Pozdrawiam, Light'I
  • #5 1425037
    bocian_s
    Poziom 12  
    Posty: 74
    Pomógł: 1
    Ocena: 4
    Oto co do tej pory stworzyłem:


    
    .include "2313def.inc"
    
    .def zero = R0	;zero
    .def one = R1	;jeden	
    .def tsk = R2	;tymczasowy wskaźnik skrócenia
    .def twy = R3	;tymczaspwy wskaźnik wydłużenia
    .def dod = R16	;mnożnik
    .def ode = R17	;dzielnik
    .def skr = R18	;skrócenie
    .def wyd = r19	;wydłużenie
    .def tmp = r20	;rejestr tymczasowy
    .def pod = r21	;pętla do odejmowania
    .def psk = R22	;pętla do skrócenia
    .def pwy = R23	;pętla do wydłużenia
    .def lo = R24	;niższy baht licznika
    .def hi = R25	;wyższy bajt licznika
    
    .org 0x0000
    
    	rjmp RESET
    
    ;----------------- Tabela wektorów przerwań (Interrupt Vectors) ----------------
    
    .org INT0addr ; External Interrupt0 Vector 
    	rjmp zapis  ; Address 
    .org INT1addr ; External Interrupt1 Vector 
    	rjmp zmiana   ; Address 
    .org ICP1addr ; Input Capture1 Interrupt 
    	reti   ; Vector Address 
    .org OC1addr ; Output Compare1A 
    	reti   ; Interrupt Vector Address 
    .org OVF1addr ; Overflow1 Interrupt Vector 
    	reti   ; Address 
    .org OVF0addr ; Overflow0 Interrupt Vector 
    	reti   ; Address 
    .org URXCaddr ; UART Receive Complete 
    	reti   ; Interrupt Vector Address 
    .org UDREaddr ; UART Data Register Empty 
    	reti   ; Interrupt Vector Address 
    .org UTXCaddr ; UART Transmit Complete 
    	reti   ; Interrupt Vector Address 
    .org ACIaddr ; Analog Comparator 
    	reti   ; Interrupt Vector Address 
    ;--------------------------------------------------------------------------------------------- 
    
    
    RESET: 
    	ldi tmp,ramend
    	out spl,tmp
    	clr zero
    	clr one
    	inc one
    	clr hi
    	clr lo
    	ldi dod,50
    	ldi wyd,2
    	ldi skr,0
    	ldi ode,100
    	ldi tmp,$f0
    	ldi tmp,0xf0	;
    	out ddrb,tmp	;ustaw portb 0-3 jako wejścia
    	ldi tmp,0xff	;
    	out portb,tmp	;podciągnij wszystkie w portb do "1"
    	ldi tmp,0xe0	;
    	out ddrd,tmp	;ustaw portd 0-4 jako wejscia
    	ldi tmp,0xff
    	out portd,tmp	;podciągnij wszystkie w portd do "1"
    
    main:					;główna pętla programu
    	sbis pinb,0
    	rjmp delay
    	sbis pinb,1
    	rjmp delay
    	sbis pinb,2
    	rjmp delay
    	sbis pinb,3
    	rjmp delay
    	rjmp main
    
    delay:					;procedura skracania
    	cli					;zablokowanie przerwań	
    	cpi skr,0			;sprawdzanie czy skrócenie =0
    	breq start			;skacz do start jeśli skrócenie =0
    	mov tsk,skr			;załąduj współczynnik opóźnienia do licznika pętli opóźnienia
    	ldi psk,10			;załaduj pętlę opóźnienia
    	clc
    delay1:					;pętla odliczania opóźnienia
    	dec psk				;zmniejsz o 1 wskaźnik pętli
    	brne delay1			;skacz jeśli psk większe od 0
    	sub tsk,one			;zmniejsz licznik pętli opóźnienia
    	cp tsk,zero			;porównanie licnzika pętli z zerem
    	breq start			;jeśli tsk=0 skacz do start
    	ldi psk,10			;załąduj pętlę opuźnienia
    	rjmp delay1
    	
    start:					;procedura rozpoznawania wejścia
    	sbis pinb,0
    	rjmp start0
    	sbis pinb,1
    	rjmp start1
    	sbis pinb,2
    	rjmp start2
    	sbis pinb,3
    	rjmp start3
    	rjmp main
    
    
    start0:					;procedura mnożenia przez dodawanie dla wejścia 0
    	cbi portb,4			;ustaw 0 na pinb5
    	cp dod,zero			;sprawdź czy współczynnik mnożenia = 0
    	breq zwieksz		;jeślo współczynnik mnożenia=0 skacz do zwieksz
    start01:				;pętla sprawdzająca stan wejścia 0 (14 MIPS z podprogramem)
    	sbic pinb,0			;1/2;czy 0 na pinb0
    	rjmp odejmij		;2;jeśli pinb0=1 skacz do odejmij
    	rcall dodaj			;3;wywołaj podprogram dodaj
    	rjmp start01		;2;wróc do począdku pętli sprawdzania portb0
    
    start1:					;procedura mnożenia przez dodawanie dla wejścia 0
    	cbi portb,5			;ustaw 0 na pinb5
    	cp dod,zero			;sprawdź czy współczynnik mnożenia = 0
    	breq zwieksz		;jeślo współczynnik mnożenia=0 skacz do zwieksz
    start11:				;pętla sprawdzająca stan wejścia 0 (14 MIPS z podprogramem)
    	sbic pinb,1			;1/2;czy 0 na pinb0
    	rjmp odejmij		;2;jeśli pinb0=1 skacz do odejmij
    	rcall dodaj			;3;wywołaj podprogram dodaj
    	rjmp start11		;2;wróc do począdku pętli sprawdzania portb0
    
    start2:					;procedura mnożenia przez dodawanie dla wejścia 0
    	cbi portb,6			;ustaw 0 na pinb5
    	cp dod,zero			;sprawdź czy współczynnik mnożenia = 0
    	breq zwieksz		;jeślo współczynnik mnożenia=0 skacz do zwieksz
    start21:				;pętla sprawdzająca stan wejścia 0 (14 MIPS z podprogramem)
    	sbic pinb,2			;1/2;czy 0 na pinb0
    	rjmp odejmij		;2;jeśli pinb0=1 skacz do odejmij
    	rcall dodaj			;3;wywołaj podprogram dodaj
    	rjmp start21		;2;wróc do począdku pętli sprawdzania portb0
    
    start3:					;procedura mnożenia przez dodawanie dla wejścia 0
    	cbi portb,7			;ustaw 0 na pinb5
    	cp dod,zero			;sprawdź czy współczynnik mnożenia = 0
    	breq zwieksz		;jeślo współczynnik mnożenia=0 skacz do zwieksz
    start31:				;pętla sprawdzająca stan wejścia 0 (14 MIPS z podprogramem)
    	sbic pinb,0			;1/2;czy 0 na pinb0
    	rjmp odejmij		;2;jeśli pinb0=1 skacz do odejmij
    	rcall dodaj			;3;wywołaj podprogram dodaj
    	rjmp start31		;2;wróc do począdku pętli sprawdzania portb0
    
    odejmij:				;procedura dzielenia przez 100 
    	cp hi,zero			;sprawdzanie czy hi=0
    	breq odejmijexit	;jeśli hi=0 skacz do odejmijexit
    odejmij1:				;główna pętla odejmowania (14 MIPS)
    	sub lo,ode			;1;odejmij 100 od lo
    	brcc odejmij2		;1/2;jeśli C=0 skacz do odejmij2
    	dec hi				;1;zmniejsz hi o 1
    	breq odejmijexit	;1/2;jeśli hi=0 skacz do odejmijexit
    	rjmp odejmij3		;2;skacz do odejmij
    odejmij2:
    	nop					;1;dla zrównania czasów
    	rjmp odejmij3		;2;skacz do odejmij3
    odejmij3:				;pętla do wrówniania dodawania i odejmowania
    	ldi pod,2			;liczba pętli do wykonania
    odejmij4:
    	dec pod				;zmniejsz licznik pętli o 1
    	brne odejmij4		;jeśli pod różne od 0 skacz do odejmij4
    	rjmp odejmij1		;skacz do odejmij1
    odejmijexit:			;kończenie procedury odejmowania
    	sub lo,ode			;odejmij 100 od lo
    	brcc odejmijexit	;jeśli C=0 skacz do odejmijexit
    	clr hi				;zeruj hi
    	clr lo				;zeruj lo
    	rjmp zwieksz		;skacz do procedury zwiększenia czasu
    
    zwieksz:				;procedura wydłużania czasu
    	cp wyd,zero			;sprawdź czy wdłużenie=0
    	breq end			;jeśli wydłużenie=0 skacz do pońcowej procedury
    	mov twy,wyd			;
    	ldi pwy,200			;ustaw dłuość pętli wydłużenia
    zwieksz1:
    	dec pwy				;zmniejsz współcznnik pętli wydłużenia o 1
    	brne zwieksz1		;skacz do zwieksz1 dopuki pwy różne od 0
    	dec twy				;zmniejsz tymczaswe wydłużenie
    	breq end			;jeśli tymczasowe wydłużenie=0 skacz do końcowej procedury
    	ldi pwy,200			;ustaw długość pętli wydłużenia
    	rjmp zwieksz1		;skacz do zwieksz1
    
    end:					;końcowa procedura modyfikacji sygnału wejściowego
    	ldi tmp,0xff
    	out portb,tmp		;ustaw na wszystkich pinach 1
    	sei					;odblokuj przerwania
    	rjmp main			;skacz do programu głównego
    
    dodaj:					;podprobram dodawania
    	add lo,dod			;1;dodaj współczynnik dodawania do lo
    	brcc dodajexit		;1/2;skocz jeślni nie było C=0
    	inc hi				;1;zwiększ hi o 1
    dodajexit:
    	ret					;4;powrót z podprogramu (7 MIPS)
    
    
    zapis:
    	ldi r30,0xff
    	reti
    
    zmiana:
    	ldi R31,0xff
    	reti
    


    Co do rygrou to istotna jest powiedzmy dokładność 0,01ms co daje jakieś 10µs

    PS. Lighti za twoją rada poprawiłem.
  • #6 1426348
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    bocian_s napisał:
    PS. Sorqa za tabulacje. Normalnie to wszystko jest uporządkowane.
    Zamiast "quote", użyj "code", a będzie w porządku... ;)
    Czy z projektem dalej jakieś problemy ?
    Light'I
  • #7 1426797
    bocian_s
    Poziom 12  
    Posty: 74
    Pomógł: 1
    Ocena: 4
    Light'­­­­I napisał:

    ...
    Czy z projektem dalej jakieś problemy ?
    Light'I


    Zasadniczo jeden. Wszystko nadal w fazie symulacji komputerowej. Jakoś nie mam czasu do tego przysiąść i dokończyć. Naszczęście terminy mnie bardzo nie gonią.
  • #8 1536250
    bocian_s
    Poziom 12  
    Posty: 74
    Pomógł: 1
    Ocena: 4
    Pytanie za które mogę zostać wyrzucony z forum elektrody.
    Rozkaz SUB - odejmowanie bez pożyczki - kiedy ustawia bid "C"?? Stwierdziłem że w projekcie 2-ubajtowa zmienna mnożnika może okazać się za mała więc zaprogramowałem zmienną trzybajtową. procedura dzielenia odbywa sięmetodą wielokrotnego odejmowania. Rozkaz DEC ustawia bit Z jeśli rejestr osiągnie 0. NIe bardzo mi jest to na rękę więc zdecydowałem się na odejmowanie rozkazem SUB. I tu moje pytanie jeśli od jakiegoś rejestru odejmuję rejest w którym jest wartość 1 to czy bit C zostanie ustawiony w chwili gdy modyfikowany rejestr osiągnie wartość 1, 0 czy operacji 0-1 gdzie wynik końcowy w rejestrze będzie 255. NIe bardzo qmam w którym momencie następuje porównanie rejestrów (zależność do ustawienia bitu C) - przed czy po dokonaniu operacji matematycznej.

    Druga sprawa to czy przy ISP musi być konkretny rezonator kwarcowy podczas programowania czy dowolny zaakceptowany przez AVR-a??

    Przepraszam za lamerskie pytania. Na przyszłość postaram się poprawić.

    A i jeszcze jedno może mik toś w kilku słowach wyjaśnić zależności czasowe przy zapisywaniu zmiennej do EEproma i we. podaćjakiś przykładowy algorytm procedury zapisu.
  • #9 1536679
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    Mam tu wkleić całego pdfa od procesora ? ;)
    Widziałeś może się z plikiem pomocy "C:\Program Files\Atmel\AVR Tools\Help\AVRASM.chm", który tam jest po zainstalowaniu AVRStudio ? ;) Znajdziesz tam więcej informacji, niż jestem tu w stanie tłumaczyć, nie tylko o sub...
    Cytat:
    C: Rd7 • Rr7 +Rr7 • R7 +R7 • Rd7
    Set if the absolute value of the contents of Rr is larger than the absolute value of Rd; cleared otherwise.
    Po polsku - flaga przeniesienia C jest ustawiana, gdy wartość absolutna rejestru Rr(odjemnik) jest większa od wartości absolutnej w rejestrze docelowym Rd(odjemna i zarazem różnica po zakończeniu odejmowania) przed rozpoczeciem operacji odejmowania, czyli inaczej, gdy wynik odejmowania absolutnych wartości jest ujemny. W innym przypadku jest zerowana.
    ISP polega na niewyciaganiu mikrokontrolera z układu w którym on pracuje... ;) Tak więc programowanie musi działać przy takich samych warunkach.
    Co do EEPROM, to jeśli masz na myśli ten wbudowany, to rownież znajdziesz odpowiedź z przykładami w nocie katalogowej(Datasheet od AT90S2313, do którego zamiesciłeś wcześniej kod programu) oraz w notach aplikacyjnych AVR100, AVR101, AVR103 i AVR104.
    --
    Pozdrawiam, Daniel
  • #10 1537955
    bocian_s
    Poziom 12  
    Posty: 74
    Pomógł: 1
    Ocena: 4
    NIe nerwuj się tak Light'i.
    To było lamerskie pytanie ale musiałem je zadać żeby rozwiać wszelkie wątpliwości. Wczoraj przetestowałem sprawę i rozkaz SUB spisuje się wręcz znakomicie.

    W sprawie EEproma. W dokumentacji jest coś o tym że procek zatrzymuje się na (chyba) 4 cykle zegarowe przy dostępie do pamięci EEPROM, oraz czas zapisu trwa około 2ms. Więc nie bardzo rozumiem jak mam podejść do zapisywania kilku kolejnych zmiennych do pamięci nieulotnej. Zadresować komórkę, załadowaćzmienną do bufora, odpalić zapis i co dalej?? czekać aż procesor sam da znać czy zapisał?? Zdaje się że chyba powinna być do tego specjalna flaga.

    Light'i masz sporo wiedzy to widać zle nie zapominaj że PDFy pisane są dla ludzi "z branży" dla których programowanie i działanie mikroprocesora nie ma żadnych tajemnic. Niestety większości z nas udało się tylko pojąć skromną część wiedzy a ludzie tacy jak TY pomagają man zrozumieć zagadnienia zawiłe i wątpliwe dla począdkujących. Za to jesteśmy Ci bardzo wdzięczni.
  • #11 1538666
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    No dobra, dziękuję za czułe słówka, tego mi było brak ;), a oto moje procedurki do sekwencyjnych operacji przepisywania danych ze SRAM do EEPROM, mam nadzieję, ze to coś wyjaśni :
    SeqRead32ItEEPROM:
    	ldi	CountBtL, 0x04 ; Number of bytes to write 32 bits to EEPROM
    ;Proc SeqReadIntrEEPROM(CountBtL<- No. of bytes, XL:XH <- SRAMStartAddr, ZL:ZH <- EEPROMStartAddr )
    SeqReadIntrEEPROM:
    	sbic EECR, EEWE	; if Internal EEPROM Reading is Enabled, it's posible to operation
    	rjmp SeqReadIntrEEPROM
    	out EEARL, ZL
    	out EEARH, ZH
    	ld DataByte, Z+      ; Increment Z point easly 
    	sbi	EECR, EERE	;	set Internal EEPROM read bit
    SeqReadIntrEEPROMLoop:
    	sbic EECR, EERE	;	wait until Internal EEPROM read bit become hardware clear
    	rjmp SeqReadIntrEEPROMLoop
    	in	DataByte, EEDR
    	st	X+, DataByte
    	dec CountBtL
    	brne SeqReadIntrEEPROM
    	ret
    ;----------------------------------
    SeqWrite32ItEEPROM:
    	ldi	CountBtL, 0x04 ; Number of bytes to write 32 bits to EEPROM
    ;Proc SeqWriteIntrEEPROM(CountBtL<- No. of bytes, XL:XH <- SRAMStartAddr, ZL:ZH <- EEPROMStartAddr )
    SeqWriteIntrEEPROM:
    	sbic EECR, EEWE	; if Internal EEPROM Write is Enabled, it's posible to operation
    	rjmp SeqWriteIntrEEPROM
    	out EEARL, ZL
    	out EEARH, ZH
    	ld DataByte, Z+      ; Increment Z point easly 
    	ld	DataByte, X+
    	out	EEDR, DataByte
    	cli
    	sbi	EECR, EEMWE	;	set Internal EEPROM master write bit
    	sbi	EECR, EEWE	;	set Internal EEPROM write bit
    	sei
    	dec CountBtL
    	brne SeqWriteIntrEEPROM
    	ret
  • #12 1538687
    Machoni
    Poziom 13  
    Posty: 55
    Pomógł: 1
    Ocena: 1
    Light'I napisał:
    ISP polega na niewyciaganiu mikrokontrolera z układu w którym on pracuje... ;) Tak więc programowanie musi działać przy takich samych warunkach.


    Programowanie musi zadzialac w warunkach w ktorych procesor normalnie pracuje. Jednak nie znaczy to, ze procesor nie zadziala (nie wykona programu) gdy podmienimy mu kwarc na inna wartosc (oczywiscie z zakresu akceptowalnych). Oczywiscie wszelkie zaleznosci czasowe szlag trafi (komunikacja, timery, itp. ).
  • #13 1538713
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    O co Tobie chodzi Machoni ? Czy pisałem, że nie zadziała w innych warunkach ? Szukasz okazji do kłótni ? ;)
    http://sjp.pwn.pl/haslo.php?id=69611 :
    Cytat:
    zadziałać dk I, ~am, ~asz, ~ają, ~aj, ~ał
    1. «o mechanizmach, aparatach: zacząć funkcjonować»
    Po włączeniu do sieci automat zadziałał.
    (...)
    http://sjp.pwn.pl/haslo.php?id=12380 :
    Cytat:
    działać ndk I, ~am, ~asz, ~ają, ~aj, ~ał
    (...)
    3. «o mechanizmach, aparatach: funkcjonować»
    Telefon, dzwonek, silnik działają.(...)
    O co tobie chodzi ? Jeśli coś ma działać, to wcześniej musi zacząć działać, czyli zadziałać, czyli moje stwierdzenie zawiera w swojej logice również i twoje, jak i również to, że po zadziałaniu nadal będzie działać, czyli nie ukończy działania natychmiast po zadziałaniu... ;)
  • #14 1538766
    Machoni
    Poziom 13  
    Posty: 55
    Pomógł: 1
    Ocena: 1
    Light'I napisał:
    O co chodzi ? Czy pisałem, ze nie zadziała w innych warunkach ?


    No tak to odebralem. Choc faktyczne "musi dzialac przy takich samych warunkach" a "musi byc wykonane przy takich samych warunkach" to nie to samo, i jesli to wlasnie miales na mysli to spoko. Chcialem tylko zwrocic uwage, ze nie sa to (uklad docelowy) watunki konieczne.

    Cytat:
    Szukasz okazji do kłótni ? ;) (...)O co tobie chodzi ? ;)


    Widze ze dodales powyzsze ;) No pewnie ze tak ;P ale moze nie teraz... (i pewnie nie tu), ale poklocic sie zawsze mozna.
  • #15 1544261
    bocian_s
    Poziom 12  
    Posty: 74
    Pomógł: 1
    Ocena: 4
    Program chyba ukończyłem:
    ;Program do "modyfikatora sygnału"
    ;Parametry techniczne dla taktowania 4MHz:
    ;- skrócenie czasu o wartość max ponad 2,5ms z krokiem co 10us
    ;- lub wydłużenie czasu o max stałą wartość ponad 20ms z krokiem co 80us
    ;- mnożenie czasu przez współczynnik około 1,00 do 2,55
    ;- wejścia sygnałowe portB 0-3
    ;- wyjścia sygnałowe portB 4-7
    ;- portD2 - klawisz "zapisz"
    ;- portD2 i portD1 - klawisz "default"
    ;- PortD3 - klawisz "plus"
    ;- portD3 i portD4 - klawisz "minus"
    ;- portD3 i PortD5 - klawisz "razy"
    ;- portD3 i portD6 - klawisz "dziel"
    
    
    .include "2313def.inc"
    
    ;*********************** definiowanie nazw dla poszczególnych rejestrów mikroprocesora**
    
    .def lo = R0			;niższy baht licznika
    .def hi = R1			;wyższy bajt licznika
    .def hi1 = R2			;najwyższy bajt licznika
    .def zero = R4			;zero
    .def one = R5			;jeden	
    .def tsk = R6			;tymczasowy wskaźnik skrócenia
    .def twy = R7			;tymczaspwy wskaźnik wydłużenia
    .def adres = R8			;wskaźnik adresu komórki EEPROM
    .def dod = R16			;mnożnik
    .def ode = R17			;dzielnik
    .def skr = R18			;skrócenie
    .def wyd = r19			;wydłużenie
    .def tmp = r20			;rejestr tymczasowy
    .def pod = r21			;pętla do odejmowania
    .def psk = R22			;pętla do skrócenia
    .def pwy = R23			;pętla do wydłużenia
    .def klawzm = R26		;tymczasowy rejestr klawiatury zmiany
    .def klawzp = R27		;tymczasowy rejestr klawiatury zapisu
    
    .org 0x0000
    
    	rjmp RESET			;
    
    ;*********************** Tabela wektorów przerwań (Interrupt Vectors) ******************
    
    .org INT0addr 			;External Interrupt0 Vector 
    	rjmp intzapis  		;skacz do zapis 
    .org INT1addr 			;External Interrupt1 Vector 
    	rjmp zmiana   		;skacz do zmiana
    .org ICP1addr 			;Input Capture1 Interrupt 
    	reti   				;Vector Address 
    .org OC1addr 			;Output Compare1A 
    	reti   				;Interrupt Vector Address 
    .org OVF1addr 			;Overflow1 Interrupt Vector 
    	reti   				;Address 
    .org OVF0addr 			;Overflow0 Interrupt Vector 
    	reti   				;Address 
    .org URXCaddr 			;UART Receive Complete 
    	reti   				;Interrupt Vector Address 
    .org UDREaddr 			;UART Data Register Empty 
    	reti   				;Interrupt Vector Address 
    .org UTXCaddr 			;UART Transmit Complete 
    	reti   				;Interrupt Vector Address 
    .org ACIaddr			;Analog Comparator 
    	reti   				;Interrupt Vector Address 
    
    ;*********************** inicjalizacja procesora ************************************
    
    RESET: 
    	cli					;zablokowanie przerwań
    	ldi tmp,ramend		;ostati wolny adres RAM do tmp
    	out spl,tmp			;inicjacja stosu pod ostatnim wolnym adresem RAM zawatym w tmp
    	clr zero
    	clr one
    	inc one
    	clr hi
    	clr lo
    	ldi tmp,0x01		
    	mov adres,tmp		;załaduj adres pierwszej zmiennej w EEPORM do tmp
    	out eear,adres		;ustaw rejestr adresowy EEPROM
    	sbi eecr,eere		;ustaw bit odczytu z EEPROM
    	in dod,eedr			;załaduj zmienną DODAJ z rejestru danych EEPROM
    	inc adres			;zwiększ wskaźnik adresu EEPROMu
    	out eear,adres		;ustaw rejestr adresowy EEPROM
    	sbi eecr,eere		;ustaw bit odczytu z EEPROM
    	in wyd,eedr			;załaduj zmienną WYDŁUŻ z rejestru danych EEPROM
    	inc adres			;zwiększ wskaźnik adresu EEPROMu
    	out eear,adres		;ustaw rejestr adresowy EEPROM
    	sbi eecr,eere		;ustaw bit odczytu z EEPROM
    	in skr,eedr			;załaduj zmienną SKRÓĆ z rejestru danych EEPROM
    	ldi ode,100			;załaduj do ode stałą odejmowaną równą 100
    	ldi tmp,0xf0		;
    	out ddrb,tmp		;ustaw portb 0-3 jako wejścia
    	ldi tmp,0xff		;
    	out portb,tmp		;podciągnij wszystkie w portb do "1"
    	ldi tmp,0x00		;
    	out ddrd,tmp		;ustaw portd jako wejscia
    	ldi tmp,0xff
    	out portd,tmp		;podciągnij wszystkie w portd do "1"
    	ldi tmp,0x0a
    	out mcucr,tmp		;ustawienie przerwań zewnętrznych - wyzwalanie zboczem opadającym
    	ldi tmp,0xc0
    	out gimsk,tmp		;ustawienie maski przerwań - aktywacja przerwań zewnętrznych
    	sei					;odblokowanie przerwań
    
    ;*********************** program główny ***************************************
    
    main:					;główna pętla programu
    	sbis pinb,0			;czy sygnał na wejściu 0
    	rjmp delay
    	sbis pinb,1			;czy sygnał na wejściu 1
    	rjmp delay
    	sbis pinb,2			;czy sygnał na wejściu 2
    	rjmp delay
    	sbis pinb,3			;czy sygnał na wejściu 3
    	rjmp delay
    	rjmp main			;powrót do począdku programu głównego
    
    ;*********************** skracanie czasu o stałą wartość **********************
    
    delay:					;procedura skracania max ponad 2,5 ms.
    	cli					;zablokowanie przerwań	
    	cpi skr,0			;sprawdzanie czy skrócenie =0
    	breq start			;skacz do start jeśli skrócenie =0
    	mov tsk,skr			;załąduj współczynnik opóźnienia do licznika pętli opóźnienia
    	ldi psk,10			;załaduj pętlę opóźnienia
    	clc
    delay1:					;pętla odliczania opóźnienia dla 4HMz = 10mikrosekund
    	nop					;1;
    	dec psk				;1;zmniejsz o 1 wskaźnik pętli
    	brne delay1			;1/2;skacz jeśli psk większe od 0
    	sub tsk,one			;zmniejsz licznik pętli opóźnienia
    	cp tsk,zero			;porównanie licnzika pętli z zerem
    	breq start			;jeśli tsk=0 skacz do start
    	ldi psk,10			;załąduj pętlę opuźnienia
    	rjmp delay1
    
    ;*********************** mnożenie poprzez wielokrotne dodawanie **************	
    
    start:					;procedura rozpoznawania wejścia
    	sbis pinb,0			;czy sygnał na wejściu 0
    	rjmp start0			
    	sbis pinb,1			;czy sygnał na wejściu 1
    	rjmp start1
    	sbis pinb,2			;czy sygnał na wejściu 2
    	rjmp start2
    	sbis pinb,3			;czy sygnał na wejściu 3
    	rjmp start3
    	sei					;odblokowanie przerwań
    	rjmp main			;powrót do począdku programu głównego
    
    start0:					;procedura mnożenia przez dodawanie dla wejścia 0
    	cbi portb,4			;ustaw 0 na pinb5
    	cp dod,zero			;sprawdź czy współczynnik mnożenia = 0
    	breq zwieksz		;jeśli współczynnik mnożenia=0 skacz do zwieksz
    start01:				;pętla sprawdzająca stan wejścia 0 (17 MIPS z podprogramem)
    	sbic pinb,0			;1;czy 0 na pinb0
    	rjmp odejmij		;2;jeśli pinb0=1 skacz do odejmij
    	rcall dodaj			;3;wywołaj podprogram dodaj
    	rjmp start01		;2;wróc do począdku pętli sprawdzania portb0
    
    start1:					;procedura mnożenia przez dodawanie dla wejścia 1
    	cbi portb,5			;ustaw 0 na pinb5
    	cp dod,zero			;sprawdź czy współczynnik mnożenia = 0
    	breq zwieksz		;jeślo współczynnik mnożenia=0 skacz do zwieksz
    start11:				;pętla sprawdzająca stan wejścia 1 (17 MIPS z podprogramem)
    	sbic pinb,1			;1/2;czy 0 na pinb0
    	rjmp odejmij		;2;jeśli pinb0=1 skacz do odejmij
    	rcall dodaj			;3;wywołaj podprogram dodaj
    	rjmp start11		;2;wróc do począdku pętli sprawdzania portb0
    
    start2:					;procedura mnożenia przez dodawanie dla wejścia 2
    	cbi portb,6			;ustaw 0 na pinb5
    	cp dod,zero			;sprawdź czy współczynnik mnożenia = 0
    	breq zwieksz		;jeślo współczynnik mnożenia=0 skacz do zwieksz
    start21:				;pętla sprawdzająca stan wejścia 2 (17 MIPS z podprogramem)
    	sbic pinb,2			;1/2;czy 0 na pinb0
    	rjmp odejmij		;2;jeśli pinb0=1 skacz do odejmij
    	rcall dodaj			;3;wywołaj podprogram dodaj
    	rjmp start21		;2;wróc do począdku pętli sprawdzania portb0
    
    start3:					;procedura mnożenia przez dodawanie dla wejścia 3
    	cbi portb,7			;ustaw 0 na pinb5
    	cp dod,zero			;sprawdź czy współczynnik mnożenia = 0
    	breq zwieksz		;jeślo współczynnik mnożenia=0 skacz do zwieksz
    start31:				;pętla sprawdzająca stan wejścia 3 (17 MIPS z podprogramem)
    	sbic pinb,0			;1/2;czy 0 na pinb0
    	rjmp odejmij		;2;jeśli pinb0=1 skacz do odejmij
    	rcall dodaj			;3;wywołaj podprogram dodaj
    	rjmp start31		;2;wróc do począdku pętli sprawdzania portb0
    
    ;*********************** podprogram dodawania **************************************
    
    dodaj:					;podprobram dodawania (łącznie 11 MIPS)
    	add lo,dod			;1;dodaj współczynnik dodawania do lo
    	brcc dodaj1			;1/2;skocz jeślni nie było C=0
    	add hi,one			;1;zwiększ hi o 1
    	brcc dodaj2			;1/2;skacz jeśli hi różne od 0
    	inc hi1				;1;zwiększ hi1 o 1
    	rjmp dodajexit		;2
    dodaj1:
    	nop					;1
    	nop					;1
    dodaj2:
    	nop					;1
    	nop					;1
    dodajexit:
    	ret					;4;powrót z podprogramu (11 MIPS)
    
    ;*********************** dzielenie przez wielokrotne odejmowanie *******************
    
    odejmij:				;pętla odejmowania (17MIPS)
    	nop					;1;dla zrównania czasu jednej pełnej
    	nop					;1;pętli dodawania
    	nop					;1;i odejmowania
    	nop					;1;
    	nop					;1;
    	sub lo,ode			;1;odejmij stałą od najmłoszego bajtu
    	brcc odejmij1		;1/2;jeśli nie wystąiła pożyczka skacz do odejmij1
    	sub hi,one			;1;zmniejsz średni bajt o 1
    	brcc odejmij2		;1/2;jeśli nie wystąpiła pożyczka skacz do odekmij2
    	sub hi1,one			;1;zmniejsz nawyższy bajt o 1
    	brcs odejmijexit	;1/2;jeśli wystąpiła pożyczkaskacz do odejmijexit
    	rjmp odejmij		;2;skacz do odejmij
    odejmij1:				;
    	nop					;1;opóźnienie czasowe do wyrównania długości pętli
    odejmij2:				;
    	nop					;1;opóźnienie czasowe do wyrównania długości pętli
    	rjmp odejmij		;2;skacz do odemij
    odejmijexit:			;kończenie procedury 
    nop
    
    ;*********************** wydłóżenie czasu o stałą wartość **********************
    
    zwieksz:				;procedura wydłużania czasu max nieco ponad 20ms
    	cp wyd,zero			;sprawdź czy wdłużenie=0
    	breq end			;jeśli wydłużenie=0 skacz do pońcowej procedury
    	mov twy,wyd			;
    	ldi pwy,80			;ustaw dłuość pętli wydłużenia 
    zwieksz1:				;przy 4MHz czas trwania pętli wydłużenia = 80mikrosekund
    	nop					;1;
    	dec pwy				;1;zmniejsz współcznnik pętli wydłużenia o 1
    	brne zwieksz1		;1/2;skacz do zwieksz1 dopuki pwy różne od 0
    	dec twy				;zmniejsz tymczaswe wydłużenie
    	breq end			;jeśli tymczasowe wydłużenie=0 skacz do końcowej procedury
    	ldi pwy,80			;ustaw długość pętli wydłużenia
    	rjmp zwieksz1		;skacz do zwieksz1
    
    end:					;końcowa procedura modyfikacji sygnału wejściowego
    	ldi tmp,0xff
    	out portb,tmp		;ustaw na wszystkich pinach 1
    	sei					;odblokuj przerwania
    	rjmp main			;skacz do programu głównego
    
    ;*********************** obsłua przerwania INT0 ************************************
    
    intzapis:				;przerwanie od klawiatury zapisu
    	cli					;zablokowanie przerwań
    	in klawzp,PIND		;zczytanie stanu portów z PIND
    	andi klawzp,0x6		;zerój nieistotne bity
    	cpi klawzp,0x2		;czy nacśnięty klawisz "PLUS"
    	breq zapis			;jeśli tak skacz do plus
    	cpi klawzp,0x0		;czy naciśnięty klawisz "MINUS"
    	breq def			;jeśli tak to skacz do minus
    	rjmp int0exit
    zapis:					;obsługa przerwania klawisza "ZAPIS"
    	cli					;zablokowanie przerwań
    	ldi tmp,1			;
    	mov adres,tmp		;załaduj wskaźnik adresu warością 1
    zapis1:					;pętla gotowości zapisu pierwszej zmiennej
    	sbic eecr,eewe		;czy EEPROM gotowy do zapisu
    	rjmp zapis1			;jeśli EEPROM nie gotowy wróć do pętli
    	out eear,adres		;ustaw rejestr adresowy
    	out eedr,dod		;umieść zmienną DODAJ w rejestrze danych
    	sbi eecr,eemwe		;ustaw bit gotowości do zapisu
    	sbi eecr,eewe		;ustaw strob zapisu do EEPROM
    zapis2:					;pętla gotowości zapisu drugiej zmiennej
    	sbic eecr,eewe		;czy EEPROM gotowy do zapisu
    	rjmp zapis2			;jeśli EEPROM nie gotowy wróć do pętli
    	inc adres			;zwiększ wskaźnik adresu
    	out eear,adres		;ustaw rejestr adresowy
    	out eedr,wyd		;umieść zmienną WYDŁUŻ w rejestrze danych
    	sbi eecr,eemwe		;ustaw bit gotowości do zapisu
    	sbi eecr,eewe		;ustaw strob zapisu do EEPROM
    zapis3:					;pętla gotowości zapisu trzeciej zmiennej
    	sbic eecr,eewe		;czy EEPROM gotowy do zapisu
    	rjmp zapis3			;jeśli EEPROM nie gotowy wróć do pętli
    	inc adres			;zwiększ wskaźnik adresu
    	out eear,adres		;ustaw rejestr adresowy
    	out eedr,skr		;umieść zmienną SKRÓĆ w rejestrze danych
    	sbi eecr,eemwe		;ustaw bit gotowości do zapisu
    	sbi eecr,eewe		;ustaw strob zapisu do EEPROM
    zapis4:					;pętla sprawdzająca zakończenie zapisu trzeciej zmiennej
    	sbic eecr,eewe		;czy zapis w EEPROM zakończony
    	rjmp zapis4			;jeśli zapis w EEPROM nie zakończony wróć do pętli
    	rjmp int0exit		;skok do wyjścia z procedury obsługi przerwania
    
    def:					;wpisanie defaultowych wartości zmiennych
    	ldi tmp,10
    	mov dod,tmp			;ustaw dod na 10
    	ldi tmp,25			
    	mov dod,tmp			;ustaw wyd na 25
    	clr skr				;wyzeruj skr
    
    int0exit:
    	sei					;odblokuj przerwania
    	reti				;skok powrotny z obsługi przerwania
    
    ;*********************** Obsługa przerwania zewnętrznego INT1 **********************
    
    zmiana:					;przerwanie od klawiatury zmiennych
    	cli					;zablokowanie przerwań
    	in klawzm,PIND		;zczytanie stanu portów z PIND
    	andi klawzm,0x78		;zerój nieistotne bity
    	cpi klawzm,0x70		;czy nacśnięty klawisz "PLUS"
    	breq plus			;jeśli tak skacz do plus
    	cpi klawzm,0x60		;czy naciśnięty klawisz "MINUS"
    	breq minus			;jeśli tak to skacz do minus
    	cpi klawzm,0x50		;czy naciśnięty klawisz "RAZY"
    	breq razy			;jeśli tak to skacz do razy
    	cpi klawzm,0x30		;czy naciśnięty klawisz "DZIEL"
    	breq dziel			;jeśli tak to skacz do dziel
    	rjmp intexit
    
    plus:					;obsługa klawisza "PLUS"
    	cp skr,zero			;czy współczynnik skróceia równy 0
    	brne plus1			;jeśli nie to skacz do plus1
    	cpi wyd,0xff		;czy współczynnik wydłużenia równy 255
    	breq intexit		;jeśli tak to skacz do końca przerwania
    	inc wyd				;zwiększ współczynnik wydłużenia
    	rjmp intexit		;skacz do końca przerwania
    plus1:					;jeśli skr większe od 0
    	dec skr				;zmniejsz współczynnik skrócenia
    	rjmp intexit		;skacz końca przerwania
    
    minus:					;obsługa klawisza "MINUS"
    	cp wyd,zero			;czy współczynnik wydłużenia równy 0
    	brne minus1			;jeśli nie skacz do minus1
    	cpi skr,0xFF		;czy współczynnik skrócenia równy 255
    	breq intexit		;jeśli tak skacz do końca przerwania
    	inc skr				;zwiększ współczynnik skrócenia
    	rjmp intexit		;skacz do końca przerwania
    minus1:					;jeśli wyd większe od 0
    	dec wyd				;zmniejsz współczynnik wydłużenia
    	rjmp intexit		;skacz do końca przerwania
    
    razy:					;obsługa klawisza "RAZY"
    	cpi dod,0xff		;czy współczynnik mnożenia równy 255
    	breq intexit		;jeśli tak skacz do końća przerwania
    	inc dod				;zwiększ współczynnik mnożenia 
    	rjmp intexit		;skacz do końca przerwania
    
    dziel:					;obsługa klawisza "DZIEL"
    	cp dod,zero			;czy współczynik mnożenia równy 0
    	breq intexit		;jeśli tak skacz do końca przerwania
    	dec dod				;zmniejsz współczynnk mnożenia
    intexit:				;koniec przerwania
    	sei					;odblkowanie przerwań
    	reti				;powrót z obsługi przerwania


    NIech czyjeś wprawne oko na to spojrzy i powie mi czy jest szansa że go zadziała.

    Mam jeszcze kilka pytań. Czy w nieprogramowanym jeszcze procku wszystkie przerwania i "pies wartownik" ;) są aktywne czy nie?? NIgdy jeszcze nie programowałem AVRów więc nie wiem jak to jest. Poza przerwaniami zewnętrznymi nie korzystam z pozostałych więc lepiej żeby one mi nie gmatwały sprawy.
    Ewentualnie wykorzystać watchdoga do resetowania tylko gdzie tu wstawić kasowanie licznika.

    Czekam na sugestie i opinie. Jak będzie OK to w weekend postaram się władować soft w procesor.

    PS. JAk wpisać począdkowe wartości do EEPROMA?? Jakie formaty plików trzeba stworzyć.

Podsumowanie tematu

✨ Dyskusja dotyczy realizacji układu "modyfikatora sygnału" opartego na procesorze Atmel AT90S2313, którego zadaniem jest modyfikacja czasu trwania sygnału wejściowego poprzez skrócenie, wydłużenie lub mnożenie przez współczynnik z zakresu 1.00 do 2.55. Autor pracuje nad programem w asemblerze, korzystając z AVRstudio4 do kompilacji i symulacji. Poruszono kwestie konfiguracji stosu w mikrokontrolerze, gdzie wskazano konieczność ustawienia wskaźnika stosu w rejestrach SPL i SPH przy większej pamięci RAM. Dyskutowano projekt klawiatury sterującej z 4-5 klawiszami, z uwzględnieniem wymagań czasowych i prostoty obsługi, co wyklucza użycie timerów do detekcji klawiszy ze względu na rygorystyczne wymagania czasowe i sporadyczne użycie klawiatury. Zaproponowano alternatywne rozwiązania, takie jak zewnętrzne układy dekodujące (np. 74HC139) lub obsługa klawiatury w przerwaniach. Omówiono szczegóły działania rozkazu SUB w asemblerze AVR, zwłaszcza ustawianie flagi przeniesienia (bit C) podczas odejmowania, oraz kwestie programowania ISP i wymagań dotyczących rezonatora kwarcowego. Przedstawiono fragmenty kodu asemblerowego realizującego funkcje modyfikacji sygnału oraz procedury zapisu i odczytu danych z pamięci EEPROM mikrokontrolera. Wskazano, że programowanie ISP musi odbywać się w warunkach pracy procesora, choć dopuszczalne są różne częstotliwości kwarcu, co wpływa na dokładność czasową. Ostatecznie autor zamieścił kompletny program do modyfikatora sygnału z opisem funkcji klawiszy i konfiguracją portów mikrokontrolera.
Wygenerowane przez model językowy.
REKLAMA