Belli bir sürede girilen dijital bilgiyi saymak ve LCD'de göstermek

Başlatan roleci, 10 Haziran 2019, 18:24:43

roleci

Parmaktan nabız ölçer devresi yaptım , çıkışı 0-5V olarak dijital.16F628A kullanarak 3sn gibi bir örnekleme zamanında PIC'in herhangi bir girişine uygulanan bu sinyalin sayılması (F=1-2Hz) , süre sonunda çıkan sonucu 20 ile çarparak dakikada nabız sayısını LCD Ekrana yazdırmak istiyorum.Bunu mikroC'de nasıl yapabiliriz..

MB_77

3sn süresince sayıp dakikadaki kalp atışı için 20 ile çarpacaksın. Bu durumda çözünürlüğü 20 olur. İki pals arasındaki süreyi ölçerek 60snye oranlasan daha iyi olur gibi.

roleci

Alıntı yapılan: MB_77 - 10 Haziran 2019, 20:39:593sn süresince sayıp dakikadaki kalp atışı için 20 ile çarpacaksın. Bu durumda çözünürlüğü 20 olur. İki pals arasındaki süreyi ölçerek 60snye oranlasan daha iyi olur gibi.

Güzel fikir ama beni şimdilik söylediğim de kurtarırdı , 3-5 satır karalayacak arkadaş arıyorum.ASM'de veya bunda basit işleri yapabiliyorum.Kafa fazla basmıyor mikroC'de cümle kurmaya.

roleci

#3
Bir yerde LED Displaylerle yapmışlar mikroC'de.Derlediğimde;
0 1 mikroCPIC1618.exe -MSF -DBG -pP16F628A -DL -O11111114 -fo4 -N"C:\Users\asus\Desktop\Parmaktan 7segment disp deneme embedded lab\MyProject.mcppi" 
0 351 File extension missing: 'MyProject'  
0 0 0 Long HEX format  -GC : Generate COFF file  1139
0 102 Finished (with errors): 21 Jun 2019, 16:28:59 MyProject.mcppi
Hata veriyor.

sbit IR_Tx at RA3_bit;
sbit DD0_Set at RA2_bit;
sbit DD1_Set at RA1_bit;
sbit DD2_Set at RA0_bit;
sbit start at RB7_bit;
unsigned short j, DD0, DD1, DD2, DD3;
unsigned short pulserate, pulsecount;
unsigned int i;
//-------------- Function to Return mask for common anode 7-seg. display
unsigned short mask(unsigned short num) {
 switch (num) {
 case 0 : return 0xC0;
 case 1 : return 0xF9;
 case 2 : return 0xA4;
 case 3 : return 0xB0;
 case 4 : return 0x99;
 case 5 : return 0x92;
 case 6 : return 0x82;
 case 7 : return 0xF8;
 case 8 : return 0x80;
 case 9 : return 0x90;
 } //case end
}

void delay_debounce(){
 Delay_ms(300);
}

void delay_refresh(){
 Delay_ms(5);
}

void countpulse(){
 IR_Tx = 1;
 delay_debounce();
 delay_debounce();
 TMR0=0;
 Delay_ms(15000);  // Delay 15 Sec
 IR_Tx = 0;
 pulsecount = TMR0;
 pulserate = pulsecount*4;
}

void display(){
  DD0 = pulserate%10;
  DD0 = mask(DD0);
  DD1 = (pulserate/10)%10;
  DD1 = mask(DD1);
  DD2 = pulserate/100;
  DD2 = mask(DD2);
  for (i = 0; i<=180*j; i++) {
    DD0_Set = 0;
    DD1_Set = 1;
    DD2_Set = 1;
    PORTB = DD0;
    delay_refresh();
    DD0_Set = 1;
    DD1_Set = 0;
    DD2_Set = 1;
    PORTB = DD1;
    delay_refresh();
    DD0_Set = 1;
    DD1_Set = 1;
    DD2_Set = 0;
    PORTB = DD2;
    delay_refresh();
    }
  DD2_Set = 1;
}

void main() {
 CMCON = 0x07;    // Disable Comparators
 TRISA = 0b00110000; // RA4/T0CKI input, RA5 is I/P only
 TRISB = 0b10000000; // RB7 input, rest output
 OPTION_REG = 0b00101000; // Prescaler (1:1), TOCS =1 for counter mode
 pulserate = 0;
 j = 1;
 display();
 do {
  if(!start){
   delay_debounce();
   countpulse();
   j= 3;
   display();
  }
 } while(1);  // Infinite loop

roleci

Klasörde eksik uzantılı dosyalar varmış.
Breadboardda kurdum çalışıyor , ama tam istediğim gibi değil , modifiyeye ihtiyacı var.
Şu haliyle , displaylerde görüntü olmadan çalışmaya başlıyor , butona basıyorsunuz , 15sn içinde giren darbeyi 4 ile çarpıp 7-8sn ekranda gösterip tekrar ekran sönüyor.
Alternatif olarak ben; start butonuna basmadan , 5-6 saniyede bir ekranda tazelenmiş (refresh edilmiş) değeri görmek istiyorum.
Ama asıl LCD'de bu devreyi yapabilir miyim..

roleci

#5
https://forum.mikroe.com/viewtopic.php?f=147&t=64506 3.mesajda aradığımız şey..
Bendeki mikroc ile derlediğimde Demo Limit hatası veriyor.Forumda ilgili yöntemleri denesem de olmadı.
Program üzerinde ufak tefek değişiklikler ve basit eklemeler yapmak istiyordum.Olmadı 250$ bayılacağım.
Verilen HEX yüklendiğinde ISIS'te program çalışıyor.

// LCD module connections
sbit LCD_RS at RD4_bit;
sbit LCD_EN at RD5_bit;
sbit LCD_D4 at RD0_bit;
sbit LCD_D5 at RD1_bit;
sbit LCD_D6 at RD2_bit;
sbit LCD_D7 at RD3_bit;

sbit LCD_RS_Direction at TRISD4_bit;
sbit LCD_EN_Direction at TRISD5_bit;
sbit LCD_D4_Direction at TRISD0_bit;
sbit LCD_D5_Direction at TRISD1_bit;
sbit LCD_D6_Direction at TRISD2_bit;
sbit LCD_D7_Direction at TRISD3_bit;
// End LCD module connections
char str[23], i = 0;
double counter = 0.0, beats_per_minute = 0.0, time_in_seconds = 0.0, frequency = 0.0;

void interrupt(){

    if((INTF_bit) && (!TMR1ON_bit)) {
        TMR1ON_bit = 1;
        INTF_bit = 0;
    }

    if((INTF_bit) && (TMR1ON_bit)) {
        TMR1ON_bit = 0;
        INTE_bit = 0;
        INTF_bit = 0;
    }

    if(TMR1IF_bit) {
        TMR1IF_bit = 0;
        TMR1H = 0x3C;
        TMR1L = 0xB0;
        //Enter your code here
        counter = counter + 1;
    }
}
    
void main() {
    CMCON =0x07;
    TRISA = 0xC0;
    TRISB = 0x01;
    TRISC = 0x00;
    TRISD = 0x00;

    PORTA = 0x00;
    PORTB = 0x00;
    PORTC = 0x00;
    PORTD = 0x00;
    PORTE = 0x00;

    LCD_Init();
    LCD_Cmd(_LCD_CURSOR_OFF);
    LCD_Cmd(_LCD_CLEAR);
    delay_ms(10);
    LCD_Out(1,0,"  KALP ATISI  ");

    while(1) {

        counter = 0;
        beats_per_minute = 0;
        time_in_seconds = 0;
        frequency = 0;
        asm clrwdt
        GIE_bit = 0;                  //Disable Interrupts till congiguration is done
        
        T1CON = 0x10;                  //Configure timer 1 for 100 ms interrupt
        TMR1IF_bit = 0;
        TMR1IE_bit = 1;
        TMR1H = 0x3C;
        TMR1L = 0xB0;
        asm clrwdt
        INTEDG_bit = 1;              //Configure INT0 interrupt to detect rising edge
        INTF_bit = 0;
        INTE_bit = 1;
        
        PEIE_bit = 1;                  //Enable interrupts
        GIE_bit = 1;
        asm clrwdt
        while(!TMR1ON_bit)asm clrwdt;            //TMR1IE_bit is set in ISR when first pulse is detected
        
        while(TMR1ON_bit)asm clrwdt;            //TMR1IE_bit is cleared in ISR when 2nd pulse is detected
        
        time_in_seconds = ((counter / 10) + ((((TMR1H << 8) + TMR1L) - 15536) * 2e-6));
        //time_in_seconds = ((counter * 50000 * 2e-6) + ((((TMR1H << 8) + TMR1L) - 15536) * 2e-6));
        asm clrwdt
        frequency = 1 / time_in_seconds;
        beats_per_minute = 60.0 * frequency;
        asm clrwdt
        FloatToStr(beats_per_minute, str);
        i = 0;
        while(str[i] != '.')i++;
        i++;
        i++;
        str[i] = '\0';
        strcat(str, " bpm  ");
        LCD_Out(2,1,str);
        asm clrwdt
    }
}


roleci

Alıntı yapılan: roleci - 09 Temmuz 2019, 19:45:32https://forum.mikroe.com/viewtopic.php?f=147&t=64506 3.mesajda aradığımız şey..
Bendeki mikroc ile derlediğimde Demo Limit hatası veriyor.Forumda ilgili yöntemleri denesem de olmadı.
Program üzerinde ufak tefek değişiklikler ve basit eklemeler yapmak istiyordum.Olmadı 250$ bayılacağım.
Verilen HEX yüklendiğinde ISIS'te program çalışıyor.

// LCD module connections
sbit LCD_RS at RD4_bit;
sbit LCD_EN at RD5_bit;
sbit LCD_D4 at RD0_bit;
sbit LCD_D5 at RD1_bit;
sbit LCD_D6 at RD2_bit;
sbit LCD_D7 at RD3_bit;

sbit LCD_RS_Direction at TRISD4_bit;
sbit LCD_EN_Direction at TRISD5_bit;
sbit LCD_D4_Direction at TRISD0_bit;
sbit LCD_D5_Direction at TRISD1_bit;
sbit LCD_D6_Direction at TRISD2_bit;
sbit LCD_D7_Direction at TRISD3_bit;
// End LCD module connections
char str[23], i = 0;
double counter = 0.0, beats_per_minute = 0.0, time_in_seconds = 0.0, frequency = 0.0;

void interrupt(){

    if((INTF_bit) && (!TMR1ON_bit)) {
        TMR1ON_bit = 1;
        INTF_bit = 0;
    }

    if((INTF_bit) && (TMR1ON_bit)) {
        TMR1ON_bit = 0;
        INTE_bit = 0;
        INTF_bit = 0;
    }

    if(TMR1IF_bit) {
        TMR1IF_bit = 0;
        TMR1H = 0x3C;
        TMR1L = 0xB0;
        //Enter your code here
        counter = counter + 1;
    }
}
    
void main() {
    CMCON =0x07;
    TRISA = 0xC0;
    TRISB = 0x01;
    TRISC = 0x00;
    TRISD = 0x00;

    PORTA = 0x00;
    PORTB = 0x00;
    PORTC = 0x00;
    PORTD = 0x00;
    PORTE = 0x00;

    LCD_Init();
    LCD_Cmd(_LCD_CURSOR_OFF);
    LCD_Cmd(_LCD_CLEAR);
    delay_ms(10);
    LCD_Out(1,0,"  KALP ATISI  ");

    while(1) {

        counter = 0;
        beats_per_minute = 0;
        time_in_seconds = 0;
        frequency = 0;
        asm clrwdt
        GIE_bit = 0;                  //Disable Interrupts till congiguration is done
        
        T1CON = 0x10;                  //Configure timer 1 for 100 ms interrupt
        TMR1IF_bit = 0;
        TMR1IE_bit = 1;
        TMR1H = 0x3C;
        TMR1L = 0xB0;
        asm clrwdt
        INTEDG_bit = 1;              //Configure INT0 interrupt to detect rising edge
        INTF_bit = 0;
        INTE_bit = 1;
        
        PEIE_bit = 1;                  //Enable interrupts
        GIE_bit = 1;
        asm clrwdt
        while(!TMR1ON_bit)asm clrwdt;            //TMR1IE_bit is set in ISR when first pulse is detected
        
        while(TMR1ON_bit)asm clrwdt;            //TMR1IE_bit is cleared in ISR when 2nd pulse is detected
        
        time_in_seconds = ((counter / 10) + ((((TMR1H << 8) + TMR1L) - 15536) * 2e-6));
        //time_in_seconds = ((counter * 50000 * 2e-6) + ((((TMR1H << 8) + TMR1L) - 15536) * 2e-6));
        asm clrwdt
        frequency = 1 / time_in_seconds;
        beats_per_minute = 60.0 * frequency;
        asm clrwdt
        FloatToStr(beats_per_minute, str);
        i = 0;
        while(str[i] != '.')i++;
        i++;
        i++;
        str[i] = '\0';
        strcat(str, " bpm  ");
        LCD_Out(2,1,str);
        asm clrwdt
    }
}
Azmi'nin elinden kimse kurtulamaz :)
Bu forumdaki kürek çalışmamıştı.
Linkteki kürek DEMO LİMİT sorununu halletti ;
http://forum.mekatronikmuhendisligi.com/Konu-MikroC-Pro-2012-5-61-lisans-sorunu-cozuldu-ektedir.html (Teşekkürler)