CHtěl bych se naučit programovat AVR

se mi zda jako blbost, ale mrknu na to, diky za upozorneni

trochu debilni nevyhoda… FUJ :slight_smile:

Jo, jinak rad bych Vas trochu poopravil: zjistil sem že atmega 8 nema ani JMP. A k te chybe: CALL (i JMP) má už ATmega16

právě jsem na to koukal do datasheetů

Pokud bych ten programek napsal tak, ze bude generovat pouze potrebny pocet smycek, bylo by to temer bez omezeni s minimalnim intervalem 20 strojovych cyklu.
Ale jelikoz jsem velmi linej clovek, tak si to jeste rozmyslim :slight_smile:

pri pouziti vzdy 2 smycek bude rozsah od 27 - 195.861 cyklu, tj. 1,7us - 12,2ms @16MHz
3 smycky: 34 do 49.939.990 cyklu, tj. 2,125us - 3,1s @16MHz
4 smycky: 41 - 1,27e10 cyklu, tj. 2,56us - 13min 16s @16MHz
5 smycek: 48 - hodne, tj. 3us - 56,5h (priblizne) @16MHz

10 smycek: asi 83 - hodne moc, tj. 5,2us - 7e9 roků @16MHz :laughing: :laughing: :laughing:
Tak si vyber, kolik smycek budes chtit… 8)
Jinak lze jeste rozsah kazde smycky roozsirit pridanim nekolika NOPů…

Dobry den,

do akej miery je rozumne, aby procesor cakal v slucke napriklad 1 minutu a okrem toho vobec nic nerobil? A to ani nedal znat, ze je vsetko OK a zije?
Ak ma byt nacasovanie cez slucku presne, nesmu sa ani pouzit prerusenia, napriklad od komunikacie. Pre male (do 50us) casy mozno. Ale pre dlhsie casy je mozno rozumnejsie nastudovat pouzitie hw casovacov a z nich urobit pocitadlo pre dlhe casy. Obsluha casovacov je v celku jednoducha.

Mohlo by to vyzerat asi tak, ze hw casovac da prerusenie kazdych 100us a v ramci toho prerusenia sa dekrementuje napriklad 2B premenna (cca do 6.5 sek), respektive sa po vynulovani prvej premennej moze dekrementovat dalsia 2B premenna a potom to bude az do 119 hodin.

dekrementovat 2B premennu mozes jednou instrukciou

SBIW Rdl, 1 (dva takty), alebo aj inou

LD Rd, -Y

ci niecim podobnym (akurat hodnota v Rd bude zbytocna). Je to jedno.

Samozrejme to prerusenie od casovaca moze byt omnoho redsie. Ale ak by si si chcel vytvorit internu casovu zakladnu od ktorej sa odvija viac inych veci v procesore, 100us je dost jemny casovy krok. Ja pouzivam zakladny casovy krok 500us a zatial mi to na vsetko stacilo.

Martin

jj, jan16 se akorat chtel pouziti casovacu vyhnout pro pripad, ze by nemel zadnej volnej. Ale pokud se nektery flaka, tak je rozhodne lepsi ho vyuzit.

Takhle to ale není! AVR s pamětí FLASH do 8KB včetně žádné call a jmp nepotřebují a proto je také nemají. 8KB = 4Kword. Rozsah rcall a rjmp je ±2Kword, tedy obsáhne celý adresový prostor, který se jeví jako uzavřený do kruhu. Po adrese 0x0FFF následuje 0x0000, tedy opět začátek. Proto relativní skok nemůže nikdy opustit adresový prostor. Tuto skutečnost sdělíte překladači zaškrtnutím volby Wrap Relative Jumps.

tim lip pro nas :slight_smile:

Prvni verzi(nez najdete nejaky chyby) uz mam, tak muzete zkouset :wink:
AVR_DelGen.gif
AVR_DelGen.zip (6.28 KB)

Objevil sem ti fatální chybu - nejde to spustit :smiley: :smiley:
“Správní inicializace aplikace (0xc0000135) se nezdařila. Klepnutím na tlačítko OK můžete aplikaci ukončit.”
trochu detajl :wink:

Jinak moc moc díky, v čem si to programoval? Delphi? Můžeš mi poskytnout zdroják? (pokud teda chceš mi to poskytnout) - díky

Ahoj, Honza
PS: ještě jednou moc diky za vymyšlení toho algorytmu na generování těch smyček :slight_smile:

Ted mezi ci klavesnici a zidli je chyba? :laughing:
Je to v C#(MS visual studio 2005, mimochodem legalni :smiley: ), potrebuje to mit nainstalovanej .NET 2.0, kterej si stahni od MS :wink:
microsoft.com/downloads/details.aspx?displaylang=cs&FamilyID=0856eacb-4362-4b0d-8edd-aab15c5e04f5

Zdrojaky dat muzu, ale je to dobytkarna, je to polepeny jen z toho nejnutnejsiho aby to chodilo :wink: Radsi bych se tim vnitrkem moc nechlubil :smiley:

a nemoh bys to přeprogramovat tak, aby toi nepotřebovalo takový kraviny jako NET.2.0 ?? :slight_smile: Na co to vůbec tohle potřebuje?

Jinak tim zdrojákem nepohrdnu, hlavně když to bude fachčit, z cčka si to přelouskám do FreePascalu a nějak o snad rozchodim :slight_smile: Můžeš mi poslat nebo to sem vložit ten zdroják? Stačil by ten algoritmus toho generovani s trochou popisu, mě se totiž žádnej algoritmus zatim nepodařilo vymyslet… . :frowning:

Pro .NET se pise stale vic programu, a jesli myslis, ze se to zmeni, jsi na omylu :wink: Dnes neni vzhledem k hardwaru ani tak dulezita narocnost, jako rychlej vyvoj a vyssi bezpecnost (blbuvzdornost vuci programatorum amaterum jako treba ja). Takovy veci jako pascal uz maji svych 15 min slavy za sebou :wink:

Nasal jsem to a odladil asi za 2 hodky… zadnej super vykon, ale jsem zvedavej na tvuj pascal :slight_smile: (ale asi to bude rychlejsi nez C++)

algoritmus je vcelku jednoduchej.

  1. odhat potrebnyho poctu smycek (logaritmus o zakladu 255 z potrebnyho poctu IC)
  2. skutecna delka cyklu vcetne rcall: [13 + 4pocet_smycek + …k4(3+k3*(3+k2*(3+k1*(3+0))))]
    Zde je treba “naladit” konstanty k1-kn pro minimalni odchylku (ten vzorec jsem vymejslel vcera 2h u avr simulatoru… Tam kde je “0” se da napsat k0 a cislo, ktery by vyslo by byl pocet vlozenych "NOP"u)
  3. vypis ZK

Pokud bys nahodou chtel delat primo s timhle zdrojakem, MS uvolnil uplne nejzakladnejsi verzi visual studia pro nekomerci zdarma (aspon driv to tak bylo)…

Nepouzivam zadny vlastni tridy a podobny veci, tak to snad zvladnes… jsem zvedavej :slight_smile:

Nicmene ja .NETem nepohrdnu, psani ridicich aplikaci pro mcu na serivym portu (nebo na usb pres ftdi) je naprosto primitivni :slight_smile: Ani k tomu nepotrebujes zadnou knihu. VS je parada. si tak klikam ve tridach a namespaces a najednou vidim “IO”, mrknu tam a hle… “serial”… a prace se seriovym portem jak na dlani bez studovani hord materialu…
AVR_DelGen_project.zip (78.5 KB)

jj dik, planej poplach, pred 15ti minutama jsem přišel možná na lepší a přesnější algoritmus, neni to odhad, lze to vcelku jednoduše zpočítat. Zejtra sem napíšu jak jsem to vymyslel.

Kdo řikal že tu někdo programuje v pascalu? nevšim jsem si toho… Mezi pascalem a FREEpascalem je sakra rozdíl… Nezdá se to, ale ve freepascalu píšu jednoduchý 3D programy v OpenGL, na 3D hru jsem se zatim nezmohl :slight_smile: A SDL asi možná taky znáš - to používám taky :slight_smile:
I tak díky, mrknu na to!
Ahoj, Honza

home.unix-ag.org/tjabo/avr/AVRdelayloop.html

Jan16: Kdyby ten soft nebyl německy… :slight_smile:

Dá se přepnout do angličtiny.
Ale je tak jednoduchý, že stačí znát asi 5 slov.

  1. Nastav žádaný počet cyklů (Cycles) nebo čas (Time/sec)
  2. Nastav kmitočet oscilátoru (Cycle rate)
  3. Stiskni tlačítko GO.

Případně je nahoře možno zvolit, které registry použije

Díky, OK, tak jako s Němčinu se ve škole sice učíme, mě jde ok, ale učitelka nás neučí nic užitečnýho. Víme sice kopu gramatiky, slovíček taky kopu umíme, ale neumíme poskládat kloudnou větu. No já bych si s tim poradil i v tej němčině, to měla být spíš taková poznámka bokem :wink: Ale jestli to umí angličtinu, tím líp :slight_smile:

Tak sem si opatřil ten soft na generování těch zpožďovaček. Kupodivo tu funguje :slight_smile:

Snad ještě dneska odpoledne nebo zejtra odpoledne to rozfachčim - to blikání LEDkou :slight_smile:

Jinak pomalu začínám těm AVR porozumívat, pročet jsem si datasheet od ATmega8, prošel jsem si instrukční soubor (samozřejmě english :slight_smile: to neni problém :slight_smile: )

Už jsem pochopil jak funguje Z flag (zero flag). To mi zatim stačí, ještě ale potřebuju nastudovat pár bitových operací: nastavení bitu, vynulování bitu, negace bitu. Pak to půjde už snadno :slight_smile: (doufám)

Tak už jsem se přiměl k tomu, že budu pokračovat. NAšel jsem si instrukce pro nastavení bitu v IO registru (SBI) a vynulování - // - (CBI). Hups, jen jsem nenašel instrukci, která by vytvořila negaci bitu v IO registru - jak soe to teda dělá??
Taky jsem si zjistil něco o tom jak fungují registry DDRx PINx PORTx.
Stále se snažím přijít na to, jak znegovat libovolný pin nějakýho IO registru. Nic mě stále nenapadá. Poradíte pls? :slight_smile:

Díky, Honza

ty mi davas… se to snad jeste naucim… primo instrukci negace jsem nepotkal (treba jsem jen slepej), ale da se pouzit XOR - tam, kde je v druhym operandu “1”, tam se bude ten prvni negovat…

ldi r16, 0x08 ;bude se negovat bit 3 in r17, PORTB ;pokud chci pouze negovat a nezajima me, ;co se venku deje, je lepsi cist vystupni registr eor r17, r16 out PORTB, r17