ATmega szybkosc portu

Oct 22, 2007 17 Replies

Witam.



Podczepi³em do atmegi kwarc 16MHz i chcia³em sprawdzic jak szybki przebieg uzyskam na porcie wyjsciowym. Oto program generujacy przebieg prostokatny.



DDRD=0xff; PORTD=0xff;



while (1) { PORTD^=0xFF; //zmieñ stan LED asm ("nop"); }



Na wyjsciu uzyska³em przebieg 1MHz. Czy konstrukcja tego kontrolera nie pozwala na szybszy przebieg??



Pozdrawiam.


Dnia 10/22/2007 5:09 PM, Użytkownik Viki napisał:

po co nop?

clr r16

main: com r16 ; 1 out PORTD, r16 ; 1 rjmp main ; 2

1+1+2 = 4 cykle

to powinno dać 4MHz na wyjściu. Chyba że o czymś zapomniałem ;)

Rjmp ma na pewno tylko 2 cykle?? Bo to taka architektura, która robi wszystko naraz :P... Więc nie wiem, czy to jakoś przez to wolniej nie działa :P:P... no ale tak czy siak, prościej będzie tak: ldi r16 , 0xFF ; same 1 do r16 petla: out PIND , r16 rjmp PETLA

To taki przydatny trik - wpisanie 1 do jakiegoś bitu PINx neguje odpowiedni pin portu (rejestr PORTx, nie zmienia DDRx) :)... Jedna instrukcja mniej, to według Twoich obliczeń 1+2 = 3 cykle, 16MHz/3 =

5,333MHz :D:D:D

Pozdrawiam Konop

Dnia 22.10.2007 Konop snipped-for-privacy@gazeta.pl napisał/a:

Bardzo przydatny trik :) A swoją drogą to częstotliwość będzie jeszcze 2x mniejsza, bo te 5,333MHz to częstotliwość zmiany stanu portu, a na pełen okres prostokątu składają się 2 takie zmiany.

Użytkownik Konop napisał:

Tylko nie na każdej ATmedze to działa...

Pozdrawiam Grzegorz

Dnia 10/22/2007 7:26 PM, Użytkownik Grzegorz Kurczyk napisał:

A mógłbyś coś więcej napisać? Albo przynajmniej na których to działa. Szybko przeglądnąłem opis ATmegi8 i w sumie nie znalazłem nic na ten temat.

Tak samo szybko ale niesymetrycznie:

petla: sbi PIND ,1 cbi PIND ,1 rjmp PETLA

Szybciej:

ldi r16 , 0xFF ldi r15 , 0 petla: out PORTD, r15 out PORTD, r16 rjmp PETLA

Jeszcze szybciej i z przytupem:

ldi r16 , 0xAA ldi r15 , 0x55 petla: out PORTD, r15 out PORTD, r16 . . out PORTD, r15 out PORTD, r16 rjmp PETLA

A zegar ustawi³e¶ na zewnêtrzny?

Dnia Mon, 22 Oct 2007 20:58:35 +0200, Piotr Chmiel napisał(a):

No i czy przypadkiem ta MEGA nie ma włączonego fuse'a odpowiedzialnego za dzielenie częstotliwości kwarca przez 8? ;>

tak.

uzywam ATmega8535, ona nie ma tego fuse'a

uzywam timera tak ustawionego ze nie ma watpliwosci iz CLK to 16MHz.

W artykule <ffin3m$ksn$ snipped-for-privacy@news.onet.pl> dziobu napisal(a):

Działa na '256x, '128x, '640. Na "zwykłej" ATmedze 128 (i mniejszych) - nie, PIN-y są tylko do odczytu.

Użytkownik Piotr Chmiel napisał:

Taka konstrukcja mogła zostać przetłumaczona na coś takiego skok: in r24, PORTD ldi r25, 0xFF eor r24, r25 out PORTD, r24 nop rjmp skok

daje to 7 taktów na wygenerowanie jednego zbocza czyli 14 taktów na okres. Daje to 16/14 = ~ 1.14MHz

Pozdrawiam Grzegorz

Ja bym spróbowal wykorzystac timer w trybie OC i wyjscie timera na pin. Pawel

Jakie macie doświadczenia jeśli chodzi o przetaktowanie ATmegi, podobno

20MHz wytrzyma pytanie tylko czy nie dzieją się wtedy dziwne rzeczy?

Pozdrawiam.

Użytkownik pawel napisał:

No ale to już będzie generator sprzętowy :-)

U¿ytkownik "Grzegorz Kurczyk" snipped-for-privacy@antispam.control.slupsk.pl> napisa³ w wiadomo¶ci news:ffkhcv$hl9$ snipped-for-privacy@nemesis.news.tpi.pl...

Pytanie brzmia³o: "Czy konstrukcja tego kontrolera nie pozwala na szybszy przebieg??"

Pawe³

Użytkownik pawel napisał:

Ma Kolega rację. Ale tytuł posta i przykładowy kod sugeruje programowe generowanie przebiegu. Dodatkowo autor wątku "miga" wszystkimi bitami portu, a nie tylko jedną "nogą".

P.S. Można uzyskać jeszcze szybszy (2x) przebieg niż z timera. Z nogi XTAL2 ;-)

Pozdrawiam Grzegorz

Dnia 22.10.2007 JS <jar0only snipped-for-privacy@polbox.com napisał/a:

Na ATmega88 też działa.

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required