Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

seri iletişim de hata?

Başlatan forumsad, 13 Ocak 2011, 02:17:26

forumsad

internetden mehmet arkadaşımızın pic628 ile yaptığı örnek çok güzel di örnegi 16f877a 'ya uyarlamaya çalıştım

kod ilk veri geldiğinde düzgün çalışıyor ikinci veride aptallaşıyor
mesela  islem2() ye gitmiyor gelen veriyi lcd de görüyorum doğru geliyor ama alt satırda gözüküyor

sorun nerde olabilir acaba????
#include "E:\elektronik\ccs_c\ccs_uygulamalar\877\RS232\1\main.h"



#define use_portd_lcd TRUE //lcd bilgisi için port d'yi kullanıyoruz
#include <LCD.C>   //2x16 LCD


#use rs232 (baud = 9600, xmit = pin_C6, rcv = pin_C7, stop = 1, parity = N)
//#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)



void islem1();
void islem2();
void islem3();
void islem4();


void veri()
 { 
   char x[80];
  

   gets(x);
 
   if(x[0]=='A')
   islem1();
   if(x[0]=='B')
   islem2();
   if(x[0]=='C')
   islem3();
   if(x[0]=='D')
   islem4();
   
   printf(lcd_putc,"\f%s",x);  //LCD'yi temizle ve x string ifadesini LCD'de göster
 
   return;
 }
void islem1()
 { 
    output_toggle(pin_b0);
    
 }

void islem2()
 { 
   output_toggle(pin_b1);
  
 }
 void islem3()
 { 
    output_toggle(pin_b2);
    
 }
 void islem4()
 { 
    output_toggle(pin_b3);
    
 }
 
 
 
 
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);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);


lcd_init();
   // TODO: USER CODE!!
   set_tris_a(0x00);    //porta çıkış
   set_tris_b(0x00);    //portb giriş
   set_tris_c(0b10000000);    //portc 
   set_tris_d(0x00);    //portd çıkış
   set_tris_e(0x00);    //porte çıkış
   


 printf(lcd_putc,"\f MEHM@");
   

output_b(0x00);
 while(1)
  {
    veri();
  }
}


**************************************************************************************************************

main.h
#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected


#use delay(clock=4000000)



[IMG]http://pic1.resimupload.com/r5/thumb_391565490.jpg[/img]

Oblivion

Eğer veri doğru geliyor ama sadece LCD de göründüğü yer yanlış ise sorunun LCD.c' de olmalı. LCD kodlarını yazabilir misin?

Digimensch

#2
printf(lcd_putc,"\f%s",x);
satirini

printf(lcd_putc,"\f%c",x);
olarak degistirin bakalim olacakmi??

bir ikincisi Serial Port'dan  veri dizisi mi gönderiyorsunuz yoksa sadece karektermi?
karekter ise
x'i dizi olarak değilde  sadece char x; seklinde degisken olarak tanimlamaniz yeterli, cünkü zaten sadece
x[0]'i sürekli kontrol ediyorsunuz öyleyse , tek karekterlik bir degisken tanimlamaniz yeterli saniyorum...

forumsad

bu örneği internetden buldum örnegin pic 628 li orjinali düzgün çalışıyor ....

aynı uygulamayı 877a ile yapmaya çalıştım...

printf(lcd_putc,"\f%c",x);  bu şekilde yazdığımda lcd hatalı gösterdi

burda lcd^den önce programın gelen karekteri tanıyıp ledi yakmaması daha önemli bir sıkıntı...

mesela B ye tıkladığımda ilğili led yanıyor lcd gösteriyor .....sorun yok
A'ya bastığımızda lcd'nin ikinci satırında karekter gözüküyor ama led yanmıyor

örnek uygulamayı burdan indirdim
http://www.4shared.com/file/220486899/90b18bb5/seriport_uygulama.html

teşekkürler

Digimensch

#4
Yukardaki Kodu 877'ye göre degistirmissiniz belki Fuses ayarlarinda bir hata yapmis olabilirsiniz.
Degistirdiginiz kodu göremedigim icin birsey diyemiyecegim.Birde Su kodu deneyin bakalilim 877 icin yazilmis...
olursa araya artik Ledleri yakmak icin if(); sartlarini yerlestiririsiniz.
Kodda  RDA kesmesi kullanilmis. !!!!

