You are here

8031 mikrokontroller beindításában szeretnék segítséget kérni

32 posts / 0 new
Last post
zus

Helló ! A címben megénekelt 8031-et szeretném beindítani. Ehhez szeretnék klasszikus MCS-51 családú mikrokontroller programozásban jártas ember segítségét kérni. Hogy miről is lenne szó ?

Kezemhez nőtt két 80C31 mikrokontroller, a 8051-esek belső ROM/EPROM nélküli változata. Viszonylag régi motoros vagyok már a mikrokontroller szakmában, de még se 8031-et nem indítottam be, sem pedig 8051-est úgy, hogy a belső ROM-ot negligáltam. A szokásos idevágó irodalmakat kiolvastam a témában, ideértve a Rádiótechnika évkönyv 1992. évi számából a Madarász-féle hiánypótló összefoglalót is. Megépítettem egy egyszerű kisszámítógépet (80C31+74HCT573+27C256), amiben van egy darab LED a uC Port1 0. kivezetésén (1-es kivezetés).

A problémám a következő: megírtam egy tök egyszerű programot, ami kizárólag annyit csinál, hogy a Port1.0 kivezetésen levő LED-et villogtatja. Ez az egész kis program csak a kisérletezéshez kell (tényleg beindul-e uC külső EPROM-mal ?), illetve az áramkörbe tett uC tesztelésére. A programot az EPROM-ba szépen beírtam, de a készülék nem csinál semmit. Szkóppal vizsgálva, a 80C31 csinál valamit, az ALE és a PSEN lábakon vannak jelek, az összes IC-k kivezetésein mindenféle négyszögjel-impulzus kombinációk láthatóak, de mégsem működik. Olybá tűnik, hogy a 80C31 beindult, csinált egy reset-et, majd a legelső lépésnél megállt és valami miatt nem megy tovább, nem kérdezi le az EPROM-ot, bár a lekérdező jelek szépen mennek ki a processzorból.

Az ilyen klasszikus dolgot, hogy /EA lábat testre kell tenni (mert ekkor dolgozik a 80C31 a külső EPROM-ból) megcsináltam. Az összes doksi szerint ez elég ahhoz, hogy a uC a külső EPROM-ból dolgozzon. Mégsem megy. Több EPROM-ot próbáltam és több 8031-et is. Mi lehet a hiba ?

Biztos, hogy egy kábé 5 másodperces lépést hagyok ki, de mivel még ilyen 8031-et életemben nem hajtottam meg, nem tudom, hogy mi lehet az ?

A mellékelt rajz a kisgépet ábrázolja. A benne levő uC típusa nem érdekes, mert mind a 8031, mind pedig 8051 tökugyanúgy  működik, ha az /EA kivezetése testre kerül. A progit a komputerrel leszimulálva az megfelelően működik.

Köszi a segítséget.

File attachment: 
Comments
zus

Sziasztok ! Mivel sok választ kaptam, így kumulatíve válaszolok: mindenkinek megköszönöm a hozzászólását. Sokkal bentebb vagyok, mint egyébként. Működni ugyan még nem működik, de például a javasolt Timer2 megszakítást és az összes többi kezelést meg fogom csinálni. Majd megírom az eredményeket.

0

Vote up!

You voted ‘up’

proba

Ha csak egy bizonytalan tényezőt szeretnék, a portot ki be kapcsolgatnám, mindenféle időzítés nélkül. Ez könnyen detektálható, és szinte biztosan nulla szoftver hibával kivitelezhető. két értékadás egy ugrás. Ha ez megy, már talán biztos lehetsz benne, a programodon múlik a többi. Hardver, és portkezelési hiba talán már nincs.   

0

Vote up!

You voted ‘up’

mszabo

Szia!

Szerintem ez lesz a probléma oka mivel a ledet a port 1.0 és a vcc közé kötötted.:
T2 (P1.0): Timer/Counter 2 external count input/clockout (see Programmable Clock-Out).

Timer 2 external flag set when either a capture or reload is caused by a negative transition on T2EX andEXEN2 = 1. When Timer 2 interrupt is enabled, EXF2 = 1 will cause the CPU to vector to the Timer 2interrupt routine. EXF2 must be cleared by software. EXF2 does not cause an interrupt in up/downcounter mode (DCEN = 1).

