UART veri göndermek ?

Başlatan bulut_01, 14 Aralık 2017, 00:56:00

bulut_01

iyi geceler arkadaslar uartdan 110 byte veri göndermek istiyorum putc veya print komutları ile bu ascii kodu nasıl gönderebilirim?  putc komutu ilk satırı gönderim dedim olmadı.
göndermek istediğim ascii kodlar bu;
C8 09 3B 23 62 30 54 45 53 54 3D D0 09 3B 23 62 30 54 45 53 54 3D D8 09 3B 23 62 30 54 45 53 54 3D D0 09 3B 23 62 30 54 45 53 54 3D D0 09 3B 23 62 30 54 45 53 54 3D D0 09 3B 23 62 30 54 45 53 54 3D D0 09 3B 23 62 30 54 45 53 54 3D D0 09 3B 23 62 30 54 45 53 54 3D 68 09 3B 23 62 30 54 45 53 54 3D 68 09 3B 23 62 30 54 45 53 54 3D

örnek yazdııgm kod;
#include <16F628A.h>
#FUSES NOWDT                    //No Watch Dog Timer
#fuses INTRC_IO                     
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOMCLR                   //Master Clear pin disabled
#FUSES NOCPD                    //No EE protection
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_B2,rcv=PIN_B1,PARITY=E,BITS=8,STOP=1,ERRORS)

#use fast_io(A) 
#use fast_io(B)

void main()
{
 
 setup_timer_1(T1_DISABLED);
 setup_comparator(NC_NC_NC_NC);
 setup_vref(FALSE);

set_tris_a(0b00000000);
set_tris_b(0b00000000);
 
 output_a(0x00);
 output_b(0x00);
 
 while(true){

int i;
char buffer[2]={'C','8'};

for(i=0;i<=100;i++){
putc(buffer[i]);
 
}}}
YENİLMEZ..

dumansiz

CCS C bilmiyorum ama;

#use rs232(baud=9600, xmit=PIN_B2,rcv=PIN_B1,PARITY=E,BITS=8,STOP=1,ERRORS)

Sadece bunu yazmak seri portun açılmasına yetiyor mu?
PARITY=E olarak kullanmışsın. Gönderdiğin tarafta da bu şekilde mi ayarlı.
PARITY=N yapıp deneyebilirsin.

Eğer seri port açıldıysa bile
set_tris_b(0b00000000);
 
 output_b(0x00);

bu komutlarla iptal ediyorsun.

for(i=0;i<=100;i++){
putc(buffer[i]);
 
}

2 elemanlı dizinin olmayan elemanlarına erişmeye çalışıyorsun. Yazılım saçmalayabilir. Ya dizini 101 elemanlı yap ya da; "i<2" koşulunu kullan.

makine_terbiyecisi

#include <16F628A.h>
#FUSES NOWDT                    //No Watch Dog Timer
#fuses INTRC_IO                     
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOMCLR                   //Master Clear pin disabled
#FUSES NOCPD                    //No EE protection
#use delay(clock=4000000)
#use rs232(UART1,baud=9600, xmit=PIN_B2,rcv=PIN_B1,PARITY=N,STREAM=DATA_SEND,BITS=8,STOP=1,ERRORS)

#use fast_io(A) 
#use fast_io(B)
 
void main()
{
 
set_tris_a(0b00000000);
set_tris_b(0b00000000);
 
 output_a(0x00);
 output_b(0x00);

 int i;
char *buffer[2]={'C','8'};
 while(true){

for(i=0;i<2;i++){
fprintf(DATA_SEND, "%s", buffer[i]);
 
}}}


Bu şekilde dene bakalım.

iyi çalışmalar.
# ÖĞRENELİM, ÖĞRETELİM #

bulut_01

Cvplarınız için saolun ilk satırı değilde hepsini birden nasıl gönderebilirim kolay yolu nedir buffer 110 byte ascii kodu yukardaki gibi tek tek mi yazmalıyım?
YENİLMEZ..

sadogan

1 byte gönderebiliyormusun ?


makine_terbiyecisi

Alıntı yapılan: bulut_01 - 14 Aralık 2017, 10:14:03
Cvplarınız için saolun ilk satırı değilde hepsini birden nasıl gönderebilirim kolay yolu nedir buffer 110 byte ascii kodu yukardaki gibi tek tek mi yazmalıyım?

Bir anda gönderemezsin. Çünkü UART seri haberleşme ile çalışır. Artı dataları 8 bit olarak gönderir.
Sen 110 byte yollasan bile program onu 8 bit kümeleri halinde sıra ile gönderir alıcı tarafa.
# ÖĞRENELİM, ÖĞRETELİM #

bulut_01

