20Mhz de 600baud ayarlayamıyorum

Başlatan Eren Eraslan, 16 Temmuz 2013, 15:45:31

Eren Eraslan

Merhabalar bi projede 20Mhz kristal kullanmam gerekiyor ve bu projede udea nın arx atx kitlerini kullanmaktayım. Sorun ise 20mhz de 600 baud a ayarlayamıyorum out of range diyor derleyici... 1200 baud da ise haberleştiremiyorum zaten
bu sorunu nasıl aşabilirim
teşekkürler
insanın içine işleyen şarkılar ;  https://soundcloud.com/reeraslan

AsHeS

#1
Alıntı yapılan: ereneraslan7 - 16 Temmuz 2013, 15:45:31
Merhabalar bi projede 20Mhz kristal kullanmam gerekiyor ve bu projede udea nın arx atx kitlerini kullanmaktayım. Sorun ise 20mhz de 600 baud a ayarlayamıyorum out of range diyor derleyici... 1200 baud da ise haberleştiremiyorum zaten
bu sorunu nasıl aşabilirim
teşekkürler
Donanımsal olarak 16f887 de mümkün değil mesela yazılımsal olarak yapın.
Edit:Fikir verebilir XC8 de yazılmıştır.
void SOFTUARTput(unsigned char kar)
{
    unsigned char indis = 0, x[8];
    for (indis = 0; indis < 8; indis++)
        x[indis] = kar &(0x01 << indis);//UART anında zaman optimizasyonu
    PORTBbits.RB0 = 0;
    __delay_us(834);

    for (indis = 0; indis < 8; indis++)
    {
        if (x[indis])
            PORTBbits.RB0 = 1;
        else
            PORTBbits.RB0 = 0;
        __delay_us(834);
    }
    PORTBbits.RB0 = 1;
    __delay_us(834);
}

MrDarK

uart fonksiyonunu force_sw yapın , yazılımsal uarta dönüştürsün ;)
Picproje Eğitim Gönüllüleri ~ MrDarK

Tagli

16 bitlik baud rate generator'u olan modellerde donanımsal olarak da yapılabilir.

PIC16F887'de mümkün mesela, ancak PIC16F877A'da yapılamaz.
Gökçe Tağlıoğlu

Eren Eraslan

#4
Alıntı yapılan: MrDarK - 16 Temmuz 2013, 15:53:15
uart fonksiyonunu force_sw yapın , yazılımsal uarta dönüştürsün ;)

hocam dediğiniz şeye pek aşina olamadım biraz açıklayabilirmisiniz yada örnek dökümanınız var mı?

mesaj birleştirme:: 16 Temmuz 2013, 15:55:56



mesaj birleştirme:: 16 Temmuz 2013, 15:57:22

Alıntı yapılan: AsHeS35 - 16 Temmuz 2013, 15:47:38
Donanımsal olarak 16f887 de mümkün değil mesela yazılımsal olarak yapın.
Edit:Fikir verebilir XC8 de yazılmıştır.
void SOFTUARTput(unsigned char kar)
{
    unsigned char indis = 0, x[8];
    for (indis = 0; indis < 8; indis++)
        x[indis] = kar &(0x01 << indis);//UART anında zaman optimizasyonu
    PORTBbits.RB0 = 0;
    __delay_us(834);

    for (indis = 0; indis < 8; indis++)
    {
        if (x[indis])
            PORTBbits.RB0 = 1;
        else
            PORTBbits.RB0 = 0;
        __delay_us(834);
    }
    PORTBbits.RB0 = 1;
    __delay_us(834);
}


hocam açıkcası birşey anlamadım koddan
insanın içine işleyen şarkılar ;  https://soundcloud.com/reeraslan

AsHeS

Alıntı yapılan: Tagli - 16 Temmuz 2013, 15:54:17
16 bitlik baud rate generator'u olan modellerde donanımsal olarak da yapılabilir.

PIC16F887'de mümkün mesela, ancak PIC16F877A'da yapılamaz.
Veri formatını 0x00+veri olarak değiştirirse evet ama 8-bitlik uart kullanırken pek mümkün gözükmüyor.

MrDarK

#use rs232 (baud=600, xmit=pin_b1, rcv=pin_b0, parity=N, stop=1,ERRORS,stream=blue,bits=8,force_sw)

force_sw yazıldığı zaman -> donanımsal pinleri kullansan bile yazılımsal çalışır

bu arada stream ise bu haberleşmede kullandığım nik isimdir. Birden fazla UART lazım olduğunda kullanmak zorunda kalıyorsun.

Kullanım şekli ;

puts("Deneme",blue);

veya

fprintf(blue,"Deneme");    // Şeklinde ;)
Picproje Eğitim Gönüllüleri ~ MrDarK

AsHeS

Alıntı yapılan: ereneraslan7 - 16 Temmuz 2013, 15:55:28
hocam açıkcası birşey anlamadım koddan
Eğer çok düşük hızlarda UART ihtiyacınız varsa yüksek saat frekansında RS232 veri formatında veri çıkartıyor RB0 pininden fonksiyon basit olarak bunu yapıyor.

Eren Eraslan

bu arada bunu kullanma sebebim udea nın rf kitlerini 1200 baudda çalıştıramamış olmamdı. daha önceden 4mhz de 600 baudda çokca çalıştırmıştım 20mhz geçince sorun oldu . bu konuda tecrübeli arkadaşlarım yüksek baudda çalıştırabildimi udeaları?
insanın içine işleyen şarkılar ;  https://soundcloud.com/reeraslan

Tagli

Olayın veri formatıyla ilgisi yok. Baud rate generator (BRG), donanımsal USART'ın iki bit arasındaki zamanı belirlemesini sağlayan bir çeşit sayaçtır, yani timer0 gibi ama dışarıdan erişime kapalı. Eski modellerde bu sayaç 8 bitlik idi, bu sebeple düşük hızlar veya yüksek zaman hassasiyeti gerektiğinde yetersiz kalıyordu. Yeni modellerde BRG istenirse 16 bit olarak ayarlanabiliyor. Böylece içine 255'ten yüksek değerler de girilebiliyor ve iyice yavaşlatılabiliyor. Bunun için destekleyen modellerde BRG16 bitinin 1 yapılması gerekiyor. PIC16F887'nin datasheet'indeki tabloda 20 MHz kristal ile 300 bps bile yer alıyor. Kabaca 20 bps'ye kadar düşülebileceğini tahmin ediyorum, artık kimin ne işine yararsa tabi o hız...
Gökçe Tağlıoğlu

AsHeS

#10
Alıntı yapılan: Tagli - 16 Temmuz 2013, 16:04:16
Olayın veri formatıyla ilgisi yok. Baud rate generator (BRG), donanımsal USART'ın iki bit arasındaki zamanı belirlemesini sağlayan bir çeşit sayaçtır, yani timer0 gibi ama dışarıdan erişime kapalı. Eski modellerde bu sayaç 8 bitlik idi, bu sebeple düşük hızlar veya yüksek zaman hassasiyeti gerektiğinde yetersiz kalıyordu. Yeni modellerde BRG istenirse 16 bit olarak ayarlanabiliyor. Böylece içine 255'ten yüksek değerler de girilebiliyor ve iyice yavaşlatılabiliyor. Bunun için destekleyen modellerde BRG16 bitinin 1 yapılması gerekiyor. PIC16F887'nin datasheet'indeki tabloda 20 MHz kristal ile 300 bps bile yer alıyor. Kabaca 20 bps'ye kadar düşülebileceğini tahmin ediyorum, artık kimin ne işine yararsa tabi o hız...
Ben 16-bit hadisesini veriyi gönderirken olarak algılamıştım,  basitçe sadece baud üretecini değiştiriyormuş.
bit 3 BRG16: 16-bit Baud Rate Generator bit
1 = 16-bit Baud Rate Generator is used
0 = 8-bit Baud Rate Generator is used

mesaj birleştirme:: 16 Temmuz 2013, 16:12:19

