• 63 odgovora
  • 14.281 pregleda
Re: ATMEL 89C51 zadatak u C 02.12.2015. u 15:44 · pre 132 meseci #41
Opet nista :( istu gresku izbacuje
Re: ATMEL 89C51 zadatak u C 02.12.2015. u 17:56 · pre 132 meseci #44
popuni ali ne radi , ne znam zasto
Re: ATMEL 89C51 zadatak u C 02.12.2015. u 19:21 · pre 132 meseci #45
U poslednjoj verziji koda ne vidim ET0=1 (enable timer 0 interrupt)?

Re: ATMEL 89C51 zadatak u C 02.12.2015. u 22:48 · pre 132 meseci #46
Jeste,nema ga.

Pise undefined identifier kada ga dodam u inicijalizaciju
Re: ATMEL 89C51 zadatak u C 04.12.2015. u 07:33 · pre 132 meseci #49
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        
          }
     }            
}            

 


Potpis
www.micromatic.hr
Re: ATMEL 89C51 zadatak u C 04.12.2015. u 13:03 · pre 132 meseci #50
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

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;        
          }
     }            
} 



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.....
Re: ATMEL 89C51 zadatak u C 04.12.2015. u 13:05 · pre 132 meseci #51
ovo u zaglavlju zanemarite , posto sam probao nesto drugo pa je ostalo ali ne smeta da stoji
Code:

byte frequency;
byte displ;

Re: ATMEL 89C51 zadatak u C 04.12.2015. u 13:06 · pre 132 meseci #52
Bilo bi dobro ako neko ima program micro vision pa da isproba program pa da se uveri ,tesko je ovako...
ATMEL 89 C 51
Re: ATMEL 89C51 zadatak u C 04.12.2015. u 13:30 · pre 132 meseci #53
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.
Potpis
www.micromatic.hr
Re: ATMEL 89C51 zadatak u C 04.12.2015. u 18:06 · pre 132 meseci #54
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
Re: ATMEL 89C51 zadatak u C 05.12.2015. u 19:47 · pre 132 meseci #57
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


[Ovu poruku je menjao HeplF2 dana 05.12.2015. u 21:02 GMT+1]
Re: ATMEL 89C51 zadatak u C 05.12.2015. u 19:50 · pre 132 meseci #58
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;        
          }
     }            
} 

Re: ATMEL 89C51 zadatak u C 10.12.2015. u 09:49 · pre 132 meseci #59
...........i onda su ljudi utihnuli :))
Re: ATMEL 89C51 zadatak u C 10.12.2015. u 12:17 · pre 132 meseci #60
Slaba trojčica.. neka. Slaba zato što ne slušaš šta ti ljudi savetuju a trojčica za trud i muku :)
Potpis
gorankg
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme