Mäta en puls med ccp och timer

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Kalf
Inlägg: 249
Blev medlem: 5 november 2005, 09:59:45

Inlägg av Kalf »

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
Användarvisningsbild
bengt-re
EF Sponsor
Inlägg: 4829
Blev medlem: 4 april 2005, 16:18:59
Skype: bengt-re
Ort: Söder om söder
Kontakt:

Inlägg av bengt-re »

uS=Mohm eller ?
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Processorn går i 4 * 10^6 Hz, inte 4 Hz. EDIT: Och prescalern är 8, inte 1/8.
(Du behöver inte använda prescaler med så korta pulser.)
Användarvisningsbild
Kalf
Inlägg: 249
Blev medlem: 5 november 2005, 09:59:45

Inlägg av 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:

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;
     }
Användarvisningsbild
bengt-re
EF Sponsor
Inlägg: 4829
Blev medlem: 4 april 2005, 16:18:59
Skype: bengt-re
Ort: Söder om söder
Kontakt:

Inlägg av bengt-re »

Konduktans mäts i enheten siemens, 1 S = 1 Ω-1.

sekund betecknas med lilla s....

uS --> mOhm....
Användarvisningsbild
Kalf
Inlägg: 249
Blev medlem: 5 november 2005, 09:59:45

Inlägg av Kalf »

aha, det visste inte jag, men det stog med stort S i databladet för min sensor.

//Kalf
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

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?
Senast redigerad av bearing 30 november 2006, 23:24:29, redigerad totalt 1 gång.
Användarvisningsbild
bengt-re
EF Sponsor
Inlägg: 4829
Blev medlem: 4 april 2005, 16:18:59
Skype: bengt-re
Ort: Söder om söder
Kontakt:

Inlägg av bengt-re »

*ler* Bara lite irriterande när man använder SI-enhter fel. Fast är nog mest som fd. lärare man stör sig ;)

Jo jag har hittat lysdioder som skall tåla MA också, men det stämde inte - jag kunde bara prestera några tiondels kA och inte ens det tålde de.... Skumt.....
Användarvisningsbild
Kalf
Inlägg: 249
Blev medlem: 5 november 2005, 09:59:45

Inlägg av Kalf »

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
Användarvisningsbild
bengt-re
EF Sponsor
Inlägg: 4829
Blev medlem: 4 april 2005, 16:18:59
Skype: bengt-re
Ort: Söder om söder
Kontakt:

Inlägg av bengt-re »

Det gör inget - jag slutar att störa tråden.

Märkligt sätt att skriva till TRISregisterna... oftast lämpligast att binärnotera när man skriver till TRISrigerna för bättre läsbarhet på koden..
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Jag har i och för sig inte skrivit mycket kod i C, men det här förstår jag inte alls :

> TRISB = 1; //PORTB.3 blir ingång

Hur fungerar det ??
Hur ser assembler-koden ut som genereras av detta C-kommando ?
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

I min kompilator (CC5X) skulle det bli:
BANKSEL TRISB
MOVLW 1
MOVWF TRISB

Så i den skulle inte kommentaren stämma överens med koden. Antagligen inte i andra kompilatorer heller.
Användarvisningsbild
Kalf
Inlägg: 249
Blev medlem: 5 november 2005, 09:59:45

Inlägg av Kalf »

jag har klippt lite, tyvärr och efter det har nog kommentaren hamnat fel bara.

//Kalf
Användarvisningsbild
Kalf
Inlägg: 249
Blev medlem: 5 november 2005, 09:59:45

Inlägg av Kalf »

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?
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.
Skriv svar