Alıntı yapılan: ereneraslan7 - 16 Temmuz 2013, 16:02:55
bu arada bunu kullanma sebebim udea nın rf kitlerini 1200 baudda çalıştıramamış olmamdı. daha önceden 4mhz de 600 baudda çokca çalıştırmıştım 20mhz geçince sorun oldu . bu konuda tecrübeli arkadaşlarım yüksek baudda çalıştırabildimi udeaları?
2400 baud antensiz 3 metre çalıştırdım ama az çekiyor diye işi abartıp Preamble bölümüne çok yüklenmiştim paternin gücü alıcıya gitsin diye (120 byte 0xAA ve 0x55) göndermiştim. 1200 baudda rahatça çalışıyor ama preamble+senkron+veri formatıyla atmanız önerilir.
Ayrıca anten polarizasyona göre anten takarsanız daha da rahatlarsınız.

Eren Eraslan

klasik udea protokolünü kullanıyorum antenlerde 10cm uzunluğunda tek damarlı kablolar neden çalışmadı anlamadım

verici kısmı

#include <16F877A.h>

#use delay(clock=20000000)


#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOPUT                    //No Power Up Timer
#FUSES NODEBUG                  //No Debug mode for ICD

#FUSES NOWRT                    //Program memory not write protected

//====== LCD Tanıtılıyor ==========//


//==============================/

//=======RS232 AYARLARI========//
#use rs232 (baud=600,  xmit=pin_C6, rcv=pin_C7, parity=N, stop=1,ERRORS,stream=blue,bits=8,force_sw)

#use fast_io(b)
//=============================//



void main()
{
set_tris_b(0b00100000);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);

while (1) {
if(input(pin_b5)==0)
{
putc(0b01010101);       //wake up buddy
putc(0b01010101);  
putc(0b01010101);  
putc(0b01010101);  
putc('X');              //i am coming from x 
putc('A');              //thats what i want to send
delay_ms(10);
output_high(pin_b1);
delay_ms(70);
output_low(pin_b1);
delay_ms(70);
output_high(pin_b0);
delay_ms(70);
output_low(pin_b0);
delay_ms(70);

}      
     
   }
}


alıcı kısmı ise
#include <16F628.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(crystal=20000000)

#define LED PIN_B0
#define DELAY 1000
#use fast_io(b)
int i;
#use rs232 (baud=600, xmit=pin_b2, rcv=pin_b1, parity=N, stop=1,ERRORS,bits=8,force_sw)

void main()
{
set_tris_b(0x00); 
  
   /*
       for(i=0;i<3;i++)
       {
       output_low(LED);
      delay_ms(222);
      output_high(LED);
      delay_ms(222);
       }*/
       
   while(true)
   {
CHAR n;
if(getc()=='X')
{ //öncü veriyi aldıysan
n=getc();
if(n=='A')
{
       for(i=0;i<5;i++)
       {
       output_low(LED);
      delay_ms(DELAY);
      output_high(LED);
      delay_ms(DELAY);
       }

}
}

   
   }

}
insanın içine işleyen şarkılar ;  https://soundcloud.com/reeraslan

AsHeS

Anten 17.3 cm olmalı UDEA'nın sitesinde ki katalogda okuduğumu hatırlıyorum.
http://www.udea.com.tr/dokumanlar/ATX-34S%20KILAVUZ.PDF
5.sayfada gereken ayrıntılar mevcut sizin için.

Eren Eraslan

Alıntı yapılan: AsHeS35 - 16 Temmuz 2013, 16:27:31
Anten 17.3 cm olmalı UDEA'nın sitesinde ki katalogda okuduğumu hatırlıyorum.
http://www.udea.com.tr/dokumanlar/ATX-34S%20KILAVUZ.PDF
5.sayfada gereken ayrıntılar mevcut sizin için.

hocam anten boyundan ziyade benim verici 3.3v ile çalışıyor alıcı ise 5v . vericide buffer devresi var transistörler ile buyrun resmi
ben böylesine daha önce çalıştırdım fakat neden çalışmıyor şimdi anlamadım
insanın içine işleyen şarkılar ;  https://soundcloud.com/reeraslan