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 ??