[ HeplF2 @ 29.11.2015. 12:50 ] @
Potrebno je napisati program u C za 8051 koji omogucuje ispis na displej(memorijski mapiran na adresi 0x8001) SAMO brojeve u datom nizu od sedam proizvoljnih elemenata koji su deljivi sa tri.
Brojeve ispisivati svake sekunde.

Pokusao sam da resim ali mi nije ne registruje deljenje nego samo ispisuje SVE brojeve redom u nizu i znatno brze od jedne sekunde.
Ideja je napraviti 50ms (C350 HEX) u tajmeru i preko brojaca napraviti 20 prekida jer 50ms *20=1 s

Ako neko zna gde je greska u kodu, neka napise ..
Hvala !

Code:

#include <reg51.h> 
#include <math.h>                  
typedef unsigned char byte;

byte a[7]= {7,5,16,1,4,11,9}; 

byte counter;
byte xdata display _at_ 0x8001;
byte started = 0;
int i=0;

sbit switcher=P0^0;
 
void Inic(void) 
{
    EA=1;         
    TMOD=1;       //  16 bit timer
    TH0=0xC3;     // set timer0  0xC350
    TL0=0x50;     // 50,000 decimalno
    TR0=1;
    counter=1;    // set brojac
}

 
void timer0(void) interrupt 1 using 2 
{    
    TH0=0xC3;  // set timer0  C350 = 50,000
    TL0=0x50;   // posle svakog prekida                   
    
    counter--;  // broj prekide
    if(counter == 0)      // broj 20 prekida za 1 sec kasnjenja     
       {
       counter = 20;        
       if(started == 1)  
         {
         if(i < 7)              //ako je i<7 deli sa tri brojeve u nizu
            if((a[i]/3) )       //    deli brojeve u nizu sa 3
               display=a[i];                            // ako su deljivi, ispisi na displej
         i++;             // inkrementiranje za  novu vrednost u nizu
         if(i == 7)        // 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
                   
   while(1)       
     {                    
     if(switcher == 0)    
       if(started == 0)   
          {         
          started = 1;    // started ide na 1 kada je prekidac pritisnut
          i = 0;          // postavi i na prvi broj u nizu
          counter = 20;    // ceka se 1 sekunda
                          // 
          TH0=0xC3;       // set timer0 na 0xC350
          TL0=0x50;      // 50,000 decimalno
          ET0=1;          // enable timer0 
          TR0=1;          // start timer0        
          }
     }            



[ _str_ @ 29.11.2015. 16:04 ] @
Code:
if(!(a[i]%3) )      
    display=a[i];                            // ako su deljivi, ispisi na displej


Kontrolišeš ostatak deljenja i ako je 0...
[ HeplF2 @ 29.11.2015. 16:23 ] @
Hvala.
Tacnije sada pokazuje ali kada sam dodao jos par elemenata niza na kraju uocim samo promenu dioda na displeju koja odgovara prvom broju 3
{3,7,5,16,1,4,11,9,6}

Verovatno se prebrzo menja pa ne mogu da uocim. Trebao bi da prikazuje 3,9 i 6 iz niza. Treba broj po sekundi ali je dosta brze !!

Trebao bih nekako drugacije da brojac vracam na nulu ili ?

I koja je razlika izmedju
Code:

  1)  if(!(a[i]%3) )      
       display=a[i]; 

  ILI 

   2)  result =a[i]/3;
        display=result;

ili

     3)  if((a[i]/3) )      
         display=a[i]; 
[ _str_ @ 29.11.2015. 19:49 ] @
Brojač broji od 0 ka FFFF i na svaki interapt ga setuješ sa FFFF-C350...
[ HeplF2 @ 29.11.2015. 20:21 ] @
Da,jeste. Sada je jedna sekunda ali za jednu sekundu promeni mi sva stanja.
Meni treba da posle svakog broja u nizu prodje 1 sekunda,a ne kada protrici kroz sve vrednosti koje su deljive sa tri.
Nije mi jasno kako da to omogucim , sekunda po jednom broju u nizu?
[ veselinovic @ 30.11.2015. 13:30 ] @
Treba da prebacis pauzu iza ispisivanja broja.
Dakle nasao si broj djeljiv sa 3.
Posaljes taj broj na displej i okines brojanje vremena.
Kad isteken vrijeme nastavis sa ispitivanjem brojeva.
[ HeplF2 @ 30.11.2015. 16:05 ] @
Da, tako bi trebalo. Ali ne moze to tek tako ...
Ako resetujem pre tj posel ispisivanja,nece ici na sledeci broj..
Ne znam sta drugo da prebacim ?
[ HeplF2 @ 30.11.2015. 16:07 ] @
Citat:
veselinovic:
Treba da prebacis pauzu iza ispisivanja broja.
Dakle nasao si broj djeljiv sa 3.
Posaljes taj broj na displej i okines brojanje vremena.
Kad isteken vrijeme nastavis sa ispitivanjem brojeva.



Da, tako bi trebalo. Ali ne moze to tek tako ...
Ako resetujem pre tj posel ispisivanja,nece ici na sledeci broj..
Ne znam sta drugo da prebacim ?
[ _str_ @ 30.11.2015. 17:45 ] @
Kako si podesio preskaler brojača i koji je kristal?
[ HeplF2 @ 30.11.2015. 18:33 ] @
Kristal je 12MHz

50 000*20=1s

FFFF-C350=3CAF

preskaler je podesen sada na
TH0=0x3C
TL0=0xAF
-----------------------------------------

[ HeplF2 @ 30.11.2015. 18:36 ] @
Sadasnji kod je sledeci

Code:


#include <reg51.h> 
#include <math.h>                  
typedef unsigned char byte;

byte a[7]= {7,5,16,1,4,11,9}; 

byte counter;
byte xdata display _at_ 0x8001;
byte started = 0;
int i=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=1;
    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)  
         {
         if(i < 7)              //ako je i<7 deli sa tri brojeve u nizu
            if(!(a[i]%3) )       //    deli brojeve u nizu sa 3
               display=a[i];                            // ako su deljivi, ispisi na displej
         i++;             // inkrementiranje za  novu vrednost u nizu
         if(i == 7)        // 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
                   
   while(1)       
     {                    
     if(switcher == 0)    
       if(started == 0)   
          {         
          started = 1;    // started ide na 1 kada je prekidac pritisnut
          i = 0;          // postavi i na prvi broj u nizu
          counter = 20;    // ceka se 1 sekunda
                          // 
          TH0=0x3C;       // set timer0 na 0xC350
          TL0=0xAF;      // 50,000 decimalno
          ET0=1;          // enable timer0 
          TR0=1;          // start timer0        
          }
     }            


[ HeYoo @ 01.12.2015. 00:03 ] @
Koji kompajler koristis? Mislim da na 8051 moras da ocistis interapt flegove pri ulasku u interapt rutinu. Ako to ne uradis, moze da se desi da se naknadni isteci tajmera ne obradjuju ili u gorem slucaju da kontrolor ostane zaglavljen u interapt rutini. Pogledaj datasheet.
[ HeplF2 @ 01.12.2015. 09:58 ] @
Koristim KEIL microvison program.
Ne koristim pravu maketu nego KEL maketu sa diodama u softveru..
[ HeplF2 @ 01.12.2015. 15:47 ] @
Zna li neko nacin da se svaki broj kao rezultat prikaze svake sekunde ?
[ uart @ 01.12.2015. 20:10 ] @
Ja bih, za početak, pojednostavio interapt rutinu:


Umesto

Code:

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)  
...
...
}


uveo bih flag update_display, pa bi ovaj deo koda izgledao ovako:

Code:

byte counter = 20;
byte update_display = 0;


void timer0(void) interrupt 1 using 2 
{    
TR0 = 0; //zaustavi tajmer
    TH0=0x3C;  // set timer0  C350 = 50,000
    TL0=0xAF;   // posle svakog prekida                   
TR1 = 1; //pokreni tajmer
    
    counter--;  // broj prekide
    if(counter == 0)      // broj 20 prekida za 1 sec kasnjenja     
       {
       update_display = 1; //ovde smo svakih 1 sec
       counter = 20;
}



Staro je pravilo da interapt rutine treba da budu što kraće tj. da imaju što manje instrukcija.

Proveru deljivosti bih prebacio u glavnu petlju. Nema potrebe isključivati tajmer, update_display će imati vrednost "1" svaku put kada istekne sekunda.

Dodao sam i instrukcije za zaustavljanje tajmera 0 pre upisa TH0 i TL0. U nekim (retkim) slučajevima može doći do probelma u radu tajmera ako se on ne zaustavi pre upisa TH0 i TL0.

Za dalje mi nije baš jasno kako ovo treba da radi.

Ne radi ništa dok se ne pritisne taster? Kada se pritisne taster odmah se ispisuje prvi broj u nizu koji je deljiv sa 3, pa se zatim čeka jedna sekunda?
Posle jedne sekunde se ispisuje sledeći? Šta se dešava ako je samo jedan broj u nizu deljiv sa 3? Ili nijedan?
...
...



[ HeplF2 @ 02.12.2015. 08:19 ] @
Pa ne zanam bas da update flag resava stvar

Treba da svake sekunde ispise broj. Tj broj po sekundi.

Nece nista ispisati ako nema broj deljiv sa tri. Sam uslov sa if (!(a%3)) omogucuje.
Nisam nikada radio sa update display

Cuo sam da moze da se napise i bez toga samo nesto treba drugacije napisati..
Ja sam uspeo da sve brojeve koji su deljivi sa 3 ispise za jednu sekundu. Jer ne znam kako da omogucim da jedan broj bude po sekundi.

Profa kaze da treba ispisivanje da bude u prekidnoj rutini. Sto mi je i nekako logicno zbog ispisivanja svake sekunde, da prekid napravi svake sekunde ide na sledeci..
E sad.. Nece nista vise da kaze ;)

