gsm uygulamasında pic gelen mesajı okuyamıyor yardım

Başlatan tigris, 20 Aralık 2013, 23:14:30

tigris

merhaba arkadaşlar ben samsung e 250 cep telefonunu kullanarak telefona gelen mesajları İSİS te lcd ekranda yazdırmaya çalışıyorum fakat mesajı gets, getch gibi komutları kullanarak çekemiyorum nerede hata yapıyorum lütfen yardım edin....((cep telefonunu usb ile bilgisayara bağlıyorum))
Yazdığım kodlar ve isis simulasyonunu aşağıya ekledim nerede yanlışlık var.



#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use fast_io(b)
#define use_portb_lcd TRUE
#include <lcd.c>

char msg[70];
int i=1;

void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   
   set_tris_b(0x00);
   
   lcd_init();
   
   printf(lcd_putc,"\fSiSTEM BASLiYOR");
   delay_ms(100);
   
   printf("ATE0\r");
   delay_ms(100);
   
   printf("AT\r");
   delay_ms(100);
   
   printf("AT+IPR=9600\r");
   delay_ms(100);
   
   printf("AT+CMGF=1\r");
   delay_ms(100);
   
   printf("AT+CNMI=1,2,0,0,0\r");
   delay_ms(100);
   
   enable_interrupts(GLOBAL);
   enable_interrupts(int_rda);
   while(1);
}

#int_rda
void serihaberlesme_kesmesi()
{
 disable_interrupts(int_rda);
 if (i>5)
 {
 gets(msg);
 printf(lcd_putc,"\f%s",msg);
 }
 i++;
}

Gökhan BEKEN

Uart kesmesi kullanın derim. Kesme içine yazacağınız kodlarda enter kontrolü yapın, enter gelene kadar her geleni belirttiğiniz diziye aktarsın, aktarma işi bittikten sonra yani enter geldikten sonra bir fonksiyon çağırın, o fonksiyonda LCD'ye yazdırma gibi işlemler yapın.
Özel mesaj okumuyorum, lütfen göndermeyin.

tigris

Alıntı yapılan: meftun - 21 Aralık 2013, 02:02:46
Uart kesmesi kullanın derim. Kesme içine yazacağınız kodlarda enter kontrolü yapın, enter gelene kadar her geleni belirttiğiniz diziye aktarsın, aktarma işi bittikten sonra yani enter geldikten sonra bir fonksiyon çağırın, o fonksiyonda LCD'ye yazdırma gibi işlemler yapın.
şimdi virtual terminalde pic in rx ucuna verinin doğru bir şekilde geldiğini görebiliyoruz OK cevaplarını da TX ucuna bağlı olan terminalde görüyoruz gelen giden verilerde sıkıntı yok eğer bilgiler picin seri iletişim pinlerine doğru bir şekilde geliyorsa neden veriyi çekemiyoruz.ayrıca da farklı algoritmalar da denedim mesela hiç kesme kullanmadan sadece telefonda kayıtlı olan bir mesajı okuyup LCD e yazdırma ama yine mesaj bilgilerinin terminalle rx ucuna ulaştığını gördüm ama bir türlü o mesajı pice alamadım CCS C derleyicisi hatada vermiyor yani.
ayrıca uart kullanmayı deneyin dediniz uartın ne farkı var int_rda dan.

esensoy

Birincisi max232den sonra 7404 görüyorum, isiste çalışıyor belki ama gerçek devreye koymayın,
Yazdığınız gibi bir interrupt rutini doğru değil, interrupt içinde yalnız bilgi alınmalı, kalanı ana programda halledilmeli,
kesme içine disable_interrupts koymuşsunuz, ilk kesmeye girdiğinde rda interruptı kapatılıyor, bir dahada açılmıyor,
gets komutunu da hiç kullanmadım, kullanmayı da doğru bulmuyorum, kontrol sizden çıkıyor genelde,

Ben olsam;
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use fast_io(b)
#define use_portb_lcd TRUE
#include <lcd.c>

char msg[70];
int i=1,j=0;
int1 enter_geldi=FALSE;

#int_rda
void serihaberlesme_kesmesi(){
msg[j]=getc();
    if (msg[j]==0x0D){
        enter_geldi=TRUE;
        disable_interrupts(int_rda);
    }
j++;
}

void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   
   set_tris_b(0x00);
   
   lcd_init();
   
   printf(lcd_putc,"\fSiSTEM BASLiYOR");
   delay_ms(100);
   
   printf("ATE0\r");
   delay_ms(100);
   
   printf("AT\r");
   delay_ms(100);
   
   printf("AT+IPR=9600\r");
   delay_ms(100);
   
   printf("AT+CMGF=1\r");
   delay_ms(100);
   
   printf("AT+CNMI=1,2,0,0,0\r");
   delay_ms(100);
   
   enable_interrupts(GLOBAL);
   enable_interrupts(int_rda);
   while(1){
       if(enter_geldi==TRUE){
          // işlemleri yap;
          j=0;
          enable_interrupts(int_rda);
       }
    }
}


Bu yazdığım kodda çok hızlı bir iletişimde kesme rutini içindeki disable_interrrupts tan ana dögündeki while içindeki enable_interrupts a gelene kadar kod kaçırabilir, test edilmelidir,
Kaçırıyor ise kesme içine ring buffer mantığıyla çalışan bir kod yazmak gerekecektir.
En tehlikeli an "zafer" anıdır.

tigris

Alıntı yapılan: esensoy - 21 Aralık 2013, 08:51:59
Birincisi max232den sonra 7404 görüyorum, isiste çalışıyor belki ama gerçek devreye koymayın,
Yazdığınız gibi bir interrupt rutini doğru değil, interrupt içinde yalnız bilgi alınmalı, kalanı ana programda halledilmeli,
kesme içine disable_interrupts koymuşsunuz, ilk kesmeye girdiğinde rda interruptı kapatılıyor, bir dahada açılmıyor,
gets komutunu da hiç kullanmadım, kullanmayı da doğru bulmuyorum, kontrol sizden çıkıyor genelde,

Ben olsam;
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use fast_io(b)
#define use_portb_lcd TRUE
#include <lcd.c>

char msg[70];
int i=1,j=0;
int1 enter_geldi=FALSE;

#int_rda
void serihaberlesme_kesmesi(){
msg[j]=getc();
    if (msg[j]==0x0D){
        enter_geldi=TRUE;
        disable_interrupts(int_rda);
    }
j++;
}

void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   
   set_tris_b(0x00);
   
   lcd_init();
   
   printf(lcd_putc,"\fSiSTEM BASLiYOR");
   delay_ms(100);
   
   printf("ATE0\r");
   delay_ms(100);
   
   printf("AT\r");
   delay_ms(100);
   
   printf("AT+IPR=9600\r");
   delay_ms(100);
   
   printf("AT+CMGF=1\r");
   delay_ms(100);
   
   printf("AT+CNMI=1,2,0,0,0\r");
   delay_ms(100);
   
   enable_interrupts(GLOBAL);
   enable_interrupts(int_rda);
   while(1){
       if(enter_geldi==TRUE){
          // işlemleri yap;
          j=0;
          enable_interrupts(int_rda);
       }
    }
}


Bu yazdığım kodda çok hızlı bir iletişimde kesme rutini içindeki disable_interrrupts tan ana dögündeki while içindeki enable_interrupts a gelene kadar kod kaçırabilir, test edilmelidir,
Kaçırıyor ise kesme içine ring buffer mantığıyla çalışan bir kod yazmak gerekecektir.
arkadaşım cevap verdiğinden dolayı çok teşekkür ederim.Gönderdiğin kodların aynısını denedim değiştirip denedim daha farklı şeyler denedim ama msg=getc(); işlemini yapmıyor kanımca ayrıca kesme kullanmadan sadece telefonda kayıtlı bir mesajı okuyup lcd e yazmayı da denedim o da olmuyor.ayrıca pic ile com arasına max232 koymadanda isiste çalışıyor orası sıkıntı değil asıl sıkıntı getc(); komutuyla veri okuyamıyorum. rx ucundaki veriyi okumanın farklı bir komutu veya algoritması yok mudur .

tigris

buffer tam olarak ne oluyor ve buffer kullanarak veriyi rx ucundan nasıl çekeriz böyle bir uygulamada

tigris

sorun çözüldü AT+CMGR=1 komutunu telefona gönderdiğimde gelen cevap 5 satır oluyor. Bunlar 1- boşluk, 2-numara ve tarihin olduğu satır,3-asıl mesajın olduğu kısım, 4-boşluk,ve son olarak 5- OK cevabı 5 defa gets(değişken); komutuyla satırları okuyup istediğimiz satırı alıp işlemlerimizi ona göre yapıyoruz...

esensoy

7404 ü kaldırdınız mı duruyor mu? amacı nedir merak ediyorum?
En tehlikeli an "zafer" anıdır.

tigris

Alıntı yapılan: esensoy - 23 Aralık 2013, 08:53:34
7404 ü kaldırdınız mı duruyor mu? amacı nedir merak ediyorum?
telefonla pic i haberleştirmek için çok fazla kombinasyon denedim resimdeki bağlantıyıda buna benzer bir uygulamada görmüştüm o yüzden kullandım ama şimdi pice direk compin bağlıyorum araya max232 ve 7404 de koymuyorum.Neden 7404 kullanılmış açıkçası bende pek anlamadım.Ayrıca dikkat edilmesi gereken en önemli nokta compin in rx ve tx uçları picin rx ve tx uçlarına bağlanılıyor rx-tx, tx-rx çaprazlaması yapılmıyor gsm uygulamalarında.