Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

PIC16F887 RS232 ve Seriport

Başlatan candogru, 09 Aralık 2014, 09:42:25

candogru

Merhaba arkadaşlar öncelikle konuyu yanlış yere açtıysam affola, çok acil cevaba ihtiyacım var.

Görsel programlama ve Mikroişlemciler dersinin ortak ödevi için bir proje üzerinde çalışıyorum. C# ile görsel bir uygulama yaptım örnek vermek gerekirse Buton1 e basılınca seri porta "a", Buton2 ye basılınca seri porta "b" yazıyor. Kullandığım PIC16F887 ile de bu değerleri okuyarak kronometre ve geriye zaman sayıcı yapmak istiyorum. Bilgisayarın tek amacı Kullanıcıya ara yüz sunarak işlem seçtirerek. Geri kalan kronometre kısmı tamamen picde hallediliyor. Şuanlık kronometreyi çözsem projenin devamı gelecek. Seri portu kullanmadan direk mikroişlemcide kronometre yaptırabiliyorum TMR0 ve TMR1 kesmeleri ile. Kullandığım 4 Digit 7 segment ortak anot display. Pic içerisine yüklediğim kod şu:

#include <built_in.h>
char oku,basla;
const char LedKod[10]={0x40,0xF9,0x24,0x30,0x19,0x12,0x03,0xF8,0x00,0x18};
char deger[4], dakika=0,saniye=0, salise=0, sayac=0;
unsigned char tara[4]={0x10,0x20,0x40,0x80};
//Timer0
//Prescaler 1:16; TMR0 Preload = 68; Actual Interrupt Time : 3 ms
void InitTimer0()
{
  OPTION_REG     = 0x03;                     // PS2-PS1-PS0 için 011 yüklenir. 1:16 oran olur
  TMR0           = 68;                        //Timer içerisine 68 yüklendi ve 255e kadar sayacak ,188    3ms edecek
  INTCON.T0IE=1;     //timeri kesme olarak kullandıktan sonra kesme için 1
  INTCON.GIE=1;
}
//Timer1
//Prescaler 1:1; TMR1 Preload = 55536; Actual Interrupt Time : 10 ms
void InitTimer1()
{
  T1CON         = 0x00;                 //timer1 in ayarlanın yapıldığı register.
  TMR1IF_bit    = 0;                    //PIR1 0.biti TMR1IF ile kesme kontrol edilir.
  TMR1H         = 0xD8;
  TMR1L         = 0xF0;                 //10000 saydirmak için yükledi
  TMR1IE_bit    = 1;                    //PIE1 0.biti TMR1IE ile kesmelerine izin verilir.
  INTCON.PEIE=1;                        //INTCON 6.biti PEIE ile çevre birim kesmelerine izin verilir.
}
//-----------------------------
void basamakla()
{ deger[0]=LedKod[dakika%10];
  deger[1]=LedKod[saniye/10];
  deger[2]=LedKod[saniye%10];
  deger[3]=LedKod[salise/10];
}
//---------------------------------
void Interrupt()
{
  if (TMR1IF_bit){
    TMR1IF_bit = 0;                 //PIR1 0.biti TMR1IF ile kesme kontrol edilir.
    TMR1H         = 0xD8;
    TMR1L         = 0xF0;           //10000 saydirmak için yükledi
    salise++;                        //salisa 1 artar
    if(salise==100){salise=0;saniye++;}      //100 salisede saniyeyi 1 arttırır
    if(saniye==60){saniye=0;dakika++;}       //60 saniyede dakikayı 1 arttırır
    basamakla();                       //ledkod değerlerini çağırıyor
  }

  if (TMR0IF_bit)
  {
    TMR0IF_bit   = 0;
    TMR0         = 68;              //Timer içerisine 68 yüklendi ve 255e kadar sayacak ,188  3ms edecek
    sayac++;
    if(sayac==4) sayac=0;
    PORTB=tara[sayac];
    if(sayac==2)        {PORTC.RC0=0;}     // saniye ile salises arasındaki nokta
    else if(sayac==0)   {PORTC.RC0=0;}    // saniye ile salises arasındaki nokta
    else                {PORTC.RC0=1;}
    PORTD=deger[sayac];
  }
}
//-------------------------------------------
void kurulum()
{
  TRISC=0;
  TRISB=0;                 //çıkış
  TRISD=0;                 //ÇIKIŞ
  TRISE=0;
  PORTB=0;                  //PORTB TEMİZ
  PORTC.RC0=0;
  PORTD=0x40;                 //PORTD TEMİZ
  PORTE=0;
  UART1_Init(9600);
  InitTimer0();           //TİMERO KURULUMU YAP BAKALIM
  InitTimer1();           //TİMER1 KURULUMUDA YAP
  delay_ms(100);           //BEKLE BİRAZ
}
void main()
{
  kurulum();
  basamakla();

  T1CON.TMR1ON=1;        //Timer1 çalıştırılıyor.
 
}
Bu şekilde sonsuz sayma işlemi yapıyor. benim amacım seri prottan "a" değeri geldiğinde sayma işlemine başlasın." b" değeri geldiğinde dursun. "c"de sıfırlasın falan.

Seri port ile picin iletişimi için kısa bir kod daha yazmıştım:
char oku,basla;
void main()
{
     TRISD=0;
     PORTD=0;
     UART1_Init(9600);
     delay_ms(100);
     while(1)
      {
       if(UART1_Data_Ready())
                             {
                             oku=UART1_Read();

                             if(oku=='k')
                               while(1)
                               {
                               if(UART1_Data_Ready())
                                 { basla=UART1_Read();
                                 if(basla=='w'){PORTD.RB0=1;delay_ms(1000);}//
                                 if(basla=='e') {PORTD.RB0=0;delay_ms(1000);}//
                                  if(basla=='q') {break;}//
                                  }
                               }
                              if(oku=='s')
                                {PORTD.RB0=1;delay_ms(1000);}
                              }
       }
}
Bu kodlar ile kurudğum bir ufak devrede led yakabiliyorum. Ama bir üstte verdiğim kod bu kodu iç içe geçirmek için if döngülerinin içini dolduruyorum dersem program istediğim gibi çalışmıyor yani saymaya başlamıyor. Kodlarda fazlalıklar olabilir. Üzerinde çalışıyorum şuanda. Nasıl bir yapı ile ilk verdiğim kodların içine bu istediğim kodlamaları gömebilirim ??