Üstad buffer bir sınırı var mı kaç byte kadar yazabiliyoruz?
char *buffer[110]={'C', '8', '0' ,'9', '3' ,'B...}  Şeklinde 110 byte veriyi yazacagım değil mi?
YENİLMEZ..

makine_terbiyecisi

Alıntı yapılan: bulut_01 - 14 Aralık 2017, 11:19:55
Üstad buffer bir sınırı var mı kaç byte kadar yazabiliyoruz?
char *buffer[110]={'C', '8', '0' ,'9', '3' ,'B...}  Şeklinde 110 byte veriyi yazacagım değil mi?

Kullandığın mikrokontrollörün ROM ve RAM belleğinin yetebileceği kadarını diziye tanımlayabilirsin.
örneğin char *data[9999] = { 'x', 'R', ... };
# ÖĞRENELİM, ÖĞRETELİM #

bulut_01

#8
üstad asagıdakı ccs derlemiyor data_send komutu bilinmeyen komut diye hata veriyor


int i;

char *buffer[2]={'C','8'};
 
 for(i=0;i<2;i++){
fprintf(DATA_SEND , "%s", buffer[i]);
YENİLMEZ..

bulut_01

Bu konuda yardımcı olurmusunuz arkadaslar.
YENİLMEZ..

baran123

Şu kısmı:
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1, PARITY=N, BITS=8, STOP=1, ERRORS)

Şu şekilde düzeltirsen hata vermez
#use rs232(UART1,baud=9600, xmit=PIN_B2, rcv=PIN_B1, PARITY=N, STREAM=DATA_SEND, BITS=8, STOP=1, ERRORS)

Sadece stream ismi tanımla ve parity bitine dikkat et alıcı taraftada aynısını yapman gerekiyor. Lazım değilse N olarak ver.

bulut_01

Alıntı yapılan: baran123 - 14 Aralık 2017, 16:08:01
Şu kısmı:
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1, PARITY=N, BITS=8, STOP=1, ERRORS)

Şu şekilde düzeltirsen hata vermez
#use rs232(UART1,baud=9600, xmit=PIN_B2, rcv=PIN_B1, PARITY=N, STREAM=DATA_SEND, BITS=8, STOP=1, ERRORS)

Sadece stream ismi tanımla ve parity bitine dikkat et alıcı taraftada aynısını yapman gerekiyor. Lazım değilse N olarak ver.


derleme sorunum gitti yanlız hiç data göndermiyor tx hep 5 volt var atladıgım kısım neresi ?

#include <16F628A.h>
#FUSES NOWDT                    //No Watch Dog Timer
#fuses INTRC_IO                     
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOMCLR                   //Master Clear pin disabled
#FUSES NOCPD                    //No EE protection
#use delay(clock=4000000)
#use rs232(UART1,baud=9600, xmit=PIN_B2,rcv=PIN_B1,PARITY=E,STREAM=DATA_SEND,BITS=8,STOP=1,ERRORS)

#use fast_io(A) 
#use fast_io(B)
 
void main()
{
 
set_tris_a(0b00000000);
set_tris_b(0b00000000);
 
 output_a(0x00);
 output_b(0x00);

 int i;
char *buffer[2]={'C','8'};

 while(true){

for(i=0;i<2;i++){
fprintf(DATA_SEND, "%s", buffer[i]);
 
}}}
YENİLMEZ..

baran123

Yapman istediğini tam olarak anlamadım.
C8 zaten bir hex kodu değilmi ? yani 0xC8 değil mi ? Neden tek tek gönderiyorsun ?
CCS kullanmıyorum ama şu şekilde ekrana C8 yazdırabilirsin tabi sen fprintf fonksiyonuna göre bunu düzenle
char buffer[2] = {'C', '8'};
    
for(int i = 0; i < 2; i++)
   printf("%c", buffer[i]);

bulut_01

Alıntı yapılan: baran123 - 14 Aralık 2017, 23:07:25
Yapman istediğini tam olarak anlamadım.
C8 zaten bir hex kodu değilmi ? yani 0xC8 değil mi ? Neden tek tek gönderiyorsun ?
CCS kullanmıyorum ama şu şekilde ekrana C8 yazdırabilirsin tabi sen fprintf fonksiyonuna göre bunu düzenle
char buffer[2] = {'C', '8'};
    
for(int i = 0; i < 2; i++)
   printf("%c", buffer[i]);


Mesele c8 değil o bir örnek mesele en basta yazdıgım 110 bytelık ascii kodlarını uart ile yollamak arkadasın yazdıgı örneğini denedim c8 göndermek için olmadı data gitmiyor bu uart konusunda yabancısıyım onun için sizlerden bilgi alıyorum.
YENİLMEZ..

makine_terbiyecisi

İlk olarak, TX ucunda hep 5V olması gayet doğal. Doğal çünkü stop biti TRUE yani lojik 1 dir. Lojik-1 demek 5V demek. Veri iletimi olmadığı zaman hep 5V seviyesinde olur.

İkincisi, data yollasan bile multimetre ile bunu görme şansın olmayabilir. Osiloskop yardımıyla verinin gidip gitmediğini anlayabilirsin.
Her bir veri gönderiminde tx ucu lojik-0 'a çekilir. Yani 0V olur. Veri iletimi bitince tekrar 5V a çıkar. Yani veri iletimi esnasında osiloskopta bir kare dalga görürsün.

Üçüncüsü, veriyi nereye gönderiyorsun?

iyi çalışmalar.
# ÖĞRENELİM, ÖĞRETELİM #