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