PIC 16f877a - HC-05 Ve Matlab Arayüzü Vasıtası İle Seri Haberleşerek Led Yakma

Başlatan MG33, 12 Aralık 2021, 23:41:51

MG33

Herkese iyi günler, matlab gui ile arayüz yapıp,pc ile hc-05'i bu arayüz vasıtasıyla seri haberleştirmek istiyorum.
Bu proje icin PIC 16f877A mikrodenetleyicisini kullandım.
Öneğin, arayüzde 'led on' butonuna basınca led yanacak led of butonuna basınca led sönecek. (Ayrıca hc-05 ' , slave modda baud rate 9600,1,0 olarak ayarladım.)
Arayüzü yaptım hc-05 başarılı
bir şekilde arayüze bağlandı fakat arayüzdeki led on butonuna basınca led yanmadı. Bende sıkıntı matlabtadır diye düşünerek telefona bir tane bluetooth terminal programı indirip hazır olarak denemek istedim. MPlab ortamında yazdığım kodda, led yanacaksa 1 verisini gonder,
led sönecekse 0 verisini gönder diye tasarladım. Terminale 1 yazdığımda gene led yanmadı. Fakat aynı şeyi proteusta simulasyon şeklinde devreyi yapıp,
proteustaki terminale 1 ya da 0 verisini gönderince istediklerimi yapabildim. Şu an sorunun devre bağlantısında olduğunu düşünüyorum. Multimetre ile hc-05 e giren voltaj
değerinin 4.80 v olduğunu ölçtüm rx pininden çıkan voltaj değerinin ise voltaj bölücü oluşturmama rağmen 4.20 v olduğunu saptadım.(okuduğum
bazı kaynaklarda rx pini 3.3v olması gerekliymiş yoksa hc-05 sağlıklı bir şekilde haberleşemezmiş) Acaba bu durum mu istediğim sonucu almamı engelliyor
yoksa başka bir şey mi ? Kodu ve devre şemasını aşağıda paylaştım:
Devrede hc-05 için kırmızı-vcc,kahverengi-gnd,beyaz-rx pinine,mor-tx pinine,ledin + bacağı-rb5 pinine. Ayrica pic'i beslemek için 5v bir kaynak kullanıyorum.


Alternatif 1.Kod:

// CONFIG
#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF      // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF      // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF        // Flash Program Memory Code Protection bit (Code protection off)


#include <proc/pic16f877a.h>
#include <xc.h>
#include <stdio.h>
#include <string.h>
#include <htc.h>
#define _XTAL_FREQ 4000000

int data;

//USART ASYNCHRONOUS RECEIVER
void __interrupt() isr()
{

    if(RCIF == 1)
    {
        data = RCREG;
        RCIF = 0;
    }
  
}

void main(void)
{
    
    GIE = 1;
    PEIE = 1;
    RCIE = 1;

    TRISC7=1;
    TRISC6=0; // 0 asl?nda
    
    TRISB = 0;
    PORTB=0X00;
    
    
    TXSTA=0X24;
    RCSTA=0X90;
    SPBRG=25; 
    
    
    while(1)
    {  
        
        
        if(data == '1')
        {
            RB5 = 1;
        }
        
        else if(data == '0')
        {
            RB5 = 0;
        }
        
              
    }
        
    return;
}


Alternatif 2.Kod:
// CONFIG
#pragma config FOSC = HS      // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF      // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = OFF        // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF        // Flash Program Memory Code Protection bit (Code protection off)
//End of CONFIG registers

#define _XTAL_FREQ 4000000
#include<xc.h>

//******Initialize Bluetooth using USART********//
void Initialize_Bluetooth()
{
  //Set the pins of RX and TX//
    TRISC6=0; //0 olarak dene
    TRISC7=1;
    
    BRGH=1;      
    SPBRG=25;
    
    //Turn on Asyc. Serial Port//
    SYNC=0;
    SPEN=1;
    
    //Set 8-bit reception and transmission
    RX9=0;
    TX9=0;

  //Enable transmission and reception//
    TXEN=1; 
    CREN=1; 
    
    //Enable global and ph. interrupts//
    GIE = 1;
    PEIE= 1;
  
    //Enable interrupts for Tx. and Rx.//
    RCIE=1;
    TXIE=1; //bunu kapatarak dene
}


//Function to get a char from Rx.buffer of BT//
char BT_get_char(void)  
{
    if(OERR) // check for over run error 
    {
        CREN = 0;
        CREN = 1; //Reset CREN
    }
    
    if(RCIF==1) //if the user has sent a char return the char (ASCII value)
    {
    while(!RCIF);  
    return RCREG;
    }
    else //if user has sent no message return 0
        return 0;
}
//End of function

void main(void)
{
    //Scope variable declarations//
    int get_value;
    //End of variable declaration//
  
    //I/O Declarations//
    TRISB = 0b00000000;
    //End of I/O declaration//
  
  Initialize_Bluetooth(); //lets get our bluetooth ready for action

  while(1) //The infinite lop
  {  
    
  get_value = BT_get_char(); //Read the char. received via BT
    
if (get_value=='0')
        {    
            RB5=0;  
        }

if (get_value=='1')
        {
            RB5=1;            
        }
    
    
  } 

}




Hattuşa

dikkatimden kaçmadıysa bağlantı ve kod doğru gözüküyor yalnız şöyle bir sorun var, matlap veya başka bir arayüz farketmez senin yolladığın datayı 1 ve 0 yolladım diyorsun ya ben ascii tablosundan baktığıma göre sen 0 yolladığında decimal 48, 1 yolladığında 49 değerleri gönderiyor olabilirsin. PIC tarafında 48 ve 49 deneyebilirmisin? yani alınan data decimal değer olmayabilir

ete

Daha başka bir deyiş ile yollanan karekterler karekter olarak değerlendiriliyor ise 0 rakamı ASCII Karekter olarak 48 ile tanımlanır. 1 ise 49 olarak tanımlanır. Bunları rakam olarak yollayıp rakam olarak değerlendirebiliyor isen 0-1 olarak yollanırlar. Muhtemelen karekter çalışıyorsun. 48 ve 49  olarak test etmeyi dene.

Ete

aRci

Bende fikrimi söyleyeyim pic haberleşme bağlantısını her alınan bilgi ile aldığınız şekilde işlem yapmadan tx poninden geri gönderin ifade ederken '1' şeklinde yapınca chat tipi değer olacaktı aslında ASCII karşılığı olarak da 49 decimal le denk geliyor benim fikrim voltaj seviyesi sebebi ile yada baud ayarı ile ilgili haberleşmede problem var. 877 3.3v de çalışabilir. Bence siz beslemeyi 3.3v olarak yapın ve gerilim boluculeri kaldırın ardından hc05 in tx pinine pullup direnç takın

Hattuşa

android studio - PIC arası HC-05 HC-06 uygulamaları epey yaptım. PIC in 5v veya 3.3V olmasının bir önemi  yok, hatta RX pinini direk PIC in TX pinini gerilim bölücü olmadan kullandım hiç bir sıkıntı yaratmadı. Baudrate hızı ise PIC ile Bluetooth arasında uyumlu olduktan sonra bluetooth ile android arasında baudratenin hiç bir önemi yok. benim yaşadığım sorunlar bahsettiğim gibi PIC den gönderdiğim decimal değerin öteki tarafda convert edilmediğinde ascii alması şeklinde oldu. tabi sizin matlap arayüzünü bilmiyorum

MG33

bu projeyi önceden arduino ile denemiştim sorunsuz bir şekilde çalışmıştı. 49-1 48-0 olarak denedim fakat gene olmadı. hc-05 in datashhetine baktığımda baud rate ayarlarında 3 parametre birisi baud rate in sayısal değeri, diğer ikisi ise stop ve parity bit. Şu an benim ayarladığım şekil 9600,1,0 acaba parity ve stop bitlerinin lojik değerleri farklı mı olmalı diye aklıma geldi. Çünkü asynchronous  modda, stop ve parity bitlerinin bazı işlevleri varmış.

Hattuşa

Alıntı yapılan: MG33 - 13 Aralık 2021, 23:04:11bu projeyi önceden arduino ile denemiştim sorunsuz bir şekilde çalışmıştı. 49-1 48-0 olarak denedim fakat gene olmadı. hc-05 in datashhetine baktığımda baud rate ayarlarında 3 parametre birisi baud rate in sayısal değeri, diğer ikisi ise stop ve parity bit. Şu an benim ayarladığım şekil 9600,1,0 acaba parity ve stop bitlerinin lojik değerleri farklı mı olmalı diye aklıma geldi. Çünkü asynchronous  modda, stop ve parity bitlerinin bazı işlevleri varmış.

hocam baudrate değeri ile neden oynama ihtiyacı duydunuz? orj. baud değeri 9600,0,0 olmalı, bence öncelikle bluetoothu reset edip orj. hali ile çalıştırın, şifre isim ve baud değeri ile daha sonra oynarsınız. ben genellikle 115200 baud ile çalıştırıyorum, zira byte array dizisi yolladığım için 9600 baudde 1 byte 1 ms de gönderiyor, 115200 baudda 1 byte i 100uS Civarında yolluyor.

ayrıca arduino ile uğraşmadan bluetoothlarınızı videodaki şekilde kolayca değiştirebilirsiniz. video başında detaylı anlatım mevcut

MG33


MG33

Alıntı yapılan: aRci - 13 Aralık 2021, 20:30:40Bende fikrimi söyleyeyim pic haberleşme bağlantısını her alınan bilgi ile aldığınız şekilde işlem yapmadan tx poninden geri gönderin ifade ederken '1' şeklinde yapınca chat tipi değer olacaktı aslında ASCII karşılığı olarak da 49 decimal le denk geliyor benim fikrim voltaj seviyesi sebebi ile yada baud ayarı ile ilgili haberleşmede problem var. 877 3.3v de çalışabilir. Bence siz beslemeyi 3.3v olarak yapın ve gerilim boluculeri kaldırın ardından hc05 in tx pinine pullup direnç takın

hocam eskidende 5v ile projeler yaptım çalışırdı ben sorunun bluetooth' a gelen voltaj değerinden kaynaklandığını düşünüyorum. Baud rate hesaplamaları doğru gözüküyor. Peki Tx e pull up takınca ne değişecek ?



aRci

Alıntı yapılan: MG33 - 19 Aralık 2021, 00:44:13hocam eskidende 5v ile projeler yaptım çalışırdı ben sorunun bluetooth' a gelen voltaj değerinden kaynaklandığını düşünüyorum. Baud rate hesaplamaları doğru gözüküyor. Peki Tx e pull up takınca ne değişecek ?



pic 5v de pullup yapıyor siz ise 3.3v de çalışan cihazin tx poninden 3.3v gerilim çıkıyor bu arada gerilim farkı vs var.
Anlayacağın kunuda pekte bilgili değilim sadece tecrübe ettiğim için tavsiyede bulundum ve ise yaradığı için uygulayıp uygulamamk size kalmış.
Bende devrelerini 5v ile tasarlıyoruz. Ama ne zaman da3231, sim800 veya ESP dahil etmeye başladım i vakit besleme voltajını 3.9v de ortak veriyorum. Bu sayede ds3231 saati doğru çalışıyor ve ESP ile sim800 le beraber rahatça kullanıyorum
Tabi sim800 sistemi petek lerle bozmayı başarıyor ama onunda tedbirle atlatiliyor.

Hattuşa

bana kalırsa matlapda yazdığınız kısımda sıkıntı var, tabii diğer pic kısmının bahsettiğiniz gibi doğru olduğunu düşünüyorsanız. matlabda ki kodunuz özel değilse size androidde bir kod yazayım deneyin.

MG33

Alıntı yapılan: pro-TR - 19 Aralık 2021, 19:12:18bana kalırsa matlapda yazdığınız kısımda sıkıntı var, tabii diğer pic kısmının bahsettiğiniz gibi doğru olduğunu düşünüyorsanız. matlabda ki kodunuz özel değilse size androidde bir kod yazayım deneyin.

olur hocam bugün bir de android terminalde deneyeceğim

Hattuşa


MG33


Hattuşa

Alıntı yapılan: MG33 - 23 Aralık 2021, 20:59:02android terminal ile de çalışmadı maalesef :(

İsis similasyonda iki pic i rx-tx ile simüle edebilirmisiniz? yani bluetooth olmadan piclerin Tx-Rx e Rx-Tx e bağlayıp test edebilirmisiniz,pic kod tarafında problem var sanırım.mesela picin Rx i ni giriş olarak tanımladınız mı? ben göremedim de

Powered by EzPortal