pic16F877A + senzor smt160

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
bluepatch
Příspěvky: 25
Registrován: 21 bře 2010, 00:00
Bydliště: Ledeč nad Sázavou/Brno
Kontaktovat uživatele:

pic16F877A + senzor smt160

#1 Příspěvek od bluepatch »

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
Uživatelský avatar
procesor
Příspěvky: 5286
Registrován: 02 říj 2009, 00:00
Bydliště: PO

#2 Příspěvek od procesor »

Darmo sa snažíš, CAPTURE funguje iba s TIMER1. To som ti už raz napísal :wink:
Uživatelský avatar
bluepatch
Příspěvky: 25
Registrován: 21 bře 2010, 00:00
Bydliště: Ledeč nad Sázavou/Brno
Kontaktovat uživatele:

re

#3 Příspěvek od bluepatch »

no dobre, tak kdyz to ted merim timerem bez capture..jen pouze dobu trvani log 1 a log 0, tak proc to zas nefunguje?
Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 00:00

#4 Příspěvek od AB1 »

Kód: Vybrat vše

duty+=(zero/(one+zero)); 

Myslím že má být

Kód: Vybrat vše

duty+=(one/(one+zero)); 
Uživatelský avatar
bluepatch
Příspěvky: 25
Registrován: 21 bře 2010, 00:00
Bydliště: Ledeč nad Sázavou/Brno
Kontaktovat uživatele:

re

#5 Příspěvek od bluepatch »

to jsem zkousel..meri to skoro stejne, akorat kdyz ho zahreju, tak teplota pada, takze to mam asi dobre
Uživatelský avatar
procesor
Příspěvky: 5286
Registrován: 02 říj 2009, 00:00
Bydliště: PO

#6 Příspěvek od procesor »

TMR2 tam je načo? akosi mi to uniká.
Koľko bitový prevod chceš dosiahnuť?
Akú fr. má PIC?
S CAPTURE je to najjednoduchsie.
Uživatelský avatar
bluepatch
Příspěvky: 25
Registrován: 21 bře 2010, 00:00
Bydliště: Ledeč nad Sázavou/Brno
Kontaktovat uživatele:

re

#7 Příspěvek od bluepatch »

tmr2 v tomto pripade meri sirku nuly a jednicky a capture se ted vubec nepouziva..jede mi to na 8mhz. melo by to byt vlastne uplne jedno..protoze beru pomer nuly ku celymu pulzu a ten pomer bude vzdy stejny..
Uživatelský avatar
procesor
Příspěvky: 5286
Registrován: 02 říj 2009, 00:00
Bydliště: PO

#8 Příspěvek od procesor »

Však to vidím. Len prichádzaš o presnosť. Takýto prevodník bude horší ako 7bitov, pritom s CAPTURE sa to dá vpohode urobiť na 10 a viac. A merania sú nezávislé na sw, a najmä použitie C-čka v tomto prípade je úplne nafigu.
Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 00:00

#9 Příspěvek od AB1 »

Pri pokojove teplote mi displej ukazuje teplotu kolem 50°C.

protoze beru pomer nuly ku celymu pulzu a ten pomer bude vzdy stejny..

Jak jsem psal, duty cycle se počítá jako poměr kladného pulsu k periodě.. Potom ti vyjde místo 50 stupňů asi 27.
Uživatelský avatar
procesor
Příspěvky: 5286
Registrován: 02 říj 2009, 00:00
Bydliště: PO

#10 Příspěvek od procesor »

http://en.wikipedia.org/wiki/Duty_cycle

Presnejší výsledok by sa získal merať najskôr "1"..odloziť "one".
Potom merať periodu.
Nenulovať!! TMR2 a odmerať spolu "onepluszero". Tu by mohol nastať prípad že v TMR2 je menšie číslo ako "one"...potom by sa k "onepluszero" cislo 256.
Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 00:00

#11 Příspěvek od AB1 »

S PIC nedělám, ale:

Nepřetéká ti timer2?
Nevidím u něho žádný předdělič.
Měl by umět počítat do cca 800 us.
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#12 Příspěvek od Andrea »

AB1 píše:
Pri pokojove teplote mi displej ukazuje teplotu kolem 50°C.

protoze beru pomer nuly ku celymu pulzu a ten pomer bude vzdy stejny..

Jak jsem psal, duty cycle se počítá jako poměr kladného pulsu k periodě.. Potom ti vyjde místo 50 stupňů asi 27.

Když on v tom programu nule říká one a jedničce říká zero. :roll:
Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 00:00

#13 Příspěvek od AB1 »

Opravdu, teprve teď to vidím.
Uživatelský avatar
procesor
Příspěvky: 5286
Registrován: 02 říj 2009, 00:00
Bydliště: PO

#14 Příspěvek od procesor »

Preddeličku má nastavenú s krokom 2us (T2CON = 0b00000001; )- čo by mohlo stačiť ak by kalkuloval s pretečením TMR2. Aj v tom najpomalšom obvode stačí 1000us na periódu.
Uživatelský avatar
bluepatch
Příspěvky: 25
Registrován: 21 bře 2010, 00:00
Bydliště: Ledeč nad Sázavou/Brno
Kontaktovat uživatele:

vyreseno

#15 Příspěvek od bluepatch »

Diky vsem za radu..nakonec jsem prisel na to co jsem delal spatne a rozchodil jsem ten capture.. je to presnejsi, tak na tenhle zpusob kaslu..
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“