Programiranje ATMEL Mikrokontrolera

Ama, ja sam navikao sve raditi i učiti kroz praksu… Te 4433 i 2313 nisu loše ali de vidi imal se kupiti mega8, mega16 , mega128 … Ti su novijeg dizajna i većih kapaciteta mem. :slight_smile:

Kod nas se sve može kupiti osim ovih procesora. Najbliža prodavnica je u Zagrebu !

Ne znam baš za asembler. Nisam baš dobar u tome. Trenutno mi se čini da je C bolji za početak :slight_smile: Ali to ću tek vidjeti kad pokušam nešto napraviti praktično

PS
evo jedan link. ja sam se već prijavio :slight_smile:
http://www.circuitcellar.com/avr2004/

Imaju, kako da ne:
Mega 8 - 6.20 Eur.
Mega 32 - 10.50 Eur.
Mega 128 - 13.85 Eur.
Mega 161 - -16 - 8.75 Eur.
Mega 103 - 23.25 Eur.
itd… itd…

Pa dobro , tačno je da su noviji ali i ova dva su više nego dobri. Tako npr. možeš i 2313-ku taktovati sa 10 Mhz. a to znači da jedna operacija traje 100 ns. U njegov fleš možeš strpati 2000 Bajtova programa, zamisli samo koliko je to ? Imaš 15 Inputa odnosno Outputa gdje slobodno možeš odrediti šta da bude ulaz a šta izlaz. Lakše je računati sa 8 Bita nego sa 32. Ako su ti potrebni veći brojevi od 255 onda lijepo spojiš dva registra i kontrolišeš Cary-Bit u Status registru. Osim toga imaš dva interupt ulaza koji uvijek kontrolišu stanje na njima i mogu da utiču na program . zatim ulaz za rs232 (seriski port) tj. možeš sa PC-om mijenjati informacije. Možeš se igrati sa ascii slovima i slati ih na eksterni display. Ma ima toga koliko hoćeš zato je možda bolje početi kod ovih jednostavnijih ali eto kako hoćeš. Ja se evo mučim sa jednim counterom, jer nikako nemogu da
protumačim jedan kod koji sadrži timer, pa me evo i glava zabolila računajući sa binarnim brojevima. Vidio sam stranicu nekog manijaka koji je uspio programirati mahpong igru za Televizor koja bazira samo na AVR-u.
http://jkdesign.de/avrproject/Die%20MAHPONG%20Seite.htm
Inače sam se zadnjih dana pravo zarazio tako da sam totalno u svijetu AVR-a i predpostavljam da ću i ostati sve dok nepostane svakodnevna igračkica. :0watdrop

Kad reče da ćeš dolaziti ?

Da se dogovorimo da mi doneses par AVR-ova.
I oko plaćanja ćemo se dogovoriti :slight_smile:

Trenutno me interesuju samo : 2313, mega8L i mega16L . Ostali na paleti će doći kasnije kad se malkice uštelim :slight_smile:

Koji ti je email ? :slight_smile:

Pogledaj privatne poruke.

Miraleme znas li kako u ASM-u napraviti neku funkciju poput :

delay ( ms ) ili sleep ( ms ) - (ms - milisekunde(i)) ?

Treba mi za zadrzavanje procesa i brojanje vremena :slight_smile:

Poz,
Mirza

Pa i ja sam frišak u ASM-u ali koliko znam postoje dvije mogućnosti zadržati vrijeme. Jedna je da uzmeš jedan, dva ili tri i više registara i napraviš Counter a druga je da koristiš njegove original timere: Timer0 i Timer1.Prva mogućnost je brzo napravljena, jednostavana i pregledna. Kod druge mogućnosti moraš koristiti dodatne registreSP,DDRB,TIMSK,TCNT0,TCCR0. Prednost ove druge metode je što kontroler može dalje da izvršava program dok brojiš vrijeme.
Ja ću ti objasniti prvu mogućnost sa registrima pa ako te interesuje i korištenje timera reci .
Par osnovnih stvari:
Ako koristimo kvarz sa 4 MHz imaćemo 4000 000 operacija u sekundi , što znači da jedna operacija traje 250 nS. Kod kvarca od 10 MHz trajaće samo 100 nS. Najednostavnija komanda u ASM-u je NOP i ona naređuje procesoru da ništa neradi ( No Operation) . Znači potrebne su ti 4 ovakve komande da bi dobio vrijeme od 1mikroSekunde.Nastaviću dole jer ima neki bug ovdje u Php-u.

Eh, da nebi sad pisao hiljade ovih komandi ti lijepo uzmeš jedan registar te ga stalno inkrementiraš tj. povećavaš za 1. Možeš ga naravno i dekrementirati, bitno je da dođe do 0 i postavi z-bit u statusnom registru na 1 . Kad registar preskoči vrijednost od 255 onda će u statusnom registru z-bit imati vrijednost 1 , te se onda pokreće brojanje slijedećeg registra . Znači da moramo uvijek između kontrolisati z-bit u statusnom registru. Sa tri registra se da napraviti lijep counterčić . Evo ti primjer jednog countera koji zadržava procesor za ca. 500 ms:

;	(Petlja za ca. 500 ms )

wait:	
ldi	r19,10		           ;r19, r18 i r17
	clr	r18		    ;daju zajedno
	clr	r17	            ;jedan 3-byte counter
wait1:	
        dec	r17		   ;najniži byte-1
	brne	wait1		  ;ako nije stigao do 0 -> ponovi petlju
	dec	r18		   ;srednji byte -1
	brne	wait1		  ;ako nije stigao do 0 -> ponovi petlju
	dec	r19		    ;najviši Byte -1
	brne	wait1		   ;ako nije stigao do 0 -> ponovi petlju
	ret			       ;Kraj petlje, Vrati se nazad

Nemoj da se zezneš kao ja i misliš da za jedno prebrojavanje treba 255 taktova, nego misli da ti uvijek treba duplo vrijeme jer komanda brne takođe zahtijeva jedan takt. Ova komanda je ta koja kontroliše z-bit te ukoliko je ovaj 0 ponavlja petlju. Registar r19 dobije odma vrijednost 1010 (decimalno 10) tako da možeš njime određivati malo grublja vremena s tim što mu odma predaš veću ili manju vrijednost. Nadam se da sam ti pomogao. :slight_smile:

Još nešto za kraj:
Preporučio bi ti da skineš sebi AVR-Studio sa ATMELOVE stranice jer sa njim možeš simulirati ove procese i tačno posmnatrati kako se sve to odvija. Nažalost ovako nešto nepostoji za linux a nisam uspjeo ni sa wine-om da emuliram ovaj prog. tako da sam ga instalirao na win4lin.
Primjer za ovaj counter sam uzeo iz ovog jednostavnog programa koji pali i gasi jednu LED-diodu sa pauzama od 500 ms
http://s-huehn.de/elektronik/avr-prog/avr-test1.zip

OK. Ali treba mi nes poput ovoga :

[code]void delay_ms(unsigned int ms) {
unsigned int outer1, outer2;
/*outer1 = 200; 4 MHZ /
/
outer1 = 300; 6 MHZ /
outer1 = 400; /
8MHz */

while (outer1) {
    outer2 = 1000;
    while (outer2) {
        while ( ms ) ms--;
        outer2--;
    }
    outer1--;
}

}[/code]

A, ti hoces da predas vrijednost na neki label(funkciju). Eh kao u C-u to neces moci direktno uraditi ali veoma slicno. Mozes npr.definisati gore navedeni registar r19 kao konstantu, te mu dati neku vrijednost u glavnom programu.PRIMJER

.DEF MojOmiljeniRegistar = r19 ; Dao sam r19 ime

               LDI MojOmiljeniRegistar , 30 ; predao mu vrijednost od 30
               RJMP funkcija
               [...] Ovdje dodje ostali programski kod
funkcija :
               DEC r19 ; smanji vrijednost za 1..itd...itd...
               BRNE funkcija ; ponavljaj

       

Jel neko mozda uspio nastimati USART na nekom AVR-u ?

Ja se evo danima mucim da ustimam USART na ATmega8 al nis … Ne dobijem ono sto zelim u konzoli :frowning:

Ako neko ima neku ideju neka javi :slight_smile:

Mirza

Mirza, ako si dobar sa Njemackim jezikom obavezno pogledaj ovo:
http://www.mikrocontroller.net/tutorial/uart.htm 8)

Pozdrav,

Dali postoji neka literatra na našem jeziku o programiranju Atmel AVR mikrokontrolera i gdje se može nabaviti?

Za literaturu u stampanoj formi ne znam, ali mozda ti za pocetak budu interesantni slijedeci clanci:

http://titan.etf.bg.ac.yu/~gvozden/mips/radovi/avr
http://www.mikroelektronika.co.yu/domestic/magazine/magazine/p1broj/1broj3.htm

Inace, na sajtu mikroelektronike moze pronaci dosta zanimljivih stvari…

hvala na linku ! ovaj prvi nemogu otvoriti, no na linku mikroelektronika našao sam knjigu o AVR-ima, no za sada je tek navodno u pripremi dok na jednom drugom linku je već rasprodana tako da neznam dali je več štampana !?