začátky programování AVR

cau, mohl by mi (jako uplnemu lajkovi, ktery se chce naucit programovat) nekdo pomoci svymi slovy vysvetlit co delaji nasledne programky?

/**

  • Modul na komunikaci po I2C
  • © 2009 Pavel Rozhon
    */

#include <avr/io.h>
#include <avr/interrupt.h>

#include “i2c.h”
#include “protokol.h”
#include “led.h”

uint8_t i2c_address = 1;

void i2c_set_reply(uint8_t data)
{

}

void (*i2c_on_data_received)(uint8_t data);

void i2c_init(void)
{
// Pripravi preruseni pri START stavu
USICR = _BV(USISIE) | _BV(USIWM1) | _BV(USIWM0) | _BV(USICS1);
}

// Start stav na sbernici
ISR(USI_START_vect)
{
// Pripravi prijem adresy a R/W

USISR &= ~USI_CNT_MASK; // Vynuluje citac (16 - prijima 8 bitu)

USISR |= _BV(USISIF); // Vynuluje priznak START preruseni USI a povoli preruseni preteceni citace
USICR &= ~_BV(USISIE);
USICR |= _BV(USIOIE);

}

#define I2C_ADDR 1
#define I2C_DATA_RECV 2
#define I2C_DATA_SEND 3

uint8_t i2c_stav = I2C_ADDR; // Poprve prijimame adresu

// Zmena stavu na USI sbernici
ISR(USI_OVERFLOW_vect)
{
DDRD = 0xFF;
DDRA = 0xFF;
PORTD = USIDR;
PORTA = USIDR >> 7;
for(;;){

switch(i2c_stav){
	// Prisla adresa a r/w
	case I2C_ADDR:
		if((USIDR & ~_BV(7)) == i2c_address){ 
			// Master komunikuje s nami
			if(USIDR & _BV(7)) 
				i2c_stav = I2C_DATA_SEND; // My vysilame
			else
				i2c_stav = I2C_DATA_RECV; // My prijimame

			// Pripravi vysunuti ACK
			USISR &= ~USI_CNT_MASK;
			USISR |= (USI_CNT_MASK - 2); // Pripravi vysunuti jednoho bitu - ACK
			USIDR = 0xFF;
			status_led_on();
		} else {
			// Master nekomunikuje s nami, cekame na dalsi START stav
			USICR |= _BV(USISIE);
			USICR &= ~_BV(USIOIE);
		}
		break;
}

USISR |= _BV(USIOIF); // Uvolni sbernici
}

}

**

  • Stara se o indikacni LED (sdileno mezi moduly na I2C a tlacitka)
  • © 2009 Pavel Rozhon
    */

#include <avr/io.h>

#include “zapojeni.h”
#include “led.h”

uint8_t led_counter = 0;

void status_led_init(void)
{
DDR_STATUS_LED &= _BV(STATUS_LED);
}

void status_led_on(void)
{
led_counter = 0;
PORT_STATUS_LED |= _BV(STATUS_LED);
}

void status_led_off(void)
{
PORT_STATUS_LED &= ~_BV(STATUS_LED);
}

// Po poctu volani urcenym STATUS_LED_TICK_COUNT vypne stavovou LED
void status_led_tick(void)
{
if(++led_counter >= STATUS_LED_TICK_COUNT) status_led_off();
}

/**

  • Vstupni bod programu pro MASTER zarizeni
  • Zarizeni na I2C sbernici postupne poptava stav jednotlivych hlasovacich zarizeni
  • a odesila jakykoliv prijaty stisknuty znak kontrolnimu programu pres USB - USART
  • prevodnik. Tyto soucasti tvori hlasovaci system.
  • © 2009 Pavel Rozhon
    */
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/sleep.h>

#include “protokol.h”
#include “i2c.h”

uint8_t slave = 1;

void prijat_status(uint8_t povedlo, char znak)
{
if(povedlo && znak != P_STATUS_NONE){
// Ve slavovi byl stisknut nejaky znak
if(slave == 1 && znak == ‘1’) PORTA = PORTA & (~PORTA & 1);
if(slave == 2 && znak == ‘1’) PORTA = PORTA & (~PORTA & 2);
PORTA |= 4;
return;
}

if(slave++ == 128) slave = 1;	
i2c_init_send(slave, P_STATUS);

}

void odeslan_status(uint8_t povedlo)
{
if(povedlo){
// Zkontaktovali jsme uspesne SLAVE, nechame ho rict stav
on_i2c_received = &prijat_status;
i2c_init_receive(slave);
}

	if(slave++ == 128) slave = 1;	

}

// Inicializace zarizeni
void init()
{
DDRA = _BV(PA0) | _BV(PA1) | _BV(PA2);
//set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Nastavi vychozi rezim spani
i2c_init();

on_i2c_sent = &odeslan_status;
i2c_init_send(slave, P_STATUS); // Zepta se prvniho SLAVE na stav
sei();

}

int main(void)
{
init();
for(;;);
}

/**

  • Definice protokolu pro komunikaci mezi MASTER a SLAVE jednotkami
  • © 2009 Pavel Rozhon
    */

// ------ Prikazy ------

// Posli stav
#define P_STATUS 0
// Odpoved: nic nestisknuto
#define P_STATUS_NONE 0

// Enumerace (jsi tu)
#define P_ENUM 128
// Odpoved: ok
#define P_ENUM_OK 0xAA

// Vsechno ostatni: programovat adresu
// Odpoved: adresa naprogramovana
#define P_ADR_OK 1
// Odpoved: programovani selhalo
#define P_ADR_FAIL 0

/**

  • Vstupni bod programu pro SLAVE zarizeni (klavesnici)
  • Zarizeni odpovida na pozadavky MASTER jednotky a pri stisknuti tlacitka mu
  • posle prislusny znak po I2C sbernici.
  • © 2009 Pavel Rozhon
    */
    #include <avr/io.h>
    #include <avr/sleep.h>
    #include <avr/interrupt.h>

#include “zapojeni.h”
#include “protokol.h”
#include “tlacitka.h”
#include “led.h”
#include “i2c.h”

// Inicializace zarizeni
void init()
{
// --------- TODO: TOHLE PRIJDE DO MODULU NA I2C ------------
ACSR = _BV(ACD); // Vypne komparator (setri energii)
USICR = _BV(USISIE) | _BV(USIWM1) | _BV(USIWM0) | _BV(USICS1); // Zapne preruseni pri START stavu
// ----------------------------------------------------

// Citac/casovac

TCCR1B = _BV(WGM12) | _BV(CS11) | _BV(CS10); // Nastavi casovac 1 do CTC rezimu, zdroj fclk/64
OCR1A = 1439; // Predvolba, preruseni po 100ms
TIMSK |= _BV(OCIE1A); // Zapne preruseni casovace1
tlacitka_init();
status_led_init();
i2c_init();
sei(); // Zapne preruseni
// status_led_on(); // Bliknutim indikuje zapnuti
}

int main(void)
{
init();
for(;;);
}

// Preruseni asi po 100ms
ISR(TIMER1_COMPA_vect)
{
status_led_tick();
tlacitka_tick();
}

/**

  • Ovladani tlacitek ve slave jednotce
  • © 2009 Pavel Rozhon
    */

#include <avr/io.h>
#include <avr/interrupt.h>

#include “zapojeni.h”
#include “tlacitka.h”
#include “led.h”

// Ukazatel na fci volanou pri zmacknuti tlacitka
void (*on_btn_press)(char znak);

// Prazdna funkce - nedela nic (vychozi akce pri zmacknuti tlacitka)
void nop(char znak){};

// Inicializuje tlacitek a casovac pro cteni jejich stavu
void tlacitka_init(void)
{
// Tlacitka
DDR_TL &= ~MASKA_TL; // Nastavi tlacitka jako vstupy
PORT_TL |= MASKA_TL; // Zapne pull-upy
on_btn_press = &nop; // Vychozi akce pri zmacknuti tlacitka

}

// Preruseni pro zpracovani tlacitek
uint8_t predchozi = 0, stabilni = 0;
void tlacitka_tick(void)
{
uint8_t okamzite = ~PIN_TL & MASKA_TL; // Ulozi okamzity stav tlacitek

if(okamzite == predchozi){
	// Mame novy stabilni stav. Sem se dostaneme kdyz nedoslo k zakmitu.
	if(stabilni && !okamzite){ 
		// Tlacitko bylo zmacknuto a uz neni, testujeme ktere bylo zmacknuto
		char znak = 0;
		if(okamzite & _BV(TL1)) znak = ZN1;
		if(okamzite & _BV(TL2)) znak = ZN2;
		if(okamzite & _BV(TL3)) znak = ZN3;
		if(okamzite & _BV(TL4)) znak = ZN4;
		if(okamzite & _BV(TL5)) znak = ZN5;
		if(okamzite & _BV(TL6)) znak = ZN6;
		on_btn_press(znak); // Volame udalost pri zmacknuti tlacitka
	}
	// Ulozime tento stabilni stav pro priste
	stabilni = okamzite;
}
// Ulozime tento okamzity stav pro priste
predchozi = okamzite;

}

