www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

2x16 LCD prikazuje samo levo polovico

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
mk0388
Član
Član



Pridružen-a: Čet 30 Okt 2008 21:52
Prispevkov: 161
Aktiv.: 0.80
Kraj: Celje

PrispevekObjavljeno: Sre Mar 17, 2010 6:22 pm    Naslov sporočila:  2x16 LCD prikazuje samo levo polovico Odgovori s citatom

Pozdravljeni,

S Pic-em 18f4620 hočem na lcd prikazati preprost text v dveh vrsticah, vendar mi ga izpiše samo na levi polovici displeja v obeh vrsticah, desne strani pa ni prikazane. Program pišem v ccs c compilerju.

Ali ve kdo kaj je vzrok temu oz. kaj storiti?

LP

_________________
Victims - aren't we all...
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Highlag
Član
Član



Pridružen-a: Pet 23 Jan 2004 20:42
Prispevkov: 4034
Aktiv.: 17.02
Kraj: Črnuče

PrispevekObjavljeno: Sre Mar 17, 2010 6:48 pm    Naslov sporočila:   Odgovori s citatom

LCD ima displej razdeljen na 4 dele. Poizkusi besedilo razporediti v več vrstic (4), pa se bo verjetno izpisal na del displeja, ki je sedaj prazen.
_________________
If at first you don't succeed, destroy all evidence that you tried.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
bungee
Član
Član



Pridružen-a: Pon 07 Mar 2005 18:49
Prispevkov: 1479
Aktiv.: 6.24
Kraj: Ljubljana

PrispevekObjavljeno: Sre Mar 17, 2010 9:07 pm    Naslov sporočila:   Odgovori s citatom

Povedal si skoraj vse in nič.
1. Tip LCD-ja
2. Hitrost procesorja
3. Kratek primer kode, kjer ti to napačno dela

Potem, ti pa lahko pomagamo, seveda ne pozabit napisat verzije CCS-ja in katero knjižnico si uporabil, pa tudi kako imaš priklopljeno vse supaj ni zanemarljivo....
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
mk0388
Član
Član



Pridružen-a: Čet 30 Okt 2008 21:52
Prispevkov: 161
Aktiv.: 0.80
Kraj: Celje

PrispevekObjavljeno: Sre Mar 17, 2010 9:22 pm    Naslov sporočila:   Odgovori s citatom

LCD-2x16
Hitrost-20MHz
Verzija ccs-4.084

V priponko sem dal driver LCD.c katerega imam, potem kratek program za izpis 2 vrstic na lcd in fuse.

Kako on ve kateri LCD mam jaz...vrstice mu lahka [slovenščina je zame španska vas] določim (#define LCD_TYPE 2), (vsaj mislim), kaj pa koliko znakov(v mojem primeru 16)?

Priklopil sem tako kot kaže slika.



Vaja_LCD.rar
 Opis:

Download
 Ime datoteke:  Vaja_LCD.rar
 Velikost datoteke:  3.38 KB
 Downloadano:  22 krat


_________________
Victims - aren't we all...
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
bungee
Član
Član



Pridružen-a: Pon 07 Mar 2005 18:49
Prispevkov: 1479
Aktiv.: 6.24
Kraj: Ljubljana

PrispevekObjavljeno: Čet Mar 18, 2010 12:51 am    Naslov sporočila:   Odgovori s citatom

Načeloma je v programu videti vse OK. Kadar daš tip 2, potem je jasno da je to 2x16 na podlagi HD47xxx čipa.
Ko sem ti rekel, da napiši kakšen LCD imaš sem imel v mislih oznako samega LCD-ja.


Sem na hitro napisal kodo. Preizkusi s tem:
Koda:
#include <18F4620.h>
#device adc=8
#FUSES NOWDT, WDT128, HS, NOPROTECT, NOIESO, NOBROWNOUT, BORV21, PUT
#FUSES NOCPD, NOSTVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOEBTR, NOCPB
#FUSES NOEBTRB, NOWRTC, NOWRTB, NOFCMEN, NOXINST, NOPBADEN, NOLPT1OSC, NOMCLR
#use delay(clock=20000000)

//Ker ne pre-definiram kateri port bi uporabil, bo LCD.C avtomatično uporabil port D

//     D0  enable
//     D1  rs
//     D2  rw
//     D4  D4
//     D5  D5
//     D6  D6
//     D7  D7

#include <LCD.C>


void main()
{
   int16 x;

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF|ADC_TAD_MUL_0);
   setup_psp(FALSE);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
 
 
  lcd_init();
  Delay_ms(100); //Varnostni ukrep
 
  printf(lcd_putc,"1234567890123456");
  lcd_gotoxy(1,2);
  printf(lcd_putc,"Testiranje 43210");
  delay_ms(1000);
 
  printf(lcd_putc,"\fStetje:");
 
  while (1)
  {
      lcd_gotoxy(1,2);
      printf(lcd_putc," %05LU ",x);
      x++;
      delay_ms(250);
  }
 


}


LCD.C uporabiš tvoj, vse ostalo je v tej kodi. Wink
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Peter123
Član
Član



Pridružen-a: Tor 13 Jan 2009 15:34
Prispevkov: 1441
Aktiv.: 7.20
Kraj: Lj.

PrispevekObjavljeno: Čet Mar 18, 2010 8:23 am    Naslov sporočila:   Odgovori s citatom

Osebno imam dobre izkušnje s CCs primeri in knjižnicami,
Kako preklaplaš med tipe LCDja pa poglej v LCD.c.
Pri moji knjižnici je napisano. Res pa je da uporabljam starejšo verzijo.

Da izločiš napako v programu lahko priklopiš kak drug LCD pa izprobaš.
Lahko pa na obstoječemu naviješ kontrast tako da se pokažejo temne kocke (vsaj v celi vrsti bi se morali. To je nekako najbolj osnovni test če delujejo vsi segmenti na LCDju.

lp
p
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
aly
Član
Član



Pridružen-a: Tor 28 Sep 2004 14:51
Prispevkov: 9407
Aktiv.: 39.70
Kraj: Kranj - struževo

PrispevekObjavljeno: Čet Mar 18, 2010 7:20 pm    Naslov sporočila:   Odgovori s citatom

Poskusi na LCDju postaviti kurzor na začetno pozicijo, potem pa izpiši zelo dolgo besedilo - vsaj 160 znakov, lahko več. Toliko da zapolniš kompleten pomnilnik pri LCDju.

Če se še vedno nič ne pokaže na desni strani, je crknil sekundarni krmilnik LCDja - tadrugi čip zadaj na vezju. Zamenjaj LCD.

_________________
I'm going to stand outside, so if anyone asks, I'm outstanding Smile
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
mk0388
Član
Član



Pridružen-a: Čet 30 Okt 2008 21:52
Prispevkov: 161
Aktiv.: 0.80
Kraj: Celje

PrispevekObjavljeno: Čet Mar 18, 2010 7:21 pm    Naslov sporočila:   Odgovori s citatom

bungee...

tvoj program dela Very Happy sem dobil danes drugi LCD pa dela Very Happy. Očitno pri tastarem štrajka desna polovica(edina napaka je bla da sn biu prepričan u sebe da je 100% izpravn) Brick wall

Hvala Vsem






Dans ne grem nič spat... Dancing

_________________
Victims - aren't we all...
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
rastamajks
Član
Član



Pridružen-a: Čet 23 Mar 2006 13:03
Prispevkov: 105
Aktiv.: 0.45
Kraj: zalec

PrispevekObjavljeno: Pet Mar 19, 2010 5:14 pm    Naslov sporočila:   Odgovori s citatom

@bungee

Že dva dni se trudim uporabiti timer0 za enostavno štetje sekund vendar mi niakkor ne uspe, zato sem šel korak nazaj oz. štartam od začetka in kar pri tem programu ki si ga zgoraj prilepil. Uporabljam PIC16F84A z hitrostjo 4MHz in LCDjem DEM16217.
Ko program compilam v ccs-4.084 program sicer deluje, vendar neprestano skače iz while zanke(se pravi program se zažene in začne šteti od 256 naprej, prišteje 3 vrednosti in skoči na začetek izpiše tiste tesne številke, nato pa spet prišteje tri vrednosti in spet skoći na začetek in tako ves čas). Zakaj ne ostane v zanki? Naj povem še da sem moral iz programa izbrisati vse setup... ; ker drugače mi je javljalo napake pustil sem lahko le setup_timer_0(RTCC_INTERNAL); pa še tega sem moral obrisati drugače mi na LCDju ni izpisovalo nič!

še moj program


Lp
Koda:
#include "D:\Elektro\CCS_PCW\stoparica\stoparica.h"
#include "lcd.c"
#use delay(clock=4000000)

void main()
{
   int16 x;
   //setup_timer_0(RTCC_INTERNAL);
   lcd_init();
   Delay_ms(100); //Varnostni ukrep
   lcd_gotoxy(1,1);
   printf(lcd_putc, "\f");           //izbris zaslona
   printf(lcd_putc,"1234567890123456");
   lcd_gotoxy(1,2);
   printf(lcd_putc,"Testiranje 43210");
   delay_ms(1000);
    printf(lcd_putc,"\fStetje:");
 
  while (1)
  {
      lcd_gotoxy(1,2);
      printf(lcd_putc," %05LU ",x);
      x++;
      delay_ms(250);
  }
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
bungee
Član
Član



Pridružen-a: Pon 07 Mar 2005 18:49
Prispevkov: 1479
Aktiv.: 6.24
Kraj: Ljubljana

PrispevekObjavljeno: Pet Mar 19, 2010 6:01 pm    Naslov sporočila:   Odgovori s citatom

Ne pozabi spremenit FUSE nastavitev, ker potem ti ne dela tako kot je potrebno. Tule imaš primer, z interruptom....

Koda:
#include <16F84A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading

#use delay(clock=4000000)

#define use_portb_lcd TRUE
#define lcd_type 2

#include <LCD.C>

int ure,minute,sekunde=0;
int16 tick;

#int_TIMER0
void  TIMER0_isr(void)
{
   if (tick>=999)
   {
      tick=0;
      if (sekunde>=59)
      {
         sekunde=0;
         if (minute>=59)
         {
            minute=0;
            if (ure>=23)
            {
               ure=0;
            }
            else ure++;
         }
         else minute++;
      }
      else sekunde++;     
   }
   else tick++;
}



void main()
{
   int x;
   
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4);
   lcd_init();
   
   delay_ms(100); // Zaradi displaya, lahko poizkusiš brez bi moralo tudi delovati.
   
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);
                   
   printf(lcd_putc,"\f    Test ure\n");
   printf(lcd_putc,"     v 0.01");
   
   
   while (1)
   {                             
      if (x==0) printf(lcd_putc,"\fVrstica kjer,");
      if (x==5) printf(lcd_putc,"\flahko postavis");
      if (x==10) printf(lcd_putc,"\fsporocilo kakor");
      if (x==15) printf(lcd_putc,"\fti je ljubo.");
      if (x==20) printf(lcd_putc,"\fwww.elektronik.si");
     
      if (x==30) x=0;
      else x++;
     
      lcd_gotoxy(1,2);
      printf(lcd_putc,"    %02u:%02u:%02u ",ure,minute,sekunde);
     
      delay_ms(250);     
   }

}


Ni komentarjev zanalašč, tako da potem ko analiziraš kodo lahko napišeš vprašanja Twisted Evil
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
rastamajks
Član
Član



Pridružen-a: Čet 23 Mar 2006 13:03
Prispevkov: 105
Aktiv.: 0.45
Kraj: zalec

PrispevekObjavljeno: Sob Mar 20, 2010 8:54 pm    Naslov sporočila:   Odgovori s citatom

Hja vidim da za začetek sploh nisem imel pravilno nastavljenih FUSE bitov ampak zdaj je ql in programček lepo teče, vendar so se pa pojavila nasljedja vprašanja in nejasnosti! bungee vprašanja sem pisal kar kot komentarje v programu pa bi te prosil če mi lahko pomagaš! Zanima me pa še ali v CCS-ju obstaja watch okno da bi preveril kako dolgo trajaja določeni del programa. Bral sem da lahko naložiš plunginse za MPLAB in tam uporablaš to okno, vendar meni ni uspelo, pa me zanima ali so potrebne kake posebne nastavitve vMPlabu da to deluje!?

Koda:
#include "D:\Elektro\CCS_PCW\stoparica_ve1\stoparica_ve1.h"




#define use_portb_lcd TRUE
#define lcd_type 2

#include <LCD.C>

#define   S1  PIN_A2                 //tipka START
#define   S2  PIN_A3                //tipka STOP
#define   S3  PIN_A4                //tipka RESET

int32 ure,minute,sekunde,des= 0;
int16 tick;
int stop,reset=0;

#int_TIMER0
void  TIMER0_isr(void)
{
   if (tick>=9)         //se pravi tukaj uporabimo še nek števec da dobimo željeno proženje timerja 
   {                    // npr. en iterval timerja traja 1.024ms, ker želimo proziti timer na 10 ms
      tick=0;           //damo števec do 9 in dobimo proženje na (1.024*9=9.216ms)!?
      if (des>=99)      //tukaj sem dodal še desettisocinke zraven vendar mi ne izpisuje številke lepo po vrsti ampak
      {                 //preskakuje npr. 19,44,98..in poveča sekundo in nato spet!?
         des=0;
      if (sekunde>=59)
      {
         sekunde=0;
         if (minute>=59)
         {
            minute=0;
           if (ure>=23)
            {
               ure=0;
            }
            else ure++;
         }
         else minute++;
      }
      else sekunde++;
      } else des++;
   }
   else tick++;
}

void main()
{
   int x;
   
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4);     //nastavitev za timer0 [ (4*256)*1us=1.024ms ] tukaj dolocimo interval timerja!?
   lcd_init();                                 //inicializacija LCD-ja
   delay_ms(100);
   enable_interrupts(INT_TIMER0);          //omogočena prekinitev INT_TIMER0     
   enable_interrupts(GLOBAL);             //omočene prekinitve
                   
   printf(lcd_putc,"\f Test stoparice\n");   //izbriše zaslon in izpiše tekst
   printf(lcd_putc,"     v 0.01");
   delay_ms(1000);
   
   while (1)
   {   
   
           
      printf(lcd_putc,"\f      Time");
      lcd_gotoxy(1,2);
      printf(lcd_putc,"  %02u:%02u:%02u.%02u ",ure,minute,sekunde,des);
     
      delay_ms(250);     
       
         if (!input(S3))            //ali je tipka reset bila pritisjena
          { 
               output_bit(PIN_a0,1);  //želel sem dodati še tri tipke za start stop in reset in naletel na par težav
               minute=0;               //1. nevem kako bi prekinil timer
               sekunde=0;              //2. in potem ob startu spet zagnal timer
               des=0;                  //3. ko pritisnem na tipko S3 postavim spremenljivke na 0 vendar tipka ne zagrabi
          }                            // vedno (včasih resetira ob prvep pritisku včasih pa šele ob tretjem)!?
         if (!input(S2))
         {
            stop=0;
            reset=0;
            output_bit(PIN_a0,0);
         }
   }
}
   
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
bungee
Član
Član



Pridružen-a: Pon 07 Mar 2005 18:49
Prispevkov: 1479
Aktiv.: 6.24
Kraj: Ljubljana

PrispevekObjavljeno: Sob Mar 20, 2010 9:21 pm    Naslov sporočila:   Odgovori s citatom

Da bi prikazoval desetinke, potem moraš LCD osveževati nekaj hitreje kot na 100ms, se pravi daj tisti delay_ms(250) na recimo delay_ms(50) to je prvo, če bo pa display vseeno preveč "bezljal" potem pa malo povečaj.

Da bi "ustavil" timer imaš nekaj variant na voljo, najlažja je ta, da v timer interruptu dodaš še preverjanje ali je štoparica aktivna ali ne preko globalne spremenljivke.

Koda:
 if (stopaj==1)
{
     [koda ot timer interrupta]
}


Potem ti pa priporočam tipke, reset in start/stop (ena) in če boš potreboval še za vmesni čas.

Če bi želel, da ti interrupt dela točno na 1ms potem ob vsakem proženju interrupta skrajšaj timer tako, da ne bo tistih 24us .... namig (set_timer1(xy))

Pa še to, šteješ od 0..9 = 10 cifer Wink

Pa tisti delay_ms(xy) ki ga boš dal v glavni zanki daj na koncu za preverjanjem tipk.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
rastamajks
Član
Član



Pridružen-a: Čet 23 Mar 2006 13:03
Prispevkov: 105
Aktiv.: 0.45
Kraj: zalec

PrispevekObjavljeno: Pon Mar 22, 2010 12:00 am    Naslov sporočila:   Odgovori s citatom

ko si mi namignil naj uporabim set_timer1(xy) si se zmotil in mogoče mislil set_timer0(xy)!? Ker sedaj sem uporabil set_timer0(xy), vendar sem probal narediti tudi z timer1 in to uporabiti vendar mi ni uspelo, kot da PIC16f84 ne podpira timer1!?
Program sedaj deluje kot sem si zamislil in z primerjavo prave štoparice se niti ne razlikuje toliko v času, vendar to sem dosegel z poizkušanjem, jasno mi pa še zmeraj ni kako točno deluje ta timer0 in kako lahko preračunam njegove vrednosti in delilnike za željeni čas? Naprimer z set_timer0(xy) določimo čas proženja interrupta in ga izračunamo npr. za 20us=> 256-(0.00002/(4/4000000))=236 (kaj pomeni ta 4 tukaj?) KAko pa potem preračunamo tisto vrednost za tick da dobimo timer0 ki se bo izvajal na 1ms?

Zanima pa me še zakaj ko se program zažene na LCD izpiše 255:255:255.00, in ne same nule? To sem sicer rešil tako da ob vklopu resetiram vse spremeljivke, vendar bi moralo biti že na začetku na 0 ker jih že v inicializaciji postavim na 0?

Glede tipk pa moram imeti za start in stop posebaj, ker štoparico bom prekinil nekje stran od tam, kjer jo bom startal, vmesni čas pa ne potrebujem.


Še koda...

Koda:
#include "D:\Elektro\CCS_PCW\stoparica_ve1\stoparica_ve1.h"




#define use_portb_lcd TRUE
#define lcd_type 2

#include <LCD.C>

#define   S1  PIN_A2                 //tipka START
#define   S2  PIN_A3                //tipka STOP
#define   S3  PIN_A4                //tipka RESET

int32 ure,minute,sekunde,des= 0;
int16 tick;
int reset,stop=0;
int nula=1;

#int_TIMER0
void  TIMER0_isr(void)
{
  set_timer0(15);                   
   if (stop==1)
   {
   if (tick>=9)           
   {                   
      tick=0;           
      if (des>=99)       
      {                 
         des=0;
      if (sekunde>=59)
      {
         sekunde=0;
         if (minute>=59)
         {
            minute=0;
           if (ure>=23)
            {
               ure=0;
            }
            else ure++;
         }
         else minute++;
      }
      else sekunde++;
      } else des++;
   }
   else tick++;
}
}
void main()
{
   int x;
   
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4);     //nastavitev za timer0
   lcd_init();                                 //inicializacija LCD-ja
   delay_ms(100);
   enable_interrupts(INT_TIMER0);          //omogočena prekinitev INT_TIMER0     
   enable_interrupts(GLOBAL);             //omočene prekinitve
   
   
     
   printf(lcd_putc,"\f Test stoparice\n");   //izbriše zaslon in izpiše tekst
   printf(lcd_putc,"     v 0.01");
   delay_ms(1000);
   
   while (1)
   {   
   
           
      printf(lcd_putc,"\f     Time:");
      lcd_gotoxy(1,2);
      printf(lcd_putc,"  %02u:%02u:%02u.%02u ",ure,minute,sekunde,des);
     
           
       
         if ((!input(S3)&& stop==0) || nula==1    )        //ali je tipka reset bila pritisjena
          { 
               reset=1;
               nula=0;
               ure=0;
               minute=0;               
               sekunde=0;             
               des=0;                 
          }                           
         if (!input(S1))            //ali je tipka START bila pritisjena
         {
            output_low(PIN_A0);
            stop=0;
            reset=0;
           
         }
         
         if (!input(S2))         //ali je tipka STOP bila pritisjena
         {
            stop=1;
            output_high(PIN_A0);
           
         }
         
         delay_ms(40);           //osveževanj LCD-ja
   }
}
   
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
bungee
Član
Član



Pridružen-a: Pon 07 Mar 2005 18:49
Prispevkov: 1479
Aktiv.: 6.24
Kraj: Ljubljana

PrispevekObjavljeno: Pon Mar 22, 2010 1:28 am    Naslov sporočila:   Odgovori s citatom

Mislil sem timer0, napisal sem pa 1 .... se opravičujem typo.

Timer je HW modul v mikroprocesorju (uC), ki šteje tako hitro kot ga nastavimo s preddelilnikom in je neodvisen od ostalega izvajanja kode razen če ne pišemo ravno vanj.


Medmisel, ni potrebno branje Razz
Izračunati na koliko časa se izvede prekinitev, kadar imamo timer interrupt. Torej kadar ima timer preddelilnik 1 --> šteje vsak cikel potem se bo prekinitev zgodila ko se vrednost "prelije" iz 255 v 0 (pri 8 bitnih timerjih) ali pa iz 65535 v 0 (pri 16 bitnih timerjih) ..... in tako naprej za višje vrednosti.

Če pa imamo vključen preddelilnik pa se to zgodi x krat počasneje, se pravi timer šteje vsak x-ti cikel.


Zaradi specifičnosti PIC-ov dolžina enega strojnega cikla ni 1/f, temveč je (1/f)*4 ......
Torej če vzamemo 4MHz kristal potem je dolžina enega strojnega cikla (1/4MHz)*4 = 250ns * 4 = 1us

Torej ko smo obdelali kakšen je strojni takt, lahko preidemo na timerje. Timer s predelilnikom 1 bo imel ločljivost 1us (izhajam iz prejšnjega primera) in bo sprožil interrupt vsakih 256us oziroma 65536us v odvisnosti od "širine" timerja. PIC16F84A ima Timer0 8 biten. Če preddelilnik povečamo na 4, potem pride izračun takole .... timer se poveča na vsake 4 cikle torej ima ločljivost 4us .... torej 4us*256=1024us .... če pa tu želimo dobiti 1000us, potem moramo timerju namesto 0 "podtakniti" vrednost, ki bo kompenzirala 24us. Torej bi po izračunih moral nastaviti set_timer0(7)

Tu moraš upošteveti še to dejstvo, da imaš v najslabšem primeru, ko stisneš tipko start in tipko stop še dodatnih 80ms zamika zaradi zanke za osveževanje. To bi lahko rešil tako, da bi osveževanje displaja vtaknil v svojo interrupt rutino in bi v glavni rutini preverjal le še tipke, ki bi zdaj postale mnogo bolj odzivne. Vendar na PIC16F84A tega ne moreš storit, ker nimaš še enega timerja. Oziroma spravit tipke v interrupt rutino, tako bi imel zamik med pritiskom in akcijo nekaj us, oziroma v najslabšem primeru toliko, da se izvede timer prekinitev do konca.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
rastamajks
Član
Član



Pridružen-a: Čet 23 Mar 2006 13:03
Prispevkov: 105
Aktiv.: 0.45
Kraj: zalec

PrispevekObjavljeno: Pon Mar 22, 2010 12:29 pm    Naslov sporočila:   Odgovori s citatom

@bungee
Hvala za obrazložitev in pomoč in misli da so mi sedaj ti timerji dokaj jasni kako delujejo! Vprašal bi pa še samo to, ker po izračunih bi za 1ms potreboval set_timer0(6) -> (256-6)*4us=1000us in v tem primeru mi čas prehitro teče, če dam pa set_timer0(15) -> (256-15)*4us=964us pa čas teče tako kot mora! Ali to pomeni da je potrebno upoštevati še ukaze v timerju in jih prišteti, ker za vsak ukaz porabi PIC 1us!?

lp
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 495 dni


Powered by phpBB © 2001, 2005 phpBB Group