CHtěl bych se naučit programovat AVR

No vidiš, tak to mě nenapadlo…
To je první věc která mě na AVR pěkně s*** to tam DPC nemohli dát instrukci negace bitu jako je u x51 CPL ? :smiley:

jj, tak to zkusim no :slight_smile:
Ale zas je pravda že tyhle 4 instrukce pro AVR vyjdou při stejnym taktu kontroléru rychlejc než to CPL u x51 :slight_smile: CPL zabere 1 (2) strojový cykly, tedy až 24 taktů xtalu :slight_smile:

j díky ještě jednou, snad budu už za chvíli blikat :smiley:

njn… avr maj nevyhodu, ze skoro vsechny aritmeticky i logicky instrukce umi delat prave jen s registrama… takze ikdyby tam ta instrukce byla, stejne bys musel ten port nejdriv precist.

jo, momentálně řešim miniproblém: potřebuju nastavit/nulovat bit IO registru, na to je SBI, CBI že j? Jak to mám zapsat když chci např. vynulovat pin PB0 ?? (respektive bit 0 z registru PORTB)
cbi PB0 fakt nejde
cbi PORTB.0 taky ne :slight_smile:
pls poradte, v tom serialu podle keryho se to ucim je vysvetleny kulovy (lepsi sem bohuzel nenasel :frowning: )
v knížce jsem to nenašel…
díky Honza

EDIT: dneska už končim, zase zejtra, mám toho až pokrk :smiley: stačí mi že jsem pochopil aspoň trochu tu motanici s PINx PORTx a DDRx :slight_smile:

spatnej zapis :wink:

V tomto pripade je ta konstanta “P” definovana v inc souboru (.equ PORTB = 0x18), takze:
sbi PORTB, 5
cbi PORTB, 5

Nevim, jesli mas tenhle datasheet, ale od stranky 5 jsou popsany syntaxe instrukci a nejaky dalsi veci…
AVR Assembler User Guide
atmel.com/dyn/resources/prod_documents/DOC1022.PDF

Potom tam maj jeste datasheet o instrukcich s jejich chovanim v mcu… 150 stran, jesli mas zajem :laughing:

Registry portů jsou také v IO oblasti, takže používají instrukce SBI, CBI, IN, OUT.
V helpu k Avrstudiu je u každé instrukce podrobný popis i s příklady.

Často se používá ldi r16, 1<<3 aby bylo přímo vidět, který bit se nastavuje. 1<<3 je binární jednička třikrát posunutá vlevo.

To není nevýhoda AVR, všechny mikroprocesory umí dělat všechny aritmetické a logické operace jenom s určitou skupinou registrů (pracovní registry).
Naopak výhodou AVR je, že těchto registrů má 32. Např MP řady 51 měly jenom jeden pracovní registr (akumulátor).

Ještě dodám, že PIC má taky jenom jeden pracovní registr (W REG).

bla bla… Většina věcí de provádět i s dalšíma registrama, taky jich je 32,a u x51 se jako registry dá použít kerákoliv buňka paměti. Jako pracovní registr může sloužit klidně i port. x51 bych sem vůbec nepletl, to je CISC, tam lze použít jako registr téměř cokoliv…

u x51 to asi bylo mysleno tak, ze alespon 1 operand aritmetickych a i mnoha dalsich instrukci musi byt v A :wink: Nicmene ten druhy muze byt velice casto na libovolnem miste…
Bitove operace jdou provadet s kazdym bitove adresovatelnym registrem.

Naproti tomu avr umi do/z ram a I/O jen zapisovat/cist. Pokud ma provest neco jinyho, musi s tim nejdriv do pracovnich registru…

Myslel jsem to tak, že 51 má jenom jeden registr s kterým jdou dělat VŠECHNY aritmetické a logické operace. Avr má takových registrů 32.
Nebo se mýlím?

asi se mýlýte, protože ACC na všechny instrukce nestačí, někdy je zapotřebí použít i BCC, nebo nějaký Rr… Ale myslíte to téměř dobře… Mě zatím připadá že to jak se u x51 pracuje s ACC že mi to příjde logičtější než u těch AVR… jeto ale jenom o zvyku… Já si zvyknul na x51 :slight_smile:

Trocha aktualit: LED mi stále nebliká :slight_smile:
Provedl jsem několik úprav programu, zejména v inicializaci portů kontroléru, řeším to totiž jinak, lépe než předtím.
A nyní u mě pro ujasněnou: jak negovat bit jste mi poradili, mám tam ale pár nejasností, kdyžtak mě opravte:
XOR funguje takto:
A B Y
0 0 0
0 1 1
1 0 1
1 1 0
je to tak?
instrukce EOR Rd, Rr pracuje předpokládám-li správně: prostě XORuje mezi sebou vždy příslušné dva bity. Na papíře jsem si to ověřoval, kupodivu Y=NOT(A) je to samé co Y=XOR(A,1) :smiley:
aspoň jsem zase o kus chytřejší :slight_smile:
ZA chvíli se do toho zase pustím, a doufám že už to rozfachám :slight_smile:

Ano.

Zkuste toto

[code];ledka na portb,0 bliká

.include “m8def.inc” ;soubor s definicemi

