[ conver @ 12.12.2010. 16:02 ] @
Pozdrav svima, evo ja se igrao malo svojim (ne) znanjem,programiranjem i PICom te sam hteo da napravim sebi nesto za svoj automobil. S obzirom da vozim relativno star auto, postao sam zavidan svakom ko ima bilo kakav displej na centralnoj konzoli na svom automobilu. :)
Pokusao sam napraviti sebi tzv. putni racunar koji ce mi pokazivati trenutnu potrosnju goriva, naponsko stanje akumulatora, vreme trajanja impulsa na el. dizni, preostali broj kilometara do zamene ulja itd...
Medjutim kako su me obaveze stigle sve manje vremena imam da privedem projekat kraju. Kako mi cilj projekta nije bio da zaradim odlucio sam da ga podelim sa svima koji su drage volje da pomognu njegovoj realizaciji i mozda jednog dana stave u svoj auto.
Moj trenutni problem jeste u tome sto mi program broj obrataja motora ispisuje NEtacano te automatski ni kalkulacija potrosnje ne moze biti tacna...

Recimo da je u pitanju rad motora na leru kome odgovara 800 o/min, to znaci da ce bombina dva puta baciti "varnicu" na neku od svecica, dakle 800 x 2 = 1600 sto znaci da je to 1600 / 60 = 26.666 Hz!
Zato sam i SPARK u proteusu podesio na 26.666 HZ

inace jedan prolaz kroz while petlju u main-u traje 1sec, te mi je to reperno vreme ... dakle brojim impulse u 1sec pa dalje transformisem u obrtaje, sve se lepo vidi u kodu koji cu okaciti zajedno sa proteus simulacijom,pa ko je voljan da mi pomogne, dobro mi dosao!

Link za simulaciju i kod:
http://www.4shared.com/file/J5TwvP3o/TripComputer.html

evo main koda mozda neko uspe da provali zasto ne dobijam pravilan broj za RPM...

Trip.c
Code:

#include "16F887.h"
#use delay(clock=1024000)

#include "LCD.h"

#define H  0
#define OC  1

int SS = 0;            //ScreenState
int adc_valueAN0;    //Acumulator
int adc_valueAN1;    //Fuel
long int RPMCount = 0;
int min = 60;
int UpdateCounter;
int UpdateInterval = 2;


float BatteryVolts;
float InjectorPulse;
float Injectors = 1;
float InjectorFlow = 16; //For 1.6 Engine
float RPM;
float Consumpt;

float KM = 15000; //na toliko sledi promena ulja

#include "LCDCustomChars.h"
#include "Display.h"
#include "WelcomeScreen.h"

void spark_pulse_counter(){

while(input(PIN_E2)) 
  {
  ++RPMCount; 
  }

}

void wait_for_low_to_high() {

   while(input(PIN_B1)) ;       /* if it's high, wait for a low */

   delay_us(3);                 /* account for fall time */

   while(!input(PIN_B1));       /* wait for signal to go high */
}

void wait_for_low() {

   delay_us(3);                 /* account for rise time */

   while(input(PIN_B1));        /* wait for signal to go low */
}
void km_counter(){
while(input(PIN_B2)) 
  {
  KM = KM - 1; 
  }
}

void Main(){

lcd_init();
Delay_ms(100);
lcd_cursor_off();
lcd_load_custom_chars(); 
lcd_putc("\f");



setup_adc_ports(sAN0|sAN1); 
setup_adc(ADC_CLOCK_DIV_8); 

SETUP_TIMER_0(RTCC_INTERNAL | RTCC_DIV_256);

WelcomeScreen();

do 
{
spark_pulse_counter();

km_counter();
UpdateCounter++;

wait_for_low_to_high();
set_timer0(0);
wait_for_low();
InjectorPulse = get_timer0();

set_adc_channel(0); 
delay_us(20); 
adc_valueAN0 = Read_ADC(); 

    
RPM = RPMCount / 2; //jer za jedan obrt vratila bombina 2x baci varnicu
Consumpt = ((InjectorPulse * Injectors * InjectorFlow * RPM * 60) / 3600000); 

BatteryVolts    = (float)(adc_valueAN0/12); //12 je kalibraciona konstanta        

if (UpdateCounter == UpdateInterval && SS ==1)
{
Display();
UpdateCounter = 0;
RPMCount = 0;
}

} while (TRUE);

}



Display.h
Code:

void Display(){
lcd_putc("\f");

lcd_gotoxy(3,1);
lcd_putc("V");

lcd_gotoxy(7,1);
lcd_putc("ms");

lcd_gotoxy(14,1);
lcd_putc("RPM");

lcd_gotoxy(6,2);
lcd_putc("L/h");

lcd_gotoxy(15,2);
lcd_putc("KM");

lcd_gotoxy(1,1);
printf(lcd_putc,"%0.0f",BatteryVolts);

lcd_gotoxy(5,1);
printf(lcd_putc,"%0.0f"InjectorPulse);

lcd_gotoxy(10,1);
printf(lcd_putc,"%0.0f"RPM);

lcd_gotoxy(1,2);
printf(lcd_putc,"%0.1f"Consumpt);

lcd_gotoxy(10,2);
printf(lcd_putc,"%0.0f"KM);
}







[ branko_g @ 12.12.2010. 19:45 ] @
Citat:
Moj trenutni problem jeste u tome sto mi program broj obrataja motora ispisuje NEtacano

Koliko u ciframa je NEtacno netačno? Da li imaš konstantnu grešku, procentualnu ili ta greška varira?
S obzirom da kod uopste nije komentarisan predpostavljam da čak i ti nakon duže pauze teško možeš da ukapiraš
šta si sa pojedinim delovima koda hteo da postigneš.
Probaj da uz ključne delove koda napišeš komentar šta taj deo koda radi.