Rekao je da nigde ne vracam brojac na nula . E sada gde treba da ga vratim nemam pojma??
Vracam ga sa uslovom if(counter ==0) counter =20 i to je to ... Drugi nacin ne znam
[ bogdan.kecman @ 02.12.2015. 09:17 ] @
uh bre al ste ga zakomplikovali, ne radi se to tako :( ti ne znas koliko dugo ce ispitivanje trajati, zavisno od velicine ulaza i nacina generacije ulaza moze da potraje..

1. napravis ring bafer (implementiras sa nizom i 2 pointera)
2. dokle god p nije stigao q u glavnoj petlji ispitujes ulazne vrednosti i kada naidjes na ulaz koji odgovara uslovu zadatka (u tvom slucaju deljiv sa tri) dodas ga u ring bafer
3. u interapt rutini, brzinom koja je zadata (1 u sekundi ili 1 u 3 sekunde ili sta ti je vec zadatak postavio), uzimas vrednost iz ring bafera i ispisujes na ekran

obrati paznju da dodavanje u bafer pomera p, vadjenje iz bafera pomera q, dakle p i q se medjusobno jure, kada p sustigne q znaci da nemas mesta vise u ring baferu i tada u glavnoj petlji cekas da ti se oslobodi mesto

jasno? ili da crtam :)
[ HeplF2 @ 02.12.2015. 09:30 ] @
Jasno mi je skroz sta zelis da kazes ali mi nismo radili sa ring baferom bas nista..
Radili smo samo tajmer 0 i 1 i brojac koji broji ako prevazilazi kapacitet tajmera i to je to. Naravno primeri neki sa ispisivanjem niza ali ne ovakvog kako sada imam, da trazi sekundu za svaki broj. Malo je drugacije
Ostalo je umece iz C :D

Ako si voljan, slobodno crtaj :)))
Treba mi resenje za ispit...
[ bogdan.kecman @ 02.12.2015. 09:37 ] @
pa sta ako niste radili sa ring baferom, radio si sa nizom, znas da
napravis pointer na element u nizu, to ti je to, samo fancy ime za
drugacije koristenje niza .. to sto ga niste koristili tako ne znaci da
nije upravo ono sto profa ocekuje od vas da skapirate ..

uvek kada imas taj tip problema - gledaj kakav ti bafer treba, da li
hoces neki FIFO kao sto ti sada treba, tu je ring keva (zovu ga i
rolling, circular..) ili ti treba FILO (ili LIFO, ista stvar) gde onda
implementiras nesto kao stek .. na mcu nemas vremena da se igras sa
listama i slicno, uvek je obican niz i samo pitanje da li imas 1, 2 ili
3 pointera na taj niz



da ne bih crtao pogledaj: https://en.wikipedia.org/wiki/Circular_buffer


evo ti primer implementacije (malo duzi zato sto je "generalni primer"
to mozes da iskasapis ihahaj za sebe):
http://c.learncodethehardway.org/book/ex44.html
[ HeYoo @ 02.12.2015. 10:45 ] @
Citat:
uvek kada imas taj tip problema - gledaj kakav ti bafer treba, da li
hoces neki FIFO kao sto ti sada treba, tu je ring keva (zovu ga i
rolling, circular..) ili ti treba FILO (ili LIFO, ista stvar) gde onda
implementiras nesto kao stek .. na mcu nemas vremena da se igras sa
listama i slicno, uvek je obican niz i samo pitanje da li imas 1, 2 ili
3 pointera na taj niz


Bogdane, vrlo cenim tvoje misljenje ali mi nije bas najjasnije koja je upotrebna vrednost ring buffera u ovom zadatku. On vec ima staticki niz koji predstavlja fiksan "ulaz".
HeplF2 ima problem sa interapt rutinom. Trebao bi za pocetak da u rutinu stavi samo toggle nekog pin-a i vidi da li ledica blinka na sekundu. Moguce je da postoiji neka igrarija sa interupt flegovima ili sa variablama koje koristi u ISR.
Moguce je da je kompajler u optimizaciji eliminisao neku od varijabli iz rutine. Probaj ih deklarisati kao volatile.
[ HeplF2 @ 02.12.2015. 10:58 ] @
Gledao samo. Nije bas jednostavno kako izgleda. :))

