Merhaba,
PIC hakkında sıfır bilgi ve tecrübeye sahibim. Yapmak istediğim projenin bir benzerinin PIC için yapılmışını buldum. Ancak alıcı kısmında kodların bir kısmını anlayamadım. void main() in üstünde kalan kodları açıklarsanız çok sevinirim.
unsigned int count=0,sgnal=0;
int i=7,j=0,xr=0;
char txt[]="........";
char val[]="........";
void timer_routin(){
count++;
if(count>0xFF){
count=0;
TMR0L=0;
}
}
void interrupt()
{
if(INTCON.TMR0IF){
timer_routin();
INTCON.TMR0IF=0;
}
if(INTCON.INT0IF){
xr=count;
count=0;
TMR0L=0;
if(i<0){ i=7; }
if(xr==3){ // you may use if(xr==3||xr==4||xr==2){...}
val[i]='0';
i--;
if(i<0){ i=7; }
}
else if(xr==6){ // you may use if(xr==5||xr==6||xr==7){...}
val[i]='1';
i--;
if(i<0){ i=7; }
}
else{
/// For start signal or Repeat signal , i=0 and start to count
TMR0L=0;
i=7;
count=0;
}
INTCON.INT0IF=0;
}
}
void main()
{
ADCON1=0x0F;
CMCON=7;
TRISB=0x01;
PORTB.F6=0;
PORTB.F5=0;
PORTB.F4=0;
PORTB.F3=0;
T0CON=0xC1;
TMR0L=0;
INTCON.GIE=1;
INTCON.PEIE=1;
INTCON.TMR0IE=1;
INTCON.INT0IE=1;
INTCON.TMR0IF=0;
INTCON.INT0IF=0;
INTCON2.RBPU=1; // DISABLE PULUP REGISTER
INTCON2.INTEDG0=0;
while(1){
if(val[7]==val
[li]){ [/li]
txt[7]=val[7];
}
if(val[6]==val[1]){
txt[6]=val[6];
}
if(val[5]==val[2]){
txt[5]=val[5];
}
if(val[4]==val[3]){
txt[4]=val[4];
}
if(txt[4]=='0' && txt[5]=='0' && txt[6]=='0' && txt[7]=='1') {
PORTB.F6=1;
PORTB.F5=0;
PORTB.F4=0;
PORTB.F3=0;
}
if(txt[4]=='0' && txt[5]=='0' && txt[6]=='1' && txt[7]=='0') {
PORTB.F6=0;
PORTB.F5=1;
PORTB.F4=0;
PORTB.F3=0;
}
if(txt[4]=='0' && txt[5]=='0' && txt[6]=='1' && txt[7]=='1') {
PORTB.F6=0;
PORTB.F5=0;
PORTB.F4=1;
PORTB.F3=0;
}
if(txt[4]=='0' && txt[5]=='1' && txt[6]=='0' && txt[7]=='0') {
PORTB.F6=0;
PORTB.F5=0;
PORTB.F4=0;
PORTB.F3=1;
}
}
}
Bu da alıcı kodu #define address 0xff
#define command_1 0xFF
#define command_2 0x81
#define command_3 0x42
#define command_4 0xC3
#define command_5 0x24
unsigned int i=0,j=0;
void repeat(){
PWM1_Start();
delay_us(8000);
PWM1_Stop();
delay_us(8000);
}
send_data_byte(unsigned char dattt){
PWM1_init(36000);
PWM1_Set_Duty(127);
for(j=0;j<8;j++){
PWM1_Start();
delay_us(562);
PWM1_Stop();
if(dattt & 0x01){
delay_us(1687);
dattt=dattt>>1;
}
else
{
delay_us(562);
dattt=dattt>>1;
}
}
PWM1_Stop();
}
void send_data_command(unsigned char dat){
PWM1_init(36000);
PWM1_Set_Duty(127);
PWM1_Start();
delay_us(9000);
PWM1_Stop();
delay_us(4500);
send_data_byte(dat);
repeat();
}
void main() {
ADCON1=0x0F; // disable ADC converter
CMCON=7; // to disable comparator
TRISA.F0=1;
TRISA.F1=1;
TRISA.F2=1;
TRISA.F3=1;
TRISC.F2=0;
PORTC.F2=0;
while(1){
if(PORTA.F0==0){
send_data_command(command_2);
while(PORTA.F0==0){
repeat();
}
}
if(PORTA.F1==0){
send_data_command(command_3);
while(PORTA.F1==0){
repeat();
}
}
if(PORTA.F2==0){
send_data_command(command_4);
while(PORTA.F2==0){
repeat();
}
}
if(PORTA.F3==0){
send_data_command(command_5);
while(PORTA.F3==0){
repeat();
}
}
}
}
Merhabalar ir protokolü altında bazı yapılar var. Bunlar NEC, SONY , RC5 gibi. Bana NEC protokolünü taklit etmeye çalışmış gibi geldi. Öncesinde bir taşıyıcı sinyal oluşturuluyor pwm init ettğini fonksiyon içerisinde , bir duty cycle değeri belirleniyor ve data gönderilirken modülasyon işlemi gerçekleştiriliyor. orada koyduğu 9000 , 4500 gibi değerler prokolün kendisinde olan değerler. Fakat bu kodun doğru çalışacağını düşünmüyorum. 36khz ayarlanmış , data gönderme işleminde mark ve space durumları gözardı edilmiş.
https://techdocs.altium.com/display/FPGA/NEC+Infrared+Transmission+Protocol
Sıfır bilgi ile yapacağın hiç bir şey yok Reis:)
İnterrupt Rutin Alıcı koda yazılır, vericiye değil!
Alıntı yapılan: volkanunal - 26 Mart 2019, 09:26:27Merhabalar ir protokolü altında bazı yapılar var. Bunlar NEC, SONY , RC5 gibi. Bana NEC protokolünü taklit etmeye çalışmış gibi geldi. Öncesinde bir taşıyıcı sinyal oluşturuluyor pwm init ettğini fonksiyon içerisinde , bir duty cycle değeri belirleniyor ve data gönderilirken modülasyon işlemi gerçekleştiriliyor. orada koyduğu 9000 , 4500 gibi değerler prokolün kendisinde olan değerler. Fakat bu kodun doğru çalışacağını düşünmüyorum. 36khz ayarlanmış , data gönderme işleminde mark ve space durumları gözardı edilmiş.
https://techdocs.altium.com/display/FPGA/NEC+Infrared+Transmission+Protocol
Sağolun.
Verici yerine alttaki koda da alıcı yazmışım kusura bakmayın.