A p1.0-án megszakítás generálódik, és nem tartozik hozzá megszakítást kezelő routin, ami miatt nem tér vissza a processzor a megszakítás elötti címhez.

A rajz első ránézésre jónak tűnik.

Mivel azt most nem tudom, hogy reset után mely regiszterek milyen értéket kapnak, így azt sem tudom biztosan, hogy a p1.0 okozhat e megszakítást, ezért én lekezelném az összes megszakítási vektort. Biztos ami biztos.

Egy ASM példa:

;INTERRUPT TABLA ************************************************************
ORG 0000H
                AJMP RESET
                ORG 003H
                AJMP INT_0
                ORG 00BH
                AJMP TF_0
                ORG 013H
                AJMP INT_1
                ORG 01BH
                AJMP TF_1
                ORG 023H
                AJMP RI_TI
                ORG 02BH
                AJMP TF2_EXF2

;A PROGRAM KEZDETE
;****************************************************************************
START:      MOV A,#STACK_START          ; initialize stack
                MOV SP,A
                SETB INT0
                CLR TESZT_BIT
                MOV C,TESZT_BIT
                MOV TESZT,C
                MOV TIME,#00H
;                CLR GYUJT                   ;TEKERCS GERJESZTESE
                ACALL BANK0                 ;0-.S REGISZTERBANK KIV.LASZT.SA
                ACALL INIT_INT              ;MEGSZAKIT.SOK .S PRIOLIT.SOK BE.LLIT.SA
                ACALL INIT_TIMER2           ;TIMER 2 INICIALIZ.L.SA 10ms ID.ZIT.SRE
                MOV DPTR,#0000H
ST_0000:        NOP
                AJMP ST_0000

SUBRUTINOK *****************************************************************

RESET:          AJMP START                  ;2us

INT_0:          RETI                        ;VISSZAT.R.S MEGSZAKIT.SB.L

TF_0:           RETI

INT_1:          RETI

TF_1:           RETI

RI_TI:          RETI

TF2_EXF2:  RETI                        ;VISSZAT.R.S MEGSZAKIT.SB.L

Remélem tudtam segíteni.
 

0

Vote up!

You voted ‘up’

Jaca
Jaca's picture

Szia!

Szimulátorban nekem addig nem csinált semmit, míg fel nem húztam egy 10k-val a P1.0 kimenetet. Az epromkezelés még nem volt benne.

0

Vote up!

You voted ‘up’

Guest
Guest's picture

Üdv!
Mi és hol a különbség? Mit csinál máshogyan?

0

Vote up!

You voted ‘up’

zus

Csak annyi a különbség, hogy valami miatt a VPP-t a uC vezérli, míg az enyémben az fix VCC-n van. Az EPROM adatlapja szerint az neki tökmindegy, hogy normál esetben a VPP GND vagy VCC. A másik különbség pedig a PSEN által vezérelt /OE+/CE.

0

Vote up!

You voted ‘up’

Guest
Guest's picture

Ez egy epromíró, ezért vezérli a VPP vonalat. A CE bmenet kezelése az érdekes számodra. A kiadott 16 címbitet csak a CE és az OE együttes aktív állapotában "látja" az eprom.

0

Vote up!

You voted ‘up’

Jaca
Jaca's picture

Szia!

http://dsp-book.narod.ru/ESD8031.pdf
A programot tudnád csatolni?

0

Vote up!

You voted ‘up’

zus

Persze. De sokra nem mész vele, mivel az egy egyszerű BASIC program. Nincs másom, amivel programozni tudom a 80C31-et.

A progi működik BELSŐ EPROM-os MCS-51-en, a komputeres szimuláció szerint ! De én ezt a 80C31-et szeretném beíndítani (máskülönben sincs 8x51-em, számítógéppel szimuláltam a progit - például a TopView-vel, amihez csatoltad a PDF-et). A gépmadár 4MHz-en ketyeg, biztos, ami biztos és hogy ne legyenek időzítési gondok az EPROM-nál.

Képtelen vagyok rájönni a hibára. A nyákot összehasonlítottam a neten fellelhető LS373-as és 573-as Ic-s nyákokkal, más EPROM-mal szerelt nyákokkal és az jó. Működő nyákkal is összehasonlítottam és aszerint is jó. Csak valahol a programozásban lehet a gond. Abban is biztos vagyok, hogy valami apró trükk, ami annyira triviális, hogy senki sem említi meg. Ezért nem lehet rátalálni.

File csatolás: 

0

Vote up!

You voted ‘up’

Oszi11
Oszi11's picture

Szia!

Tegnap nem volt időm foglalkozni a programoddal, de mos visszafordítottam a programot és elég érdekes lett a kód. Lehet érdemes lenne mást futtatni. Írtam egy egyszerű kis progit assemblyben ami elvileg 2Hz-el villogtatja a LED-et ha el nem számoltam. Esetleg próbáld meg azzal hátha más az eredmény! 

Üdv,
     Oszi

File csatolás: 

0

Vote up!

You voted ‘up’

Jaca
Jaca's picture

Szia!

Amit küldtél programot, az nem 100-tól indul, hanem 0c0-tól. Nem tudom, ez befolyásol-e valamit.

0

Vote up!

You voted ‘up’

Jaca
Jaca's picture

A romstart az elején ki van kommentelve?
Valaha programoztam intelt, talán 8080-at, de csak gépi kódban.

Ja, a ledet úgy kösd be, hogy a katódot tdee a kimenetre, az anódot meg 10k-val tápra. Open Draines a kimenet.
https://www.tutorialspoint.com/embedded_systems/es_io_programming.htm
Illetve az összes portot fel kellene húzni 10k-val tápra. 

0

Vote up!

You voted ‘up’

zus

Te Jaca, ez eddig is így van, csak a felszopó ellenállás az nem 10k, mert akkor a LED nem csinál semmit, hanem 270R és akkor vállalhatóan világít (nem folyik ki tőle a szemem, de jól látható).

0

Vote up!

You voted ‘up’

proba

Nem tudom, a kimenet képes  e egy ledet meghajtani? Lehet minden működik, csak a terhelés túl nagy. Azt biztosan tudod, hogy a kimenet leginkább OC jellegű,  de a terhelhetősége nem nagy. A rádiótechnika könyv alapján biztosan életre lehet kelteni, minden bonyodalom nélkül, mert semmi egyéb dokumentációm nem volt annak idején róla, és működtettem. A kimenetekhez nem volt semmi extra beállítás. Esetleg az 1990-es évkönyvben lévő 8048- as család felépítését is megnézheted, hátha abban is említenek valami fontosat. 

0

Vote up!

You voted ‘up’

zus

Figyi, egy kopasz ledet csak meg tud hajtani. Nagyobb baj az, hogy az 1-es port 1. kivezetésén nincs semmi mozgás (ott van LED). Nem zizeg a kivezetés. Ott stabil magas szint van. Úgy gondolom, hogy ha működne a rendszer és nem tudna egy LED-et villogtatni, akkor melegedne a uC és szkóppal megnézve, a mért jelalaknak is ott kéne lennie, csak torzan.

0

Vote up!

You voted ‘up’

Oszi11
Oszi11's picture

Szia!

A rajz amit feltöltöttél jó! Ilyen konfigurációban mennie kell. Ellenőrizd a buszok tartalmát. Ha készítesz egy olyan EPROM-ot ami csak nop utasítást tartalmaz látnod kell hogy végigszámolja a címeket az EPROM-on. Ha az ALE és a -PSEN működik akkor hozzá akar férni az ROM-hoz ellenőrizd a latch-t helyesen működik-e!

Üdv,
    Oszi

1

Vote up!

You voted ‘up’

zus

Szia Oszi11 ! Amikor mérem a cuccost, akkor azt láttam, hogy az ALE és a PSEN jelek kivezetésein négyszögjelek vannak. Az egyes buszok kivezetésein négyszög, illetve impulzusok kombinációi. ez idáig oké, mivel mondhatjuk azt, hogy az egymás után kiolvasott bájtok jelennek meg a buszon.
De minden ilyen kombó áll a szkóp ernyőjén, vagyis emberünk ugynazokat a dolgokat (ugyanazokat a bájtokat) ismételgeti. A legelején valahol egy végtelen ciklusba kerülhet a műszer. De csinál valamit, mivel mind az ALE, mind a PSEN jelek jelen vannak, a portokon a bájt kombinációknak megfelelő impulzusok is. Az AD0 kivezetés (port0.0 bit) pedig rendszertelenül pulzál, olybá tűnik, mintha a P0 port valahogy változtatná az értékét (a kivezetéseken levő bitkombinációkat). A rendszertelenség pedig akár lehetne a cím alsó bájtjainak változása is.

A külső memória olvasásánál az hiszem a PSEN jeleknek az impulzus szélessége a kiolvasott utasításoknak megfelelően változik, ha jól értettem az adatlapot. A lényeg, hogy nem egy ugyanolyan alakú-sorozatú négyszög jel sorozatot kell kapni, hanem változó impuzusszélességű jelsorozatot. Most emebrünk olyan az ALE és PSEN kivezetéseken, mint egy négyszögjel generátor. Az a baj, hogy továbbra sem tudom, hogy a programozásból mit hagytam ki ? Biztos vagyok benne, hogy valami nyomorult falg-et még valahol be kéne állítani ahhoz, hogy ez a vacak elinduljon. Sajnos nincs egy egy olyan leírásom, de még egy példaprogramom se (se Asm-ben, se C-ben vagy Pascalban, vagy Basic-ben), ami egy ilyen 80C31-es uC-t felprogramoz használhatóra. Úgy értem, hogy ami el is indul és működik szépen. Csak egy szem LED villogtatásáról lenne szó, de nem akarja az igazságot a rendszer. A kapcsolás szerintem is külön működik, a belevésett Led villogtató prigit is leszimuláltam komputeren legyálább három különböző progival és működik az is. A kettőt mégse tudom összehozni.

Egy Atmel 80C31X2-vel próbálkozom, de sima kopasz i8031-gyel is ugyanaz a probléma.

Ha egy kitörölt EPROM-ot teszek a gépbe, akkor az üres helyek megfelelnek NOP utasításnak ?

0

Vote up!

You voted ‘up’

Oszi11
Oszi11's picture

Szia!

A utasítás olvasásakor memóriát úgy olvassa, hogy először kiadja a 16-bites címet a P0-ra  és  P2-re majd az ALE magas jele belépteti a latch-be a P0-tartalmát ALE alacsonyra vált, P0 bemenetbe kapcsol ez után a -PSEN alacsony szintre vált és engedélyezi a rom kimenetét. Memóriaíráskor a PSEN magas marad, hogy ne tegye tönkre a buszt. Ezeknek a jeleknek így kell ismétlődni minden utasítás olvasásnál.
Sajnos az üres EPROM nem jó mert az FF-el van tele de 00 kell,  mert az a NOP kódja. Van egy olyan lehetőség hogy az EPROM adatbuszának minden bitjét földre kötöd ellenállásokon keresztül. Nem elegáns de működik. Az ellenállások kellenek hogy ne legyen zárlat. Értékük nem fontos néhány kilóohmosok jók.
Csatoltam egy doksit, Benne vannak opkódok és a gépi kódok is vissza tudod ellenőrizni az EPROM tartalmát hátha ott a baj.

Üdv,
      Oszi

File csatolás: 

0

Vote up!

You voted ‘up’

zus

Szia ! Köszönöm az utasításgyűjteményt, majd elolvasom. Közben eszembe jutott az, hogy ugyan minden leírás azt írja, hogy a programkód 0000h-tól megy a 8031-nél. Nem lehet az, hogy ezt kicsit fentebb kellene kezdeni ? 1000h-nál mondjuk ? Mivel a 8031-ben vannak belső regiszterek is, amik valami memóriánál vannak elhelyzve. De pl. 0500h-nél vagy 1000h-nál már nincs semmi.

0

Vote up!

You voted ‘up’

Oszi11
Oszi11's picture

Szia!

A belső registerek a belső ramban vannak a 128-as címtől kezdve, de valóban a program memória elején vannak a megeszakításvektorok ezek bedrótozott címek ahova az egyes megszakítások beugranak. A reset az 0000h ide érdemes egy JMP start  utasítást rakni ami elugrik a program elejére, ami az utolsó vektor után van (2BH ha minden igaz). Ha nem használtad ezeket a megszakításokat nem okozhatta problémát, de érdemes figyelembe venni.

Üdv,
      Oszi

0

Vote up!

You voted ‘up’

zus

Oszi bátyám, itt van ennek az AT80C31X2 a gépkönyve, amivel foglalkoznék. Akárhogy nézem, ez a nyomorult /EA=0 kivételével nem ír semmit a külső EPROM hozzáférésről. Még annyit se, hogy a megszakítások kezelése miatt legalább a 24H-tól célszerű indítani a progit (néhány bájt veszteség az EPROM-ban, na bumm). Kérlek, hogy nézd át, mert lehet, hogy valamit nem veszek benne észre. Az adatlapban a 33. oldalon ott vannak a külső memória olvasási jelealakok. Az ennél levő ALE és PSEN jeleket mértem, ilyenek, szerintem ennyire is vannak egymáshoz képest tájolva. Mindkét jel folyamatosan működik. Az adatvezetékeken is vannak jelek (az AD0 vagyis a 0-ás port 1. vezetékének az utolsó bitje folyamatosa, de rendszertelenül zizeg). Tehát, mintha emberünk olvasni szeretne, csak épp vagy nem tudja, hogy honnan, vagy valami végtelen ciklusba kerül a legelején.

File csatolás: 

0

Vote up!

You voted ‘up’

Oszi11
Oszi11's picture

Szia!

Ebben az adatlapban szinte csak az extrák vannak benne. Az eredetit az Intel gyártotta úgy 40 évvel ez előtt. Ez egy tovább fejlesztett verzió a megszakítás rendszere is prioritásos és csak annyit mond 5 vectror van a megszakításokhoz és szabadon kapcsolgatható melyik milyen priorítással legyen elérhető. Gondolom az első 5 a sztandardból.

Üdv,
   Oszi

File csatolás: 

0

Vote up!

You voted ‘up’

zus

Hozzászólásokra válaszolva kumulatíve: először is köszönöm a válaszokat. A PDF-ek nem voltak meg, letöltöttem őket, köszönöm. Bármi adhat jó ötletet.

A gond az, hogy a progit komputeren leszimulálva, az működik ! Úgy, ahogy annak mennie kell. Ezzel együtt élesben nem működik és nem tudom, hogy miért. Minden leírás azt írja, hogy az /EA=0 esetére a 80C31 automatikusan a külső memóriából kezdi el szipkázni a programkódot. De amivel én játszok, az konkrétan sz@rik bármit is kiszipkázni az EPROM-ból. Több EPROM-ot leteszteltem és több 8031-et. Ismétlem: emberünk úgy tesz, mintha az elején kiszippantana egy szem kódot az EPROM-ból, aztán úgy marad. Életjeleket ad, a buszokon ott állnak az impulzus sorozatok, meg a négyszögek, de mintha egy végtelen ciklusban lenne a uC. Vagy megteszi az első lépést, aztán kiakad, mert még valami hiányzik a kódból. Mit tudom én, honnan szedje a következő lépést ? Nem tudom és ebben kérek segítséget.

A probléma vagy egy apró elkötés a rajzban, amit nem hiszek, mert több helyen utánanéztem és mindenütt így van összekötve a lényeg. Inkább arra gondolok, hogy egy apró programozási trükk még kell, PSW-t beállítani, vagy valami regisztert az induláshoz. Hátha kell port irányt is beállítani, mint a PIC-eknél vagy az Atmeleknél (bár MCS-51-ben eddig ezt nem kellett). Valami ilyesmire gondolok, amit azért nem tudok, mert még a büdös életben nem volt arra szükségem, hogy külső memóriás uC-vel operáljak.

0

Vote up!

You voted ‘up’

zsugori
zsugori's picture

szia
így nem lehet?

File csatolás: 

0

Vote up!

You voted ‘up’

zus

Figyi, a reset az így van a rajzomon is, az /EA-nak GND-n kell lennie, máskülönben VPP programozó jelet vár a rendszer VAGY a belső (itt a 80C31-nél nem létező) EPROM-ból válogatna.

0

Vote up!

You voted ‘up’

zsugori
zsugori's picture

0

Vote up!

You voted ‘up’

Guest
Guest's picture

0

Vote up!

You voted ‘up’

kferi

Hát marha régen volt amikor erre írtam bármit. Talán még van is a fiókban.

0

Vote up!

You voted ‘up’

ty

hello, egy adatlapja csak van ennek a 8031-nek?

0

Vote up!

You voted ‘up’

SzBálint
SzBálint's picture

szia: ez lenne?

Bálint

File csatolás: 

0

Vote up!

You voted ‘up’

zus

Ez. A 80C31-es típus.

0

Vote up!

You voted ‘up’

More similar content