Odustajem od ringa. Hvala ti na komentaru ;)
[ HeplF2 @ 02.12.2015. 11:01 ] @
Zadatak je kao jednostavan ali ima neki trik
[ bogdan.kecman @ 02.12.2015. 11:19 ] @
@heplf2, nema tu nikakav trik, a ako ti je ring komplikovan (niz i 2 pointera) onda se iskreno nadam da je poenta ovoga da odradis zadatak i da se vise nikad u zivotu ovim ne bavis

@heyoo, napravio ga je on vec da ide na 1sec pa mu je profa rekao da nije to to zar ne? ako cemo tako da gledamo moze on i rucno da izbaci sve iz niza koji nisu deljivi sa 3 "kad vec ima samo taj ulazni niz" zar ne? poenta je da se napravi univerzalno resenje koje radi za siri broj slucajeva inace je zadatak beskoristan...

ajmo opet
- profa je trazio da bude ispis u isr

dakle to sto isr ispisuje mora vec da bude spremno, negde, dakle u main-u moras da spremis sledecu vrednost za prikaz. ako radis sa ring baferom velicine 1 to je "vrednost" + "slobodno", dakle postavis slobodno na 1 svaki put kad vrednost procitas (znaci da ti je varijabla vrednost sada slobodna), u main-u ako je slobodno ==1 izracunas sledecu vrednost, postavis slobodno na 0 i cekas dok ne bude slobodno opet 1 da bi ubacio u vrednost novu vrednost. problem ovde je sto ako ti je ulaz "spor" ili "nejednakom brzinom dolazi" bafer velicine 1 moze da bude suvise mali pa je onda iskusno da imas malo veci bafer .. npr velicine 10.. to sto ces ti za ovih par brojki u nizu stici da nadjes "sledeci deljiv sa 3" u tih 1sec koliko imas vremena nije "univerzalno resenje" a razlika u implementaciji za bafer od 1 bajt i bafer od X bajtova je 1 varijabla vise i 5 linija koda vise i dobijes full skolsko univerzalno resenje ... no kada su odgovori "suvise komplikovano" i "nismo sa tim radili" ...

[ HeplF2 @ 02.12.2015. 11:37 ] @
Pa poenta mi je da spremim ispit.. A ja sam inace hardwer designer a ne softver.
Ali moram da polozim da bi zavrsio sa studijama.
Opet ti se zahvaljujem sto zelis da pomognes,ali ne znam koliko ce mi trebati jos da se sa ringom izborim i da na kraju jos ne radi . Samo da se upucam :))
[ bogdan.kecman @ 02.12.2015. 12:22 ] @
:D :D :D :D

nes se mnogo usreciti sa hw dizajnom ako ne savladas odlicno C .. no u svakom slucaju ako ne zelis ovim da se bavis poptuno razumem nedostatak zelje da se cimas previse oko zadatka koji te ne zanima :D

evo jedno pitanje, sta ako je taster bio otpusten 2 sekunde? sa ring-om imas i dalje na 1 sec nisku, bez ringa nemas, imas pauzu tu dok je taster otpusten


elem, evo ti kod koji radi to sto si napisao da hoces, ako sam razumeo oko tastera sta si hteo
Code:

#include <reg51.h> 
#include <math.h>
        
#define ELEMENTS_IN_A 7        
#define RING_BUFFER_SIZE 5

typedef unsigned char byte;

byte a[ELEMENTS_IN_A]= {7,5,16,1,4,11,9}; 

byte ring[RING_BUFFER_SIZE];
volatile byte p;
volatile byte q;

volatile byte counter;
byte xdata display _at_ 0x8001;
volatile int i=0;
sbit switcher=P0^0;

void timer0(void) interrupt 1 using 2 {
  // bem li ga valjda ovako na '51 ide konfiguracija tajmera
  TR0 = 0;   // zaustavi tajmer
  TH0=0x3C;  // set timer0  C350 = 50,000
  TL0=0xAF;  // posle svakog prekida                   
  TR1 = 1;   //pokreni tajmer
    
  if (counter) {                                   // da li je proslo 1sec
    counter--;
  } else {
    if (((q + 1) % RING_BUFFER_SIZE - p - 1)){ // da li imas spreman podatak u baferu?
      display = ring[p];
      p = (p + 1) % RING_BUFFER_SIZE;              // pomeri pocetak za jedno mesto napred
      if (p == q) p = q = 0;                       // nije obavezno ali ako je ring prazan stavi ih da krenu od nule
    }
    
    counter = 20;                                  // koliko ti prekida treba za 1sec
  }
}


