Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Mikroprocesor 8051 arhitekture

[es] :: Elektronika :: Mikrokontroleri :: Mikroprocesor 8051 arhitekture

Strane: 1 2 3

[ Pregleda: 7843 | Odgovora: 45 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

janko11

Član broj: 338428
Poruke: 29
*.adsl.eunet.rs.



Profil

icon Re: Mikroprocesor 8051 arhitekture26.04.2018. u 08:57 - pre 72 meseci
Ok. Hvala na predlozima. Sta konkrentno treba da se izmeni u kodu za timer interrupt? Moze li izmena?
 
Odgovor na temu

mikikg
System administrator
Srbija

Član broj: 3779
Poruke: 5059
*.dynamic.sbb.rs.

Sajt: yu3ma.net


+505 Profil

icon Re: Mikroprocesor 8051 arhitekture26.04.2018. u 12:56 - pre 72 meseci
Samo shemu da vidite, da li ima nesto "lepse i jednostavnije" od ovoga trenutno na planeti sa tom kolicinom delova koja ipak radi nesto korisnu u pozadini osim sto svicka po LED? :)

Kad budu napravili MAX7219 da moze isto ovako da se programira onda cu da predjem na njega, mozda : )


Site about Software Defined Radio – SDR
http://yu3ma.net/
https://github.com/yu3ma
On-line LM317 kalkulator
Prikačeni fajlovi
 
Odgovor na temu

mbm

Član broj: 66632
Poruke: 93



+10 Profil

icon Re: Mikroprocesor 8051 arhitekture26.04.2018. u 15:06 - pre 72 meseci
Citat:
mikikg:
Da objasnim zasto stalno instistiram na ovom resenju sa Blue Pill i direktnim guranjem LED, igrom slucaja to je retka kombinacija svih pojedinacnih delova koji se savrseno lepo uklapaju i sa SW i sa HW.

Kao prvo STM32 ima stalno spominjanje BSRR registre koji nam omugucavaju da napokon mozemo da setujemo bilo koju nozicu na bilo kom portu bez read-modify-write, ja ne znam da li imaju drugi ne-ARM kontroleri koji to mogu da urade, ispravite me ako gresim.
Ta jedna jedina opcija nam daje preduslov na mozemo da se malo "opustenije" igramo u ISR rutini jer ne moramo da pazimo na raise-condition sve dok vodimo racuna koje nozice kontrolisemo iz ISR. Takodje bas ta opcija nam se savrseno lepo nadovezuje na to da 7-Seg LED modul (5x7seg) mozemo fizicki da umetnemo izmedju DIP-40 rastera koji zauzima Blue Pill sa druge strane plocice tako da nozice od displeja idu odmah na I/O nozicu i tacno ima malo izmedju prostora (jedna raster-rupica 2.54mm) gde se umetne seriski otpornik za LED. Izpovezane nozice se lepo konfigurisu u programu i to je resen problem displeja.
U programu kao sto rekoh pocinje prica ali na malo drugaciji nacin (bar sam ja to tako resavao), ima tajmer koji poziva ISR recimo na svakih 1ms (1kHz) koji radi potrebnu logiku za osvezavanje JEDNE CIFRE + isti ISR iskoristio za interne vremence posto mi je zgodna vremenska baza, tako sam dobio i vremensku bazu i brzo osvezavanje LED-a i to je sve skockano sa inline optimizovanim switch/case logikom, bez funkciskih poziva i zauzima minimalno procesorskog vremena. Veza izmedju ISR rutine i vrednosti na displeju je preko jedne globalne array sa 5 clanova i to je sve.
Ja zgodnije i jednostavnije HW / SW resenje nisam video od tog do sad ... Naravno nagledao sam se kojekakvih 8-bit MCU kod kojih MORA da se sloze portovi sa LED nozicama, ne mogu bilo koje nozice, sa STM32 mogu bilo koje nozice i to je to ...

Ja sam tako gurao do 6 cifri direktno iz STM32 i to sa oversamplovanim (internim) 18bit-A/D, kao nesto zbog shuma ovo-ono ... ma radi to sve ko zmaj ...





Ali naš prijatelj nije pitao za 32 bitni STM ARM miktrokontroler već za konkretan problem sa arhitekturom koju je odlučio da koristi a to je 8051 u osnovi.
STM32 je odličan ali nije mcs51 arhitektura. Ako neko misli da je starudija spora verujte greši a read-modify-write koncept kod 8051 ni ne postoji jer ne može da čita koje stanje izlaza je zadato nekom ranijom komandom već čita samo fizičko stanje.
AT89LP serija je za mene odlična. Koliko će potrajati i treba li ga proučavati u dubinu u vreme drugih naprava ne mogu da kažem, ali bar vredi videti šta može.



 
Odgovor na temu

mbm

Član broj: 66632
Poruke: 93



+10 Profil

icon Re: Mikroprocesor 8051 arhitekture27.04.2018. u 12:52 - pre 72 meseci
Upravo sam ponovo pročitao naše postove na temi i shvatio da deluju baš nadmeno sve sa korišćenjem primerenih izraza ali nepotrebnih i slabo razumljivih u ovom slučaju, a čovek je samo pitao kako da nešto da uradi. Evo ja se u moje ime izvinjavam. Ako postavljač teme želi pomoći ću efikasnije koliko mogu.

Milan
 
Odgovor na temu

janko11

Član broj: 338428
Poruke: 29
*.dynamic.isp.telekom.rs.



Profil

icon Re: Mikroprocesor 8051 arhitekture29.04.2018. u 16:17 - pre 72 meseci
Koji deo u kodu za prekidnu rutinu timera, treba ispraviti da bi sve to funkcionisalo bez problema?
 
Odgovor na temu

mbm

Član broj: 66632
Poruke: 93



+10 Profil

icon Re: Mikroprocesor 8051 arhitekture30.04.2018. u 01:17 - pre 72 meseci
Vidi Janko da otklonimo prvo neke druge greške.
Ne mogu na šemi da pročitam ništa ali ako su displeji neki standardni nije mi jasno kako to još nije pocrkalo kad nema ostpornike na linijama sa uln2803 prema displejima. Prvo to da se reši pa onda:



Ovo je glavna programska petlja u main
while (1) {
initSerial();
showNumber();
// print();
// TH0=0xFF;
// TL0=0xFF;
delayTimer(); // kod petlji u interrup
}


tu se stalno u krug poziva :

void initSerial()

To ne treba da radiš. initSerial() treba da pozoveš samo jednom posle reseta (dakle na početku rada a pre ulaska u glavnu programsku petlju)
jer je ovo samo jednokratno podešavanje načina rada i startovanje serijskog porta. Inicijačlizacija je početno podešavvanje načina rada pa ga ne treba stalno beskonačno pozivati.
ovo lepo radi ali večno čeka na karakter i ništa drugo ne radi osim ako ima neki interapt.
// prijem podataka
char receiveData() {
char el;
while (RI == 0);
el = SBUF;
RI = 0;
return el;
}

Napiši prvo prijem karaktera u jednu globalnu promenljivu preko serijskog interapta. Postavi jedan bit global flag kao znak da imaš primljen karakter pa u main while petlji tek ako ima promene ti obrađuj a ko nem asamo obnavljaj displej. Toćeš ispraviti kasnije Pokušaj prvo ovo. Nemoj pokušavati odmah da pišeš serijski cirkularni bafer. to posle...

 
Odgovor na temu

janko11

Član broj: 338428
Poruke: 29
*.adsl.eunet.rs.



Profil

icon Re: Mikroprocesor 8051 arhitekture09.05.2018. u 12:36 - pre 71 meseci
Napisao sam funkciju za serijski interrupt i koristio flegove. Sada cifre ne trepere. Evo koda i za interrupt timera:

switch(disp)
{
case 1:
INH=0;
C=0;
BB=0;
A=1;
displayDigit(tmp5);
delay(5);
break;
case 2:
INH=0;
C=0;
BB=1;
A=0;
displayDigit(tmp4);
delay(5);
break;
case 3:
INH=0;
C=0;
BB=1;
A=1;
displayDigit(tmp3);
delay(5);
break;
case 4:
INH=0;
C=1;
BB=0;
A=0;
displayDigit(tmp2);
delay(5);
break;
case 5:
INH=0;
C=1;
BB=0;
A=1;
displayDigit(tmp1);
delay(5);
break;
}
disp++;
if(disp>6)
disp=1;

Sta je potrebno izmeniti u navedenom kodu da bi na displeju recimo umesto 01234 pisalo 1234 ili umesto 00675 pisalo 675?
 
Odgovor na temu

mbm

Član broj: 66632
Poruke: 93



+10 Profil

icon Re: Mikroprocesor 8051 arhitekture09.05.2018. u 17:29 - pre 71 meseci
Na konkretno pitanje konkretan odgovor u duhu koda koji je već napisan (sve ovo se u principu radi sasvim drugačije ali ako kažeš da sad radi kao što želiš onda je u redu.)

u duhu datog koda:

ako je tmp5 najviša težinska cifra a tmp1 najniža onda predlažem da uz jednu pomoćnu unsigned char promenljivu za ovu namenu, nazvaću je nula dopišeš...

copy / past tvog koda pa dodato to što ti treba s tim što ne obraćam pažnju na selekciju dipleja u multipleksu pa neću dirati INH, C, BB, A to se pobrini sam ali ni ne moraš neka ostane ovako samo se pobrini za displayDigit da ugasi displeje na sadrzaj 255



nula=0;
switch(disp)
{
case 1:
INH=0;
C=0;
BB=0;
A=1;
nula+=tmp5;
if (nula){displayDigit(tmp5);}else{displayDigit(0xFF);}// u funkciju displayDigit stavi da ako je 255 budu ugaseni segmenti
delay(5);
break;
case 2:
INH=0;
C=0;
BB=1;
A=0;
nula+=tmp4;
if (nula){displayDigit(tmp4);}else{displayDigit(0xFF);}
delay(5);
break;
case 3:
INH=0;
C=0;
BB=1;
A=1;
nula+=tmp3;
if (nula){displayDigit(tmp3);}else{displayDigit(0xFF);}
delay(5);
break;
case 4:
INH=0;
C=1;
BB=0;
A=0;
nula+=tmp2;
if (nula){displayDigit(tmp2);}else{displayDigit(0xFF);}
delay(5);
break;
case 5:
INH=0;
C=1;
BB=0;
A=1;
displayDigit(tmp1);
delay(5);
break;
}
disp++;
if(disp>6)
disp=1;

 
Odgovor na temu

mbm

Član broj: 66632
Poruke: 93



+10 Profil

icon Re: Mikroprocesor 8051 arhitekture11.05.2018. u 16:29 - pre 71 meseci
Šta bi Janko, da li je sad u redu?
 
Odgovor na temu

janko11

Član broj: 338428
Poruke: 29
*.adsl.eunet.rs.



Profil

icon Re: Mikroprocesor 8051 arhitekture14.05.2018. u 12:22 - pre 71 meseci
Probacu danas ili sutra. Nisam mogao ovih dana. Javljam cim probam. Samo jedno pitanje, za prikaz decimalne tacke na displeju, moralo bi se u funkciji displayDigit napraviti maska na isti nacin, kao sto sam radio za ostale cifre, ili postoji neki drugi nacin da se u programu podesi ukljucivanje decimalne tacke?
 
Odgovor na temu

mbm

Član broj: 66632
Poruke: 93



+10 Profil

icon Re: Mikroprocesor 8051 arhitekture14.05.2018. u 17:28 - pre 71 meseci
Najlakše je da se i tačka tretira kao segment ako ima dosta vodova, pa ubaciš i taj bit u masku.
 
Odgovor na temu

mikikg
System administrator
Srbija

Član broj: 3779
Poruke: 5059
*.dynamic.sbb.rs.

Sajt: yu3ma.net


+505 Profil

icon Re: Mikroprocesor 8051 arhitekture15.05.2018. u 10:46 - pre 71 meseci
Decimalna tacka treba da ima svoju logiku koja je malo odvojena od 7-seg logike.

Konkretno ne moze iz jedne komande da se upise i broj i tacka, tehnicki moze ali logicki nije prakticno.
Dakle 7-seg se obraduje kako se obraduje a decimalna tacka treba da ima jednu variablu gde se upisuje pozicija tacke, 0=nema tacke, 1=prva cifra levo, 2=druga cifro levo i tako dalje.

U interapt rutini ili funkciji koja obraduje 7-seg treba dodati tu logiku koja za izabrano decimalno mesto u trenutku kada se osvezava pojedinacna cifra i ako je izabrana decimalna tacka bas na tom mestu onda se aktivira i bit koji pali DP dok u svim ostalim situacijama gasi DP.
Site about Software Defined Radio – SDR
http://yu3ma.net/
https://github.com/yu3ma
On-line LM317 kalkulator
 
Odgovor na temu

veselinovic
Jovan Veselinovic
Ist. Sarajevo

Moderator
Član broj: 7761
Poruke: 3860
31.223.133.95



+333 Profil

icon Re: Mikroprocesor 8051 arhitekture15.05.2018. u 11:36 - pre 71 meseci
ili ako imas slobodnih pinova vozis DP direktno sa pina bez multipleksa.
 
Odgovor na temu

mbm

Član broj: 66632
Poruke: 93



+10 Profil

icon Re: Mikroprocesor 8051 arhitekture15.05.2018. u 15:06 - pre 71 meseci
Ako ima slobodnih pinova (a nekako nazirem na šemi da ima) onda taj jedan pin staviti kao osmi bit koji prolazi kroz ULN2803 i vrlo jednostavno se može koristiti pokretna tačka jer se upravlja isto kao bilo koji drugi segment (recimo to ovako umesto 7 ima 8 segmenata.)

"Konkretno ne moze iz jedne komande da se upise i broj i tacka, tehnicki moze ali logicki nije prakticno."

Konkretno može pozivom jedne funkcije (dakle jednom komandom) da se upiše i broj i tačka u smislu ima tačke ili nema tačke na datom displeju. I veoma je praktično samo stanje treba generisati u istoj funkciji gde se vrši konverzija u cifarska mesta.

Naravno ako je fiksna decimalna tačka onda nema potrebe za svim tim.

Ako se float pretvara u cifre za prikazivanje lako je unutar te funkcije staviti i jedan bajt čiji bitovi pokazuju postojanje ili nepostojanje decimalne tačke na ovakvom displeju slično kao što reče mikikg. To je samo poređenje težinskih mesta celobrojnog dela float. Vrlo je jednostavno i praktično.

U svakom slučaju tretiraj tačku kao osmi segment u ovakvoj upotrebi.

Milan

 
Odgovor na temu

janko11

Član broj: 338428
Poruke: 29
*.adsl.eunet.rs.



Profil

icon Re: Mikroprocesor 8051 arhitekture04.06.2018. u 09:58 - pre 70 meseci
Nisam stigao da odgovorim. Decimalna tacka radi. Da li postoji neka mogucnost da se u programu kod inicijalizacije serijskog porta podesi da se bira baudrate izmedju vise vrednosti, umesto da se stavi fiksna vrednost? Moze li neka smernica u kom pravcu treba razmisljati? Hvala svima na odgovorima i savetima.
 
Odgovor na temu

mbm

Član broj: 66632
Poruke: 93



+10 Profil

icon Re: Mikroprocesor 8051 arhitekture05.06.2018. u 01:32 - pre 70 meseci
Može, samo reci kako bi hteo da aktiviraš različite brzine. Zapravo može se napisati "autobaud", da se prijemni deo prilagodi brzini kojom se spoljašnji uređaj obraća serijskom portu, pa kad automatski odredi prijemnu brzinu podesi i predajnu. Nije komplikovano, smišljeno pre oko 30 godina ali ipak treba malo više programske memorije nego obična inicijalizacija.
https://www.pjrc.com/tech/8051/autobaud.html
Evo jednog načina ali orginalni način je mislim baš Intelov a Paul ga samo primenio.

Opet kažem zavisi šta hoćeš da postigneš.
Evo ti zgodan program da ne moraš da računaš na kalkulatoru:
https://www.8051projects.net/d...ytimer-routine-calculator.html

(Division je 12 kao standardni delilac oscilatora a ako koristiš AT89LP.... ili drugi tako zmijski brz onda je delilac 1.)
 
Odgovor na temu

janko11

Član broj: 338428
Poruke: 29
*.adsl.eunet.rs.



Profil

icon Re: Mikroprocesor 8051 arhitekture05.06.2018. u 15:08 - pre 70 meseci
Evo koda kako sam zamislio:

Code:

   void bRate()
   {
    switch(pom)
    {
        case 1:
                TH1=0xA0; // baudrate=300
            baud=jurbaud();
            if(baud==1)
               TR1=1;
        break;
        case 2:
            TH1=0xD0; // baudrate=600
            baud=jurbaud();
            if(baud==1)
            TR1=1;
        break;
        case 3:
                TH1=0xE8; // baudrate=1200
             baud=jurbaud();
             if(baud==1)
                 TR1=1;
            break;
        case 4:
            TH1=0xF4; // baudrate=2400
             baud=jurbaud();
             if(baud==1)
                TR1=1;
        break;
        case 5:
            TH1=0xFA; // baudrate=4800
            baud=jurbaud();
            if(baud==1)
            TR1=1;
        break;
        case 6:
                TH1=0xFD; // baudrate=9600
            baud=jurbaud();
            if(baud==1)
               TR1=1;
      break;
    }
    pom++;
    if(pom>7)
        pom=1;
}

unsigned int jurbaud()
{
    int i;
    for(i=0;i<10;i++)
    {
        if(RI)
        {
            el=SBUF;
            RI=0;
            if(el==0x02)  // pocetak komunikacije
                baudrate=1;
            else 
                baudrate=0;
        }
    }
    return baudrate;
}

void initSerial()
{
    TMOD&=0x0F;
    TMOD|=0x20;
    SCON=0xD0;
//    TH1=0xFD;
    TR1=1;
}

// main funkcija

void main()
{
  ...
 initSerial();
 while(1)
 {
     bRate();
 }
}



Baudrate, baud i pom su globalne promenljive.
Funkcionise za baudrate=9600, za ostale brzine ne radi. Da li sam na pravom putu ili je pogresan pristup? Ako je pogresan pristup, kako bi moglo da se uradi, da se detektuje baudrate izmedju vise razlicitih brzina. Frekvencija oscilatora je 11.0592MHz. Pogledao sam nacin koji je Paul primenio.

[Ovu poruku je menjao janko11 dana 05.06.2018. u 16:18 GMT+1]
 
Odgovor na temu

mbm

Član broj: 66632
Poruke: 93



+10 Profil

icon Re: Mikroprocesor 8051 arhitekture05.06.2018. u 18:14 - pre 70 meseci
Citat:
janko11:
Nisam stigao da odgovorim. Decimalna tacka radi. Da li postoji neka mogucnost da se u programu kod inicijalizacije serijskog porta podesi da se bira baudrate izmedju vise vrednosti, umesto da se stavi fiksna vrednost? Moze li neka smernica u kom pravcu treba razmisljati? Hvala svima na odgovorima i savetima.


Ovaj program koji si poslao po svom konceptu ne može da radi to što je napisano da bi trebalo da radi u gornjem citatu.
Opet je pomešana inicijalizacija sa redovnim radom. Moram da te podsetim da je SBUF validan tek ako je postavljen flag RI! dakle nema čitanja SBUF dok RI nije jednak 1 a takođe kad jednom pročitaš SBUF on više nije validan. a RI moraš sam da resetuješ.

Izbriši ovo sve. Koncept nije dobar i ovako ne može da se odredi kojom brzinom je poslat bajt ka 8051.

1. Predlažem da ne gubiš vreme sa autobaud algoritmom jer mislim da to nema neku pravu primenu.
2. Ako hoćeš da menjaš "u letu" brzinu onda prvo onemogućiš prijem pa podesiš reload vrednosti tajmera na novu vrednost pa omogućiš prijem i imaš novu brzinu.

Uostalom imaš gore link na fin kalkulator ne moraš da računaš.

Evo inicijalizacije na 19200 iz tog kalkulatora


//Replace x with timer no.
//Configure and Enable timer.
//Timer Clk=11.0592/12*1 = 0.9216 MHz
PCON |= 0x80 //Set SMOD
SCON = 0x50; //8-bit,rx enable
TLx = 0x00; //Lower Byte
THx = 0xFD; //Upper Byte
TRx = 1; //Run timer

Evo isto iz njega inicijalizacije za 4800

//Replace x with timer no.
//Configure and Enable timer.
//Timer Clk=11.0592/12*1 = 0.9216 MHz
PCON |= 0x80 //Set SMOD
SCON = 0x50; //8-bit,rx enable
TLx = 0x00; //Lower Byte
THx = 0xF4; //Upper Byte
TRx = 1; //Run timer


i to je urađeno JEDNOM NA POČETKU. Kasnije kad po nekom kriterijumu hoćeš da menjaš brzinu onda samo onemogući prijem na kratko promeni TH bajt na novu vrednost i ponovo pokreni prijem. To je zgodno ako GSM modul radi sa procesorom na 19200 a GPS/GLONASS na 4800 a prebacuješ procesorov port sa jedne na drugu periferiju.


Inače jesi li stavio gašenje vodeće nule kao što si hteo.

A ovo mi bode oči:

int i;
for(i=0;i<10;i++) ......

zašto za ime sveta int i ? to čak nije ni signed a ne unsigned char za to što broji ? nije to tridestdvobitni ARM :)
 
Odgovor na temu

janko11

Član broj: 338428
Poruke: 29
*.adsl.eunet.rs.



Profil

icon Re: Mikroprocesor 8051 arhitekture06.06.2018. u 12:26 - pre 70 meseci
Resen je problem sa nulom. Gde treba dodati menjanje brzine, u funkciji za inicijalizaciju serijskog porta? Posto ovo radim prvi put, mozes li da mi napises primer, da prijem podataka recimo zapocne brzinom 9600, pa se posle "u letu" promeni recimo na 2400, jer meni nikako ne uspeva to menjanje brzine?
 
Odgovor na temu

mbm

Član broj: 66632
Poruke: 93



+10 Profil

icon Re: Mikroprocesor 8051 arhitekture06.06.2018. u 18:15 - pre 70 meseci


Hajde prvo dobro prouči (komotno prepiši šta ti treba) a vrednost za TH1 za određenu brzinu izračunaj onim programom od gore.
Nema potrebe da ponavljam što je u ovom linku napisano, sasvim je korektno.

https://www.8051projects.net/w.../Serial_Communication_Tutorial
Ako bude i dalje trebalo pošalji mi privatnu poruku pošto ovo druge ne zanima pa ću ti poslati uzvratno.



 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: Mikroprocesor 8051 arhitekture

Strane: 1 2 3

[ Pregleda: 7843 | Odgovora: 45 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.