Mäta en puls med ccp och timer
jag är inte riktigt övertygad om jag förstog ditt inlägg helt, sodjan. Förklarade du bara vad bearing tidigade skrev eller skall Jag ändra på något?
Jag fattade iaf det som, precis som bearing säger nu, att jag kan köra fler saker samtidigt. Men nu är det så att jag inte vill det. Det jag skall göra är att ifall allting stämmer så skall en Led tändas. Annars inget annat, ingen LCD eller något.
Jag sitter här och räknar, men får bara konstiga, enligt mig, svar.
formeln: Tid [ms] = period * 1000 * 4 * prescaler / Klockfrekvens
Tid: 18.5mS
Prescaler 1:8
Klockfrekvens: 4mhtz
18.5 = period * 1000 * 4 * 0.125(1 åttondel) / 4
18.5 = period * 125
18.5/125 = period
0.148 = period
Vad menas med detta, jag trodde jag skulle få ett högre värde. 18.5mS är nämligen den längsta pulsen som jag kommer att mäta och den kortaste är 115uS
//Kalf
Jag fattade iaf det som, precis som bearing säger nu, att jag kan köra fler saker samtidigt. Men nu är det så att jag inte vill det. Det jag skall göra är att ifall allting stämmer så skall en Led tändas. Annars inget annat, ingen LCD eller något.
Jag sitter här och räknar, men får bara konstiga, enligt mig, svar.
formeln: Tid [ms] = period * 1000 * 4 * prescaler / Klockfrekvens
Tid: 18.5mS
Prescaler 1:8
Klockfrekvens: 4mhtz
18.5 = period * 1000 * 4 * 0.125(1 åttondel) / 4
18.5 = period * 125
18.5/125 = period
0.148 = period
Vad menas med detta, jag trodde jag skulle få ett högre värde. 18.5mS är nämligen den längsta pulsen som jag kommer att mäta och den kortaste är 115uS
//Kalf
Tack, då blev det ett mer realistiskt tal.
bengt-re: uS = mikrosekunder = 1/1000 000 sekund om jag inte misstar mig.
Jag har kodat vidare nu. Men det verkar inte fungera som jag vill. Jag använder en ultraljudsmodul som skickar ut pulsen. för att aktivera den så skickar man in en kort puls på 5uS, detta ligger i funktionen start_pulse() när jag bara kör denna funktionen i en loop så lyser aktivitetslampan på modulen, men när jag kör hela programmet, så funkar det inte alls. Vad kan det vara? Är det mina while(PIR1.CCP1IF == 0)
{
void;
}
Eller vad kan det vara?
Här är iaf hela min kod:
bengt-re: uS = mikrosekunder = 1/1000 000 sekund om jag inte misstar mig.
Jag har kodat vidare nu. Men det verkar inte fungera som jag vill. Jag använder en ultraljudsmodul som skickar ut pulsen. för att aktivera den så skickar man in en kort puls på 5uS, detta ligger i funktionen start_pulse() när jag bara kör denna funktionen i en loop så lyser aktivitetslampan på modulen, men när jag kör hela programmet, så funkar det inte alls. Vad kan det vara? Är det mina while(PIR1.CCP1IF == 0)
{
void;
}
Eller vad kan det vara?
Här är iaf hela min kod:
Kod: Markera allt
/****************************************
* *
* Safety Electronics UF *
* *
* Programerad av: Karl-fredrik *
* Datum: 2006-11-30 *
* Version: V.0.3 *
* *
****************************************/
void start_pulse(void);
void recive(void);
void count(void);
unsigned int CCP_Value_1_L;
unsigned int CCP_Value_1_H;
unsigned int CCP_Value_2_L;
unsigned int CCP_Value_2_H;
unsigned int CCP_Result_L;
unsigned int CCP_Result_H;
unsigned int CCP_Result;
void main()
{
TRISA = 0;
while(1)
{
TRISB = 0;
start_pulse();
TRISB = 1; //PORTB.3 blir ingång
recive();
if(CCP_Result <= 0x0908)
{
PORTA = 0b00000100;
}
else
{
PORTA=0x00;
}
}
}
void start_pulse(void)
{
PORTB = 0x00;
PORTB = 0b00001000; //1 skickar en puls till ping)))...
delay_us(5); //...Som varar i 5us
PORTB = 0x00; //0'ställer igen
}
void recive(void)
{
T1CON = 0b00110001; //startar timer 1 med prescaler 1:8
CCP1CON = 0b00000101; //Sätter igång CCP'n, positiv flank
while(PIR1.CCP1IF == 0) //Väntar på flank
{
void;
}
PIR1.CCP1IF = 0;
CCP_Value_1_L = CCPR1L; //Stoppar in värdet på CCPR1L i en varabel...
CCP_Value_1_H = CCPR1H; //Samma med CCPR1H
CCPR1L = 0x00; //Nollställer dessa två
CCPR1H = 0x00;
CCP1CON = 0b00000100; //Ställer om för negativa flanker
while(PIR1.CCP1IF == 0) //Väntar igen
{
void;
}
PIR1.CCP1IF = 0; //Nollställer interuppt registret
CCP_Value_2_L = CCPR1L; //Stoppar in i varablar
CCP_Value_2_H = CCPR1H;
T1CON = 0x00; //Stoppar timern
count();
}
void count(void)
{
CCP_Result_L = CCP_Value_2_L - CCP_Value_1_L;
CCP_Result_H = CCP_Value_2_H - CCP_Value_1_H;
CCP_Result = CCP_Result_H << 8 + CCP_Result_L;
}
Jag ser att du bytt till frilöpande nu, varför det?
Och varför inte låta CCP-enheten nollställa?
Subtraktionen du gör är inte korrekt. Du måste ta hänsun till carry. Detta gör kompilatorn automatiskt om du först lägger CCPR1 i en 16-bitsvariebel och sedan kör subtraktionen.
TRISB = 1 sätter väl bara RB0 till ingång?
EDIT: Vad tycker IR-modulens utgångssteg om att "kämpa" mot picens utgång?
Och varför inte låta CCP-enheten nollställa?
Subtraktionen du gör är inte korrekt. Du måste ta hänsun till carry. Detta gör kompilatorn automatiskt om du först lägger CCPR1 i en 16-bitsvariebel och sedan kör subtraktionen.
TRISB = 1 sätter väl bara RB0 till ingång?
EDIT: Vad tycker IR-modulens utgångssteg om att "kämpa" mot picens utgång?
Senast redigerad av bearing 30 november 2006, 23:24:29, redigerad totalt 1 gång.
Frilöpande?
Jag hade nog glömt att nolställa den.
Carry?
Hur skriver man en 16bitars varaibel då?
Måste inte PORTB vara ingång ifall man vill läsa ifrån den?
Usäkat ifall det kanske är dumma frågor, men det är väll därför detta forumet finns eller?
bengt-re: Mitt misstag, eller att jag inte visste det, jag får väll skylla på att jag bara är elev:-p
//Kalf
Jag hade nog glömt att nolställa den.
Carry?
Hur skriver man en 16bitars varaibel då?
Måste inte PORTB vara ingång ifall man vill läsa ifrån den?
Usäkat ifall det kanske är dumma frågor, men det är väll därför detta forumet finns eller?
bengt-re: Mitt misstag, eller att jag inte visste det, jag får väll skylla på att jag bara är elev:-p
//Kalf
Frilöpande - man låter den gå runt-runt och man påverkar den inte, menar jag.
Jag får be om ursäkt, kollade databladet och det fanns inte möjligheten att ställa in så att timern nollställs vid capture. Måste ha blandat ihop. Då är ditt/vfr:s sätt rätt, men du behöver inte nollställa CCPR1.
Carry har/kommer du läsa om på digitaltekniken. När ett register slår runt sätts carryflaggan så att man kan addera/subtrahera biten i nästa register.
Antagligen skriver man: unsigned int variabelnamn. Kolla manualen.
Sätt ingångarna till 1 och utgångarna till 0 i trisregistret vid initieringen. Du verkar inte behöva växla in/utgång under programmets gång.
Jo, man kan fråga. Dock tror jag att man utvecklas på många sätt bättre om man själv gör sitt yttersta för att själv finna lösningen innan man frågar/löser det.
Jag får be om ursäkt, kollade databladet och det fanns inte möjligheten att ställa in så att timern nollställs vid capture. Måste ha blandat ihop. Då är ditt/vfr:s sätt rätt, men du behöver inte nollställa CCPR1.
Carry har/kommer du läsa om på digitaltekniken. När ett register slår runt sätts carryflaggan så att man kan addera/subtrahera biten i nästa register.
Antagligen skriver man: unsigned int variabelnamn. Kolla manualen.
Sätt ingångarna till 1 och utgångarna till 0 i trisregistret vid initieringen. Du verkar inte behöva växla in/utgång under programmets gång.
Jo, man kan fråga. Dock tror jag att man utvecklas på många sätt bättre om man själv gör sitt yttersta för att själv finna lösningen innan man frågar/löser det.
Såg inte ditt tilläg färens nu. Det är en ultraljuds modul. Det finns bara en signalpine på den. Så det är så man skall göra.bearing skrev:Jag ser att du bytt till frilöpande nu, varför det?
Och varför inte låta CCP-enheten nollställa?
Subtraktionen du gör är inte korrekt. Du måste ta hänsun till carry. Detta gör kompilatorn automatiskt om du först lägger CCPR1 i en 16-bitsvariebel och sedan kör subtraktionen.
TRISB = 1 sätter väl bara RB0 till ingång?
EDIT: Vad tycker IR-modulens utgångssteg om att "kämpa" mot picens utgång?