ATmega szybkosc portu

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.

Reply to
Viki
Loading thread data ...

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 ;)

Reply to
dziobu

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

Reply to
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.

Reply to
Sawik

Użytkownik Konop napisał:

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

Pozdrawiam Grzegorz

Reply to
Grzegorz Kurczyk

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.

Reply to
dziobu

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

Reply to
Bogdan G

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? ;>

Reply to
badworm

tak.

uzywam ATmega8535, ona nie ma tego fuse'a

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

Reply to
Viki

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.

Reply to
JS

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

Reply to
Grzegorz Kurczyk

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

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

Pozdrawiam.

Reply to
Witold Kuczek

Użytkownik pawel napisał:

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

Reply to
Grzegorz Kurczyk

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

Reply to
Grzegorz Kurczyk

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

Na ATmega88 też działa.

Reply to
Sawik

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.