Pic to pic Uart veri yollama

Başlatan CaptainOnedin, 26 Şubat 2022, 05:25:42

CaptainOnedin

İyi günler herkese,

Uart haberleşmenin şart oldupu bir durumda iki pic arasında iki ya da daha fazla farklı veriyi göndermek istiyorum nasıl yaparım? Şöyle ki, aynı anda masterdan slave'e a=1 ve c=3 gibi iki veriyi yollamam lazım ki diğer picte seri kodlar çalışsın. Slave if(a=1){ if(c=3){ gibi bir kod serisini başlatıcak ya da durdurucak

Erol YILMAZ

Her bir mcu nun UART TX ini digerinin RX ine baglayacaksin oncelikle.

Sonra da birinden Transmit yapinca digerine ulasacak gonderdigin data.

CaptainOnedin

quote author=Erol YILMAZ link=msg=620637 date=1645865559]
Her bir mcu nun UART TX ini digerinin RX ine baglayacaksin oncelikle.

Sonra da birinden Transmit yapinca digerine ulasacak gonderdigin data.
[/quote]

:D Veri yollamada sıkıntım yok amacım iki veriyi yollayıp diğer pic te bunu algılama. Yani şöyle; fputc(15,slave) fputc(30,slave) gibi iki tane veriyi yolladığımda slave pic a=fgetc(slave) c=fgetc(slave) olarak eşleştirmeli ve a=15 c=30 olmalı. Buaynı anda gelen veriyi nasıl ayrı değişkenlere atarım onu merak ediyorum

mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

fide

@mehmet önerdiği gibi Frame oluşturman gerekir.
Önce bir format belirle.
<a=10,b=20>Cr gibi (Cr= ASCII 13 enter) format belirle.
Sonra enter karakteri alınca alınan stringin ilk karakteri < ve son karakteri > olup olmadığını kontrol et.
Sonraki basamakta karakterleri teker teker tarayıp virgülü bul
Sonrasında virgüle kadar ve virgülden sonrası olarak iki stringe ayır.
İlk kısmında = karakterini bul.
= Karakteri öncesi ve sonrasındaki karakterleri ayrı değişkenlere aktar. Sonrasında = öncesi stringin a olup olmadığını kontrol et
= Sonrası karakterlerin sayısına bak ve str to int dönüşüm yap.
Aynı işlemleri virgülden sonrası için de uygula.

Lafın kısası karşılaştırma, arama bulma için güzel fonksiyonlar yazman yada ccs c nın str fonksiyonlarını iyi öğrenmen lazım.

GSM modül ile web sayfasından veri çekip parse etmiştim. (Burdaki işlemin yaklaşık 20 katı kadar veri vardı :o  :o  :o  :o ) O zamanlar iyi saç baş yolmuştum ama konuyu öğrenmenin sağlamıştı.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

kudretuzuner

#5
Merhaba, alıcı tarafındaki yazılımızda öncelikle istediğiniz dataların geldiğini teyit etmeniz gerekir. Bunu da gelen datanın (örneğin klavye "1" HEX'31' dir.) Bu HEX'31' i de   MOVLW B'00110001';HEX'31' YANİ RAKKAM "1"        XORWF RCREG                  BTFSS STATUS,2                                                                                                      komutu ile alıcı register ile karşılaştırmanız gerekir. Eşit ise slave PIC'e eylem yaptırabilirsiniz.             
Amatör

CaptainOnedin

Mesajlar için teşekkürler. @mehmet in yazdığını anlayamadım.

@fide sizin yazdığınızı anlar gibi oldum ama nafile. Ccs c kullanıyorum örnek varsa daha iyi anlarım gibi.

@kudretuzuner ASM bilmediğimden anlayamadım. Kusura bakmayın.

Ben uzakyol gemi kaptanıyım ve şuan atlantik okyanusunun ortasından yazıyorum bu mesajları. Tamamıyla gemideki boş vakitlerimi değerlendirmek adına bir uğraş benim ki. Amacım şuydu; bir menü yaptım pic16f628a ile ve i2c lcd ile kullanıyorum. 3 ana başlıklı 3 katman derinlikli menü bu. Stepper motor sürüyorum ve bu menülerle ayarları yapıyorum. Seçeneklerden birinde timer0 kesmesi ile moturun hızını ayarlayıp sonsuz döngüde çalıltırıyorum, bir diğerinde timer1 kesmesi ile zaman ayarlı olarak çalıştırıyorum gibi. Ama bunları yaparken özellikle timer0 kesmesi aktifken lcd ekranda titremeler meydana geliyor. Bundan kurtulmak adına dedim elimdeki 12f675 pici ile motoru süreyim diğeri sadece menü işlevi görsün ve uart ile haberleşsinler. Şimdilik sadece motoru açıp kapatacak konumda kodum. Hız ayarı ya da zaman ayarlı olarak çalıştıramıyorum. Eğer bahsettikleriniz için örnek varsa çok daha iyi anlarım. Şimdiden teşekkürler.

CaptainOnedin

Kodları da şöyle paylaşayım

Master Kodu
#include <16F628a.h>
#USE delay(clock=4000000)
#fuses INTRC,NOMCLR,NOWDT,NOBROWNOUT,NOPROTECT,NOCPD
#use i2c(master,sda=pin_b4,scl=pin_b5,FAST=100000,STREAM=I2C_LCD) //i2c ayarı. STREAM kısmı önemli
#use rs232 (baud=9600,uart1,stream=pic)

#include <I2C_LCD.c>

int1 PUSH=0;
unsigned int8 SCREEN=0;    //Ana ekran
unsigned int8 SCREENA=0;  //Hız ayarlı menüsü
unsigned int8 SCREENC=0;  //Zaman Ayarlı menüsü
unsigned int8 SCREENd=0;  //Diğer ayarlar menüsü
int hiz=1;  // Stepper motor hızı
int b;      // derin kademeli while'lardan çıkmak için
int A=0;    // Stepper motor çalışma algılama değişkeni
int1 screenc1=0;  //Zaman ayarlı için kullanılan Timer1 kesmesinin döngü değişkeni(çıkıp girmeyi sağlıyor)




#int_EXT
void  EXT_isr(void) {      //Dış kesme ile buton dinleme
      PUSH=1; 
  }  

void ilk(){                // İlk açılış ekranı
  LCD_Cmd(LCD_CLEAR);
  LCD_Out("    Ogulcan    ");
  LCD_CMD(LCD_SECOND_ROW);
  LCD_Out(" Press for menu ");
}

void hizayarlialt1(){  // HIZ AYARI MENÜSÜ
    hiz=read_eeprom(0);
    LCD_Cmd(LCD_CLEAR);
    LCD_Goto(1,1);
    LCD_Out(" Hiz Ayari ");
    lcd_cmd(lcd_second_row);
    printf(lcd_out,"      %02u",hiz);
      while(TRUE){
      hiz=read_eeprom(0);
        if(input(pin_a6)) {
        delay_ms(150);
              hiz++;
              if(hiz>9) hiz=10;
              write_eeprom(0,hiz);
              output_high(pin_b3);
              delay_us(100);
              output_low(pin_b3);
              fputc(hiz,pic);
              LCD_Goto(1,2);
              printf(LCD_Out,"      %02u",hiz);
              }
        
        if(input(pin_a7)) {
            delay_ms(150);
              hiz--;
              if(hiz<1) hiz=1;
              write_eeprom(0,hiz);
              output_high(pin_b3);
              delay_us(100);
              output_low(pin_b3);
              fputc(hiz,pic);
              LCD_Goto(1,2);
              printf(LCD_Out,"      %02u",hiz);
                  }
      if(PUSH==1) {
      PUSH=0;
      break;}
      }
}


void hizayarli(){    // HIZ AYARLI MOTOR MENÜSÜ
  LCD_Cmd(LCD_CLEAR);
  while(TRUE){
        while(A==0){        // Stepper motor çalışMIyorsa bu kodlar akar
              if (input(pin_a6)){
                  if(SCREENA==2) ScreenA=-1;
                  SCREENA++;
                  delay_ms(250);}
              if(input(pin_a7)){
                  if(ScreenA==0) ScreenA=3;
                  ScreenA--;
                  delay_ms(250);}
            switch (SCREENA) {
            case 0:  LCD_Goto(1,1);
                    LCD_Out(">Motoru baslat  ");
                    LCD_Goto(1,2);
                    LCD_Out(" Hizi ayarla    ");
                    break;
            case 1:  LCD_Goto(1,1);
                    LCD_Out(" Motoru baslat  ");
                    LCD_Goto(1,2);
                    LCD_Out(">Hizi ayarla    ");
                    break;    
            case 2:  LCD_Goto(1,1);
                    LCD_Out(" Hizi ayarla    ");
                    LCD_Goto(1,2);
                    LCD_Out(">Ust menu        ");
                    break;
            default: break;
            }
            if(PUSH==1) {
              PUSH=0;
              if(SCREENA==0) {A=1;
                              output_high(pin_b3);
                              delay_us(100);
                              output_low(pin_b3);
                              fputc(5,pic);
                              }
              if(SCREENA==1) {
                              output_high(pin_b3);
                              delay_us(100);
                              output_low(pin_b3);
                              fputc(4,pic);
                              hizayarlialt1();}
              if(SCREENA==2) {SCREENA=0;
                              b=1;
                              break;
                              }
              }
        }
        if(b==1) {b=0;
                  break;}
        while(A==1){        // Stepper motor çalışıyorsa bu kodlar akar
              if (input(pin_a6)){
                  if(SCREENA==2) ScreenA=-1;
                  SCREENA++;
                  delay_ms(250);}
              if(input(pin_a7)){
                  if(ScreenA==0) ScreenA=3;
                  ScreenA--;
                  delay_ms(250);}
            switch (SCREENA) {
            case 0:  LCD_Goto(1,1);
                    LCD_Out(">Motoru durdur  ");
                    LCD_Goto(1,2);
                    LCD_Out(" Hizi ayarla    ");
                    break;
            case 1:  LCD_Goto(1,1);
                    LCD_Out(" Motoru durdur  ");
                    LCD_Goto(1,2);
                    LCD_Out(">Hizi ayarla    ");
                    break;
            case 2:  LCD_Goto(1,1);
                    LCD_Out(" Hizi ayarla    ");
                    LCD_Goto(1,2);
                    LCD_Out(">Ust menu        ");
                    break;
            default: break;
            }
            if(PUSH==1) {
              PUSH=0;
              if(SCREENA==0) {A=0;
                              output_high(pin_b3);
                              delay_us(100);
                              output_low(pin_b3);
                              fputc(1,pic);}
              if(SCREENA==1) {
                              output_high(pin_b3);
                              delay_us(100);
                              output_low(pin_b3);
                              fputc(4,pic);
                              hizayarlialt1();}
              if(SCREENA==2) {SCREENA=0;
                              b=1;
                              break;
                              }
              }
        }
        if(b==1) {b=0; 
                  break;}
      }
      
}



void zamanayarli(){
  LCD_Cmd(LCD_CLEAR);
  while(TRUE){
              if (input(pin_a6)){
                      
                  if(SCREENC==1) ScreenC=-1;
                  SCREENC++;
                  delay_ms(250);}
              if(input(pin_a7)){
                      
                  if(ScreenC==0) ScreenC=2;
                  ScreenC--;
                  delay_ms(250);}
        switch (SCREENC) {
            case 0:  
                    LCD_Goto(1,1);
                    LCD_Out(">20sn ayarli    ");
                    LCD_Goto(1,2);
                    LCD_Out(" Ust menu      ");
                    break;
            case 1:  
                    LCD_Goto(1,1);
                    LCD_Out(" 20sn ayarli    ");
                    LCD_Goto(1,2);
                    LCD_Out(">Ust menu      ");
                    break;        
            
            default:  break;
        }
        
        if(PUSH==1) {
              PUSH=0;
              if(SCREENc==0) {  screenc1=1;
                                ///// timer1 kesmesi buradaydı
                                break;}
              
              if(SCREENc==1) {  SCREENc=0;
                                break;
                              }
              }
  }
}

void digerayarlar(){
  LCD_Cmd(LCD_CLEAR);
  while(true){  
  if (input(pin_a6)){
                      
                  if(SCREENd==1) Screend=-1;
                  SCREENd++;
                  delay_ms(250);}
              if(input(pin_a7)){
                      
                  if(Screend==0) Screend=2;
                  Screend--;
                  delay_ms(250);}
  switch (SCREENd) {
            case 0:  
                    LCD_Goto(1,1);
                    LCD_Out(">Arka isik      ");
                    LCD_Goto(1,2);
                    LCD_Out(" Ana menuye don  ");
                    break;
            case 1:  
                    LCD_Goto(1,1);
                    LCD_Out(" Arka isik      ");
                    LCD_Goto(1,2);
                    LCD_Out(">Ana menuye don  ");
                    break;
}
  if(PUSH==1) {
              PUSH=0;
              if(SCREENd==0) nobacklight();
              if(SCREENd==1) {SCREENd=0;
                              backlight();
                                break;}
              }
  }
}
    
void main() {        // ANA FONKSİYON  
    
  
  enable_interrupts(INT_EXT);
  enable_interrupts(GLOBAL);
  ext_int_edge(H_TO_L);
    lcd_begin(0x4E);
  set_tris_b(0x01);
  while(TRUE){
      ilk();
      delay_ms(2000);
    while(TRUE){
                      
        if (input(pin_a6)){
                      
                  if(SCREEN==3) Screen=-1;
                  SCREEN++;
                  delay_ms(250);}
              if(input(pin_a7)){
                      
                  if(Screen==0) Screen=4;
                  Screen--;
                  delay_ms(250);}
        switch (SCREEN) {
            case 0:  
                    LCD_Goto(1,1);
                    LCD_Out(">Hiz ayarli      ");
                    LCD_Goto(1,2);
                    LCD_Out(" Zaman ayarli    ");
                    break;
            case 1:  
                    LCD_Goto(1,1);
                    LCD_Out(" Hiz ayarli      ");
                    LCD_Goto(1,2);
                    LCD_Out(">Zaman ayarli    ");
                    break;        
            case 2:  
                    LCD_Goto(1,1);
                    LCD_Out(">Diger ayarlar  ");
                    LCD_Goto(1,2);
                    LCD_Out(" Cikis          ");
                    break;
            case 3:  
                    LCD_Goto(1,1);
                    LCD_Out(" Diger ayarlar  ");
                    LCD_Goto(1,2);
                    LCD_Out(">Cikis          ");
                    break;
            default:  break;
        }
        
        if(PUSH==1) {
              PUSH=0;
              if(SCREEN==0) hizayarli();
              if(SCREEN==1) zamanayarli();
              if(SCREEN==2) digerayarlar();
              if(SCREEN==3) {  SCREEN=0;
                                break;
                              }
              }
            }
          }
}
 

Slave kodu

#include <12F675.h>
#use delay(clock=4MHz)
#fuses INTRC_IO,NOWDT,NOCPD,NOPROTECT,NOPUT,NOMCLR,NOBROWNOUT
#use rs232(baud=9600,rcv=pin_a5,stop=1,parity=N,bits=8,stream=pic)


const int adim[] = {0x01,0x03,0x02,0x06,0x04,0x14,0x10,0x11};
int i=0;

int thiz;
int A;

#int_timer0
void kesme(){
  
  if(A==5) {set_timer0(248);
              if(i>6) i=-1;
              i++;
              output_a(adim[i]);
}
    if(A==4) {set_timer0(thiz);
              if(i>6) i=-1;
              i++;
              output_a(adim[i]);
        }
}
        
#int_ra
void degisimkesmesi(){
  if(bit_test(input_change_a(),3)){
      A=fgetc(pic);
      }  
  }

void main()
{
  setup_adc(adc_off);
  setup_adc_ports(no_analogs);
  enable_interrupts(global);
  enable_interrupts(int_ra3);
  clear_interrupt(int_ra);
  setup_timer_0(T0_INTERNAL | T0_DIV_256);
  
  
  set_tris_a(0x28);
  output_a(0x00);
  
  while(TRUE)
  {
      if(A==1){ disable_interrupts(int_timer0);
      }
      if(A==5){ enable_interrupts(int_timer0);
              set_timer0(248);
      }
      if(A==4){ thiz=fgetc(pic);
      }
        }
}