void main(){
  counter = 0;
  i = 0;
  p = 0;
  q = 0;
  
  //konfigurisi tajmer
  EA=1;         
  TMOD=1;       //  16 bit timer
  TH0=0x3C;     // set timer0  0xC350
  TL0=0xAF;     // 50,000 decimalno
  TR0=1;
  
  while(i<MAX_ELEMENTS_IN_A)
    while (!switcher)    // da li treba dokle god je stisnut taster da citas ili treba da sacekas da se pusti taster da bi cekao da se ponovo stisne za nastavak? da li ti treba tu neki sw debouncing?  ovako radi tako kako si i ti inicijalno pisao - dokle god je stisnut on cita
      if (RING_BUFFER_SIZE - ((q + 1) % RING_BUFFER_SIZE - p - 1)  == 0) //ako ima mesta u baferu, trazi sledeci deljiv sa 3
        if ( a[i++] % 3 == 0) {
          ring[q] = a[i-1];               //ubaci ga u ring
          q = (q + 1) % RING_BUFFER_SIZE; //pomeri kraj za jedno mesto
  }
      
      
  while(1); // zavrti se na kraju posto nemas gde da "izadjes"
}


[ HeplF2 @ 02.12.2015. 12:50 ] @
U pravu si. Potpuno se slazem.
U Srbiji nema sanse da se usrecim sa tim ako ne znam C, ili neko programiranje..Mislim , tesko je za posao. Svestan sam.
Kad te pitaju sta zavrsavas i kazes elektro, svi misle da si programer, tj da radis neko programiranje :))

Zato na zapadu mozes svasta da radis ali ne bih sada o tome... ;)

Inace, pustio sam sada kod i nazalost ne radi :((. Ni da micne
Mrtav a prosao kompajler bez greske.....

[ bogdan.kecman @ 02.12.2015. 12:58 ] @
za C, ne mislim ja da treba da budes programer, ali da bi dizajnirao
bilo kakav hardware mora znas C i mora ga znas dobro, jer HW bez nekog
procesora, bar minimalnog implementiranog u vhdl-u, ozbiljnog dizajna
nema .. danas cak ni analogiju ne mozes da radis bez bar jednog malog
procesora, tako da moras da znas C ako nista drugo da bi mogao da
testiras dal ti dizajn radi ili ne :D

a sto se koda tice, ja sam inicijalizaciju tajmera iskopirao od tebe
(pojma nemam kako se inicijalizuje tajmer na tom '51) .. tako da ako ti
se interapt ne vrti, proveri dal je to inicijalizovano kako treba

dalje, main, vidi on ce da prodje jednom kroz niz i to je to, onda ce da
stane i da se vrti u mrtvoj petlji, da li imas tu neki debuger? ili samo
izvrsis i cekas?

ako pogledas prva petlja ti je

while(i<MAX_ELEMENTS_IN_A)

znaci ide samo jednom kroz niz. ako hoces da se vrti beskonacno, tj da
uvek krece od pocetka niza kad ga zavrsi, valjda toliko umes da promenis
kod?

Code:

  while(1){
    if (i >= MAX_ELEMENTS_IN_A) i = 0;
    while (!switcher)    // da li treba dokle god je stisnut taster da citas ili treba da sacekas da se pusti taster da bi cekao da se ponovo stisne za nastavak? da li ti treba tu neki sw debouncing?  ovako radi tako kako si i ti inicijalno pisao - dokle god je stisnut on cita
...
  }}


i onda ti donja petlja while(1); ne treba posto se ova gore nece nikad
zavrsiti

dalje, imas while (!switcher) dakle ta unutrasnja petlja ti se vrti sve
vreme dok ti je taster stisnut (razumeh iz tvog koda da ti je switcher 0
kada je taster stisnut), nema debouncinga, nema cekanja da pustis taster
pa pritisnes ponovo za sledeci, dakle u tvom slucaju on ce da cim pipnes
taster protrci kroz sve i zavrsi posto je dovoljno brz .. ako hoces da
tasterom dajes "jedan po jedan" input onda tu mora se doda jedno cekanje
da taster postane 1 (otpusten), neki debounce ovo ono .. ako radis hw
znas valjda o cemu pricam ...

[ bogdan.kecman @ 02.12.2015. 13:01 ] @
e da i savet, promeni ELEMENTS_IN_A da bude malo vece od 7 i dodaj u a
niz dodatnih vrednosti i napravi da imas jos neku koja je deljiva sa 3
:D sada imas samo jednu vrednost deljivu sa tri i nije ti neki test :D

znaci umesto

#define ELEMENTS_IN_A 7

stavi npr

#define ELEMENTS_IN_A 20

a umesto
byte a[ELEMENTS_IN_A]= {7,5,16,1,4,11,9};

stavi

byte a[ELEMENTS_IN_A]= {7,11,9,15,13,5,5,3,3,5,5,5,3,5,3,6,9,8,33,7};

cisto da bude zanimljivije :D
[ HeplF2 @ 02.12.2015. 13:44 ] @
Pa nije bas tako ,al ajde.Mislim u pravu si da ima. Pogotovo za digitalni dizaj gde se pise verilog ili vhdl kod...
Zavisi gde radis i sta .. Ima raznih testiranja, postoje i masine-instrumente koje su specijalizovane za odredjena testiranja..
hardver je dosta sirok pojam. Mozes raditi i mikrotalasnu , gde projektujes antene,filtre i slicno,proces proizvodnje samog cipa... Ili da radis na razvoju nekog dela cipa.. Sve zavisi da li je industrija ili neka mala firma... itd.. Ali opet kazem da mozes da radis ali ne moras da znas, nije svuda prisutan... To sam hteo da kazem.. Ima tu dosta sfera koja su vezana za elektroniku a nije programiranje...

eee skontao sam sada da u kodu fali inicijalizacija :))
probacu sada da dodam to, jer bez toga nece ni raditi i mora se pozvati u main delu...
a prekidac nije bitno kako se pali ,samo da se aktivira.. Mi obcno samo if (switcher)... Ne zahteva se nista posebno...

