czas wykonywania operacji - avr

Mar 04, 2007 5 Replies

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

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

Użytkownik ThomasN napisał:

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

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required