Opet nista :( istu gresku izbacuje
ATMEL 89C51 zadatak u C
Zaključano
Zakačeno
isprati debagerom
Potpis
dakle ovako
1. ugasis interapt rutinu skroz
2. ispratis debagerom main, mora da ti popuni ring[] niz sa ovima koji
su deljivi sa 3
to ti je cca 4 minuta opsla max
1. ugasis interapt rutinu skroz
2. ispratis debagerom main, mora da ti popuni ring[] niz sa ovima koji
su deljivi sa 3
to ti je cca 4 minuta opsla max
Potpis
popuni ali ne radi , ne znam zasto
U poslednjoj verziji koda ne vidim ET0=1 (enable timer 0 interrupt)?
Jeste,nema ga.
Pise undefined identifier kada ga dodam u inicijalizaciju
Pise undefined identifier kada ga dodam u inicijalizaciju
kako ne radi ako popuni?
Potpis
mora pokrenes interapt, sad kako se to radi nemam pojma to vec moras sam da resis ali ako ti popuni niz znaci da radi kako terba main, sad samo jos napravi da radi interapt i ispisivace ti to na 1sec
Potpis
Probaj ovaj kod
Code:
#include <reg51.h>
#include <math.h>
typedef unsigned char byte;
byte a[7]= {3,5,15,1,4,11,9};
byte counter;
byte xdata display _at_ 0x8001;
byte xdata Buffer[7] _at_ 0x8002;
byte started = 0;
int i=0;
int j=0;
sbit switcher=P0^0;
void Inic(void)
{
EA=1;
TMOD=1; // 16 bit timer
TH0=0x3C; // set timer0 0xC350
TL0=0xAF; // 50,000 decimalno
TR0=0; // NE STARTAMO TIMER ODMAH
counter=1; // set brojac
}
void timer0(void) interrupt 1 using 2
{
TH0=0x3C; // set timer0 C350 = 50,000
TL0=0xAF; // posle svakog prekida
counter--; // broj prekide
if(counter == 0) // broj 20 prekida za 1 sec kasnjenja
{
counter = 20;
if(started == 1)
{
display=Buffer[j]; // ispisi na displej
j++; // inkrementiranje za novu vrednost u nizu
if(Buffer[j] == 0) // kada se prodju svi elementi u nizu ,resetuj tajmer
{
ET0 = 0; // disable timer 0
TR0 = 0; // stop timer0 - svi u nizu su provereni
started = 0; // started = 0,zaustavi kada se prekidac opet stisne
}
}
}
}
void main(void)
{
Inic();
switcher = 1; // prekidac se startuje na 1
i = 0; // postavi i na prvi broj u nizu
j = 0; // postavi i na prvi broj u bufferu
// izdvojimo u buffer brojeve iz niza djeljive s 3
nxt:
if(!(a[i]%3) ) // deli brojeve u nizu sa 3
{
Buffer[j]=a[i]; // ako su deljivi, upiši u buffer
j++; // inkrementiranje za novu poziciju u bufferu
Buffer[j]=0; //kraj tabele buffera
}
i++; // inkrementiranje za novu vrednost u nizu
if(i < 7) // obradi sve elemente u nizu
goto nxt;
while(1) //
{
if(switcher == 0)
if(started == 0)
{
started = 1; // started ide na 1 kada je prekidac pritisnut
counter = 1; // ceka se 50 milisekundi
j=0; // krečemo od prvog broja u bufferu
ET0=1; // enable timer0 interupt
TR0=1; // start timer0
}
}
}
#include <reg51.h>
#include <math.h>
typedef unsigned char byte;
byte a[7]= {3,5,15,1,4,11,9};
byte counter;
byte xdata display _at_ 0x8001;
byte xdata Buffer[7] _at_ 0x8002;
byte started = 0;
int i=0;
int j=0;
sbit switcher=P0^0;
void Inic(void)
{
EA=1;
TMOD=1; // 16 bit timer
TH0=0x3C; // set timer0 0xC350
TL0=0xAF; // 50,000 decimalno
TR0=0; // NE STARTAMO TIMER ODMAH
counter=1; // set brojac
}
void timer0(void) interrupt 1 using 2
{
TH0=0x3C; // set timer0 C350 = 50,000
TL0=0xAF; // posle svakog prekida
counter--; // broj prekide
if(counter == 0) // broj 20 prekida za 1 sec kasnjenja
{
counter = 20;
if(started == 1)
{
display=Buffer[j]; // ispisi na displej
j++; // inkrementiranje za novu vrednost u nizu
if(Buffer[j] == 0) // kada se prodju svi elementi u nizu ,resetuj tajmer
{
ET0 = 0; // disable timer 0
TR0 = 0; // stop timer0 - svi u nizu su provereni
started = 0; // started = 0,zaustavi kada se prekidac opet stisne
}
}
}
}
void main(void)
{
Inic();
switcher = 1; // prekidac se startuje na 1
i = 0; // postavi i na prvi broj u nizu
j = 0; // postavi i na prvi broj u bufferu
// izdvojimo u buffer brojeve iz niza djeljive s 3
nxt:
if(!(a[i]%3) ) // deli brojeve u nizu sa 3
{
Buffer[j]=a[i]; // ako su deljivi, upiši u buffer
j++; // inkrementiranje za novu poziciju u bufferu
Buffer[j]=0; //kraj tabele buffera
}
i++; // inkrementiranje za novu vrednost u nizu
if(i < 7) // obradi sve elemente u nizu
goto nxt;
while(1) //
{
if(switcher == 0)
if(started == 0)
{
started = 1; // started ide na 1 kada je prekidac pritisnut
counter = 1; // ceka se 50 milisekundi
j=0; // krečemo od prvog broja u bufferu
ET0=1; // enable timer0 interupt
TR0=1; // start timer0
}
}
}
Potpis
Probao sam taj sto si napisao sa bufferom ali ne radi.
Upalio sve diode na svim adresama 8000 8001 8002 8003 i neke ugasio opet na razlicitim..Svaki put kada startujem , neke druge diode ugasi ili upali.. ali svi portovi sa diodama su upaljeni, i zelene i zute i crvene plave. Onda kada ugasim i opet pokrenem program potpuno druge su neke upaljene, recimo plave... itd
Probao sam ja i dalje ovako
Dodao sam samo break u prekidnoj rutini. Mada to nesto ne pomaze al ajde...
I povecao sam recimo brojac na 200 i usporio je dostaprelaz ali kao da jos malkice treba da se smanji brzina ,to je mozad u mili sekundama ali ne znam kako tacno da odredim.....
Upalio sve diode na svim adresama 8000 8001 8002 8003 i neke ugasio opet na razlicitim..Svaki put kada startujem , neke druge diode ugasi ili upali.. ali svi portovi sa diodama su upaljeni, i zelene i zute i crvene plave. Onda kada ugasim i opet pokrenem program potpuno druge su neke upaljene, recimo plave... itd
Probao sam ja i dalje ovako
Code:
#include <reg51.h>
typedef unsigned char byte;
byte a[16]= {7,5,16,3,1,4,11,6,12,15,24,13,18,33,39,14};
byte counter;
byte frequency;
byte displ;
byte xdata display _at_ 0x8001;
byte started = 0;
int i=0;
sbit switcher=P0^0;
void Inic(void)
{
EA=1;
TMOD=1;
TH0=0x3C;
TL0=0xAF;
counter=1;
void timer0(void) interrupt 1 using 2
{
TH0 = 0x3C;
TL0 = 0xAF;
counter--;
if(counter == 0)
counter = 200;
if(started == 1)
{
while(i < 16)
{
if( (a[i] % 3) == 0)
{
display = (a[i]);
i++;
break;
}
i++;
}
if(i == 16)
{
ET0 = 0;
TR0 = 0;
started = 0;
}
}
}
}
void main(void)
{
Inic();
switcher = 1;
while(1)
{
if(switcher == 0)
if(started == 0)
{
started = 1;
i = 0;
counter = 200;
TH0=0x3C;
TL0=0xAF;
ET0=1;
TR0=1;
}
}
}
#include <reg51.h>
typedef unsigned char byte;
byte a[16]= {7,5,16,3,1,4,11,6,12,15,24,13,18,33,39,14};
byte counter;
byte frequency;
byte displ;
byte xdata display _at_ 0x8001;
byte started = 0;
int i=0;
sbit switcher=P0^0;
void Inic(void)
{
EA=1;
TMOD=1;
TH0=0x3C;
TL0=0xAF;
counter=1;
void timer0(void) interrupt 1 using 2
{
TH0 = 0x3C;
TL0 = 0xAF;
counter--;
if(counter == 0)
counter = 200;
if(started == 1)
{
while(i < 16)
{
if( (a[i] % 3) == 0)
{
display = (a[i]);
i++;
break;
}
i++;
}
if(i == 16)
{
ET0 = 0;
TR0 = 0;
started = 0;
}
}
}
}
void main(void)
{
Inic();
switcher = 1;
while(1)
{
if(switcher == 0)
if(started == 0)
{
started = 1;
i = 0;
counter = 200;
TH0=0x3C;
TL0=0xAF;
ET0=1;
TR0=1;
}
}
}
Dodao sam samo break u prekidnoj rutini. Mada to nesto ne pomaze al ajde...
I povecao sam recimo brojac na 200 i usporio je dostaprelaz ali kao da jos malkice treba da se smanji brzina ,to je mozad u mili sekundama ali ne znam kako tacno da odredim.....
ovo u zaglavlju zanemarite , posto sam probao nesto drugo pa je ostalo ali ne smeta da stoji
Code:
byte frequency;
byte displ;
byte frequency;
byte displ;
Bilo bi dobro ako neko ima program micro vision pa da isproba program pa da se uveri ,tesko je ovako...
ATMEL 89 C 51
ATMEL 89 C 51
Program je i proban u microvisionu i radi dobro.
Problem je da ti sad navodiš da "Upalio sve diode na svim adresama 8000 8001 8002 8003 i neke ugasio opet na razlicitim.." što mi baš nije jasno!?
Na početku programa definiraš da je
byte xdata display _at_ 0x8001;
Dakle display je bajt rama na adresi 0x8001
To nisu diode
U mom programu na adresama 0x8002 i narednih 7 je buffer a ne diode.
Malo pojasni sam hardwer.
Problem je da ti sad navodiš da "Upalio sve diode na svim adresama 8000 8001 8002 8003 i neke ugasio opet na razlicitim.." što mi baš nije jasno!?
Na početku programa definiraš da je
byte xdata display _at_ 0x8001;
Dakle display je bajt rama na adresi 0x8001
To nisu diode
U mom programu na adresama 0x8002 i narednih 7 je buffer a ne diode.
Malo pojasni sam hardwer.
Potpis
E pa kod mene je cetiri reda po osam dioda razlicitih boja i svaki red tih 8 dioda razlicite boje, poziva se sa adresama koje sam naveo .... Tako je kod mene..
Kako ti se cini moj kod?
a bafera nema i nismo to koristili nikada
Kako ti se cini moj kod?
a bafera nema i nismo to koristili nikada
A tih 8 dioda po adresi su 7 segmentni displej ili kako na njih upisati broj (binararno svaka adresa 1 znamenka ili kako)
Potpis
posalji ceo projekat u keil-u koji ima sve te kalakurcije .. pa da vidimo
Potpis
izmenjeno 1 put, poslednji put HeplF2 05.12.2015. u 21:02
Izmene poruke
- HeplF205.12.2015. u 21:02zapis iz teksta poruke
Taj displej se zove LED/7 seg 4x8 . Znaci diode su 4 reda po osa led dioda . Svaki red ima svoju adresu pomocu koje se poziva znaci 8000 8001 8002 8003 , redom crvene zute zelene plave
Atachment je u prilogu kako izgleda
Atachment je u prilogu kako izgleda
Kod je napisan ovako i najbolji je jer je brzina jako priblizna jednoj sekundi ,u mili sekundama je razlika
Code:
#include <reg51.h>
typedef unsigned char byte;
byte a[16]= {7,5,16,3,1,4,11,6,12,15,24,13,18,33,39,14};
byte counter;
byte xdata display _at_ 0x8001;
byte started = 0;
int i=0;
sbit switcher=P0^0;
void Inic(void)
{
EA=1;
TMOD=1;
TH0=0x3C;
TL0=0xAF;
counter=1;
void timer0(void) interrupt 1 using 2
{
TH0 = 0x3C;
TL0 = 0xAF;
counter--;
if(counter == 0)
counter = 200;
if(started == 1)
{
while(i < 16)
{
if( (a[i] % 3) == 0)
{
display = (a[i]);
i++;
break;
}
i++;
}
if(i == 16)
{
ET0 = 0;
TR0 = 0;
started = 0;
}
}
}
}
void main(void)
{
Inic();
switcher = 1;
while(1)
{
if(switcher == 0)
if(started == 0)
{
started = 1;
i = 0;
counter = 200;
TH0=0x3C;
TL0=0xAF;
ET0=1;
TR0=1;
}
}
}
#include <reg51.h>
typedef unsigned char byte;
byte a[16]= {7,5,16,3,1,4,11,6,12,15,24,13,18,33,39,14};
byte counter;
byte xdata display _at_ 0x8001;
byte started = 0;
int i=0;
sbit switcher=P0^0;
void Inic(void)
{
EA=1;
TMOD=1;
TH0=0x3C;
TL0=0xAF;
counter=1;
void timer0(void) interrupt 1 using 2
{
TH0 = 0x3C;
TL0 = 0xAF;
counter--;
if(counter == 0)
counter = 200;
if(started == 1)
{
while(i < 16)
{
if( (a[i] % 3) == 0)
{
display = (a[i]);
i++;
break;
}
i++;
}
if(i == 16)
{
ET0 = 0;
TR0 = 0;
started = 0;
}
}
}
}
void main(void)
{
Inic();
switcher = 1;
while(1)
{
if(switcher == 0)
if(started == 0)
{
started = 1;
i = 0;
counter = 200;
TH0=0x3C;
TL0=0xAF;
ET0=1;
TR0=1;
}
}
}
...........i onda su ljudi utihnuli :))
Slaba trojčica.. neka. Slaba zato što ne slušaš šta ti ljudi savetuju a trojčica za trud i muku :)
Potpis
gorankg