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 

Merilec hitrosti
Pojdi na stran Prejšnja  1, 2, 3, 4
 
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
vitez93
Član
Član



Pridružen-a: Pet 19 Sep 2008 20:00
Prispevkov: 1018
Aktiv.: 5.00
Kraj: Celje- Dobrna

PrispevekObjavljeno: Sob Okt 03, 2009 3:26 pm    Naslov sporočila:   Odgovori s citatom

Vse imam sestavljeno. Dela tako tako. Včasih da ven čudne rezultate, včasih ko se prvi senzor prekine prikazovalnik ugasne. Kako bi naredil program nekako bolj stabilen/odporen na čudne meritve časa. Recimo ko program izračuna desetice in dobi 15, kliče tabelo za izpis in preskoči celotno tabelo in "pristane" nekje nižje, kjer je recimo podprogram za pavzo. Mad


speedometer 006.jpg
 Opis:
celotno vezje
 Velikost datoteke:  621.65 KB
 Pogledana:  2 krat

speedometer 006.jpg



speedometer 007.jpg
 Opis:
vezje spodaj
 Velikost datoteke:  697 KB
 Pogledana:  2 krat

speedometer 007.jpg



speedometer 008.jpg
 Opis:
SFH 5110 sprejmenika
 Velikost datoteke:  654.23 KB
 Pogledana:  1 krat

speedometer 008.jpg



speedometer 009.jpg
 Opis:
12F629 oddajnika IR "žarka"
 Velikost datoteke:  643.72 KB
 Pogledana:  1 krat

speedometer 009.jpg


Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
vitez93
Član
Član



Pridružen-a: Pet 19 Sep 2008 20:00
Prispevkov: 1018
Aktiv.: 5.00
Kraj: Celje- Dobrna

PrispevekObjavljeno: Čet Nov 04, 2010 8:54 pm    Naslov sporočila:   Odgovori s citatom

<13 mesecev kasneje...>

...Je stvar stekla tako kot mora. Sem se naučil programirati v C, s katerim je bile za ta projekt vse lažje. Predvsem pa računanje z velikimi števili. Senzorja sem spravil v ohišji in dodal signalne ledike za signal in napetost.
Danes smo stvar testirali z kolegovim APN 6S in dosegel sem (po ravnini v hrib naslonjeni) 54,1km/h. Moram poiskati eno neprometno ravninco, da preizkusimo do 99,9 km/h z mojim kawasakijom. Twisted Evil
Potem me čaka še izdelava enih večjih cifer in prikaz na stotinke točno.

Koda:
#include <16F628A.h>
int1   int_bit = 0;
int8    stotice = 0;
int8    desetice = 0;
int8    enice = 0;
int8    desetinke = 0;
int16   stevec1 = 0;
int32   cas = 65535;
int32   v = 0;
int16    a = 0;
int8    i = 0;

#use delay(clock=4M)
#FUSES XT, NOWDT, NOPUT, NOMCLR, NOPROTECT, NOCPD, NOBROWNOUT, NOLVP
#use fixed_io(b_outputs=PIN_B1, PIN_B2, PIN_B3, PIN_B4, PIN_B5, PIN_B6, PIN_B7)





//******************Preliv timerja**********************
#int_timer1
 
void timer1interrupt() {
   stevec1++;
   return;
}

void izpis(desetice, enice, desetinke);   
void izracun();

#INT_EXT
void senzor()
{
   disable_interrupts(int_ext);
   clear_interrupt(int_timer1);
   enable_interrupts(int_timer1);
   set_timer1(0);
   int_bit = 1;
   return;
}
void izracun()
{
   while( !INPUT(PIN_A0) )
      {
      }
   a = get_timer1();
   disable_interrupts(int_timer1);
   cas *= stevec1;
   cas = cas + a;
   cas /=100;
   v = 7200000 / cas;  //Za razdaljo med senzorjima: 8m -28800000, za 2m - 7200000
   stotice = v / 10000;
   v %= 10000;
   desetice = v / 1000;
   v %= 1000;
   enice = v / 100;
   v %= 100;
   desetinke = v / 10;
   stevec1 = 0;
   int_bit = 0;
   i = 0;
   cas = 65535;
      if(stotice >= 1){
         desetice = 12;
         enice = 12;
         desetinke = 12;
         }
   return;
}
      

   



//*******************GLAVNI********************************

void main(void)
{

   SET_TRIS_B(0b00000001);
   SET_TRIS_A(0b00000001);
   INPUT(PIN_B0);
   setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_1 );
   enable_interrupts(GLOBAL);
   ext_int_edge( 0, L_TO_H);
   while(true)
   {
   izpis(desetice, enice, desetinke);
      if(int_bit == 1)
      {
      izracun();
      }
      if(i == 200)
      {
      clear_interrupt(int_ext);
      enable_interrupts(int_ext);
      ext_int_edge( 0, L_TO_H);
      }
   }
   
}


//**********************MUX prikaz oziroma izpis na led prikazovalnike*******

void izpis(desetice, enice, desetinke)  {

   if(desetice > 0)
   {
      output_high(PIN_A3);
      switch (desetice)  {
         case 0: output_B(0b01111110);
               break;
         case 1: output_B(0b00100100);
               break;
         case 2: output_B(0b11011100);
               break;
         case 3: output_B(0b11101100);
               break;
         case 4: output_B(0b10100110);
               break;
         case 5: output_B(0b11101010);
               break;
         case 6: output_B(0b11111010);
               break;
         case 7: output_B(0b01100100);
               break;
         case 8: output_B(0b11111110);
               break;
         case 9: output_B(0b11101110);
               break;
         case 15: output_B(0b00001000);
               break;
         case 12: output_B(0b11011010);
               break;
         }
   }
      delay_ms(5);
      output_low(PIN_A3);
      output_high(PIN_A2);
      switch (enice)  {
         case 0: output_B(0b01111110);
               break;
         case 1: output_B(0b00100100);
               break;
         case 2: output_B(0b11011100);
               break;
         case 3: output_B(0b11101100);
               break;
         case 4: output_B(0b10100110);
               break;
         case 5: output_B(0b11101010);
               break;
         case 6: output_B(0b11111010);
               break;
         case 7: output_B(0b01100100);
               break;
         case 8: output_B(0b11111110);
               break;
         case 9: output_B(0b11101110);
               break;
         case 15: output_B(0b00001000);
               break;
         case 12: output_B(0b10010000);
               break;
         }
      delay_ms(5);
      output_low(PIN_A2);
      output_high(PIN_A1);
      switch (desetinke)  {
         case 0: output_B(0b01111110);
               break;
         case 1: output_B(0b00100100);
               break;
         case 2: output_B(0b11011100);
               break;
         case 3: output_B(0b11101100);
               break;
         case 4: output_B(0b10100110);
               break;
         case 5: output_B(0b11101010);
               break;
         case 6: output_B(0b11111010);
               break;
         case 7: output_B(0b01100100);
               break;
         case 8: output_B(0b11111110);
               break;
         case 9: output_B(0b11101110);
               break;
         case 15: output_B(0b00001000);
               break;
         case 12: output_B(0b10010000);
               break;
         }
      delay_ms(5);
      output_low(PIN_A1);
      if(i < 202)
      {
      i++;
      }
      return;
   
}




 
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 18.41

PrispevekObjavljeno: Čet Nov 04, 2010 9:42 pm    Naslov sporočila:   Odgovori s citatom

Tako mimogrede:
  • v funkcijah tipa void ni treba pisat "return", saj funkcija ne vrača vrednosti
  • vse spremenljivke, ki jih uporabljaš v prekinitvah, definiraj kot "volatile"
  • multipleksiranje prikaza probaj rešit v timer prekinitvi... je bolj elegantno Wink

_________________
Tule nisem več aktiven.
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: Čet Nov 04, 2010 10:47 pm    Naslov sporočila:   Odgovori s citatom

In seveda ne uporabljaj switch in tabele vsakič, ampak enostavno uporabi konstantna polja....

Koda:
const int8 cifre [10] = {0b01111110,0b00100100,0b11011100...}


Potem pa enostavno narediš
Koda:

output_b(cifre[desetinke]);


Poleg tega brezveze pri CCS-ju nastavljaš TRIS kadar ne uporabljaš konstantnih vhodov izhodov. Pusti da CCS to naredi sam, smer določi samo za vhodni INT pin Wink
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
juremav
Neznanec
Neznanec



Pridružen-a: Čet 23 Avg 2012 11:10
Prispevkov: 1
Aktiv.: 0.01

PrispevekObjavljeno: Čet Avg 23, 2012 11:12 am    Naslov sporočila:   Odgovori s citatom

Se da dobiti tudi shemo vezja in seznam elementov?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno 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
Pojdi na stran Prejšnja  1, 2, 3, 4
Stran 4 od 4

 
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: 493 dni


Powered by phpBB © 2001, 2005 phpBB Group