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

Başlatan roleci, 10 Haziran 2019, 21: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, 23: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

21 Haziran 2019, 19:51:01 #3 Son düzenlenme: 22 Haziran 2019, 23:20:38 mehmet Sebep: Mesajınıza kod eklemek için "Kod" butonunu kullanınız.
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 201916: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 jDD0DD1DD2DD3;
unsigned short pulseratepulsecount;
unsigned int i;
//-------------- Function to Return mask for common anode 7-seg. display
unsigned short mask(unsigned short num) {
 switch (
num) {
 case 
: return 0xC0;
 case 
: return 0xF9;
 case 
: return 0xA4;
 case 
: return 0xB0;
 case 
: return 0x99;
 case 
: return 0x92;
 case 
: return 0x82;
 case 
: return 0xF8;
 case 
: return 0x80;
 case 
: 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 (
0i<=180*ji++) {
    
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;
 
1;
 
display();
 do {
  if(!
start){
   
delay_debounce();
   
countpulse();
   
j3;
   
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

09 Temmuz 2019, 22:45:32 #5 Son düzenlenme: 10 Temmuz 2019, 12:55:28 roleci Sebep: Verilen HEX yüklendiğinde ISIS'te çalışıyor.
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], 0;
double counter 0.0beats_per_minute 0.0time_in_seconds 0.0frequency 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 
time_in_seconds;
        
beats_per_minute 60.0 frequency;
        
asm clrwdt
        FloatToStr
(beats_per_minutestr);
        
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, 22: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], 0;
double counter 0.0beats_per_minute 0.0time_in_seconds 0.0frequency 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 
time_in_seconds;
        
beats_per_minute 60.0 frequency;
        
asm clrwdt
        FloatToStr
(beats_per_minutestr);
        
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)