.CSEG ;segment kódu

.org  0			

;nastavení stack pointeru:
ldi r16,low(ramend) ;nastav stack pointer na konec RAM
out SPL,r16
ldi r16,high(ramend) ;adresa ramend je definována v souboru m8def.inc
out SPH,r16

;nastavení portů:
ldi r16,0b11111111
out ddrb,r16 ;celý portb bude výstupní

main:;************************************************

sbi   portb,0            ;portb,0 = 1
rcall wait1s
cbi   portb,0            ;portb,0 = 0
rcall wait1s

rjmp	main	

;endmain:*********************************************

;čekej cca 1 sec:
wait1s:
ldi R17, $48
WGLOOP0: ldi R18, $BC
WGLOOP1: ldi R19, $C4
WGLOOP2: dec R19
brne WGLOOP2
dec R18
brne WGLOOP1
dec R17
brne WGLOOP0
ret[/code]

Já nejsem zas takblbej… :slight_smile:

Tohlke už sem měl dávno naprogramovaný, ale chtěl sem aby místo:
nastav bit
čekej
vynuluj bit
čekej
tam bylo prostě “neguj bit”…
A jinak já si to radši napíšu ten program sám, nbemám zapotřebí kopírovat jiné, tim se nic nenaučim. Ale i tak díky :slight_smile:
Tím nebliká jsem měl na mysli, že jsem to ještě nenahrál do kontroléru, ale v simulátoru to blikalo :slight_smile:

Momentálně jdu na večeři, a po večeři to zkusim napálit do kontroléru, tak uvidíme :slight_smile:
Ještě jednou díky za ten program, aspoň se kouknu jak to řeší ostatní :slight_smile:

Sem nas*** jako čert :slight_smile:

Program mi sice chodí v simulátoru, v reálu ale ne. NAprogramoval sem to do kontroléru, verifikace OK. Nic. LEDka nebliká. Tak sem si řek že sem asi špatně nastavil fuse bity (vůbec jsem nepřenastavoval). Takže jsem si otrevřel datasheet… hmm… po chvilce koukání do datasheetu jsem zjistil žeCKSEL3…0 musí být v 1111 až 1010 aby byl vybrán externí xtal/keramický rezonátor. Tak jsem tam dal 1111, naprogramoval znova, ejhle, ono to zase nejde. Může mi s timhle někdo helfnout? Vůbec totiž nevim jak tzo zprovoznit… :slight_smile:
Díky, Honza

EDIT: jo a před chvílí mi začal blbnout programátor, furt hlásí device error :imp:

Pokud jste měl nový čip a neměnil jste fuse bity, tak ten má naprogramovaný vnitřní oscilátor 1 MHz.
Jestli jste časovou smyčku počítal např. na 10 MHz, tak by blikal jednou za 10 vteřin.
Nějaký oscilátor každopádně běžel, jinak by čip nekomunikoval s Ponyprogem.

Jestli Ponyprog po změně fuse bitů hlásí “Device missing…”, tak je možné že fuse bity nebyly správně zapsány.
U Ponyprogu je třeba zatrhnout bity s hodnotou 0 , ne 1.

Nezapnul si při programování watchdog? To by se MCU resetoval dříve, než by došel na konec smyčky.

To mě už napadlo taky…
problém je v tom, že kdyby to došlo aspoň k tej smyčce zpoždění, tak by na PB0 byla log.1. Problém je v tom, že když na PB0 připojim LED, proti plus nebo GND, tak nesvítí ani v jednom případě, tj na PB0 je stav Z (hig impedance) - tedy je furt nastaven jako po resetu, jako vstupní pin. V simulátoru to funguje dobře, v programu chyba nebude.

Jinak to CKSEL3…0 jsem nastavil správně?? (1111) Jestli jsem to tim náhodou nepo* protože ten kontrolér mi tedka nejde ani identifikovat programátorem… - ?? Podle datasheetu sem to snad udělal správně…
Jinak nejdřív jsem to programoival CKSEL3…0 = 0b0000, a když to nefungovalo, tak sem myslel že chyba je v tom, dal sem tam 0b1111, a asi od tý chvíle kontrolér nejde ani identifikovat programátorem… co sem to jenom provedl? :confused:

Nastavil jste externí oscilátor a čip se s vámi nebude bavit, dokud mu ho nepřipojíte.

externí oscilátor to je trochu široký pojem ne?

tim se myslí Xtal, keramickej rezonátor (to je asi to samý) nebo RC oscilátor, nebo se musí extra do pinu XTAL1 přivádět hodiny?

hmm tak už sem tovyřešil bez vás :confused:
Asi sem to fakt opravdu blbě nastavil, Zapojil jsem si vedle 89S51, a pin xtal1 sem připojil přes MH7400 (jako oddělení) na XTAL1 u tej ATmegy8 A kupodivu procesor zase začal odpovídat na progrmátor. Takže Už vim že 1111 je asi externí clock na XTAL1 pin. Stejně to ale problém neřeší, protože mě zajmá, jak to nastavit, aby mi to běželo s externím Xtalem.
Zkusim se pohrabat v datasheetu, doufám že podruhý ten konstrolér zase nějak “neusmrtim” :slight_smile: