Programování AT89S52: zkušební zapojení - MCU nebliká LEDkou

Zdravím,

koupil jsem si programátor USBasp, který umí komunikovat s AT89S52. Na stránkách dhservisu jsem si stáhl program na blikání LED. HEXa soubor jsem nahrál do procesoru, zapojil přesně podle obrázku (s tím, že jsem použil datashheet pro 40pin MCU) a př připojení napájecího napětí LED pouze jednou lehce blikla a nic se nedělo, tak jsem odpojin napájení a zkontroloval vše okolo, znovu ho přiložil a už ani neblikla. Tak jsem znovu obvod připojil na programátor a nechal načíst flash a program tam byl.
Poradíte mi prosím?

Honza

:arrow_right: administrator: přejmenováno z "Programování AT89S52"

Tyhle AT nemají moc velkou vybuditelnost výstupu (10 mA), neuvařils výstup velkým proudem?

Zkus LED přepojit na zem pro kontrolu, zda Ti neodešla.

Když se dívám na jejich schéma, moc se mi tam nezdá ten resetovací obvod. Osobně bych tam dal ještě odpor proti zemi. Takhle bych měl obavu, že to zůstává trvale v reset stavu (zbytkový prout elytu to může držet v HIGH).

Před diodou je odpor 360 ohm a napájený to mám 5V z USB. Právě že ten reset vubec nechápu. Mimochodem. Když ten kondenzátor mezi + a reset vyndám, tak dioda začne jen svítit. Jsem teď v práci, až přujdu domu, tak ještě připojím mezi reset a zem odpor 1k (bude dostačující? Nevím, jaký proud je dostatečný pro to aby se udržela log.0). Mám tam nechat ještě ten kondenzátor? Nechápu k čemu tam je.

Honza

Ten kondenzátor je tam kvůli tomu, aby Ti zresetovat mcu po zapnutí. Na reset MCU používám cca 1u (hodnota není nikterak kritická), ale je třeba mu připojit nějaký odpor proti GND. 1k bude dostačovat. Tady vůbec nejde o proud. Kondík, jak se nabíjí, tak na RST pinu postupně klesá napětí až do log. 0 (tím se odresetuje mcu). Hodnota C a R určuje to, jak dlouho od zapnutí napájení bude reset trvat. Jenže pokud tam není ten odpor, tak nabíjení může trvat (a ve Tvém případě asi trvá) hrozně dlouho. Když ten kondík vyndáš, může to dělat nějaký nepředloženosti, protože se mcu může spustit dřív, než napětí na napájení dosahne potřebné hodnoty ke správnému chodu mcu. Kromě toho, když zůstane viset ve vzduchu, může Ti náhodně mcu resetovat. Tím, že ke kondíku přidáš odpor proti zemi dosahneš toho, že mcu bude držen v resetu jen pár milisekund, což bohatě stačí na náběh napájení a bezpečný chod mcu.

Resetovací vstup vyžaduje, aby se po zapnutí napájení chvíli objevila úroveň HIGH, která procesor resetuje, a pak přešlo na provozní úroveň LOW. Kondezátor tam vstříkne krátký HIGH impuls, kterým procesor resetuje. Když se odpojí, procesor je po zapnutí napájení v náhodném stavu, např. ukazatel instrukcí může běhat kdekoliv v paměti - proto se to může projevit např. tím svitem LED, program někde běhá. Tyto procesory ještě vyžadují aby byl reset správně provedený. Nevím jistě zda procesor má nějaký pulldown odpor aby stáhl reset na LOW, ale je možné že zbytkový proud přes kondenzátor ho je schopný držet v reset stavu (HIGH) a pak by se program nerozběhl. Ten odpor 1K by mohl být dobrý - velikost určuje jen délku reset impulsu a ten stačí docela krátký. Navíc - v tomto zapojení se moc nepočítá s vybitím resetovacího kondenzátoru před opakovaným zapnutím napájení (i tomu by mohl ten odpor pomoct).

…Jo, Balů už to mezitím také popsal.

Hrozně moc děkuji za rady. Doma vyzkouším s tím odporem a následně dám vědět. Ještě bych chtěl vědět, zda tento program:

:10000000D292B2927BA77AAB7910D9FEDAFADBF6FC
:0200100080F07E
:00000001FF

má vypadat v paměti takto:

D292 B292 7BA7 7AAB 7910 D9FE DAFA DBF6
80F0 FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFF … a to pokračuje až do konce

Tohle se uloží do paměti procesoru když mu načtu hex.
Program píšu v assembleru a potřeboval bych nějaký kompilátor do hex pro tento procesor. Zatím používám ten ze stránek dhservisu a jelikož mám 64bit systém, tak musím přes dos box. Zkoušel jsem i 8051IDE, ale pořám mi hází nějaké chyby a nechápu ho.

Honza

Obsah paměti vypadá v pořádku.

Dobrý překladač pro tyhle MCU je Keil C51, pro malé programy stačí free verze. … aha, Ty chceš assembler, to je C. Sice má inline assembler, ale asi potřebuješ spíš něco jiného.

Ale dnes je už škoda se zabývat těmito procesory (jestli to není z důvodu jejich velkých zásob). Vhodnější jsou např. ATmegy, které jsou dost levné, mají větší vybavení a dají se proto už dobře programovat v C.

Ještě jsem proletěl google a našel jsem tohle. Pro zkoušku jsem mu podstrčil jeden program v assembleru, který mám i v hex abych ověřil správnost a vypadá to, že to funguje bezvadně :slight_smile:
C neovládám a tyhle staré procesory mám nějaké doma. Mám i AT89S4051 což by pro aplikaci kterou potřebuju udělat dostačovalo, ale bohužel na ně nemám programátor, tak použiju ty větší. Mám i jeden PLCC44, ale na zkoušení používám klasický pouzdro. Ten programátor do USB který mám umí jen S51 a S52 a ATMega.

Honza

Používal jsem tenhle uCpuEdit a Asem51. Je to někde z Internetu. Ani jedno nemusíš instalovat. V uCpuEdit v menu Soubor->Nastavení v záložce ASEM-51 nastavíš cestu k souboru ASEMW.EXE a můžeš vesele programovat.
A když si v položce Zvýraznění vybereš tu svojí skupinu MCU, tak máš téměř dokonalý nástroj.
asem5113.zip (599 KB)
uCpuEdit.zip (760 KB)

To je mazec, moc díky. Zrovna jsem to vyzkoušel v práci a bezvadný. Teď to zkouším v práci pod win XP, tak snad si s tím doma poradí win7 64 bit. Nasimuloval jsem mu tam chybu a je fajn že rovnou ukáže řádek na kterém je.

Zdravím. Včera už jsem se k tomu nedostal. Ještě jsem dneska ráno studoval vlákna na tomto foru a objevil jsem článek, jak někomu také nefungoval procesor a objevil jsem, že pin 31 musí být připojen k napájecímu napětí aby pracoval z interní pamětí. Tudíž jsem prostudoval datasheet a našel tuto větu, která to potvrzuje (pin 31=EA)

EA should be strapped to VCC for internal program executions.

Tak jsem to dnes vyzkoušel. Ten odpor mezi zemí a resetem u kondenzátoru opravdu mbýt nemusí. Problém byl v tom, že jsem neměl napájení na tom pinu 31. začalo to fungovat. Mám ohromnou radost. Dokonce když píšu program v uCPuEdit a mám připojený programátor s procesorem a změním cokoliv v programu a přeložím, tak se to ihned projeví. Moc díky za pomoc. Ještě musím prostudovat, proč když zapíšu do portu 0 číslo 0010000 tak všechny ledky svítí, kromě té jedné. Taky jsem myslel, že když udělám tuto instrukci:
w1: mov r0,#0
djnz r0,$
djnz r1,w1
tak to je 250 + 250 instrukcí, přičemž jedna trvá 2us (12Mhz krystal), tak by to mělo být 1000us což je 0,001 sekunda a přitom je to bliknutí, které je dost zřetelné.

Ne 250 + 250 instrukcí, ale přibližně 256*256.

LEDky jsou zapojené na +5V, proto se rozsvítí uzemněním, tedy hodnotou “0”.

To už by vycházelo přibližně na 0,13 sekundy což by mohlo být. Díky za vysvětlení.

Dal jsem místo mov p0,#00010000b tohle 11101111 a fungovalo to. Díky za vysvětlení.

Je super, že to co mám na papíře, tak si mužu vyzkoušet v reálu. Do teď jsem si myslel, že když mám jednoduchý program

setb p1.1
end

tak že se mi ta LEDka rozsvítí a zustane svítit, ale když program dorazí na “end” tak LEDka zhasne. Musel jsem to udělat takto:

start: setb p1.1
jmp start
end

a už to fungovalo

“end” (jestli se jedná o klasický assembler) znamená jen označení konce zdrojáku pro překladač. Procesor neví že tam je konec, neumí se zastavit a pokračuje dalšími instrukcemi (což bude zřejmě 0xff, nevím z hlavy jaké instrukci to odpovídá). Proto program musí vždy obsahovat nekonečnou smyčku, ve které se procesor stále pohybuje.

Ano, jedná se o klasický assembler. Vím, že se používá dynamický stop (např jmp#$) ale myslel jsem, že ten end je právě pro procesor jako ten stop. Díky.