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 ?
jj, tak to zkusim no
Ale zas je pravda že tyhle 4 instrukce pro AVR vyjdou při stejnym taktu kontroléru rychlejc než to CPL u x51 CPL zabere 1 (2) strojový cykly, tedy až 24 taktů xtalu
j díky ještě jednou, snad budu už za chvíli blikat
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
pls poradte, v tom serialu podle keryho se to ucim je vysvetleny kulovy (lepsi sem bohuzel nenasel )
v knížce jsem to nenašel…
díky Honza
EDIT: dneska už končim, zase zejtra, mám toho až pokrk stačí mi že jsem pochopil aspoň trochu tu motanici s PINx PORTx a DDRx
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).
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 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
Trocha aktualit: LED mi stále nebliká
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)
aspoň jsem zase o kus chytřejší
ZA chvíli se do toho zase pustím, a doufám že už to rozfachám
;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í
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
Tím nebliká jsem měl na mysli, že jsem to ještě nenahrál do kontroléru, ale v simulátoru to blikalo
Momentálně jdu na večeři, a po večeři to zkusim napálit do kontroléru, tak uvidíme
Ještě jednou díky za ten program, aspoň se kouknu jak to řeší ostatní
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…
Díky, Honza
EDIT: jo a před chvílí mi začal blbnout programátor, furt hlásí device error
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.
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?
hmm tak už sem tovyřešil bez vás
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”