Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 63 odgovora
  • 14.371 pregleda

Najnovija ↓

Re: ATMEL 89C51 zadatak u C 02.12.2015. u 16:44 · pre 132 meseca #41
Opet nista :( istu gresku izbacuje
Re: ATMEL 89C51 zadatak u C 02.12.2015. u 18:56 · pre 132 meseca #44
popuni ali ne radi , ne znam zasto
Re: ATMEL 89C51 zadatak u C 02.12.2015. u 20:21 · pre 132 meseca #45
U poslednjoj verziji koda ne vidim ET0=1 (enable timer 0 interrupt)?

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

Pise undefined identifier kada ga dodam u inicijalizaciju
Re: ATMEL 89C51 zadatak u C 02.12.2015. u 23:51 · pre 132 meseca #48
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
arhimed
http://www.mysql.rs/ | http://elco.crsndoo.com/
Sviđa mi se1
Re: ATMEL 89C51 zadatak u C 04.12.2015. u 08:33 · pre 132 meseca #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 14:03 · pre 132 meseca #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 14:05 · pre 132 meseca #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 14:06 · pre 132 meseca #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 14:30 · pre 132 meseca #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 19:06 · pre 132 meseca #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 20:47 · pre 132 meseca
izmenjeno 1 put, poslednji put HeplF2 05.12.2015. u 21:02
  1. HeplF205.12.2015. u 21:02zapis iz teksta poruke
#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
Re: ATMEL 89C51 zadatak u C 05.12.2015. u 20:50 · pre 132 meseca #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 10:49 · pre 132 meseca #59
...........i onda su ljudi utihnuli :))
Re: ATMEL 89C51 zadatak u C 10.12.2015. u 13:17 · pre 132 meseca #60
Slaba trojčica.. neka. Slaba zato što ne slušaš šta ti ljudi savetuju a trojčica za trud i muku :)
Potpis
gorankg
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme