czas wykonywania operacji - avr
nuclear - 04-03-2007 19:45
czas wykonywania operacji - avr Witam
tak sie zastanaiwam, jak zrobić układ, który wykonywałby nastepujacy ciąg
poleceń:
-zapisz bajt (8bit) z jakiegoś portu do pamięci (w sumie bedzie 256, lub 512
bajtów)
-wygeneruj impuls na jakiejs nóżce
i ma to być wykonywane ze scisle okresloną czestotliwoscią (max 5MHz) lub
inną wynikajacą z podziału tejże.
zastanawiam sie czy wystarczy do tego celu uzyć procka atmega88, na kwarcu
20mhz? bo aż się boję....ewentualnie jaką max czestotliwość moge osiagnąć na
tym kwarcu?
ThomasN - 04-03-2007 20:45
"nuclear" <nuclear2001@poczta.onet.pl> wrote in message
news:esf3un$ms7$1@news.onet.pl...
> Witam
> tak sie zastanaiwam, jak zrobić układ, który wykonywałby nastepujacy ciąg
> poleceń:
> -zapisz bajt (8bit) z jakiegoś portu do pamięci (w sumie bedzie 256, lub
> 512 bajtów)
> -wygeneruj impuls na jakiejs nóżce
> i ma to być wykonywane ze scisle okresloną czestotliwoscią (max 5MHz) lub
> inną wynikajacą z podziału tejże.
>
> zastanawiam sie czy wystarczy do tego celu uzyć procka atmega88, na kwarcu
> 20mhz? bo aż się boję....ewentualnie jaką max czestotliwość moge osiagnąć
> na tym kwarcu?
Na końcu datasheeta w sekcji Instruction set summary masz wypisane ile cykli
zegara trwa wykonanie każdej instrukcji. Rozpatrz przykład:
ldi R17, 0
Loop:
out PORTA, R17 - 1 cykl
com R17 - 1 cykl
rjmp Loop - 2 cykle
Łącznie 4 cykle. Przy kwarcu 20MHz generowany przebieg będzie miał
częstotliwość 2,5MHz. A tu masz jedynie generowanie przebiegu na wszystkich
pinach portu A. Na Atmega tego raczej nie zrobisz.
pozdrawiam
tn
PAndy - 04-03-2007 22:45
"ThomasN" <jakis.adres@serwer.jakis.pl> wrote in message
news:esf55r$gr6$1@inews.gazeta.pl...
> Na końcu datasheeta w sekcji Instruction set summary masz wypisane ile
> cykli zegara trwa wykonanie każdej instrukcji. Rozpatrz przykład:
>
> ldi R17, 0
>
> Loop:
> out PORTA, R17 - 1 cykl
> com R17 - 1 cykl
> rjmp Loop - 2 cykle
>
> Łącznie 4 cykle. Przy kwarcu 20MHz generowany przebieg będzie miał
> częstotliwość 2,5MHz. A tu masz jedynie generowanie przebiegu na
> wszystkich pinach portu A. Na Atmega tego raczej nie zrobisz.
wywal loop'a i scykluj 1:1 - 256 lub 512 par pod rzad i bedzie juz 2
cykle + 2 na jmp ale raz na 256 lub 512 par instrukcji
nuclear - 04-03-2007 23:45
>
> wywal loop'a i scykluj 1:1 - 256 lub 512 par pod rzad i bedzie juz 2 cykle
> + 2 na jmp ale raz na 256 lub 512 par instrukcji
racja - loop nie jest potrzebny, bo to ma być jednostkowy odczyt , tzn po
odcszytaniu tej seri danych bedzie przerwa na przetworzenie tych danych...
czyli na razie mam 2 cykle na wygenerowanie impulsu, no i zostają 2 cykle na
zczytanie i zapisanie bajtu - da się? czy w prockach avr jest cos takiego
jak stos?
ThomasN - 04-03-2007 23:45
>> wywal loop'a i scykluj 1:1 - 256 lub 512 par pod rzad i bedzie juz 2
>> cykle + 2 na jmp ale raz na 256 lub 512 par instrukcji
> racja - loop nie jest potrzebny, bo to ma być jednostkowy odczyt , tzn po
> odcszytaniu tej seri danych bedzie przerwa na przetworzenie tych danych...
> czyli na razie mam 2 cykle na wygenerowanie impulsu, no i zostają 2 cykle
> na zczytanie i zapisanie bajtu - da się? czy w prockach avr jest cos
> takiego jak stos?
Z opisu w pierwszym poście zrozumiałem, że zczytanie 512 bajtów zakończone
jest zmianą stanu na jakiejś nóżce.
Mój prosty przykład miał pokazać, że samo generowanie fali prostokątnej
zajmuje zbyt wiele czasu, żeby osiągnąć 5MHz. Jeżeli zamiast pętli dać serie
instrukcji out, com to będzie te 5MHz, ale nic więcej.
Tobie jednak chodzi o to, żeby zmieniać stan wyjścia po zczytaniu każdego
bajta. Kolejny prosty przykład:
In R17, PINA - 1 cykl
push R17 - 2 cykle
com R18 1 - cykl
out PORTB, R18 - 1 cykl
.....
5 cykli. Potrzebowałbyś kwarcu 25MHz. Atmega pewnie by poszedł - nie
testowałem. atmega8 ma 1kB stosu - może się udać.
pozdrawiam
tn
Grzegorz Kurczyk - 05-03-2007 06:48
Użytkownik ThomasN napisał:
> instrukcji out, com to będzie te 5MHz, ale nic więcej.
> Tobie jednak chodzi o to, żeby zmieniać stan wyjścia po zczytaniu każdego
> bajta. Kolejny prosty przykład:
>
> In R17, PINA - 1 cykl
> push R17 - 2 cykle
> com R18 1 - cykl
> out PORTB, R18 - 1 cykl
> ....
>
Oj tym stosem to tak trochę nieelegacko ;-) Od czego mamy rejestry
indeksowe... i odpowiednio preparując dane początkowe można to troszkę
przyśpieszyć;
; ładujemy adres bufora
ldi r30, ADDRL
ldi r31, ADDRH
; przygotowanie danych dla out-ów
ldi r16, 255
ldi r17, 0
; i lecimy ;-)
in r0, PINA ; 1 clk
st Z+, r0 ; 2 clk
out r16 ; 1 clk
in r0, PINA
st Z+, r0
out r17
in r0, PINA
st Z+, r0
out r16
in r0, PINA
st Z+, r0
out r17
..
..
..
a taką sekwencją;
ldi r16, 255
ldi r17, 0
out r16
out r17
out r16
out r17
..
..
wyciskamy 10MHz z ATmegi88@20MHz, tyle, że chyba lepiej zrobić to jakimś
timerem ;-)
Pozdrawiam
Grzegorz
zanotowane.pldoc.pisz.plpdf.pisz.plkonstruktor.keep.pl