U principu bih pošao ovim putem:
-Jedan Timer/Counter bih koristio kao Brojač eksternih impulsa.
-Drugi brojač bih koristio kao izvor vremenske baze. Ovaj brojač bi recimo izazivao interapt svakih 10milisekunde.- U interapt-rutini bih povećavao sadržaj jedne promenljive.
-Na pocetku bih i brojač i promenljivu postavio na nulu.
-Kada promenjliva dostigne vrednost 100 protekla je tačno jedna sekunda.
-U tom trenutku bih "spasao" vrednost brojača prepisavči ga u jednu globalnu promenljivu, i postavio jedan "flag" kao poruku glavnoj petlji da je merenje završeno.
-U glavnoj petlji bi onda na miru "obradio" taj broj impulsa u sekundi, taj deo onda nije vremenski kritičan.
-Kada je posao oko računanja i osvežavanja displeja završen ponovo bih resetovao "flag".

I još nešto u vezi Display.h:
U header idu samo definicije i makro, sam kod tu nije ništa izgubio.
Kod ide samo u C-fajl.
Znači napravi Display.c i Display.h

pozdrav

[ conver @ 13.12.2010. 11:15 ] @
Kod sam slabo komentaarisao jer mi je uvek bilo jasno sta radi koji deo price, ne vidim da je neki problem provaliti, ako ista zatreba, pitajte slobodno.
Integrisao sam CCS u MPLAB pa je bilo problema sa ".c" datotekama i njihovim kompajliranjem, ali je zato bez problema progutao ".h" to je jedini razlog :-)

Sto se tice greske za ocitavanje RPM motora, funkcija mi umesto stalnih 800RPM (koliko sam podesio na impulseru) ispisuje neke leve podatke 198,150,0,0 pa onda 161 itd... nema veze s mozgom!

Branko, vhala na sugestijama, ako pronadjes koji tren slobodnog vremena, slobodno baci koju liniju koda za ovu ideju!
Pozdravljam!
[ Horvat @ 13.12.2010. 11:27 ] @
Citat:
conver:  el. dizni,
"varnicu" na neku od svecica,

pa cek, je l dizelas ili benzinac?

a sto se tice komentarisanja koda, sada znas, a da ne ceprksas kod jedno pola godine, trebace ti "malo" vremena da skontas sta si tu hteo da uradis i zasto si bas to napisao
a pogotovo ako delis s drugima kod, svako ima "svoj stil" pisanja

a na koji nacin "hvatas" broj obrtaja motora,pomocu cega?
[ conver @ 13.12.2010. 11:42 ] @
Benzinac! Sta je cudno u tome sto ima el. diznu ? :) ima MonoPoint Sistem ubrizgavanja, dakle jedan injektor na cetiri cilindra...
ECU (EngineControleUnit) salje impuls od 12V na bombinu koja taj napon pretvara u visoki napon i predaje kao takav svecici.
Oborim 12v na recimo 3v, nebitno... i brojim :)
E ovako, za RPM sa odradio sledece:

definisao sam:
long int RPMCount = 0;

koji se u funkciji:

void spark_pulse_counter()
{

while(input(PIN_E2))
{
++RPMCount;
}
}

svaki put ikrementira za 1 kada se dovede stanje "1" na E2

Kao interval u kome brojim impulse sam uzeo 1 sekundu jer mi toliko traje jedan prolaz kroz glavnu while petlju:

do
{
spark_pulse_counter();

....


RPM = RPMCount / 2; //jer za jedan obrt vratila bombina 2x baci varnicu

...

} while (TRUE);

Da bih ispisao tacan podatak o broju obrtaja motora, moram broj impulsa izbrojanih na E2 podeliti sa 2 (RPM = RPMCount / 2) jer se za jedan obrt vratila motora 2x javi impuls na E2
[ _str_ @ 13.12.2010. 14:39 ] @
Signal sa "platina" je pun smetnji a možda postoji greška u filtriranju signala?
Podatak o obrtjaima se može uzeti i sa alternatora, signal je naizmenični i freq. mu zavisi od broja obrtaja motora.
[ Sepa011 @ 13.12.2010. 14:49 ] @
A si se preracunavanja potrosnje tice, trebace ti i 1 ili 2 meraca protoka.
[ conver @ 13.12.2010. 14:51 ] @
Neuzimam ga sa platina vec kao sto rekoh, direktno sa elktronsko upravljacke jedinice pre nego sto ode na bombinu!
[ conver @ 13.12.2010. 14:52 ] @
Sepo, ne treba protokomer, samo pogledaj kod tamo gore gde pise CONSUMPTION = .. :)
[ Sepa011 @ 13.12.2010. 17:00 ] @
Axm, da, veoma PRECIZNO određivanje potrošnje. Uz sve to različita goriva imaju i različitu zapreminu na razlićitim temperaturama tako da...
[ conver @ 13.12.2010. 17:38 ] @
Verovao ili ne, dobija se dosta pouzdana vrednost za sve rezime rada motora!
Nije funkcija uopste sporna zaista! Problem je odbrojati ove RPMove! Ajde neka neko zalepi kod kako da recimo pokrenemo timer2 na ovom pic-u i generisem interrupt svake sekunde te bih u prekidu obradio izbrojane impulse za tu jednu sekundu!
[ ChanMaster @ 13.12.2010. 18:36 ] @
"Recimo da je u pitanju rad motora na leru kome odgovara 800 o/min, to znaci da ce bombina dva puta baciti "varnicu" na neku od svecica, dakle 800 x 2 = 1600 sto znaci da je to 1600 / 60 = 26.666 Hz!
Zato sam i SPARK u proteusu podesio na 26.666 HZ"

Zar nece "baciti varnicu" 4 puta? posto je ceo obrtaj u ovom slucaju?

ili je motor dvotaktni??????
[ bogdan.kecman @ 13.12.2010. 19:04 ] @
odma u startu da se izvinim nisam procitao celu temu (malo sam kratak sa vremenom) ali stigao sam da dignem source i dsn pa da nacukam par problematicnih detalja

Code:
 #use delay(clock=1024000)


- koji je ovo takt i odakle dolazi?! 887 ima interni oscilator na 8MHz koji ide na postscaler te generise 8,4,2,1,0.5,0.25,0.125MHz .. 1MHz != 1024000Hz vec je 1MHz == 1000000Hz !!! Ima i dodatni LF koji je na 31KHz.. Frekvencija u ovom slucaju nema nikakve veze sa binarnim brojevima 2^x i slicno MEGA znaci E6
- gde je konfiguracija, ja ne vidim nigde fuse setovan ?! u projektu pise da je configuration setovan "in code" a u kodu nema nigde nista ?! ono use delay() samo sluzi da kompajler pretpostavlja da mcu radi na tom kloku te kada ti uradis delay_ms(100) on to napravi tako da bude 100ms ako mcu radi na 1.024MHz ali to nigde ne konfigurise mcu na 1.024MHz (niti ga je moguce pustiti na tu frekvenciju) (imas zakacene za poruku validne konf bitove)
- sve ovo sto radis, ovako kako radis - nece da moze, tebi main treba da bude otprilike
Code:

void main(){
 //inicijalizacija
 //startanje timera
 //enableovanje interrupta

 //glavna petlja
 while(1){
    refresh_display();
  }
}


dakle sve sto treba da radis u glavnoj petlji je da ispisujes stvari na ekran, sve ostalo treba da se puni kroz interrupte .... ako se dobro secam 887 ima interrupte na B portu kao i ostatak pic familije ... ne secam se da li svaki moze da bude setovan razlicito na "rising" ili "falling" edge (ako ne moze setuj sve na jednu stranu pa eventualno dodaj neke invertore de treba obrnuto) i onda imas funkciju koja obradjuje te dogadjaje (uglavnom ce to biti brojanja) .. i imas timer koji u odredjenom vremenskom intervalu pokupi vrednosti iz brojaca, resetuje ih i uradi "Sta god" sa njima ...

887 nema rtc kao zaseban modul ali moze sa zero cumulative error da se napravi neki rtc koji bi vodio racuna o svemu ... ako uvatim neki minut ovih dana mogu da nacukam primer
[ conver @ 13.12.2010. 19:18 ] @
Motor je cetvorotaktni a kod takvih motora su dva impulsa za jedan obrt vratila! Sve su formule ok! Ajte samo pomoc da CCSom pokrenem taj TMR2
[ bogdan.kecman @ 14.12.2010. 04:47 ] @
evo ...

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 int InjectorPulse;
volatile unsigned int Spark;
volatile float RPM;
volatile float InjectorsPS;


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

  ticks+=512;
  if (ticks >  (unsigned int32) 2000000){ //ONE SECOND PASSED
      ticks -= (unsigned int32) 2000000;
      // uradi sta si hteo "svake sekunde"
      RPM = Spark * 30.0; //ako spark puls dolazi po rotaciji, ako ne onda podeliti vrednost sa brojem pulseva po rotaciji
      Spark = 0; 
      
      InjectorsPS = InjectorPulse * 60.0; //Izracunaj sta god sa ovim pulsevima, bilo ih je InjectorPulse u poslednjoj sekundi
      InjectorPulse = 0;
      //
  }
}

//Spark vezan na RB1
#int_RB
void  RB_isr(void) 
{
  // obrati paznju da se ovaj interrupt desava na SVAKU PROMENU,
  // dakle i sa LOW-HIGH i sa HIGH-LOW
  // najlakse je samo da posle vrednost Spark delis sa 2 da dobijes
  // samo jedan edge, a mozes ako hoces da pamtis proslu vrednost
  // pa da proveravas da li je tranzicija ona koju hoces da 
  // brojis
  
   volatile unsigned char dummy;

   Spark++; 
   dummy = input_b(); //moramo da procitamo sadrzaj B da bi izasli iz interapta

}


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

#int_AD
void  AD_isr(void) 
{

}

#int_TIMER1
void  TIMER1_isr(void) 
{

}

#int_TIMER2
void  TIMER2_isr(void) 
{

}



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_INTERNAL|T1_DIV_BY_8);  //TIMER1 8000000/4/8/256 puta u sekundi
   setup_timer_2(T2_DIV_BY_1,99,10);        //TIMER2 8000000/4/1/256 puta u sekundi
   
   //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;
   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");
   
 
   //popali interapte
   enable_interrupts(INT_RTCC);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(INT_TIMER2);
   
   ext_int_edge( H_TO_L );         //PADAJUCA IVICA OKIDA INTERRUPT
   enable_interrupts(INT_EXT);

   *0x96 = 0x02; //IOCB1
   enable_interrupts(INT_RB);  //PROMENA NA B1 OKIDA INTERRUPT
   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);

// OVDE PRIKAZI OSTALO STA IMAS ... 



      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%
     
      
   }

}

[ bogdan.kecman @ 14.12.2010. 04:57 ] @
kao sto vidis sa primera, vezao sam ti ova dva puls generatora na B0 i B1 da bi mogao interrupt da ih pokupi ... B0 se okida na padajuci a B1 se okida na promenu (dakle i na padajuci i na rastuci signal)

takodje imas konfiguraciju u vrhu fajla i koristi se 8MHz interni oscilator (1.024MHz oscilator koji si ti spominjao nema interno a ne vidim sto bi ga stavljao externo) ..

upaljena su ti sva tri timera, doduse koristi se samo timer0, ova dva su ti upaljena ali ne rade nista ...

racuna ti se RPM i racunaju ti se tacan napon (ne znam sta ti je bilo ono /12 to si nesto "nagadjao??") na akumulatoru i tacan % goriva (ako je raspon na ulazu 0-12V)

imas dakle primer
- kako se nesto broji (broje ti se impulsi sa 2 izvora, mozes da dodas nove izvore na B2.B3... ali onda u int_rb moras da proveravas koji ti je izvor izazvao trigger)
- kako se nesto radi svake sekunde (racunanje rpm-a)
- kako se radi sa adc-om

ovo za sekunde je takozvani "zero cumulative error" pristup, dakle svaka sekunda nije "idealno" tacna (greska je +-0.5us) ali kumulativno greska je 0 posto ako je sada sekunda bila 0.1us "kraca" sledeca ce biti 0.12us duza, pa sledeca 0.02 kraca i u proseku je sve 100% tacno :D.. mnogo vecu gresku ces da imas zbog temperaturnog drifta internog oscilatora nego zbog bilo cega u softwareu :D

eto .. ako neki deo nije jasan - kukaj .. ja o kolima ne znam nista al ovo ti valjda pomogne ..

inace sto se ovih impulsnih ulaza tice, ja bi savetovao tu da stavis ispred neke optokaplere .. cisto da razdvojis to 1/1, samo limitiras struju na ulazu optokaplera i resio si problem, nema da brines .. takodje zenerka + kondenzator na ulaz ADC-a obavezno .. kola su jaaaaaaako prljava i bucna tako da je to pod moranje ...

ono sto nema je da izmeris duzinu nekog pulsa, ne znam dal ti to treba ali je isto prilicno jednostavno ..

[Ovu poruku je menjao bogdan.kecman dana 14.12.2010. u 06:08 GMT+1]
[ conver @ 14.12.2010. 11:39 ] @
Hvala ti Bogdane, pomogo si mi dosta zaista! Imaš piće za ovo kad kod ugrabiš vremena!
Nisam skontao ovaj deo sa tajmerom,dakle postavio si:
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); //TIMER0 8000000/4/2/256 i to je 3906,25 tikova u sekundi
Šta predstavlja cifra 256?

i zašto si ovde
void RTCC_isr(void)
{
static unsigned int32 ticks=0;

ticks+=512;
if (ticks > (unsigned int32) 2000000){ //ONE SECOND PASSED
ticks -= (unsigned int32) 2000000;
...
}
}
ticks uvećavao do512?

kako znaš da je ovde protekla baš jedna sekunda?
if (ticks > (unsigned int32) 2000000){ //ONE SECOND PASSED


a ovo tek nisam skontao:
setup_timer_2(T2_DIV_BY_1,99,10); šta je 99 i 10 ?

treba još dodati funkciju za merenje trajanja impulsa sa davača InjectorPulse (i to u ms)
Pozdrav!

[ bogdan.kecman @ 14.12.2010. 11:51 ] @
Citat:

Code:

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); //TIMER0 8000000/4/2/256 

Šta predstavlja cifra 256?


8000000 - pretstavlja brzinu mcua
/4 - pretstavlja broj intruction clockova mcu-a (PIC16F887 izvrsava jednu instrukciju svaka 4 takta oscilatora)
/2 - deli sa 2 broj tikova u sekundi zato sto smo setapovali prescaler kao RTCC_DIV_2 tako da se tek svaki drugi instruction clock "broji"
/256 - kako je TIMER0 osmobitni tajmer interrupt se desava svaki put kada se desi overflow, a to se na osmobitnom tajmeru desava kada predje iz 0xFF - 0x00 - dakle kada do njega stigne 256 "tikova"


Citat:

zasto ovde
Code:

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

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

ticks uvecavamo za 512?


zato sto imamo TIMER0 konfigurisan na RTCC_DIV_2 sto znaci da je svaki drugi sistemski tick okinuo TIMER0, a kako je TIMER0 osmobitni tako znamo da je svaki put kada se pozove ovaj interrupt proslo 2*256=512 sistemskih tickova

Citat:

kako znas da je ovde protekla bas jedna sekunda?
Code:

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



sistemski oscilator je 8000000, dakle sistemskih tikova ima 8000000/4 = 2000000 dakle kada prodje idealno 2000000 tikova prosla je jedna sekunda, kako povecavamo ticks za 512 nikad nece biti idealno 2M tikova vec ce biti prvi put 2000384, pa ce drugi poceti od 384 i zavrisiti na 2000256 te ce treci poceti sa 256 ... etc etc .. znaci sekunda nam varira za jedan interrupt tamo vamo sa preciznoscu od 1/(8000000/4/2/256) = 0.000256sec a da pritom nemamo kumulativnu gresku (dakle za deset hiljada sekundi necemo imati gresku od 2sekunde vec i dalje 0.000256sec) ... ovo moze da se smanji na pola ako ne koristimo post scaler nego teramo timer0 sa DIV_1 ali je to bespotrebno i bez veze trosimo cpu time obzirom da se unutar tog interrapta ipak nesto desava (neka matematika koja je float i nije uopste brza, cak bi mozda bilo bolje koristiti DIV_4 i ticks+=1024)


Citat:

Code:

setup_timer_2(T2_DIV_BY_1,99,10); sta je 99 i 10 ?



sintaksa je setup_timer_2 (mode, period, postscale)
timer 2 moze da koristi "period" - to je da mu kazes kada da radi overflow, dakle ne radi overflow na 256 kao timer0 nego radi overflow na 99
ono 10 je postscaler, dakle na koliko overflow-a da pozove interrupt
t2_div_by_1 je prescaler koji ovde kao sto vidis ne koristimo ..
[ bogdan.kecman @ 14.12.2010. 11:53 ] @
Citat:
treba još dodati funkciju za merenje trajanja impulsa sa davača InjectorPulse (i to u ms)

ah znaci onaj "injector" ulaz - tu ne brojis pulseve nego meris trajanje?

nije frka, samo da uvatim koji minut .. reci mi da li meris trajanje kad je high ili trajanje kad je low? najverovatnije cu onda da zamenim mesta za spark i za injector ulaze
[ conver @ 14.12.2010. 12:18 ] @
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 ! :-/
inace ovde:
Code:

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

  ticks+=512;
  if (ticks >  (unsigned int32) 2000000){ //ONE SECOND PASSED
      ticks -= (unsigned int32) 2000000;
      // uradi sta si hteo "svake sekunde"
      RPM = SparkPulse * 30.0; //ako spark puls dolazi po rotaciji, ako ne onda podeliti vrednost sa brojem pulseva po rotaciji
      SparkPulse = 0; 

  }
}


ipak treba:

Code:

RPM = SparkPulse / 2 * 30.0; //ako spark puls dolazi po rotaciji, ako ne onda podeliti vrednost sa brojem pulseva po rotaciji 

mada, sto smo mnozili sa 30 gore?
i sta predstavlaja:
*0x96 = 0x02; //IOCB1
gore u kodu?


[Ovu poruku je menjao conver dana 14.12.2010. u 13:33 GMT+1]
[ bogdan.kecman @ 14.12.2010. 12:51 ] @
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
[ bogdan.kecman @ 14.12.2010. 13:27 ] @
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%
     
      
   }

}

[ tox master @ 14.12.2010. 16:54 ] @
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?
[ conver @ 15.12.2010. 09:59 ] @
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 ! >:)
[ conver @ 15.12.2010. 12:32 ] @
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
[ bogdan.kecman @ 15.12.2010. 14:34 ] @
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

[ bogdan.kecman @ 15.12.2010. 14:54 ] @
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%
     
      
   }

}


[ conver @ 15.12.2010. 15:15 ] @
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 ;)
[ bogdan.kecman @ 15.12.2010. 15:26 ] @
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
[ conver @ 15.12.2010. 15:37 ] @
A da... u pravu si, izvinjavam se, ja sam TMR0 ostavio kao:

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);

[ bogdan.kecman @ 15.12.2010. 15:45 ] @
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
[ conver @ 15.12.2010. 16:23 ] @
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?
[ bogdan.kecman @ 15.12.2010. 16:30 ] @
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



[ bogdan.kecman @ 15.12.2010. 16:45 ] @
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.

[ lumpy986 @ 15.12.2010. 22:03 ] @
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 :)
[ bogdan.kecman @ 16.12.2010. 02:01 ] @
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 ..
[ ghost2k3 @ 16.12.2010. 10:28 ] @
A mozda ima i BC :S
[ bogdan.kecman @ 16.12.2010. 10:38 ] @
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 )
[ conver @ 16.12.2010. 12:49 ] @
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.
[ bogdan.kecman @ 16.12.2010. 12:59 ] @
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 ..
[ conver @ 16.12.2010. 13:34 ] @
Ovako izgleda taj dzek:

| A B C D E |
| K J H G F |

kratko spojiš tačke A i B za motor, A i K za ABS, A i H za Alarm, A i C za automatski menjač...
Ja imam samo za motor i ABS, dakle A i B + A i K

* A - Ground
* B - Engine ECU
* C - Automatic Gearbox (except models with traction control)
* D - Fuel Computer (not UK models)
* E - Engine ECU
* F - +12v (fused)
* G - Bi directional data line
* H - Alarm
* J - 4x4 or Traction Control (pin may not be present on certain models)
* K - ABS

Posto ja imam ECU:
Mototronic 1.5 do 2.8 Fault:

Moji dijagnosticki kodovi su sledeci:

Za motor:

12 Initiation of diagnosis. n/a
13 Oxygen sensor No change in voltage/open circuit.
14 Coolant Temperature Sensor (CTS) Low voltage
15 Coolant Temperature Sensor (CTS) High voltage
16 Knock sensor 1 No change in voltage
17 Knock sensor 2 No change in voltage
18 Knock control unit No signal, Engine Control Unit (ECU) fault
19 RPM signal (crankshaft sensor) Incorrect signal
21 Throttle position sensor High voltage
22 Throttle position sensor Low voltage
23 Knock sensor module n/a
24 Vehicle speed sensor (VSS) No signal
25 Injector valve 1 High voltage
26 Injector valve 2 High voltage
27 Injector valve 3 High voltage
28 Injector valve 4 High voltage
28 Fuel pump relay Low voltage
29 Injector valve 5 High voltage
31 Engine RPM signal (crankshaft sensor) No signal
32 Injector valve 6 High voltage
32 Fuel pump relay High voltage
33 Inlet manifold pressure sensor Voltage too high
34 Exhaust Gas Re-circulation (EGR) valve Voltage too high
34 Manifold Absolute Pressure (MAP) sensor Low voltage
35 Idle Speed Control Valve (ISCV) Poor or no idle speed control
36 Incorrect RON/Octane setting Damaged RON plug or bad connection.
37 Engine self-diagnosis (fault code light) Low voltage
38 Oxygen sensor Voltage low (1990 model year on)
39 Oxygen sensor Voltage high (1990 model year on)
41 Vehicle speed sensor (VSS) Low voltage
41 1 gear ident switch (C20LET systems) Low voltage
41 EST Line coil cylinder 2&3 (M2.8/XEV systems) High voltage
42 Vehicle speed sensor (VSS) High voltage
42 1 gear ident switch (C20LET systems) High voltage
42 EST Line coil cylinder 2&3 (M2.8 / XEV systems) High voltage
43 Linear EGR system (XEV systems) Faulty
44 Oxygen sensor Air/fuel mixture too lean (weak)
45 Oxygen sensor Air/fuel mixture too rich
46 Air pump relay High voltage
47 Air pump relay Low voltage
47 Linear EGR Position (XEV systems) Faulty
48 Battery voltage Low voltage
49 Battery voltage High voltage
51 ECU Programmable memory PROM error, hardware failure
52 Engine check light; final stage (fault code light) High voltage
53 Fuel pump relay Low voltage
54 Fuel pump relay High voltage
55 Engine Control Unit (ECU) fault Renew Engine Control Unit (ECU)
56 Idle Speed Control Valve (ISCV) Short to earth
57 Idle Speed Control Valve (ISCV) Interruption
59 Inlet manifold valve 1 Low voltage
61 Fuel Tank Vent Valve (FTVV) Low voltage
62 Fuel Tank Vent Valve (FTVV) High voltage
63 Inlet manifold valve 1 High voltage
63 EST Line coil cylinder 2&3 (M2.8 / XEV systems) Low voltage
64 EST Line coil cylinder 1&4 (M2.8 / XEV systems) Low voltage
65 Carbon Monoxide (CO) potentiometer Low voltage
66 Carbon Monoxide (CO) potentiometer High voltage
67 Throttle valve switch - idle position switch Low voltage - switch not opening
68 Throttle Switch (TS) - idle contact Idle switch not opening
69 Air Temperature Sensor (ATS) Low voltage
71 Air Temperature Sensor (ATS) High voltage
72 Throttle Switch (TS) - full load contact High voltage - Full load switch not running
73 Air Flow Sensor (AFS) Low voltage
74 Air Flow Sensor (AFS) High voltage
75 Transmission switch - torque control Low voltage
76 Automatic Transmission (AT) torque control Engaged long, ignition retard long
79 Traction control unit Incorrect ignition/injector cut-off
81 Injector valve 1 Low voltage
82 Injector valve 2 Low voltage
83 Injector valve 3 Low voltage
84 Injector valve 4 Low voltage
85 Injector valve 5 Low voltage
86 Injector valve 6 Low voltage
87 Air Conditioning (AC) cut off relay Low voltage
88 Air Conditioning (AC) cut off relay High voltage
89 Oxygen sensor heater Low voltage
91 Oxygen sensor heater High voltage
92 Camshaft sensor failure (XEV systems) Faulty
93 Hall Effect Switch (HES) Low voltage
94 Hall Effect Switch (HES) High voltage
95 Hot start valve Low voltage
96 Hot start valve High voltage
97 Traction control unit - ignition/injection cut off Incorrect signal - high voltage
98 Oxygen sensor Open circuit, wiring break
99 Code unknown n/a
113 Turbo boost control Boost presure high, out of range
114 Idle boost valve Above upper limit
115 Full boost pressure Below lower limit
116 Boost pressure Above upper limit
117 Wastegate valve Low voltage
118 Wastegate valve High voltage
121 Oxygen sensor 2 Lean exhaust, weak mixture
122 Oxygen sensor 2 Rich mixture/exhaust
123 Inlet manifold valve 1 Blocked
124 Inlet manifold valve 2 Blocked
132 Exhaust Gas Re-circulation (EGR) valve Incorrect signal
133 Exhaust Gas Re-circulation (EGR) valve 2 High voltage
134 Exhaust Gas Re-circulation (EGR) valve 2 Low voltage
135 'Check engine' lamp (fault code lamp) Low voltage
136 Engine Control Unit (ECU) n/a
137 Engine Control Unit (ECU) box High temperature
141 Secondary air pump Not enough air
142 Secondary air pump Air without pump
143 Immobiliser function in ECU No or incorrect signal
144 No immobiliser signal recived Faulty unit or break in wiring
145 Incorrect immobiliser signal received Faulty unit or break in wiring

Za ABS:
Anti-Lock Braking System ECU

16 Left-front solenoid
17 Right-front solenoid
18 Rear solenoids
19 Solenoids relay circuits
25 Faulty sensor toothed ring
35 Pump relay circuits (hydraulic modulator)
37 Stop lamp switch (brake pedal switch)
39/44 Left front RPM sensor (air gap between sensor and toothed ring, & sensor operation)
41/45 Left front RPM sensor (resistance & connections)
42/46 Right front RPM sensor (air gap between sensor and toothed ring, & sensor operation)
43/47 Right front RPM sensor (resistance & connections)
48 System voltage wrong (alternator or battery)
55 Faulty ECU

E sada, ja nebi greske ispisivao kao bojeve, vec ovaj tekst, sto znaci da bi to opet morao da snimim u neki eprom svu ovu zezanciju pa po potrebi da pozivam
[ bogdan.kecman @ 16.12.2010. 14:29 ] @
da. morao bi da nekim tranzistorom bacas B/K na masu .. posto su oni verovatno na 12V

da, morao bi u eeprom da spucas txt pa da ga vadis ... pretpostavljam da je slanje tog koda preko G, to ce ti biti najveci problem, da vidis u kom formatu to dolazi - verovatno je neki 9600 8n1 ali 12V/GND umesto +-12 mada .. ko zna ... zakaci neki scope pa pogledaj sta se desava ne bi trebalo da je prekomplikovano, ali kao sto rekoh, sigurno nije laganica ... moraces bar neki level shifter da pravis ... dodatno nemam pojma el ti njemu posaljes kod a on tebi odgovor ili ti spojis a on krene da pljuje kodove za ono sto ne valja?
[ conver @ 16.12.2010. 14:55 ] @
Ne,ovo je univerzalan dzek (za opel automobile), ugradjuje se u automobile sa full dijagnostikom takodje i tu su svi pinovi od A do F povezani na ECU.
Posto ja nemam 4x4 ili automatic transmition i ostalo, moji pinovi ECUa su povezani samo sa pinovima B i K na dzeku,jer ECU za dijagnostiku ima samo ta dva pina kao izlazi. (neki drugi ECU na boljem automobilu bi imao vise izlaza i svaki od A do F pinova na dzeku bi bio zauzet) valjda sam bio jasan.

G pin na dzeku, meni nicemu ne sluzi jer nije vezan za ECU zato sto on NEMA mogucnost dvosmerne razmene podataka (Bi directional data line),dakle da ucitavas novii program u ECU, kao sto rade ovi za TUNING automobila. Ovo je primitivan racunarcic, standa alone, koji sa senzora na motoru prikuplja i obradjuje podatke i salje odgovarajuci output kakav je ,recimo, odgovarajuca duzina el. impulsa na injektor (ono sto smo mi merili) ili na osnovu izmerene voltaze sa lambda sonde pravi odgovarajucu smesu vazduha i goriva itd. Dakle ono sto je ucitano u njega nema mogucnost izmene kao ni ideju da komunicira sa nekim periferijskim uredjajem preko tog bi direkcionalnog porta,jer on postoji na dzeku ali NE na ECU! :) kod novih automobila taj bi direct. postoji na dzeku ali i na ECU :)

Sto se citanja gresaka tice,cim se kratko spoji recimo A + B , krece treptanje check engine lampice za motor, koja se nalazi na instrument tabli automobila, tako da mozemo sa nje da uzimamo impulse!

Oznaka za pocetak dijagnostike je 3 x 12 ali s tim sto se recimo broj 12 prepoznaje kao jedan treptaj lampice, pauza pa dva treptaja i tako 3 puta za pocetak. Zatim ide error code, koji ako je recimo 31, ide takodje 3 puta, i to kao tri treptaja, pauza pa jedan treptaj. I na kraju opet onih 3 x 12 za oznaku kraja dijagnostike
U koliko postoji vise error code-va, npr. 31 i 83 , lampica bi isla ovako

1-2,1-2,1-2 ~ pocetak
3-1,3-1,3-1 ~ greska 31
8-3,8-3,8-3 ~ greska 83
1-2,1-2,1-2 ~ kraj
[ bogdan.kecman @ 16.12.2010. 15:01 ] @
Bi directional data line - znaci da je dvosmerna komunikacija!!!

to sa citanjem te lampice ... jaoooooooooj bre .. jos jedan Bx pa timer pa duzina pa ....
[ conver @ 16.12.2010. 15:07 ] @
Da, sluzi za neku komunikaciju sa dijagnostickim interfejsom, tako pise u servisnom uputstvu.

Lampica je cudo... :)
Isto tako ide i za ABS, samo sto tada ne svetli lampica "check engine" nego lampica "ABS" koja je isto na tabli!
Znaci za ovo treba ostaviti jos 2 B pin-a na mcu...
[ bogdan.kecman @ 16.12.2010. 15:15 ] @
ja bi iskreno zakacio scope na G i izmerio sta se desi kada spojis te zicke posto ako su iole normalni mora da salju to i u nekom legalnom formatu ... nema saje da samo imaju taj sa blinkanjem sto bi serviseri boli laptop u masinu :D .. garant moze sa G da se izvadi nesto ... posto to brojanje lampica to je smor na kub.... evo ja se drdnam da brojim neke stepove sa acceleratometra (ili kako se to vec zove) i vristim od smeha kakve rezultate dobijam :D .. to jeste lakse ali .. daj ako moz se ukrade seriski signal .. bice laganeze
[ conver @ 16.12.2010. 15:24 ] @
hmmm... paj sad ovamo :)

http://www.opelteamserbia.com/...;t=6345&hilit=dijagnostika

Tu ces skontati o cemu pricam!
[ bogdan.kecman @ 16.12.2010. 19:10 ] @
ma skontah ja odma to sa lampicama samo to je smor na kvadrat da detektujes ... tu mora da ide varijanta da pamtis niz pa ga normalilzujes, pa onda vidis koji je razmak "veci" a koji "manji" pa onda brojis pa ... smoooooooooor bre .. a tamo ne spominju G .. valjda zato sto retko ko tamo ima scope i nije im problem da broje treperenje lampica .. ako imas scope zabodi i zdrakni sta kaze na tom bidirekcionom kada prespojis to ... mozda nece rec nista al ko zna, mozda ce da propeva na 9600 ili 19200 :)
[ branko_g @ 16.12.2010. 21:11 ] @
@bogdan.kecman
Bogdane cenim tvojuspremnost da pomogneš početnicima, ali se ovo graniči sa mazohizmom.
Pusti dečka nek sam skuplja svoja iskustva, nemoj da mu serviraš sve na srebrnom tanjiru, pomisliće da to tako treba.

@conver
Ja isto cenim tvoje interesovanje za ovu oblast, ali s druge strane ne vidim tvoju spremnost da se makar malo napregneš i do
nekih stvari sam dođeš. Samo ti rastu apetiti, tražiš od bogdana da ti reši ovo ili ono, a sama tvoja krivulja učenja uopšte ne raste.
Sem na početku prikazanog, vrlo nemušto pisanog koda(početnik si, to nije mana), vidi se da ti pri njegovom pisanju nisi imao nikakav koncept,
nego si onako, iz glave, pokušao da praviš kule u vazduhu. Između onoga što si ti mislio da treba da se dešava, i onoga što se stvarno dešavalo,
leže svetovi.
Još tada si se precenio i pokušao prilično složen projekat, sa prilično slabim poznavanjem jezika C,još slabijim poznavanjem hardvera,i praktično nikakvom strategijom pristupa projektu.
I kad Bogdan najzad uvidi da "tvojim zahtevima" nema kraja, i realno ti ukaže da on ne može da ti ispunjava svaku "programersku želju", ostaćeš frustriran i onamo gde si bio i pre -> na početku.

Zato spusti loptu na zemju, i probaj da sam realizuješ neke osnovne stvari, kao na primer inicijalizacija tajmera u različitim modovima(timer, counter, PWM, capture/compare) i probaj da shvatiš
šta se dešava. Bogdan će ti sigurno pomoći, verovatno i ja, ali ne ovako: čovek ti dao prst, a ti bi ruku.

Pozdrav obojici.
[ bogdan.kecman @ 16.12.2010. 21:33 ] @
ma kakav mazohizam, 10min plafon da se nacuka taj kod .. u pauzi izmedju dva indijca :D .. i jos par minuta posle da se switchne ovaj i onaj i to je to .. e sad, kapiram da je taj kod sada lep primer za svakoga ko hoce da radi sa bilo kakvim spoljnim interaptima, ima kako da napravi vremensku bazu, ima kako da izbroji externe interapte, ima kako da izmeri duzinu impulsa .. sada na ovo moze da nadgradjuje .. valjda onaj signal sa tocka za odomer moze da napravi sam .. cekam bas da vidim kako ce to da ispadne :) ..
[ conver @ 16.12.2010. 21:46 ] @
Ovako, ima pomalo istine u ovome, ali daleko od toga da sam imao ideju da bilo koga ovde za nesto iskoristim!
Sto se tice precenjivanja sebe... ne bih to komentarisao, iz prostog razloga jer sam se ovim krenuo baviti bas iz razloga da bi ovo sebi napravio. Medjutim nikako se ne bi slozio da se nisam potrudio nimalo. Nabavio sam dosta literature, citao, google-ao, koristio datasheet-ove i mogu slobodno reci da sam za ovih par meseci dosta napredovao. Nisam duduk, ali morate se sloziti da covek kroz primere najlakse nauci! Konkretno za ove tajmere sam se toliko ubio da shvatim neke stvari a covek mi je kroz primer i par recenica objasnjenja sasvim otvorio oci!
[ bogdan.kecman @ 16.12.2010. 22:02 ] @
samo ti pitaj dalje sta nije jasno ... kapiram da ces sad da probas da dodas onaj odometar sa tocka .. trebalo bi da do sada ima dovoljno informacija za isti
[ plc @ 18.12.2010. 00:17 ] @
Mozda malko kasnim ali .. zar to nije CANBUS komunikacija u tvom automobilu???
[ bogdan.kecman @ 18.12.2010. 14:49 ] @
ako se ja dobro secam, can je izmedju ecu i senzora, ne od ecu-a prema korisniku
[ plc @ 18.12.2010. 23:27 ] @
Da i meni se cini,nego mislio sam ako je canbus cemu tolika muka kad ima sve gotovo.
Mikroelektronika ima biblioteke vec gotove samo treba da izgugla adrese canbus-a koje hoce da cita i te vrednosti predsatvi na neki LCD.
[ bogdan.kecman @ 19.12.2010. 06:56 ] @
da to je generalno ok fora, samo, kada se okacis tamo na can bus ako tvoj mcu "zadangira" i smori ceo bus - a ti ides 180 na autoputu ...
[ plc @ 19.12.2010. 16:33 ] @
Da ima istine :( mada je tamo sve lepo organizovano i mozda me nisi razumeo.
Koliko se meni cini a ispravi me ako greslim na tx+,tx-,rx+,rx- nonstop trce codovi koji nose razlicite informacije speed ,fuel bla bla.....
Ako slusa odredjene adrese valjda nece imati problema???
[ bogdan.kecman @ 19.12.2010. 21:54 ] @
razumeo sam, ali CAN se nalazi "sa druge strane" ecu-a (ako je uopste can, mozda je i nesto drugo) .. to bi zahtevalo da se okaci iza na ecu i da bude 100% siguran da nece nista da zezne, obzirom da je covek vec vise puta rekao da nije strucan za to, zamisli da mu se neki ems posalje piconju da izvrsava neki random kod i on krene da salje gluposti i zadangira can bus ? - a pritom ide 180
[ tisovac @ 14.01.2011. 08:03 ] @
A merenje brzine ?Sve ovo tesko da ima smisla bez merenja brzine.
[ conver @ 15.01.2011. 09:06 ] @
Zasto mislis da nema smisla bez merenja brzine ?
Inace, pomenuo sam u prethodnim postovima neki senzor na tocku cijim brojanjem impulsa mogu dobiti duzinu predjenog puta (samo jos da smislim kako da memorisem taj predjeni put), ali ako uzmem i izmerim vreme izmedju ta dva impulsa i gurnem u jedan mali obrazac iz fizike vezan za obodnu brzinu, lako cu dobiti brzinu kretanja vozila!
[ tisovac @ 19.01.2011. 11:53 ] @
Mislim da ako ima sve to ,trebao bi imati i brzinu.