/**

  • Konstanty zapojeni obvodu pro slave
  • © 2009 Pavel Rozhon
    */

// Stavova LED dioda
#define STATUS_LED PB0
#define DDR_STATUS_LED DDRB
#define PORT_STATUS_LED PORTB
#define PIN_STATUS_LED PINB

// Tlacitka zapojena na PD0-PD5
#define DDR_TL DDRD
#define PORT_TL PORTD
#define PIN_TL PIND

#define TL1 PD0
#define TL2 PD1
#define TL3 PD2
#define TL4 PD3
#define TL5 PD4
#define TL6 PD5

// Znaky na tlacitkach
#define ZN1 ‘1’
#define ZN2 ‘2’
#define ZN3 ‘3’
#define ZN4 ‘4’
#define ZN5 ‘5’
#define ZN6 ‘6’

#define MASKA_TL ( _BV(TL1) | _BV(TL2) | _BV(TL3) | _BV(TL4) | _BV(TL5) | _BV(TL6) )

vim, ze jsou tam k dyspozici i komentare, ale z uvedenych komentaru jsem funkci zcela uplne nepochopil:-(.

jeste jsem se chtel opitat jestli nahodou nekdo nevi o nejake strance, kde je programovani s AVR (nejlepe v programu WinAVR) prehledne pro lajky popsano?

teda to je celkem dlouhej programek :smiley: já ted dělam různe blbosti s 8051 v asm ale známej mi říká abych přešel na avr a já celkem nejsem proti a rád bych se naučil pracovat třeba s atmega8 nebo 16 a rád bych to programoval v Cčku tak kdybymi tu někdo popsal jen třeba jak rozblikat ledku na jednom vývodu tak bych vám byl taky dost vděčnej :frowning: já neustale koukám do knížek a na net na ruzny tutorialy ale prostě to cčko nedávám, v asm bych to ještě celkem zmaknul ale to Cčko je pro to prej lepší je to pravda?

no na ledku bych sel napr. takto

[code]
#include <avr/io.h>
#include <avr/delay.h>

int main(void)
{
DDRB = 0xff; //nastaveni pinu jako vstup
while(1){
PORTB=~PORTB; //pokud bit shozen tak nahodi a naopak (~ = inverze)
_delay_ms(1500); //pocka 1,5s
}
}[/code]

netestoval sem ale melo by to jit psal sem to jen tak z palice

endthe diky, hned jak najdu nějakej compiler pro avr do vist tak to zkusim;)

jo a kde seženu to io.h a delay.h ?

nainstalujes AVR studio pak k nemu nainstalujes WinAVR a to ma v sobe tyto hlavickove soubory

avr studio nejde nainstalovat protože mám visty

edit: 17:31 ale už jsem si nainstaloval mikroc ktere pod vistama jede

Ani netestuj, neslo by to z jednoducheho dovodu :slight_smile: :slight_smile: :slight_smile:

kod navrhujem upravit nasledovne:

 DDRB = 0xff; //nastaveni pinu jako VYSTUP

:slight_smile: :slight_smile: :slight_smile: … ale to sa stava i v lepsich rodinach

AVR studio nejde pod Vistami?
V AVRstudiu je simulator, aj ked nie dokonaly, taketo veci v nom funguju. Program sa da odkrokovat, da sa prezriet disasembler.

Najlepsi popis AVR-GCC (doporucujem AVR-GCC / WinAVR, lebo je celkom slusny a je zadarmo bez obmedzenia a je neskor pouzitelny na vytvaranie programov i pre ine platformy ako ARM, Cortex, Linux, Windows,… ) na ktory som narazil je tu:

mikrocontroller.net/articles … C-Tutorial

to, ze je v nemcine by nemalo odradzat, spolu s obrazkami a tabulkami by to malo byt zrozumitelne.
Aj ked znalost asembleru nie je vyslovene na zavadu, pre pracu s AVR nie je nevyhnutna a da sa bez nej uplne zaobist. Tak ako programatori (ludia) na programovanie ARM7/9/11 ale aj konzolovych aplikacii nemusia nevyhnutne poznat asembler pre ARM ci x86. Pre pracu s C vsak doporucujem minimalne ATmega168 a ako dobry pomer vykon/cena ATmega32, hlavne kvoli RAM. Pisat v C pre procesor s 1kB Flash sa sice da, ale vyhoda C sa prejavi az pri vacsich aplikaciach (>4kB).

Popisat prilozene programy povazujem za zbytocne. Nie je jasne, ci pytajuci sa vobec vie co je to ukazatel, ukazatel na funkciu, atd, atd. Na vysvetlenie takych pojmov tu nie je ani priestor a ani cas. Na to su rozne ucebnice C-cka, alebo internetove tutorialy. Cez nieco z toho sa treba preluskat. A hlavne zacat jednoduchymi programami, trebars tou LEDkou. To je taky “hello word” pre jednocipy. zacinat hned s komunikaciou cez I2C je predsa len trochu zlozitejsie, hlavne ked nie je jasne, ci zakladatel vlakna vobec vie co je I2C.

Myslim, ze presne naopak. Najprv nainstalujes WinAVR a az potom AVRstudio. AVRstudio pri instalacii zisti, ze uz su WinAVR nainstalovane a zaradi ponuku AVR-GCC projektov pri starte AVRstudia. Mne aspon takyto postup fungoval.
Vyberies projekt pod GCC, vyberies procesor a vsetky ostatne nalezitosti a dalej ako popisuje endthe.

popisy prace s AVR najdes aj tu, nieco v ASM, nieco v C:

mikrocontroller.net/articles … R-Tutorial

Mikroc vyzera pekne, ale pocitaj s ich nakupom, lebo s tak malym kodom v ramci free toho naozaj vela nenarobis. Je to akurat na nejake to zoznamenie sa s prostredim a procesorom.

jasne sry za nesrovnalost mensi chyba omlouvam se

osobne jsem nemel problemy ani s instalaci uvedenou vyse (avr studio a pak winavr)

kyberbob:
Ccko je rozhodne pohodlenejsi a jelikoz je to jen takovej “upravenej assembler”, tak by s nim nemely bejt nijak zavazny problemy…
Pro zacatek bych ovsem vynechal “delay.h” a radsi pouzil timer - minimalne pro procviceni… :slight_smile:
Ovsem pro zacatky doporucuji stahnout MS VS2008 expres a nejdriv neco zkusit napsat jen tak pro konzoli, a pak se vrhat na mcu :wink:
preci jen “a &= ~(1<<PB5);” nemusi bejt pro uplnyho zacatecnika na prvni pohled srozumitelny a ze se zakladni operace tohoto typu pozivaji pomerne casto :wink:

no jako ja uz Ccko zkousel (tada jako takovy ty hello programy nacitani klaves a takove veci pomoci zdrjovych kodu a ukazek mám Vs6 i VS2008 ale spíš se zajimam o VB, dělá mi děsnej problem styl zápisu prostě mu nerozumim ale známej říkal že na to o víkendu sednem a že mi ukáže a zkusi vysvětlit co a jak :slight_smile:

Osobne som sa zacinal ucit Ccko na PC aby som ho mohol pouzit na mcu a tento postup vrele NEDOPORUCUJEM. 4 mesiace zbytocnej prace. Potom som presedlal na Ccko pre mcu a ajhla, za tyzden prakticke pokroky - blikanie LED, zap/vyp rele, senzory pohybu, komunikacia s okolim cez I2C, SPI, PWM, AD, DA no kde s tym na ciernej konzole PC - NIKDE. Didakticke programy z ucebnic typu nacitaj z klavesnice, zobraz na monitor (cierna obrazovka) nacitaj z/do suboru su pre pracu s mcu neuzitocne a pre svoju neobsaznost a neprakticnost pre svet mcu ich povazujem za zbytocne a odradzajuce. Ak chce niekto primarne programovat na PC, prosim, ale ak chce niekto primarne programovat pre mcu, skusenost s PC vidim ako zbytocnu odbocku. Sam som si tym presiel (tym programovanim hnusnych (PCckari odpustia :slight_smile: )ciernych konzol na PC) a od vtedy som niekolko ludi ucil Ccko na mcu. Nikdy nie cez pracu na PC platforme. To je zameranim o niecom uplne inom.

no mam podobny nazor jako martin :wink: pro pcčka je to přecejen mirně odlišné takže jdu zrovna do c pro avr

Tim “Neco vyzkouset” nemyslim sedet u toho 4 mesice…
Bylo mysleno vyzkouset si chovani cyklu, obecne syntaxi, bitove operace, viditelnost promennych, globalni promenne, export/import, projekt z vice souboru apod… To by me vazne zajimalo, jak totalni zacatecnik bez debugeru najde chybu typu index out of range, deleni nulou a dalsi “nehody”, ktery uz trochu znalejsi clovek nedela.
Dale ucit se pracovat treba s pointery a strukturami opet bez debugeru… Pro masochistu asi dobry, ale jinak diky nechci :wink:
Mimo jine obsluha vselijakych sbernic, pwm, prevodniku a pod. nema s C absolutne nic spolecnyho, to uz je starost programatora a nikoli Cecka.

S tym uplne suhlasim - z toho dovodu tiez nepovazujem znalost ASM za nevyhnutnu pri praci s jednocipmi a pri obsluhe ich periferii.

Moj nazor vyplynul skor z toho, akym smerom je zamerany clovek, ktory chce robit s jednocipmi. Blikat ledkami, ovladat robotkov, dialkovo nieco spustat, menit rychlost motorceka, spravit nejaky maly automat, regulovat teplotu,… A zrazu sa ucit C v “cudzom” prostredi, ktore neobsahje ziadne aplikacie ktore su pri tohto pociatocnom zaujme moze byt skor demotivujuce.

Je to nieco ako s pisanim na klavesnici. Skusal som sa velmi velmi davno ucit prstoklad podla nejakej knizky s velmi slabymi vysledkami typu pomer vykon/cena. Az ked som zacal po rokoch programovat, ajhla, motivacia pisat rychlo (este do vecere stihnut napisat a vyskusat to ci ono) viedla k vyraznemu zlepsieniu pisatelskych schopnosti.
Myslim, ze podobne je to i s programovanim (napr. v C). V skole nas ucili na diernych stitkoch (konkretne o ne v tomto pripade nejde) nejake riesenia diferencialnych rovnic. Temy a zadania nikomu nic nehovorili, nikdo necitil potrebu a uzitocnost takychto rieseni a tak to aj vyzeralo. “Niekto” to spravil a ostatni - vratane mna - to obkreslili. A to som uz asembleroval na ZX Spectre a progamoval programy typu vytlac obrazok na ihlickovej tlacke sposobom - vyber aka farba na obrazku sa ma na papieri vytlacit akym rastrom.

Pokial som sa ucil C na PC v konzole, samoucelne ulohy typu “vyklresli na obrazovku znaky do piramidy”, cakaj, kym niekto nestlaci na klavesnici nejaky znak, vytvor subor, zavri subor, vymas subor pripadne cely HD :slight_smile:, mi ucenie slo ako v lete na saniach. Skratka, tento typ uloh ma absolutne nezaujimal. Samozrejme ze pre toho, kto chce primarne robit na PC mohli byt prave taketo ulohy motivujuce, ale bavime sa o niekom, kto chce pracovat v C na jednocipe.

Ked som tym prastil a zacal v C blikat LEDkou (debugovacie nastroje na jednocipy povazujem i na ucenie za dostatocne), potom vytvaral rozne menu na LCD a ako som si kladol nove a nove ulohy ako zariadenie vylepsit a program zelegantnit, tak som aj hladal moznosti Ccka a jeho kniznic, ako danu funkcionalitu dosiahnut. Trufam si povedat, ze rychlost a efektivita bola 5-10x vyssia, ako ked som sa trapil s Cckom v PC.

no jo motivácia je strašne nevyhnutná. Lebo ono oveľa rýchlejšie sa človek učí niečo čo ho baví a zaujíma ako keď len tak dostáva bezcielne úlohy o ktorých vie že mu budú aj tak naprd. A čo sa týka toho programovania… Doporučil by som najskôr začať z assemblerom je to základný vývojový jazyk a proste som zástanca názoru že základ musí byť vždy poriadny aby sa na ňom dalo stavať. Najskôr by som začal neakými úpne jednoduchými úlohy prácou z I/O portami a potom neaké menšie projekty až dospeješ do štádia kde zistíš že v assemblery by si sa napísal jak český žadnár :smiley: a začneš v programovať v C. Nieje na to poznať čo sa vlastne v tom jadre mikroprocesora deje to ti pomôže pochopiť a hlavne rozpoznať mnohé muchy pri samotnom doľaďovaní software