#include <16f877.h>     // Kullanýlacak denetleyicinin baþlýk dosyasý tanýtýlýyor.

// Denetleyici konfigürasyon ayarlarý
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanýlacak osilatör frekansý belirtiliyor.

#define use_portb_lcd TRUE   // LCD B portuna baðlý

#include <lcd.c>   // lcd.c dosyasý tanýtýlýyor

#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1) // Buradki ayarlari kendine göre degistir 
char   klavye[80];  // klavye isminde 80 üyeli bir dizi tanimlaniyor

#int_rda                                 // RX ucuna veri gelince meydane gelen kesme
void serihaberlesme_kesmesi ()
{
   disable_interrupts(int_rda);          // int_rda kesmesini pasif yap
   output_high(pin_c5);                  // RC5 çýkýþý lojik-1
   gets(klavye);                         // String ifadeyi al ve "klavye" adlý dizi deðiþkenine aktar.
   printf("\n\rYazdiginiz Metin>  %s\n",klavye);     // Satýr atla, yeni satýr,RS232 üzerinden klavye string ifadesini gönder,satýr atla
   printf(lcd_putc,"\f%s",klavye);       //LCD'yi temizle ve klavye string ifadesini LCD'de göster
   output_low(pin_c5);                   // RC5 çýkýþý lojik-0
   printf("\n\rKlavyeden bir metin giriniz ve enter tusuna basiniz>"); // Satýr atla, yeni satýr,RS232 üzerinden belirtilen metni gönder
}

/********* ANA PROGRAM********/

void main ( )
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dýþý
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dýþý
   setup_timer_1(T1_DISABLED);     // T1 zamanlayýcýsý devre dýþý
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayýcýsý devre dýþý
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriþ yok
   setup_adc(ADC_OFF);             // ADC birimi devre dýþý
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dýþý
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dýþý

   output_low(pin_c5);             // RC5 çýkýþý ilk anda sýfýrlanýyor
   lcd_init();                     // LCD'yi hazýrla

   printf("\r**************** Merhaba *********************"); // Yeni satýr, RS232 üzerinden belirtilen metni gönder ve satýr atla.
   printf("\n\rKlavyeden girdiginiz bilgiler LCD'de gorunecektir\n\n"); // Satýr atla, yeni satýr, RS232 üzerinden belirtilen metni gönder
   printf("\n\rKlavyeden bir metin giriniz ve enter tusuna basiniz>"); // Satýr atla, yeni satýr,RS232 üzerinden belirtilen metni gönder

   enable_interrupts(GLOBAL);  // Aktif edilen tüm kesmelere izin ver

   while(1) // Sonsuz döngü
   {
      enable_interrupts(int_rda); // int_rda kesmesi aktif
   }
}

forumsad

teşekkürler bu örnek çözmeme yardımcı olur inşallah..

Oblivion

Alıntı yapılan: forumsad - 13 Ocak 2011, 23:35:40

...mesela B ye tıkladığımda ilğili led yanıyor lcd gösteriyor .....sorun yok
A'ya bastığımızda lcd'nin ikinci satırında karekter gözüküyor ama led yanmıyor....


Eğer CCS'in kurulumu ile birlikte gelen 16F877a.h dosyasını kullanıyorsan kodlarını derlemen bile mucize olmuş. O dosyaya bakarsan PIN_A7 diye birşeyin tanımlanmadığını görürsün. A portunun pinleri 5'e kadar tanımlanmıştır. O nedenle proramın gerekli işi yapsa bile led yanmayacaktır. Sana tavsiyem "PIN_A7" kısmını "PIN_A5" olarak değiştirip denemen...

forumsad

port a yı  kullanmadığım için sorun olmadı

örnekleri kurcalayarak uygulamaları çalıştırdım şimdi

projede hem #int_rda kesmesi hemde #int_rb  kesmesi kullanacağım birazdan ikisini aynı kod içinde kullanmaya çalışacağım bakalım ne olacak...

bu arada iki kesmeden birisine öncelik verme olayı vardı burayı biraz açabilirmisiniz....

mesela rb kesmesi gerçekleşti sonra main'e döndü satır satır kodları işletirken birden rda kesmesi keldi  bu durumda pic ne yapıyor
rda kesmesine dönerse main bölümünde işi yarım kalır

burayı biraz açabilirmisiniz   saygılarımla

teşekkürler