[ HeplF2 @ 02.12.2015. 13:52 ] @
ima debug, posto tu mi se i otvara display
[ bogdan.kecman @ 02.12.2015. 14:02 ] @
Citat:
HeplF2:
Mozes raditi i mikrotalasnu , gde projektujes antene,filtre i slicno,proces proizvodnje samog cipa...


i opet imas mcu na toj mikrotalasnoj ... cak i da dizajniras samo hornu software za dizajniranje horne zahteva da pises plagine u C-u da bi mogao da dobijes to sto ti treba :D .. tu i tamo ti trba i matlab i fortran ali bez C neces da se usrecis

Citat:
HeplF2:
Ili da radis na razvoju nekog dela cipa.. Sve zavisi da li je industrija ili neka mala firma... itd.. Ali opet kazem da mozes da radis ali ne moras da znas, nije svuda prisutan... To sam hteo da kazem.. Ima tu dosta sfera koja su vezana za elektroniku a nije programiranje...


kad pocnes da radis, videces koliko je C neophodan za bilo kakav moderan rad sa elektronikom i koliko ne mozes da dobijes posao bez znanja istog...
naravno pricam o stvarima koje se rade sa faxom, banderasima ne treba C, ovima sto sklapaju plc kockice i pustaju masine u proces uglavnom ne treba C (doduse svi koji to malo bolje rade znaju odlicno C jer je mnogo lakse kad znas C i ladder i matlab..) ... os projektujes tanjir za mw - C-olik je interface za programiranje aplikacije za dizajn, os hornu, ista prica, os kontrolises lnb - mora pises neki kod da pricas sa njim, dal ce ga cukas u asm ili c ili ... na tebi je al opet mora pises kod ... adc, dac .. proslo je vreme "menjanja procesora u TV-u" :D


Citat:
HeplF2:
eee skontao sam sada da u kodu fali inicijalizacija :))
probacu sada da dodam to, jer bez toga nece ni raditi i mora se pozvati u main delu...
a prekidac nije bitno kako se pali ,samo da se aktivira.. Mi obcno samo if (switcher)... Ne zahteva se nista posebno...


pa provuci to kroz debug vidi kuda ide kod i gde zavrsava :)
[ HeplF2 @ 02.12.2015. 14:02 ] @
Nece da radi opet.... Nesto ne stima..Mrtav displej
Nema veze.. Nemoj se vise muciti

Valjda ce se jos neko javiti ..

HVALA TI PUNO JOS JEDNOM !!
[ bogdan.kecman @ 02.12.2015. 14:07 ] @
ok aj ovako, ako imas debager, idi liniju po liniju ...

ceo kod ima citavih 12 linija ako izuzmemo inicijalizacije i deklaracije .. nema tu nikakve filozofije
[ HeplF2 @ 02.12.2015. 14:07 ] @
PRODJE KORZ INICIJALIZACIJU, pa na main proveri counter i,p ,q
pa onda ide na paljenje prekidaca u main pa if (RING_BUFFER_SIZE - ((q + 1) % RING_BUFFER_SIZE - p - 1) == 0) pa se opet vraca na prekidac i tako stalno ... tu se vrti u beskonacno ali mrtav displej
[ HeplF2 @ 02.12.2015. 14:10 ] @
Citat:
bogdan.kecman:
Citat:
HeplF2:
Mozes raditi i mikrotalasnu , gde projektujes antene,filtre i slicno,proces proizvodnje samog cipa...


i opet imas mcu na toj mikrotalasnoj ... cak i da dizajniras samo hornu software za dizajniranje horne zahteva da pises plagine u C-u da bi mogao da dobijes to sto ti treba :D .. tu i tamo ti trba i matlab i fortran ali bez C neces da se usrecis

Citat:
HeplF2:
Ili da radis na razvoju nekog dela cipa.. Sve zavisi da li je industrija ili neka mala firma... itd.. Ali opet kazem da mozes da radis ali ne moras da znas, nije svuda prisutan... To sam hteo da kazem.. Ima tu dosta sfera koja su vezana za elektroniku a nije programiranje...


kad pocnes da radis, videces koliko je C neophodan za bilo kakav moderan rad sa elektronikom i koliko ne mozes da dobijes posao bez znanja istog...
naravno pricam o stvarima koje se rade sa faxom, banderasima ne treba C, ovima sto sklapaju plc kockice i pustaju masine u proces uglavnom ne treba C (doduse svi koji to malo bolje rade znaju odlicno C jer je mnogo lakse kad znas C i ladder i matlab..) ... os projektujes tanjir za mw - C-olik je interface za programiranje aplikacije za dizajn, os hornu, ista prica, os kontrolises lnb - mora pises neki kod da pricas sa njim, dal ce ga cukas u asm ili c ili ... na tebi je al opet mora pises kod ... adc, dac .. proslo je vreme "menjanja procesora u TV-u" :D


Citat:
HeplF2:
eee skontao sam sada da u kodu fali inicijalizacija :))
probacu sada da dodam to, jer bez toga nece ni raditi i mora se pozvati u main delu...
a prekidac nije bitno kako se pali ,samo da se aktivira.. Mi obcno samo if (switcher)... Ne zahteva se nista posebno...


pa provuci to kroz debug vidi kuda ide kod i gde zavrsava :)




DA LI OPET NE MORAS TO DA RADIS :)) . TO JE POENTA. IMA GA SVUDA ALI NIJE NEOPHODAN JER NEMOGU SVI TO DA RADE PA PORED TOGA I HARDVER ;)
POSEBNO U INDUSTRIJI POSLOVI SU iscepkani na milion delova.... Imao sam prilike da vidim iako nisam poceo darradim. Bio sam u industriji pa sam video
[ bogdan.kecman @ 02.12.2015. 14:11 ] @
haha pa eto je greska :D

if (RING_BUFFER_SIZE - ((q + 1) % RING_BUFFER_SIZE - p - 1) == 0)

to je "ako je prazan"

a tebi ne treba ako je prazan vec ako ima prostora :D

znaci treba

if (RING_BUFFER_SIZE - ((q + 1) % RING_BUFFER_SIZE - p - 1) > 0)
[ HeplF2 @ 02.12.2015. 14:31 ] @
izmenio sam...

sada je izbacio gresku bas za tu liniju nakon sto sam promenio na >..
pise access violation at I: 0x80 : no read permission
[ bogdan.kecman @ 02.12.2015. 14:45 ] @
hm to izbaci kad krene da kompajlira?

probaj umesto RING_BUFFER_SIZE da stavis brojku koliko je RING_BUFFER_SIZE mozda taj kompajler ne ume da hendla #define kako treba ..

prebroj zagrada u toj liniji sa IF(... mzoda fali neka zagrada :D ja sam to kuco napamet na forumu :)

a za "NE MORAS TO DA RADIS", samo sacekaj pa ces videti :D, perspektiva ti je sad takva da od drveta ne vidis sumu, sacekaj da diplomiras pa promenis 2-3 posla :)
[ bogdan.kecman @ 02.12.2015. 14:50 ] @
pogledaj ovo: http://www.keil.com/support/docs/814.htm

to je greska koja kaze da kompajler misli da pokusavas da pises po prostoru koji nemas


[ HeplF2 @ 02.12.2015. 15:20 ] @
Citat:
bogdan.kecman:
hm to izbaci kad krene da kompajlira?

probaj umesto RING_BUFFER_SIZE da stavis brojku koliko je RING_BUFFER_SIZE mozda taj kompajler ne ume da hendla #define kako treba ..

prebroj zagrada u toj liniji sa IF(... mzoda fali neka zagrada :D ja sam to kuco napamet na forumu :)

a za "NE MORAS TO DA RADIS", samo sacekaj pa ces videti :D, perspektiva ti je sad takva da od drveta ne vidis sumu, sacekaj da diplomiras pa promenis 2-3 posla :)



Hahahaha, jeste. Nikad se ne zna :)))
[ HeplF2 @ 02.12.2015. 15:44 ] @
Opet nista :( istu gresku izbacuje
[ bogdan.kecman @ 02.12.2015. 15:49 ] @
isprati debagerom
[ bogdan.kecman @ 02.12.2015. 16:28 ] @
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
[ HeplF2 @ 02.12.2015. 17:56 ] @
popuni ali ne radi , ne znam zasto
[ uart @ 02.12.2015. 19:21 ] @
U poslednjoj verziji koda ne vidim ET0=1 (enable timer 0 interrupt)?

[ HeplF2 @ 02.12.2015. 22:48 ] @
Jeste,nema ga.

Pise undefined identifier kada ga dodam u inicijalizaciju
[ bogdan.kecman @ 02.12.2015. 22:49 ] @
kako ne radi ako popuni?
[ bogdan.kecman @ 02.12.2015. 22:51 ] @
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
[ micromatic @ 04.12.2015. 07:33 ] @
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        
          }
     }            
}            

 


[ HeplF2 @ 04.12.2015. 13:03 ] @
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.....
[ HeplF2 @ 04.12.2015. 13:05 ] @
ovo u zaglavlju zanemarite , posto sam probao nesto drugo pa je ostalo ali ne smeta da stoji
Code:

byte frequency;
byte displ;

[ HeplF2 @ 04.12.2015. 13:06 ] @
Bilo bi dobro ako neko ima program micro vision pa da isproba program pa da se uveri ,tesko je ovako...
ATMEL 89 C 51
[ micromatic @ 04.12.2015. 13:30 ] @
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.
[ HeplF2 @ 04.12.2015. 18:06 ] @
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
[ micromatic @ 04.12.2015. 18:23 ] @
A tih 8 dioda po adresi su 7 segmentni displej ili kako na njih upisati broj (binararno svaka adresa 1 znamenka ili kako)
[ bogdan.kecman @ 04.12.2015. 18:32 ] @
posalji ceo projekat u keil-u koji ima sve te kalakurcije .. pa da vidimo
[ HeplF2 @ 05.12.2015. 19:47 ] @
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]
[ HeplF2 @ 05.12.2015. 19:50 ] @
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;        
          }
     }            


[ HeplF2 @ 10.12.2015. 09:49 ] @
...........i onda su ljudi utihnuli :))
[ goran_68 @ 10.12.2015. 12:17 ] @
Slaba trojčica.. neka. Slaba zato što ne slušaš šta ti ljudi savetuju a trojčica za trud i muku :)
[ micromatic @ 10.12.2015. 12:31 ] @
Čekam pojašnjenje kako na tom tvom displeju prikažem recimo broj 231 koji bi se mogao naći u ulaznom nizu i djeljiv je s 3?

Dali je display 4x8 ledica ko što je prikazano na slici? Kako onda prikazati brojeve?
Ili je svaka adresa 1 sedam segmentni displej? Onda treba znati koji bit je koji segment, koji byte je stotica, koji desetica koji jedinica?

...

[ bogdan.kecman @ 10.12.2015. 16:38 ] @
> ...........i onda su ljudi utihnuli :))

dobio si dva resenja kako se radi zadatak koja si samo trebao da
prilagodis svom okruzenju, dakle minimalni trud, ako ti ne ulozis
minimalni trud zasto bi se neko drugi trudio umesto tebe? plus, izjava
"ne mozes da uploadujes keil projekat" ..
[ ZAS011 @ 10.12.2015. 16:57 ] @
Citat:
HeplF2:
...........i onda su ljudi utihnuli :))

Ne znam šta si očekivao. Da ti drugi odrade tvoj zadatak?
Sve ti je već bilo sažvakano i prežvakano, tvoje je samo da LEPO naučiš kako se se koristi C, pročitaš datasheet od kontrolera koji koristiš i sa malo "premetačina" u kodu završiš TVOJ zadatak.
[ bogdan.kecman @ 11.12.2015. 09:52 ] @
> nisam skontao odmah gde se uploaduje... Pa sam naknadno to uradio..

ja i dalje ne vidim taj keil projekat, samo 2 snapshota kako ti izgleda
display