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

Mikroprocesor 8051 arhitekture

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

Strane: 1 2 3

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

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

janko11

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



Profil

icon Mikroprocesor 8051 arhitekture15.04.2018. u 14:08 - pre 72 meseci
Napisao sam program u programskom jeziku C za mikroprocesor iz 8051 arhitekture koji putem serijskog porta prima podatke i prikazuje ih na displeju, ali iz nekog razloga cifre malo blinkuju. Da li bi neko mogao da mi pomogne oko resenja navedenog problema? U pitanju je procesor 80C32. Hvala unapred
Prikačeni fajlovi
 
Odgovor na temu

shpiki
Student
Novi Sad

Član broj: 50342
Poruke: 1651



+62 Profil

icon Re: Mikroprocesor 8051 arhitekture15.04.2018. u 18:31 - pre 72 meseci
Sema i kod, bez toga nista...
There are only 10 types of people in the world:
those who understand binary, and those who don't.
 
Odgovor na temu

janko11

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



Profil

icon Re: Mikroprocesor 8051 arhitekture15.04.2018. u 22:36 - pre 72 meseci
Program:
#include <reg51.h>
#include <stdio.h>
#include <stdlib.h>

void displayDigit(unsigned char cifra);
void delayTimer();
void showNumber();
void initSerial();
char receiveData();
void delay(unsigned int msdelay);
//void print();
char buff[20];
unsigned int pom;
//unsigned int br;
unsigned int flag;
unsigned int tmp1,tmp2,tmp3,tmp4,tmp5;
//unsigned int broj;
sbit A=P3^4;
sbit BB=P3^5;
sbit C=P3^6;
sbit INH=P3^7;
sbit LOAD=P1^7;
sbit DIN=P3^3;
sbit CLK=P3^2;
bit DMIRNA,DNULA,DTARA,DPRINT,DMINUS,DOVER,DMMER;

void main(void)
{
DMIRNA=1;
DTARA=0;
DNULA=0;
DMINUS=0;
DOVER=0;
DMMER=1;
P1=0x00;
P3=0x03;
PT0=1;
// flag=0;
// delayTimer();
// pom=0;
while(1)
{
initSerial();
showNumber();
// print();
// TH0=0xFF;
// TL0=0xFF;
delayTimer(); // kod petlji u interrup
}
}

// maskiranje (prikaz cifri na displeju koristeci kolo ULN2803)
void displayDigit(unsigned char cifra)
{
switch(cifra)
{
case 0: P1=0x3F; break;
case 1: P1=0x06; break;
case 2: P1=0x5B; break;
case 3: P1=0x4F; break;
case 4: P1=0x66; break;
case 5: P1=0x6D; break;
case 6: P1=0x7D; break;
case 7: P1=0x07; break;
case 8: P1=0x7F; break;
case 9: P1=0x6F; break;
}
}

// refresh display - a
void delayTimer()
{
// pom=0;
TMOD&=0xF0;
TMOD|=0x01;
TH0=0xFF;
TL0=0xFF;
ET0=1;
EA=1;
TR0=1;
while(TF0==0);
TF0=0;
TR0=0;
}

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

// prijem podataka
char receiveData()
{
char el;
while(RI==0);
el=SBUF;
RI=0;
return el;
}

// prijem podataka sa vage
void showNumber()
{
// unsigned int broj;
int i,j=0;
// int ind=0; // indeks elementa u redu niz
int tail=0; // indeks elementa u redu buff
// char buff[20],niz[5];
char el;
// br=0;
el=receiveData();
if(el==0x02) // pocetak komunikacije
{
buff[tail]=el;
tail++;
while(el!=0x03)
{
el=receiveData();
if(el!=0x03)
{
buff[tail]=el;
tail++;
}
else
{
buff[tail]=el;
tail++;
buff[tail]='\0';
// flag=1;
}
if(tail==20)
tail=0;
}
// flag=1; // uspesan prijem
}
else if(el==0x03) // kraj komunikacije
{
buff[tail]=el;
tail++;
buff[tail]='\0';
}
}

// obrada interrupta i ispis na display
void timer0(void) interrupt 1
{
int i;
tmp5=buff[3]-'0';
tmp4=buff[4]-'0';
tmp3=buff[5]-'0';
tmp2=buff[6]-'0';
tmp1=buff[7]-'0';
if(tmp5==0 && tmp4==0 && tmp3==0 && tmp2==0) // 1 cifra na displeju
{
for(i=0;i<40;i++)
{
INH=0;
C=0;
BB=0;
A=1;
displayDigit(tmp1);
delay(3);
}
}
else if(tmp5==0 && tmp4==0 && tmp3==0) // 2 cifre na displeju
{
for(i=0;i<40;i++)
{
INH=0;
C=0;
BB=0;
A=1;
displayDigit(tmp1);
delay(3);
INH=0;
C=0;
BB=1;
A=0;
displayDigit(tmp2);
delay(3);
}
}
else if(tmp5==0 && tmp4==0) // 3 cifre na displeju
{
for(i=0;i<40;i++)
{
INH=0;
C=0;
BB=0;
A=1;
displayDigit(tmp1);
delay(3);
INH=0;
C=0;
BB=1;
A=0;
displayDigit(tmp2);
delay(3);
INH=0;
C=0;
BB=1;
A=1;
displayDigit(tmp3);
delay(3);
}
}
else if(tmp5==0) // 4 cifre na displeju
{
for(i=0;i<40;i++)
{
INH=0;
C=0;
BB=0;
A=1;
displayDigit(tmp1);
delay(3);
INH=0;
C=0;
BB=1;
A=0;
displayDigit(tmp2);
delay(3);
INH=0;
C=0;
BB=1;
A=1;
displayDigit(tmp3);
delay(3);
INH=0;
C=1;
BB=0;
A=0;
displayDigit(tmp4);
delay(3);
}
}
else // 5 cifre na displeju
{
for(i=0;i<40;i++)
{
INH=0;
C=0;
BB=0;
A=1;
displayDigit(tmp1);
delay(3);
INH=0;
C=0;
BB=1;
A=0;
displayDigit(tmp2);
delay(3);
INH=0;
C=0;
BB=1;
A=1;
displayDigit(tmp3);
delay(3);
INH=0;
C=1;
BB=0;
A=0;
displayDigit(tmp4);
delay(3);
INH=0;
C=1;
BB=0;
A=1;
displayDigit(tmp5);
delay(3);
}
}
}

void delay(unsigned int msdelay)
{
unsigned int i,j;
for(i=0;i<msdelay;i++)
{
for(j=0;j<100;j++);
}
}


 
Odgovor na temu

veselinovic
Jovan Veselinovic
Ist. Sarajevo

Moderator
Član broj: 7761
Poruke: 3860
31.223.133.157



+333 Profil

icon Re: Mikroprocesor 8051 arhitekture19.04.2018. u 22:02 - pre 72 meseci
Sta da ti kazem,
procesor direktno vozi displej a nemas neku interapt rutinu da bezuslovno osvjezavas displej.
I tako procesor radi nesto drugo a na displej zaboravi.
Imas dva rjesenja, ili da optimizujes kod ako je moguce ili bolja varijanta da displej vozis nekom drajverom tipa 74595.
Ja sam probao TLC 5916 ( hvala Goranu na info) i mogu ti reci super kolo.
Konstantna struja, mozes smanjiti svjetlost serijski upis lecovan izlaz ma milina.
 
Odgovor na temu

tomam
Tomislav Milicevic
Beograd

Član broj: 104895
Poruke: 163
*.dynamic.vipmobile.rs.



+4 Profil

icon Re: Mikroprocesor 8051 arhitekture20.04.2018. u 07:39 - pre 72 meseci
Pogledaj malo temu na komsinskom forumu

http://forum.yu3ma.net/showthread.php?tid=1847
 
Odgovor na temu

janko11

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



Profil

icon Re: Mikroprocesor 8051 arhitekture24.04.2018. u 12:44 - pre 72 meseci
Kako mislis da procesor direktno vozi displej. Mozes li malo detaljnije da objasnis? Na semi je displej preko kola ULN2803 povezan sa procesorom.
 
Odgovor na temu

veselinovic
Jovan Veselinovic
Ist. Sarajevo

Moderator
Član broj: 7761
Poruke: 3860
31.223.133.115



+333 Profil

icon Re: Mikroprocesor 8051 arhitekture24.04.2018. u 15:13 - pre 72 meseci
Pod direktno se misli da izmedju procesora i displeja nema neki IC sa lecovanim izlazima.
A ULN je samo glupavi drajver koji sluzi da napoji displej strujom koja je veca od one koju moze dati procesor.
 
Odgovor na temu

mbm

Član broj: 66632
Poruke: 93



+10 Profil

icon Re: Mikroprocesor 8051 arhitekture24.04.2018. u 16:15 - pre 72 meseci

Program je glavmi problem. I to jednostavno ovako ne vredi dalje raditi.
Daću samo perporuku:
Interapt ne zove kašnjenja a baš ne treba ni druge funkcije. Nek samo postavi flagove kao zadatke za glavnu programsku petlju i to je to.
Samo rx i tx stavi u svoj prekid i tako će displej funkcija dobijati asinhrono nove podatke za ispis.

Milan
 
Odgovor na temu

janko11

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



Profil

icon Re: Mikroprocesor 8051 arhitekture25.04.2018. u 16:04 - pre 72 meseci
Ispravio sam deo koda za interrupt prekidnu rutinu timera, ali se samo prva cifra dobro vidi, ostale se slabije vide. Mozete li mi reci gde gresim u kodu?
Evo koda za prekidnu rutinu timera. Hvala na predlozima. Probacu i sa nekim drajverom.
void delayTimer()
{
TMOD&=0xF0;
TMOD|=0x01;
TH0=0xEE;
TL0=0x00;
TR0=1;
}

void timer0(void) interrupt 1
{
// int disp; // brojac za selekciju displeja
ET0=0;
EA=0;
TR0=0;
TF0=0;
TH0=0xEE;
TL0=0x00;
// disp=disp+1;
disp=1;
tmp5=buff[3]-'0';
tmp4=buff[4]-'0';
tmp3=buff[5]-'0';
tmp2=buff[6]-'0';
tmp1=buff[7]-'0';
// TH0=0xEE;
// TL0=0x00;
// P3=0x83; // iskljuci displeje
switch(disp)
{
case 1:
INH=0;
C=0;
BB=0;
A=1;
displayDigit(tmp1);
case 2:
INH=0;
C=0;
BB=1;
A=0;
displayDigit(tmp2);
case 3:
INH=0;
C=0;
BB=1;
A=1;
displayDigit(tmp3);
case 4:
INH=0;
C=1;
BB=0;
A=0;
displayDigit(tmp4);
case 5:
INH=0;
C=1;
BB=0;
A=1;
displayDigit(tmp5);
}
if(disp>6)
disp=1;
else
disp++;
TR0=1;
ET0=1;
EA=1;
}
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.com
Via: [es] mailing liste

Sajt: mysql.rs


+2377 Profil

icon Re: Mikroprocesor 8051 arhitekture25.04.2018. u 16:59 - pre 72 meseci
bez da gledam kod (u mailu izgleda uzasno pa ne mogu) mogu ti reci par
stvari

 - voznja lcd-a interaptom je bila ok '80tih godina, u 21. veku
koristimo externe cipove sa latch-om imas cip koji ti je spojen latch +
trandza drajver (kao npr 2003+595) kostaju ko kikiriki, trose manje
struje nego mcu koji trci non stop i daju mnogo bolju sliku na lcd-u (ne
titra) + mozes da biras nivo osvetljenja nekim pwm-om ako zelis

 - problem koji imas (da ti neke cifre svetle jace od drugih) znaci da
si lose napisao interapt rutinu (cesta greska) ... kada ispisujes cifre
na lcd-u (7segu u stvari kod tebe) moras da imas pauzu posle ispisa da
bi se cifra videla

595 kosta 0.09$ stvarno se ne isplati drndati se sa interaptima i
smarati mcu da gubi vreme (i struju) na te trivijale
 
Odgovor na temu

mikikg
System administrator
Srbija

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

Sajt: yu3ma.net


+505 Profil

icon Re: Mikroprocesor 8051 arhitekture25.04.2018. u 18:40 - pre 72 meseci
U 22. veku koriste Blue Pill bez drajvera, ULN-ova i tranzistora, more direkt na LED, jel mu fali nesto? :)
Ako se dobudzi FRAM tu, ihhh to je prelepo kako sve radi ....

https://www.youtube.com/watch?v=xA_-619ie-4
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.130



+333 Profil

icon Re: Mikroprocesor 8051 arhitekture25.04.2018. u 18:42 - pre 72 meseci
Inace ako si bas uporan postuj ovo,
kad displej vozis direktno sa uC procedura bi trebala biti ovakva:

Namjestis izlaze na pinovima za 1. cifru
Upalis katodu za 1. cifru.
Sacekas odredjeno vrijeme
Pogasis izlaze za anode displeja
ugasis katodu cifre 1
namjestis 2. cifru na pinovima
upalis katodu2
.
.
.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.com
Via: [es] mailing liste

Sajt: mysql.rs


+2377 Profil

icon Re: Mikroprocesor 8051 arhitekture25.04.2018. u 19:05 - pre 72 meseci
@veselinovic

sto "Pogasis izlaze za anode displeja" ?

kad zabodes katodu ugasi se display, promenis izlaze anode, upalis
katodu, cemu tak korak setovanja anode na intermediate vrednost?


@miki, fali mnogo toga :D
 
Odgovor na temu

mikikg
System administrator
Srbija

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

Sajt: yu3ma.net


+505 Profil

icon Re: Mikroprocesor 8051 arhitekture25.04.2018. u 19:10 - pre 72 meseci
Citat:
bogdan.kecman: @miki, fali mnogo toga :D


Klientu koji to koristi ne fali nista, cak sam ih pitao:

- Hocete LCD 2x16? - jok, ne vidim nista tu ...
- Hocete LCD 4x20? - jok, ne vidim nista tu ...
- Hocete Touch 7'' - jok, ne mogu to da pipkam ..
- Hocete 7-Seg LED? - Eeeee to hocu!

Sto je trazio to je dobio, ja sam extremno zadovoljan kako ta kombinacija radi, i stvarno radi bolje nego sve ovo gore sto sam spomenuo za veliki broj slucajeva ...
Site about Software Defined Radio – SDR
http://yu3ma.net/
https://github.com/yu3ma
On-line LM317 kalkulator
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.com
Via: [es] mailing liste

Sajt: mysql.rs


+2377 Profil

icon Re: Mikroprocesor 8051 arhitekture25.04.2018. u 20:14 - pre 72 meseci
7seg je keva, ali isto tako voznja 7seg-a sa latch drajverom je keva
 
Odgovor na temu

scoolptor

Član broj: 305514
Poruke: 1620



+585 Profil

icon Re: Mikroprocesor 8051 arhitekture25.04.2018. u 20:23 - pre 72 meseci
A voznja 7-segment sa MAX7219 je kevina keva.
Za $1.5 dobijes ceo displej.


 
Odgovor na temu

mbm

Član broj: 66632
Poruke: 93



+10 Profil

icon Re: Mikroprocesor 8051 arhitekture25.04.2018. u 21:22 - pre 72 meseci
Da ne ulazim u hardver. Molim vas prijatelji ne sugerišite CEO ispis na multipleks sedmosegmentni LED unutar jednog prekida ako već na njemu insistirate !!

Ako mora u prekidnu rutinu onda se tajmerom mora generisati interapt pa u njemu ugasiti prethodna i upaliti sledeća cifra upravo po redosledu kako je Jovan napisao. pa tako u krug.

Taj prekid se mora izvršiti za najkraće moguće vreme. u svakom slučaju na ovom hardveru za nekoliko mikrosekundi a na atmel AT89LP seriji za nekoliko stotina nanosekundi. Svo ostalo vreme sveta je onda na raspolaganju glavnoj programskoj petlji i funkcijama da rade šta im je volja.
RX i TX komunikacija moraj da se obavljaju u svom interaptu sa prioritetom koji je za red viši od tajmerskog prekida za ispis.

Ako već čovek želi da koristi ovaj hardver samo da primetim da u svakom "case" nedostaje "break" pa se uvek sve izvršava i onda switch nema smisla.

Hajde da se prvo na postojećem programu to ispravi. Sve ostalo neka bude u funkciji učenja.
 
Odgovor na temu

mikikg
System administrator
Srbija

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

Sajt: yu3ma.net


+505 Profil

icon Re: Mikroprocesor 8051 arhitekture25.04.2018. u 23:35 - pre 72 meseci
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 ...



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

uart

Član broj: 232423
Poruke: 125
*.adsl.eunet.rs.



+6 Profil

icon Re: Mikroprocesor 8051 arhitekture26.04.2018. u 05:24 - pre 72 meseci
Kao što reče kolega mbm za prijem podataka treba koristiti serijski interapt, evo primera koda:

Code:


#define RECBUFLEN 20
...........................


volatile unsigned char recv_bufptr=0;
volatile bit ser_received=0; 
volatile unsigned char dummy;

volatile unsigned char recv_buf[RECBUFLEN]; 

........................

void serial_isr (void) interrupt 4
{
   if (RI) {
           RI = 0;
           dummy = SBUF;

           switch (dummy)
               {

           case 0x02: start_OK = 1; recv_bufptr = 0; break; /* pocetak prijema */
            
           case 0x03: ser_received = 1; start_OK = 0; break; /* podaci primljeni */
            
           default: if (start_OK) {if (recv_bufptr < RECBUFLEN) {recv_buf[recv_bufptr] = dummy; recv_bufptr++;}} break;  /* upis u bafer */
            

                 }  /* switch */
               
           } /* if */
   
   else    {
           TI = 0;
           }

}

.......................

/* u glavnoj petlji */

if (ser_received)
   {
   EA = 0;

   /* obrada primljenih podataka */

   EA = 1;
   ser_received = 0;
   }

..............





Naravno, mora de se izmeni i rutina za tajmer interapt.


 
Odgovor na temu

veselinovic
Jovan Veselinovic
Ist. Sarajevo

Moderator
Član broj: 7761
Poruke: 3860
31.223.133.130



+333 Profil

icon Re: Mikroprocesor 8051 arhitekture26.04.2018. u 06:01 - pre 72 meseci
Citat:
bogdan.kecman:
@veselinovic

sto "Pogasis izlaze za anode displeja" ?

kad zabodes katodu ugasi se display, promenis izlaze anode, upalis
katodu, cemu tak korak setovanja anode na intermediate vrednost?



Bogdan je u pravu ( pleonazam),
dosao onaj nijemac ( kako se ono zvase) i sapnuo mi :)
 
Odgovor na temu

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

Strane: 1 2 3

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

Postavi temu Odgovori

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