Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

TripComputer ~ Putni racunar za automobil

[es] :: Elektronika :: Mikrokontroleri :: TripComputer ~ Putni racunar za automobil

Strane: 1 2 3 4

[ Pregleda: 22205 | Odgovora: 60 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15331
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2341 Profil

icon Re: TripComputer ~ Putni racunar za automobil14.12.2010. u 12:51 - pre 124 meseci
Citat:
conver: Tacno tako, ne merim broj impulsa vec trajanje impulsa i to kada je na high, treba mi u ms-ovima!
Druga stvarcica, ova funkcija za RPM ti dosta dobro radi kada je mali broj obrtaja motora u pitanju.
Dakle, kada se motor vrti na 800 o/min to je 1600 "sparkova" u minuti, kada to podelimo sa 60, dobijamo 26.666 "sparkova" u sekundi kako sam gore i napisao i podesio hercazu na spark pulseru 26,666Hz.
medjutim problem nastaje kada recimo kao input zadamo da se motor vrti na 7000 o/min , dakle to je 14000 sparkova u minuti ili 233,333Hz! Kada to zadam kao input na spark impulseru u proteusu, ispisuje mi vrednost 3150 umesto ! 7000 ! :-/


nema veze sa funkcijom, problem je sto B interrupt on change ne moze da uvati toliko brzu promenu, zato sam ti mrdno spark na b0, tu radi 1/1

Prikačeni fajlovi
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15331
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2341 Profil

icon Re: TripComputer ~ Putni racunar za automobil14.12.2010. u 13:27 - pre 124 meseci
evo ga i sa merenjem duzine

Code:

#include <16F887.h>

//Koristi 10bitni ADC
#device adc=10

#FUSES NOWDT                    //Ne treba nam WDT (ne radimo nista preterano bitno)
#FUSES INTRC_IO                 //Interni oscilator (nije nam preterano bitno da bude toliko precizan klok) bez zauzeca RA6 pina
#FUSES NOPUT                    //Ne treba nam ni "power up timer" 
#FUSES MCLR                     //MCLR ukljucen - zgodno za imati reset taster - a i potrebno za debugging
#FUSES NOPROTECT                //Nema sta da stitimo
#FUSES NOCPD                    //EEprom takodje
#FUSES BROWNOUT                 //Resetuj se ako se smori Vdd
#FUSES BORV40                   //resetuj se ako Vdd ode ispod 4v
#FUSES NOIESO                   //Nemamo externi clock tako da nema sta da switchujemo
#FUSES NOFCMEN                  //Gasimo monitor "kloka" - interni je pa ako ne valja, sta sad
#FUSES NOLVP                    //LVP je za bebe :D 
#FUSES NODEBUG                  //Za sada nema sta da debagiramo (mada je ovo mozda zgodno upaliti)
#FUSES NOWRT                    //Moze da se pise po programskoj memoriji (ovo je zgodno u kombu sa bootloaderom, ovako, mozda bolje ugasiti)


//interni oscilator je 8MHz
#use delay(clock=8000000,RESTART_WDT)

#include "LCD.h"

//globalne varijable
volatile float BatteryVolts;
volatile float FuelPCT;
volatile unsigned int32 InjectorPulse;
volatile float Injector_ms;

volatile unsigned int16 Spark;
volatile float RPM;


#int_RTCC
void  RTCC_isr(void) 
{
static unsigned int32 ticks=0;

  ticks+=512;
  InjectorPulse++;
  if (ticks >  (unsigned int32) 2000000){ //ONE SECOND PASSED
      ticks -= (unsigned int32) 2000000;
      // uradi sta si hteo "svake sekunde"
      RPM = Spark * 30.0; //2 "sparka" po rotaciji
      Spark = 0; 
      //
  }
}

//InjectorPulse je vezan na B1
#int_RB
void  RB_isr(void) 
{
  static unsigned char staroStanje = 0;
  
  if (staroStanje == 0){ //L-H tranzicija
    InjectorPulse = 0; //zapocni brojanje    
    //staroStanje = 1;
  } else { //H-L tranzicija
    Injector_ms = InjectorPulse * 0.256; //trajanje u ms
    //staroStanje = 0;
  }
  staroStanje= (input_b()&&0x2)?1:0;
  
}

//Spark vezan na B0
#int_EXT
void  EXT_isr(void) 
{
  Spark++; 
}

void main()
{
   //Kresni ADC 
   setup_adc_ports(sAN0|sAN1|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_32);
   
   
   
   //zagasi SPI
   setup_spi(SPI_SS_DISABLED);
   
   
   //SETUJ TAJMERE
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); //TIMER0 8000000/4/2/256 puta u sekundi
   setup_timer_1(T1_DISABLED);  
   setup_timer_2(T2_DISABLED,0,1); 
   
   //zagasi komparatore
   setup_comparator(NC_NC_NC_NC);
   
   set_tris_b(0xff);   
   
   
   
   //setuj oscilator (ako menjas ovo ne zaboravi na pocetku da promenis fuse
   setup_oscillator(OSC_8MHZ);

   InjectorPulse = 0;
   Injector_ms = 0;
   Spark = 0;
   RPM = 0;


   //pripremi ekran
   lcd_init();
   Delay_ms(100);
   lcd_cursor_off();
   //lcd_load_custom_chars(); 
   lcd_putc("\f");
   lcd_gotoxy(5,1);
   lcd_putc("V");
   lcd_gotoxy(11,1);
   lcd_putc("%");
   
   lcd_gotoxy(5,2);
   lcd_putc("RPM");

   lcd_gotoxy(15,2);
   lcd_putc("ms");
 
   //popali interapte
   enable_interrupts(INT_RTCC);

   ext_int_edge( H_TO_L );         //PADAJUCA IVICA OKIDA INTERRUPT
   enable_interrupts(INT_EXT);

   *0x96 = 0x02; //IOCB1
   enable_interrupts(INT_RB);  
   enable_interrupts(GLOBAL);

InjectorPulse =0;
   //wrti se u krug
   while(1){
      

      lcd_gotoxy(1,1); printf(lcd_putc,"%04.1g", BatteryVolts);
      lcd_gotoxy(7,1); printf(lcd_putc,"%04.1g", FuelPCT);
      lcd_gotoxy(1,2); printf(lcd_putc,"%04.0g", RPM);
      lcd_gotoxy(9,2); printf(lcd_putc,"%06.2g", Injector_ms);


      delay_ms(100);

      //Vin = Vadc * 4
      //Vdd = 5V  
      set_adc_channel(0);
      delay_ms(1);
      BatteryVolts = read_adc() * 5.0 / 256.0;
      
      set_adc_channel(1);
      delay_ms(1);
      //FuelVolts = read_adc() * 5.0 / 256.0;
      FuelPCT = read_adc() * 500.0 / 3072.0 ; //12V == 100%
     
      
   }

}


Prikačeni fajlovi
 
Odgovor na temu

tox master
RS

Član broj: 57200
Poruke: 2658
*.teol.net.



+108 Profil

icon Re: TripComputer ~ Putni racunar za automobil14.12.2010. u 16:54 - pre 124 meseci
Malo sam cackao oko mikrokontrolera ali nedovoljno da se ukljucim u raspravu o samom pisanju programa ali cu reci svoje iskustvo kada sam pravio obrtomer sa 16f84.
Signal sam uzimao sa bobine (niskonaponska strana) ali obavezno preko optokaplera ciji je jedan kraj vezan paralelno bobini a drugi kraj ide na pin mikrokontrolera koji broji impulse i na masu.
Moguce da si greske u merenju dobijao usled napona samoindukcije koji se javlja na bobini u radu a to optokapler trebao da resi.

Nisam bas detaljno procitao sve postove ali nisam bas shvatio kako si zamislio da izracunas potrosnju sa merenjem obrtaja ili sam nesto propustio?
 
Odgovor na temu

conver
Milos Milutinovic
Paracin

Član broj: 226436
Poruke: 112
*.mts.telekom.rs.



+1 Profil

icon Re: TripComputer ~ Putni racunar za automobil15.12.2010. u 09:59 - pre 124 meseci
Hvala Bogdane, pomogao si dosta zaista!
sta predstavlja ova linija:

staroStanje= (input_b()&&0x2)?1:0;

Sto se potrosnje tice, racuna se iz:

Consumpt = ((InjectorPulse * Injectors * InjectorFlow * RPM * 60) / 3600000);

gde je:
InjectorPulse - trajanje impulsa na injektoru u "ms" (razlicito je trajanje kod motora sa MPI i SPI sistemom ubrizgavanja)
Injectors - broj injektora na motoru (ako je SPI onda ima samo jedan injektor za sva 4 cilindra)
InjectorFlow - protok injektora (za odgovarajucu vrednost pritiska iz pumpe za gorivo, ovo daje proizvodjac u specifikacijama)
RPM - broj obrtaja motora (direktno utice na vremensko trajanje impulsa injektora)
dok su brojevi 60 i 3600000 potrebni za svodjenje mernih jedinica kako bi se na displeju prikazivalo u L/h

ko ne veruje neka proveri:
na mom motoru kojij je SPI pri 800RPM imam trajanje impulsa od 4ms i injectorFlow = 16 dobijam vrednost od 0.85L/h, sto je ok!
Takodje pri 7000RPM (u toku voznje ovo se retko kad dostize) i trajanje impusla od 17ms i injectorFlow = 16 dobijam 31.3 L/h sto je opet OK!
Ko ne veruje, neka nagzi svoju masinu na autoputu pa neka izmeri ! :) samo nemoj da zaboravite gorivo da kupite ! >:)
 
Odgovor na temu

conver
Milos Milutinovic
Paracin

Član broj: 226436
Poruke: 112
*.mts.telekom.rs.



+1 Profil

icon Re: TripComputer ~ Putni racunar za automobil15.12.2010. u 12:32 - pre 124 meseci
Smorio sam se ziv, taman sam mislio da sam sve muke resio , ali...
Ista situacija kao i na pocetku koju nisam znao da resim, i ovde kao i tamo u svakom trecem/cetvrtom prolazu pokaze priblizno tacnu izmerenu vrednost trajanja impulsa injektora na B1!
Podesio sam injektor impulser na 7ms i prvi prolaz mi ispise dobro, nekih 7,14ms... sledeci mi izbaci 1004,25 pa 2008,53 i tek onda 6,96...
Okacio sam zip opet sa simulacijom i Bogdanovim kodom,vidi se sta je frka...!
Nikako da izmeri tacno 7ms ako mu zadam 7 ili 34ms ako mu zadam 34...

http://www.4shared.com/file/yhaRDqQa/TripComputer2.html
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15331
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2341 Profil

icon Re: TripComputer ~ Putni racunar za automobil15.12.2010. u 14:34 - pre 124 meseci
Citat:
conver
sta predstavlja ova linija:

staroStanje= (input_b()&&0x2)?1:0;


proverava da li je B1 1 i ako jeste upisuje u staro stanje 1 a ako nije upisuje 0

Citat:
conver
u svakom trecem/cetvrtom prolazu pokaze priblizno tacnu izmerenu vrednost trajanja impulsa injektora na B1!


ne moze nikad da ti izmeri "tacno" uvek ce ti meriti sa greskom posto signal od 1 sekunde ne mozes da izgenerises tacno bez externog kristala na 32768Hz ... ovde ti signal traje 1sec +- koji ms a to na periodu od nekoliko sekundi daje prosecno tacnu vrednost ... dakle posle 1h ako brojis sekunde imaces tacno 3600 impulsa, ali jedan impuls ce uvek biti +- neki ms ...

to mozes da resis samo tako sto ces da napravis neki low pass filter i da vatas neki "prosek" ili tako sto ces da turis externi kristal na 32768Hz pa da imas pravi 1sec impuls ... zeznuto je sto ti imas vrlo kratak taj impuls koji racunas .. da li tu imas neke "granice" ? ono koliko je najduzi koji mozes da ocekujes? ako znas da je uvek izmedju 3 i 10ms onda moze da se filtriraju greske i ubaci filter .. to je par linija koda .. samo reci koje su ti granice


 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15331
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2341 Profil

icon Re: TripComputer ~ Putni racunar za automobil15.12.2010. u 14:54 - pre 124 meseci
malo sam ja zaboravio CCS C :D ... ima par fora ... evo sad meri 7ms bez problema i prilicno tacno

fora je u #use fast_io(B) ... to mu kaze da ne filozofira posto on na svaki input() uradi tris pa cita port i to sve preko funkcija i onda to traje, na zalost trajalo je predugo za merenje signala od 7ms tako da smo imali "prebacaj" ... ovako smo mu rekli da koristio fast_io (Dakle mi kontrolisemo tris i on ocekuje da je tris vec pravilno setovan) + citamo input(pin_B1) a ne ceo port pa && .... etc .. i tu smo spasili jedno 10 taktova tako da je sada kod u interruptu kraci te uspeva da tacno izmeri i puls duzine pola ms :D

Code:

#include <16F887.h>

//Koristi 10bitni ADC
#device adc=10

#FUSES NOWDT                    //Ne treba nam WDT (ne radimo nista preterano bitno)
#FUSES INTRC_IO                 //Interni oscilator (nije nam preterano bitno da bude toliko precizan klok) bez zauzeca RA6 pina
#FUSES NOPUT                    //Ne treba nam ni "power up timer" 
#FUSES MCLR                     //MCLR ukljucen - zgodno za imati reset taster - a i potrebno za debugging
#FUSES NOPROTECT                //Nema sta da stitimo
#FUSES NOCPD                    //EEprom takodje
#FUSES BROWNOUT                 //Resetuj se ako se smori Vdd
#FUSES BORV40                   //resetuj se ako Vdd ode ispod 4v
#FUSES NOIESO                   //Nemamo externi clock tako da nema sta da switchujemo
#FUSES NOFCMEN                  //Gasimo monitor "kloka" - interni je pa ako ne valja, sta sad
#FUSES NOLVP                    //LVP je za bebe :D 
#FUSES NODEBUG                  //Za sada nema sta da debagiramo (mada je ovo mozda zgodno upaliti)
#FUSES NOWRT                    //Moze da se pise po programskoj memoriji (ovo je zgodno u kombu sa bootloaderom, ovako, mozda bolje ugasiti)


//interni oscilator je 8MHz
#use delay(clock=8000000,RESTART_WDT)
#use fast_io(B)

#include "LCD.h"

//globalne varijable
volatile float BatteryVolts;
volatile float FuelPCT;
volatile unsigned int32 InjectorPulse;
volatile float Injector_ms;

volatile unsigned int16 Spark;
volatile float RPM;


#int_RTCC
void  RTCC_isr(void) 
{
static unsigned int32 ticks=0;

  ticks+=256;
  InjectorPulse++;
  if (ticks >  (unsigned int32) 2000000){ //ONE SECOND PASSED
      ticks -= (unsigned int32) 2000000;
      // uradi sta si hteo "svake sekunde"
      RPM = Spark * 30.0; //2 "sparka" po rotaciji
      Spark = 0; 
      //
  }
}

//InjectorPulse je vezan na B1
#int_RB
void  RB_isr(void) 
{
  static unsigned char staroStanje = 0;
  
  if (staroStanje == 0){ //L-H tranzicija
    InjectorPulse = 0; //zapocni brojanje    
    //staroStanje = 1;
  } else { //H-L tranzicija
    Injector_ms = InjectorPulse * 0.128; //trajanje u ms
    //staroStanje = 0;
  }
  staroStanje = input(PIN_B1);
}

//Spark vezan na B0
#int_EXT
void  EXT_isr(void) 
{
  Spark++; 
}

void main()
{
   //Kresni ADC 
   setup_adc_ports(sAN0|sAN1|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_32);
   
   
   
   //zagasi SPI
   setup_spi(SPI_SS_DISABLED);
   
   
   //SETUJ TAJMERE
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); //TIMER0 8000000/4/1/256 puta u sekundi
   setup_timer_1(T1_DISABLED);  
   setup_timer_2(T2_DISABLED,0,1); 
   
   //zagasi komparatore
   setup_comparator(NC_NC_NC_NC);
   
   set_tris_b(0xff);   
   
   
   
   //setuj oscilator (ako menjas ovo ne zaboravi na pocetku da promenis fuse
   setup_oscillator(OSC_8MHZ);

   InjectorPulse = 0;
   Injector_ms = 0;
   Spark = 0;
   RPM = 0;


   //pripremi ekran
   lcd_init();
   Delay_ms(100);
   lcd_cursor_off();
   //lcd_load_custom_chars(); 
   lcd_putc("\f");
   lcd_gotoxy(5,1);
   lcd_putc("V");
   lcd_gotoxy(11,1);
   lcd_putc("%");
   
   lcd_gotoxy(5,2);
   lcd_putc("RPM");

   lcd_gotoxy(15,2);
   lcd_putc("ms");
 
   //popali interapte
   enable_interrupts(INT_RTCC);

   ext_int_edge( H_TO_L );         //PADAJUCA IVICA OKIDA INTERRUPT
   enable_interrupts(INT_EXT);

   *0x96 = 0x02; //IOCB1
   enable_interrupts(INT_RB);  
   enable_interrupts(GLOBAL);

InjectorPulse =0;
   //wrti se u krug
   while(1){
      

      lcd_gotoxy(1,1); printf(lcd_putc,"%04.1g", BatteryVolts);
      lcd_gotoxy(7,1); printf(lcd_putc,"%04.1g", FuelPCT);
      lcd_gotoxy(1,2); printf(lcd_putc,"%04.0g", RPM);
      lcd_gotoxy(9,2); printf(lcd_putc,"%06.2g", Injector_ms);


      delay_ms(100);

      //Vin = Vadc * 4
      //Vdd = 5V  
      set_adc_channel(0);
      delay_ms(1);
      BatteryVolts = read_adc() * 5.0 / 256.0;
      
      set_adc_channel(1);
      delay_ms(1);
      //FuelVolts = read_adc() * 5.0 / 256.0;
      FuelPCT = read_adc() * 500.0 / 3072.0 ; //12V == 100%
     
      
   }

}



 
Odgovor na temu

conver
Milos Milutinovic
Paracin

Član broj: 226436
Poruke: 112
*.mts.telekom.rs.



+1 Profil

icon Re: TripComputer ~ Putni racunar za automobil15.12.2010. u 15:15 - pre 124 meseci
au jbt. video sam...
Inace, ovo je sve super, ali treba liniju:

Injector_ms = InjectorPulse * 0.128; //trajanje u ms

promeniti u:

Injector_ms = InjectorPulse * 0.256; //trajanje u ms

Nastavljam sa razvojem, mozda mu ubacim jos koju funkciju ;)
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15331
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2341 Profil

icon Re: TripComputer ~ Putni racunar za automobil15.12.2010. u 15:26 - pre 124 meseci
ova zadnja verzija koju sam pasteova je malo "preciznija" posto koristi DIV_1 za tmr0, zato je ticks+=256; a ne +512 i zato je * 0.128 posto sada tick traje duplo krace, tj 0.128ms... cisto malo dobijes na preciznosti posto ionako ne radis nista drugo sa mcu-om
 
Odgovor na temu

conver
Milos Milutinovic
Paracin

Član broj: 226436
Poruke: 112
*.mts.telekom.rs.



+1 Profil

icon Re: TripComputer ~ Putni racunar za automobil15.12.2010. u 15:37 - pre 124 meseci
A da... u pravu si, izvinjavam se, ja sam TMR0 ostavio kao:

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);

 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15331
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2341 Profil

icon Re: TripComputer ~ Putni racunar za automobil15.12.2010. u 15:45 - pre 124 meseci
stavi kako god ti izadje bolje, ako mu dajes veci divider onda ti manje prekida glavni program no posto glavni program svejedno ne radi nista nije problem da bude div_1 ... sto je veci divider, manje te prekida ali ti je i manja preciznost ...

no - najbitnije je da usaglasis divider sa cifrom koju dodajes tickeru i sa cifrom kojom pravis duzinu u ms ... to se jedine dve stvari koje zavise od toga koliko cesto okida tmr0
 
Odgovor na temu

conver
Milos Milutinovic
Paracin

Član broj: 226436
Poruke: 112
*.mts.telekom.rs.



+1 Profil

icon Re: TripComputer ~ Putni racunar za automobil15.12.2010. u 16:23 - pre 124 meseci
hehe, al sad mi ona stvar ne da mira ja bi jos nesto dodao... :)

posto postoji davac impulsa na tocku (mislim da ima 12 impulsa za ceo obrt tocka, ali provericu), mogu li njih dovesti na RB2 recimo a da ne bude u knfliktu sa sparkom i injektorom na RB0 i RB1 ?
Pa tako recimo da od baze 15000 km oduzimam impulse sa tocka koje cu naravno pretvoriti u KM (recimo 100 impulsa = 1km pa tako na svakih 100 impulsa od 15000km oduzmem 1km, itd, itd...)
E sada recimo kad ugasim auto moram negde upisati vrednost te kilometraze smanjene za broj predjenih km-a! To moze u eprom da se zvrcne?
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15331
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2341 Profil

icon Re: TripComputer ~ Putni racunar za automobil15.12.2010. u 16:30 - pre 124 meseci
rekao bih da ti ovo sada radi to sto si hteo - jel tako?

par zakljucaka:
- ccs input, input_port, output, ouput_port funkcije nisu bas extra brze posto svaki put setuju tris, #use fast_io(X) resava problem - samo mi moramo da setujemo tris kako nam treba i vozi misko
- interrupt on change na B portu nije bas brz - propusta promene ako se desavaju jako brzo .. izgleda da mu je limit negde na 150KHz bar sudeci po simulatoru
- za razliku od tvog prvog programa koji je bio linearan ovaj koristi timer0 overflow interrupt da generise "sekundu", externi interrupt (B0) da broji "sparkove" i interrupt on change da vata duzinu pulsa
- u tmr0 overflow-u imamo odlican primer za racunanje vremena bez 32768 oscilatora koji ima "zero cumulative error" - dakle kumulativna greska mu je 0, preciznost zavisi od delioca (sto manji delioc veca preciznost ali vise prekida u glavnom programu)
- moras da *konfigurises* pic, dakle nije dovoljno samo da kazes delay ovo ono, moras da stavis sve one fuse bitove da bi on znao koji oscilator koristi, kako, gde zasto i slicno ...


ono sto bi jos jednom dodao je - ovde koristis interni oscilator na 8MHz, interni oscilator na pic-u je daleeeeeeeeeeeeeko od tacnog i vrlo varira od napona i temperature tako da sve netacnosti koje sam kod uvodi ne mogu da se porede sa netacnosti samog oscilatora na kome se sve zasniva... obzirom da ti nije frka za pinove na ovom picu (imas ih suvise slobodnih) bilo bi iskusno da koristis externi oscilator - to ti samo dodaje 2 bloka i jedan oscilator, znaci sto se cene tice nije neka promena a znacajno ce dodati na kvalitetu, tadkodje, obzirom da meris taj impuls od par ms i da ti od preciznosti istog zavisi svakojaka racunica onda mozes da turis 20MHz (to bese max za 887, proveri datasheet) i da ga poteras lepo na 20MHz... ako ga dizes na 20MHz moras da promernis

Code:

#FUSES INTRC_IO                 //Interni oscilator (nije nam preterano bitno da bude toliko precizan klok) bez zauzeca RA6 pina


u

Code:

#FUSES HS                       //Externi HighSpeed oscilator (veci od 4MHz)

da bi mcu znao da koristi externi oscilator, dalje

Code:

#use delay(clock=8000000,RESTART_WDT)

u
Code:

#use delay(clock=20000000,RESTART_WDT)

da bi delay() radio kako treba, dalje moras da promenis:
Code:

  if (ticks >  (unsigned int32) 2000000){ //ONE SECOND PASSED
      ticks -= (unsigned int32) 2000000;

u
Code:

  if (ticks >  (unsigned int32) 5000000){ //ONE SECOND PASSED
      ticks -= (unsigned int32) 5000000;


posto sada jeli 5000000 instrukcija cini jednu sekundu, pa dalje
Code:

Injector_ms = InjectorPulse * 0.128; //trajanje u ms


u

Code:

Injector_ms = InjectorPulse * 0.0512; //trajanje u ms


posto sada toliko traje jedan "tick" i na kraju
Code:

setup_oscillator(OSC_8MHZ);

u

Code:

//setup_oscillator(OSC_8MHZ);


dakle zakomentarisemo to posto ne koristimo interni oscilator




 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15331
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2341 Profil

icon Re: TripComputer ~ Putni racunar za automobil15.12.2010. u 16:45 - pre 124 meseci
Citat:
conver: hehe, al sad mi ona stvar ne da mira ja bi jos nesto dodao... :)


naravno :D

Citat:

posto postoji davac impulsa na tocku (mislim da ima 12 impulsa za ceo obrt tocka, ali provericu), mogu li njih dovesti na RB2 recimo a da ne bude u knfliktu sa sparkom i injektorom na RB0 i RB1 ?
Pa tako recimo da od baze 15000 km oduzimam impulse sa tocka koje cu naravno pretvoriti u KM (recimo 100 impulsa = 1km pa tako na svakih 100 impulsa od 15000km oduzmem 1km, itd, itd...)


da. samo moras
1. da upalis da i RB2 generise interrupt on change ( *0x96 = 0x06; //IOCB1 + IOCB2 )
2. da izhendlujes to u RB interrupt rutini ... taj deo je malo komplikovaniji

Code:

#int_RB
void  RB_isr(void) 
{
  static unsigned char staroStanjeB1 = 0;
  static unsigned char staroStanjeB2 = 0;
  unsigned char novoStanjeB1;
  unsigned char novoStanjeB2;

  novoStanjeB1 =  input(PIN_B1);
  novoStanjeB2 =  input(PIN_B2);
  
  if (novoStanjeB1 != staroStanjeB1){ //desila se promena na B1  
    if (staroStanje == 0){ //L-H tranzicija
      InjectorPulse = 0; //zapocni brojanje    
    } else { //H-L tranzicija
      Injector_ms = InjectorPulse * 0.128; //trajanje u ms
    }
    staroStanjeB1 = novoStanjeB1;
  }

  if (novoStanjeB2 != staroStanjeB2){ //desila se promena na B2  
    if (novoStanjeB2 ==1) brojacObrtajaTocka++; //povecaj broj obrtaja tocka za jedan samo na rastucoj ivici B2 signala
    staroStanjeB1 = novoStanjeB1;
  }

}



Citat:

E sada recimo kad ugasim auto moram negde upisati vrednost te kilometraze smanjene za broj predjenih km-a! To moze u eprom da se zvrcne?


da, samo pazi - ti ne znas kad ces da se otkacis sa struje tako da bi trebalo da pises tu vrednost "povremeno", a opet, pisanje u eeprom traje "dugo" tako da ne mozes da pises non stop el ce da ispreskaces cudo toga ... i trece mnogo zeznutije, eeprom ima ogranicen broj pisanja tako da ce da rikne posle mesec dana ako budes pisao u njega non stop ... mozes da ides na neku varijantu sa time da na posebnom pinu drzis signal sa kontakta pa da znas kad je ugasen auto - ti tada (posto si jos na accu) spucas sve u eeprom .. na primer ..

sto se citanja i pisanja tice u eeprom tice:
Citat:

write_eeprom (address, value)

address is a (8 bit or 16 bit depending on the part) int, the range is device dependent,
value is an 8 bit int

Write a byte to the specified data EEPROM address. This function may take several milliseconds to execute. This works only on devices with EEPROM built into the core of the device.

--------------

value = read_eeprom (address)

address is an (8 bit or 16 bit depending on the part) int

Returns:
An 8 bit int

Function:
Reads a byte from the specified data EEPROM address. The address begins at 0 and the range depends on the part.


 
Odgovor na temu

lumpy986
Ognjen Radonic
IT administrator, mikroprocesorsko
upravljanje
Backa Palanka

Član broj: 220844
Poruke: 124
46.17.124.*



+4 Profil

icon Re: TripComputer ~ Putni racunar za automobil15.12.2010. u 22:03 - pre 124 meseci
Imas li neku sliku da se vidi taj sklop sto je napravljen? Ili je jos u razvoju i ne testiran? Zainteresovan sam da napravim tako nesto ali nema iskustva u pisanju koda ali bih se lako snasao oko elektronike :)
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15331
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2341 Profil

icon Re: TripComputer ~ Putni racunar za automobil16.12.2010. u 02:01 - pre 124 meseci
sav kod imas ovde na ovoj temi ... a od elektronike nema sta .. mikrokontroler kome preko optokaplera dovedes ulaz sa ecu i to je to ..

ono sto je do duse ovde cudno, sad mi pade na pamet, conver, ti rece da imas ECU u kolima?! zar ti nije bilo lakse da nadjes protokol za tvoj ecu i da se okacis na servisni port .. znam da to drugar radi sa svojim kolima u australiji, on se okacio na servisni port i ima sve - obrtaje, potrosnju, odometar, brzinometar .. samo pokupi sve te podatke sa ECU-a (plus jos svasta nesto oko motora sto ja nista ne razumem) i onda prikaze na nekom fancy gpu display-u ..
 
Odgovor na temu

ghost2k3
Lat45.2508; Lon19.3919

Član broj: 25133
Poruke: 690
82.117.202.*

Jabber: ghost2k3
Sajt: www.zombo.com


+8 Profil

icon Re: TripComputer ~ Putni racunar za automobil16.12.2010. u 10:28 - pre 124 meseci
A mozda ima i BC :S
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15331
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2341 Profil

icon Re: TripComputer ~ Putni racunar za automobil16.12.2010. u 10:38 - pre 124 meseci
ne verujem da ima board computer posto covek rece u prvom postu da ovo pravi bas zato sto nema na konzoli nista osim osnovnih informacija ... ista prica ko ovaj moj australijanac, moram samo da ga uvatim da mi ponovo posalje link, koliko sam ga ja svatio on isto nema nista osim ECU, a tu je menjao eprom da dobije "konja.." i tu sa servisnog porta dobija sve informacije od kojih pravi mlatimudiju ... naravno tu negde kad je privrsio projekat zamenio je auto ... kako to obicno biva no treba da negde ima dokumentovan taj rad, secam se da je bio neki atmega u pitanju ... bacicu link ako ga uvatim posto se ne preklapamo bas on radi kad ja spavam :D (a i mislim da je na odmoru do treceg januara kao i 90% firme)

sve u svemu, zgodno bi bilo videti pinount i neki tech doc za taj ecu koji op ima .. ko zna, mozda ovo sve moze i jednostavnije :D ... no radi i ovako :) (bar u simulatoru :D )
 
Odgovor na temu

conver
Milos Milutinovic
Paracin

Član broj: 226436
Poruke: 112
*.mts.telekom.rs.



+1 Profil

icon Re: TripComputer ~ Putni racunar za automobil16.12.2010. u 12:49 - pre 124 meseci
Bogdane, istetoviraću tvoje ime... :)

Ovako:
Što se sklopa i cele ove priče tiče, kad se zaokruži i svede priča "kraju" (koga nema, stalno mi nešto novo pada ne pamet),biće sve objavljeno,dakle cela priča na zvaničnom sajtu ove skalamerije.
Što se servisnog porta tiče,taj glupi port ima izlaz samo za dijagnostiku i to onu primitivnu (auto je 1988 godište) ali na njemu nemam mugućnosti iščitavanja ovih podataka koji mi trebaju, niti postoji interfejs za tako nešto namenjenom za taj ECU! Na njemu se mogu samo pročitati error codes ,što u principu i mi možemo u ovaj PIC uklepati, a i hoćemo! :)
Sad ste me omeli pa imam i fiks ideju da preko RS323 ostvarim i komunikaciju između kompa i ovog PICa i ispišem neki ludi program, koji će pratiti sve i svašta na automobilu.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15331
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2341 Profil

icon Re: TripComputer ~ Putni racunar za automobil16.12.2010. u 12:59 - pre 124 meseci
vidi rs232 na njemu ti je fraj koliko ja vidim, samo u glavnu petlju dodas da sve te podatke koje ima posalje u jednoj liniji na seriski port i to je to ... ako sa druge strane ima PC da saceka podatke i procesira ih - super, ako ne, on ce to da baca u vazduh i nikom nista :D

inace taj "dijagnosticki" izlaz je prilicno zgodan, samo je problem sto je protokol proprietary i nema ga da se skine lako za svaki auto ..
 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: TripComputer ~ Putni racunar za automobil

Strane: 1 2 3 4

[ Pregleda: 22205 | Odgovora: 60 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.