Mäta en puls med ccp och timer
1. Jag hade citerat ditt inlägg och så råkade det ligga kvar i slutet.
2. Ah, tänkte fel.
3. I min kompilator för picar är int 8 bitar, i din 16 bitar tror jag, i datorer 32 bitar tror jag. Med sådana variationer verkar det bäst att du kollar själv. Det borde gå fort att googla fram manualen för din kompilator. Kanske t.o.m finns hjälp om du trycker F1,
2. Ah, tänkte fel.
3. I min kompilator för picar är int 8 bitar, i din 16 bitar tror jag, i datorer 32 bitar tror jag. Med sådana variationer verkar det bäst att du kollar själv. Det borde gå fort att googla fram manualen för din kompilator. Kanske t.o.m finns hjälp om du trycker F1,
Jag har arbetet lite med koden. Jag tillsammans med ett par lärare på skolan har försökt, nu funkar det nästan. Det verkar vara nära ett slut. Så som den beter sig för tillfället så lyser dioden om man håller handen på precis rätt avstånd. Men inte annars. Här är koden som den ser ut för tillfället:
Men den roliga biten är att ifall jag byter ut raden:
Till:
Så när det inte ligger något framför sensorn så blinkar LED'en väldigt snabbt, men ändå så långsamt så man kan uppfatta det. Men när det ligger något innom det område som det handlar om så lyser LED'en.
Om ni har glömt, eller inte läst tidigare i troden så skall LED'en lysa när det ligger ett föremål innom ett visst område. Om det är tomt så skall den vara släckt.
Vad klan felet vara?
//Kalf
Kod: Markera allt
/****************************************
* *
* Safety Electronics UF *
* *
* Programerad av: Karl-fredrik *
* Datum: 2006-11-30 *
* Version: V.0.3 *
* *
****************************************/
//Prototyper
void start_pulse(void);
void recive(void);
void count(void);
//Variablar
unsigned int CCP_Value_1;
unsigned int CCP_Value_2;
unsigned int CCP_Result;
void main()
{
TRISA = 0b00000000; //Porta utgång
while(1) //Evighets loop
{
TRISB = 0b00000000; //PortB utgång
start_pulse();
TRISB = 0b00001000; //Ställa om PORTB.3 till ingång
recive();
if((CCP_Result < 0x500)) //gämför värdet på CCP_result
{
PORTA = 0b00000100; //LED'en tänds
}
else
{
PORTA=0x00; //Led'en är släckt
}
}
}
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 = CCPR1L << 8 | CCPR1H;
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 = CCPR1L << 8 | CCPR1H;
T1CON = 0x00; //Stoppar timern
count();
}
void count(void)
{
CCP_Result = CCP_Value_2 - CCP_Value_1; //Lägger ihop till en variabel
}
Kod: Markera allt
if(CCP_Result < 0x500) //gämför värdet på CCP_result
Kod: Markera allt
if((CCP_Result < 0x500) || (CCP_Result == 0x500)) //gämför värdet på CCP_result
Om ni har glömt, eller inte läst tidigare i troden så skall LED'en lysa när det ligger ett föremål innom ett visst område. Om det är tomt så skall den vara släckt.
Vad klan felet vara?
//Kalf
Har du inte tillgång till oscilloskop eller liknande i skolan, så du kan kolla om det är signalerna det är fel på eller koden?
Det kan vara en ide' att lägga in en paus mellan varje puls, för att inte få med ev. ekon.
Jag har en avståndsmätare hemma och den sänder bara en puls varannan sekund ungefär.
Det kan vara en ide' att lägga in en paus mellan varje puls, för att inte få med ev. ekon.
Jag har en avståndsmätare hemma och den sänder bara en puls varannan sekund ungefär.
jag har idag testat med oscillioskop och signalen är det inget fel på. Jag trodde först att det inte kom någon puls alls när det inte låg någonting framför sensorn, men det gör det, det blir en puls på ca 20ms.
Visst kan jag lägga in en delay. Det skall jag testa.
Jag lade in CCP1CON = 0x00;
Men då hänger sig koden när det kommer något framför sensorn innom ett område, ganska nära till den, men när man är på "rätt" avstånd så lyser dioden.
//Kalf
Visst kan jag lägga in en delay. Det skall jag testa.
Jag lade in CCP1CON = 0x00;
Men då hänger sig koden när det kommer något framför sensorn innom ett område, ganska nära till den, men när man är på "rätt" avstånd så lyser dioden.
//Kalf
Jag antar att du förstod att denna extra nollning av CCP1CON ska göras vid VARJE ändring av flanken.....
Edit: snyggade till lite.
Kod: Markera allt
/****************************************
* *
* Safety Electronics UF *
* *
* Programerad av: Icecap *
* Datum: 2006-12-08 *
* Version: V.0.4 *
* *
****************************************/
//Prototyper
void start_pulse(void);
void Recieve(void);
typedef unsigned int word;
typedef unsigned char byte;
typedef union
{
word Word;
byte Byte[2];
} T_BOTH;
#define true 1
#define false 0
#define Indicator PORTA.F2 /* Giltigt för MikroC */
#define Pulse_IO PORTB.F3
#define Pulse_Dir TRISB.F3
//Variablar
T_BOTH CCP_Value_1, CCP_Value_2;
word CCP_Result;
void main()
{
PORTA = 0x00; // Known state
PORTB = 0x00; // Known state
TRISA = 0x00; // PORTA utgång
TRISB = 0x00; // PORTB utgång
T1CON = 0b00110001; // Startar timer 1 med prescaler 1:8 och låt den köra!
while(true) // Evighets loop
{
Pulse_Dir = 0; // Som utgång
Pulse_IO = true; // Skickar en puls till ping)))...
delay_us(5); //...Som varar i 5us
Pulse_IO = false; // Puls slut
Pulse_Dir = true; // Ställa om PORTB.3 till ingång
CCP1CON = 0b00000101; // Sätter igång CCP'n, positiv flank
while(PIR1.CCP1IF == 0); // Väntar på flank
CCP_Value_1.Byte[0] = CCPR1L; // Transfer low byte
CCP_Value_1.Byte[1] = CCPR1H; // Transfer high byte
PIR1.CCP1IF = 0; // Acknowledge the change
CCP1CON = 0x00; // To avoid stupidities
CCP1CON = 0b00000100; //Ställer om för negativa flanker
while(PIR1.CCP1IF == 0); // Väntar igen
CCP_Value_2.Byte[0] = CCPR1L; // Transfer low byte
CCP_Value_2.Byte[1] = CCPR1H; // Transfer high byte
PIR1.CCP1IF = 0; // Nollställer interupt flaggan
CCP1CON = 0x00; // Reset the CCP
CCP_Result = CCP_Value_2.Word - CCP_Value_1.Word; //Lägger ihop till en variabel
if(CCP_Result < 0x500) //Jämför värdet på CCP_result
{
Indicator = true; // LED'en tänds
}
else
{
Indicator = false; // LED'en släcks
}
}
}
Senast redigerad av Icecap 8 december 2006, 19:39:29, redigerad totalt 1 gång.
får fixa LED's imon här är länken till databladet för sensorn:
http://www.parallax.com/dl/docs/prod/ac ... G-v1.3.pdf
//Kalf
http://www.parallax.com/dl/docs/prod/ac ... G-v1.3.pdf
//Kalf