pic16F877A + senzor smt160
Napsal: 01 úno 2011, 14:03
Zdravim, jelikoz nikdo nevedel jak na to pouzit ten capture, tak sem se rozhodl zmerit stridu timerem v preruseni. Nastala vsak chyba a meri mi to radove blbe a chybu nevidim. Pri pokojove teplote mi displej ukazuje teplotu kolem 50°C. Poradte nekdo prosim..uz sem probdel druhy vecer:))
Kód: Vybrat vše
float one=0;
float zero=0;
float duty=0;
float teplota=0;
char *strtemp[6];
int i;
void interrupt() {
T2CON.TMR2ON = 1;
for (i=0; i<10; i++) {
while (portd.f0==1) {}; // začátek měření se začátkem pulsu
while (portd.f0==0) {};
TMR2=0;
while (portd.f0==1) {}; //konec nuly
zero=TMR2; //ulozi delku nuly
TMR2=0;
while (portd.f0==0) {}; //mereni jednicky
one=TMR2; //ulozi jednicku
duty+=(zero/(one+zero));
}
T2CON.TMR2ON = 0;
TMR2=0;
duty=duty/10; // prumer z deseti mereni
teplota=(duty-0.32)/0.0047;
PIR1.TMR1IF = 0; // vymaze priznak preruseni
}//interrupt
void nastaveni()
{
PORTA = 0;
PORTB = 0;
CMCON = 0x07;
TRISA = 0;
TRISB = 0;
TRISD = 1;
// OPTION_REG = 0b0000111;
PIE1 = 0b00000000;
// TMR0 = 235;
PORTB.F0 = 1;
PORTD = 0;
T1Con.TMR1CS = 0; // Timer1 Clock Source Select bit, 0 = Internal clock (FOSC/4)
T1Con.NOT_T1SYNC = 1; // Do not synchronize external clock input
T1Con.T1CKPS1 = 1; // 1:8 prescaler , TMR 1 overflow every 1.9 Hz (= 500 ms timebase)
T1Con.T1CKPS0 = 1; //
T1Con.T1OSCEN = 0; // LP Oscillator Enable Control bit
T1Con.TMR1ON = 1; // Timer 1 enabled
PIE1.TMR1IE = 1; // TMR1 Overflow Interrupt Enable bit
TMR1H = 0;
TMR1L = 0;
PIR1.TMR1IF = 0; // clear timer 1 interrupt flag
T2CON = 0b00000001;
Lcd_Init(&PORTB);
}
void main()
{
nastaveni();
Lcd_Cmd(LCD_CLEAR); // send command to LCD "clear display"
LCD_Cmd(LCD_CURSOR_OFF); // send command cursor off
LCD_Out(1,1,"Inicializace...");
delay_ms(1000);
INTCON = 0b11000000;
// PWM1_Init(5000);
// PWM1_Start();
Lcd_Cmd(LCD_CLEAR);
LCD_Out(1,1,"Temp:");
LCD_Chr(1,15,223);
LCD_Out(1,16,"C");
// PWM1_Change_Duty(50);
while(1)
{
FloattoStr(teplota,strtemp);
LCD_Cmd(LCD_CURSOR_OFF);
LCD_Chr(1,8,47);
LCD_Chr(1,9,strtemp[0]);
LCD_Chr(1,10,strtemp[1]);
LCD_Chr(1,11,strtemp[2]);
LCD_Chr(1,12,strtemp[3]);
LCD_Chr(1,13,strtemp[4]);
LCD_Chr(1,14,strtemp[5]);
}//end while(1)
}// END Main