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]);
}}}
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.
#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.
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?
1 byte gönderebiliyormusun ?
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.
Ü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?
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', ... };
ü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]);
Bu konuda yardımcı olurmusunuz arkadaslar.
Ş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.
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]);
}}}
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]);
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.
İ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.
Alıntı yapılan: makine_terbiyecisi - 15 Aralık 2017, 10:51:59
İ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.
Similasyonu proteusda yapıyorum virtual terminaldan da osiloskop da baktım veri gitmiyor yani hep 5 volt var hiç bir tepki yok tx pininde onun için gitmiyor dedim
set_tris_b(0b00000010);
Bu şekilde düzenle bakalım. Burada pin_B1 rx olduğu için input olmalı. Belki sorun budur.
Alıntı yapılan: makine_terbiyecisi - 15 Aralık 2017, 15:04:00
set_tris_b(0b00000010);
Bu şekilde düzenle bakalım. Burada pin_B1 rx olduğu için input olmalı. Belki sorun budur.
Alakası yok "%s" yerine "%c" yazınca veri göndermeye basladı bu sefer 34 43 gibi saçma sapan göndermeye başladı C. 8 göndermesi lazımken buffer daki veriyi neden farklı veri gidiyor olabilir?
Göndermeden önce bu veriyi nasıl almak istediğinizi
belirleseniz daha iyi olmaz mı?
Gönderdiğiniz veri nereden başlayacak, nerede bitecek?
Alıcı kısımın senkron olacağı bir durum vermek zorundasınız.
Veri yolu asenkron ama siz veri iletimi yaparken senkron
durumu yakalayacak bir veri bloğu yollamalısınız...
Memet hocam en basta yazdıgımı burayada yazayım elimde 110 byte ascii kodlar var karşı tarafa bozulmadan bu dataları aynen iletmem lazım bu kodları com portan dinlediğim kodlar ibus hattındaki veriler bu verileri teype yollayıp teyp acılısını sağlıyorum bunu pc den yapıyorum kücük kart yapıp uartan yollayıp teyp aktif etmek istiyorum kodlar bunlar;
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
Yazarken de anlaşılamıyorsunuz. Noktalama işaretleri
kullansanız da söylediklerinizi anlasam?
Acele etmeden sakin sakin anlatın.
#include <16F628A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#use delay(internal=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8,stream=PORT1,errors)
volatile const int veri[]={
0xC8,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0xD0,0x09,0x3B,0x23,0x62,0x30,0x54,
0x45,0x53,0x54,0x3D,0xD8,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0xD0,0x09,0x3B,
0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0xD0,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,
0x3D,0xD0,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0xD0,0x09,0x3B,0x23,0x62,0x30,
0x54,0x45,0x53,0x54,0x3D,0xD0,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0x68,0x09,
0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0x68,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,
0x54,0x3D};
void main()
{
while(TRUE)
{
for(int i=0;i<110;i++)
printf("%X ",veri[i]);
printf("\n");
delay_ms(200);
}
}
@omereliusuk güzel program yapmış.
F628 gibi giriş seviyesi piclerle çalışırken, aynı zamanda düzgün kod yszabilmek için değişmeyecek değerlerin const olarak tanımlanması; efektif hafıza kullanımı için önemli.
Umarım konuyu açan da aradığı cevabı bulmuştur.
Ömer hocam saolasın burda printf("\n"); komutu ne iş yapıyor? Ayrıca neden delay 200 ms kullandınız senkronu saglamak için mi bu süre?
iyi aksamlar arkadaslar ömer arkadasımızın yazdıgı kodlar proteusda çalısıyor şöyle bir sorun var gercek devrede sacma sapan hex kodları geliyor sebebini ugrastım ama çözemedim proteus ile gerçek devre arasında neden bu kadar fark var? proteusda 110 byte buffer verisinin aynısını alıyorum gercekte sacma sapan 332 byte veri alıyorum bu farklılıgın nedeni sizce nedir ? not: comport ayarları ile pic uart ayarları aynıdır.
proteusda okugudum kodlar;
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
buda gercek devrenin comportu ile okudugum kodlar;
F2 1E 7E 3E 8D BF 99 7B BF 9B 99 BF 93 9B BF 99 9F BF 95 97 BF 97 95 BF 95 99 BF 95 97 BF 99 77 BF 77 9F BF 9F 8D BF 99 7B BF 9B 99 BF 93 9B BF 99 9F BF 95 97 BF 97 95 BF 95 99 BF 95 97 BF 99 77 BF 77 8F BF 9F 8D BF 99 7B BF 9B 99 BF 93 9B BF 99 9F BF 95 97 BF 97 95 BF 95 99 BF 95 97 BF 99 77 BF 77 9F BF 9F 8D BF 99 7B BF 9B 99 BF 93 9B BF 99 9F BF 95 97 BF 97 95 BF 95 99 BF 95 97 BF 99 77 BF 77 9F BF 9F 8D BF 99 7B BF 9B 99 BF 93 9B BF 99 9F BF 95 97 BF 97 95 BF 95 99 BF 95 97 BF 99 77 BF 77 9F BF 9F 8D BF 99 7B BF 9B 99 BF 93 9B BF 99 9F BF 95 97 BF 97 95 BF 95 99 BF 95 97 BF 99 77 BF 77 9F BF 9F 8D BF 99 7B BF 9B 99 BF 93 9B BF 99 9F BF 95 97 BF 97 95 BF 95 99 BF 95 97 BF 99 77 BF 77 9F BF 9F 8D BF 99 7B BF 9B 99 BF 93 9B BF 99 9F BF 95 97 BF 97 95 BF 95 99 BF 95 97 BF 99 77 BF 93 8F BF 9F 8D BF 99 7B BF 9B 99 BF 93 9B BF 99 9F BF 95 97 BF 97 95 BF 95 99 BF 95 97 BF 99 77 BF 93 8F BF 9F 8D BF 99 7B BF 9B 99 BF 93 9B BF 99 9F BF 95 97 BF 97 95 BF 95 99 BF 95 97 BF 99 77 BF EB 00
buda kaynak kodum;
#include <16F628A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#use delay(internal=4000000)
#use rs232(baud=9600,parity=E,xmit=PIN_B2,rcv=PIN_B1,bits=8,stream=PORT1,stop=1,errors)
#use fast_io(A)
#use fast_io(B)
volatile const int veri[]={
0xC8,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0xD0,0x09,0x3B,0x23,0x62,0x30,0x54,
0x45,0x53,0x54,0x3D,0xD8,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0xD0,0x09,0x3B,
0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0xD0,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,
0x3D,0xD0,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0xD0,0x09,0x3B,0x23,0x62,0x30,
0x54,0x45,0x53,0x54,0x3D,0xD0,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0x68,0x09,
0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0x68,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,
0x54,0x3D};
void main()
{
setup_timer_1(T1_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_tris_a(0b00010000);
set_tris_b(0b00000010);
output_a(0x00);
output_b(0x00);
int i=0;
while(TRUE){
if(i<110){
for(i=0;i<110;i++)
printf("%X ",veri[i]);
printf("\n");
delay_ms(200);
}}}
volatile const int veri[]={
0xC8,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,
0xD0,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,
0xD8,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,
0xD0,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,
0xD0,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,
0xD0,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,
0xD0,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,
0xD0,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,
0x68,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,
0x68,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D};
int i=0;
void main()
{
while(TRUE)
{
printf("\r");
for(int i=0;i<110;i++)
{printf(" %X",veri[i]); if(veri[i]==0x3d) printf("\r"); delay_ms(250); }
delay_ms(2000);
}
}
proteusta bir dener misiniz. TEKERRÜR var. bakmanızda yarar var. bir de hangi türden veri aktarılacak karakter mi ascii mi byte mı bunlar önemli. ben hexadecimal olarak aktardım. belki sizin haberleşeceğiniz ürün ascii olarak haberleşiyor.
http://slideplayer.biz.tr/slide/2676167/10/images/16/0-127+Standart+128-255+Geni%C5%9Fletilmi%C5%9F.jpg (http://slideplayer.biz.tr/slide/2676167/10/images/16/0-127+Standart+128-255+Geni%C5%9Fletilmi%C5%9F.jpg)
ömer üstadım yardımların için tşk ederim pc nin comportundan okunan deger üst resimdeki pic den en altdaki resmideki gibi tx göndermem lazım son gönderdiğin kodda anlasımsız veriler geliyor proteus ile gercek devre farklı bir birini tutmuyor.proteus ile gercek neden bir birini tutmuyor anlamıyorum.
ayrıca ilk örnek proteusda normal calısıyor ama gercek devrede farklı calısıyor mesele burda Üstad.
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
son kod ile gelen veriler
(https://i.hizliresim.com/bLmkVG.jpg)
proteusdaki gelen veriler
(https://i.hizliresim.com/kXmG8r.jpg)
dogru olan sekli burdaki gibi okumam lazım aynısı
(https://i.hizliresim.com/kXmGD7.jpg)
È ; # b 0 T E S T =
Ğ ; # b 0 T E S T =
Ø ; # b 0 T E S T =
Ğ ; # b 0 T E S T =
Ğ ; # b 0 T E S T =
Ğ ; # b 0 T E S T =
Ğ ; # b 0 T E S T =
Ğ ; # b 0 T E S T =
h ; # b 0 T E S T =
h ; # b 0 T E S T =
text olarak seçimi yapar mısınız? karakter haberleşiyor gibi
https://drive.google.com/open?id=1Hq059VJQbZtxOCVE-oD38FYqoljMl2tt
şu programı kullanır mısınız.
üstad sag taraftaki text ayrıca verdiğin link erişim engellendi uyarısı verip acılmadı.
(https://i.hizliresim.com/zJ9346.jpg)
senin ilk yazdıgın kodun text gelen verisi yanlıs veri geliyor.son yazdıgın örnekdede anlamsız veriler geliyor ; # b 0 T E S T = böyle gelmesi lazımken.
(https://i.hizliresim.com/EykgOz.jpg)
while(TRUE)
{
for(int i=0;i<110;i++)
{printf(" %c",veri); }
delay_ms(400);
}
şu anda aklıma başka bir şey gelmiyor. bu protokolün kullanım yerini veya kullanılan ürünü belirtirseniz daha verimli ilerleyebilirsiniz.
üstad araç teyp de ibus portu var simdi teyp araç dışında oldugu için teypin ibus portna C8 ile baslayan hex kodunu gönderip teyp enable yapmak için küçük bir devre yaptım pic tx portundan teyp ibus hattına c8 ile baslaya 110 byte veri göndermem lazım ilk yazdıgınız örnek proteusda istediğim gibi data gönderiyor hatasız sekilde ama gercek devreye kod yükleyip tx portunu dinleyince alakasız veriler geliyor işin içinden çıkamadııgm nokta proteusda dogru calısan kod gercek devrede anlamsız veriler geliyor tabi dogal olarak veri yanlıs geldıgı ıcın teyp enable olmuyor mesele budur üstad.
buda olmadı maglesef.
Alıntı yapılan: omereliusuk - 17 Aralık 2017, 00:08:38
while(TRUE)
{
for(int i=0;i<110;i++)
{printf(" %c",veri); }
delay_ms(400);
}
Merhaba,
Serial port utility programında,text radio butonu değil de hex butonunu işaretler misiniz?
Alıntı yapılan: kudretuzuner - 17 Aralık 2017, 11:46:52
Merhaba,
Serial port utility programında,text radio butonu değil de hex butonunu işaretler misiniz?
Hocam hex seçili hali ile yukardaki resimlerde mevcut garip garip veriler geliyor gerçek devrede halbükü proteusda düzgün çalışan kod işin içinden çıkamadım use rs232 ayar kısmında atladıgım yada yanlıs yazdıgım bölüm mü var bulamadım.
Merhaba,
Yukarıda gördüğüm "received sending "resimde,text button işaretli.
Hocam 2 sayfada resimler var ordan bakabilirsiniz ilginiz için tşk ederim.
eğer yanlış anlamadıysam verileri direkt pic ten bilgisayar'a aktarıyorsunuz ve öyle izliyorsunuz. pic'i programlarken ne kullanıyorsunuz. belki pic'te bir sorun olabilir. 16f628a kullanıyor olmalısınız. ayrıca programlarken hex config kullanmalısınız. ekstra herhangi bir konfigürasyon kullanmamalısınız.
Pic tx portunu direk pc nin com portundan okudugum için mi farklı veriler görüyorum? Max232 gibi devre mi kullanmalıyım araya pic ile pc nin com portunun arasına o zmn veriyi düzgün okurmuyum?
Pickit3 ıcsp ile programlıyorum pic smd kılıf.
Alıntı yapılan: bulut_01 - 17 Aralık 2017, 19:01:42
Pic tx portunu direk pc nin com portundan okudugum için mi farklı veriler görüyorum? Max232 gibi devre mi kullanmalıyım araya pic ile pc nin com portunun arasına o zmn veriyi düzgün okurmuyum?
böyle bir devre kurun.Max232
veya
hc05 hc06 gibi bir bluetooth module kullanabilirsiniz. bilgisayar için de bluetooth modul gerekir. veya cep telefonundan bluetooth ile izleyebilirsiniz.
arduino varsa elinizde usb-comport olarak kullanabilirsiniz.
Arada max232 gibi devre olmadıgı için mi mantıksız değerler görüyorum sebebi bu o zaman? Proteus ile gercek devre farklılıgı burdan geliyor sanırım.
Merhaba,
"Arada max232 gibi devre olmadıgı için mi mantıksız değerler görüyorum sebebi bu o zaman? Proteus ile gercek devre farklılıgı burdan geliyor sanırım."
Data alış verişlerde hangi portu kullanıyorsunuz? Seri iletişimi RS232 porttan yapıyorsanız max232,USB pottan yapıyorsanız FT232R kullanmanız gerekir.
Hocam rs232 baglantı yapıyorum max232 ile devre kurmak lazım.
@bulut_01 "ibus portu" olarak tabir ettiğiniz port hakkında biraz daha bilgi verebilir misiniz?
Referans aldığınız bir cihaz var ise o cihazın donanımını da inceleyebilirsiniz.
Burada bir "bus" hattı varsa durum farklı bir hal alabilir. MAX232 yerine "ibus" arayüzü(interface) kullanmanız gerekebilir.
Bu bus hattına bağlı diğer birimler kendi aralarında sürekli haberleşiyor olabilirler.
"Dinleme" dediğiniz şeyi nasıl yaptınız? "Logic analyzer" ile mi?
Alıntı yapılan: dumansiz - 18 Aralık 2017, 12:50:47
@bulut_01
"ibus portu" olarak tabir ettiğiniz port hakkında biraz daha bilgi verebilir misiniz?
Referans aldığınız bir cihaz var ise o cihazın donanımını da inceleyebilirsiniz.
Burada bir "bus" hattı varsa durum farklı bir hal alabilir. MAX232 yerine "ibus" arayüzü(interface) kullanmanız gerekebilir.
Bu bus hattına bağlı diğer birimler kendi aralarında sürekli haberleşiyor olabilirler.
"Dinleme" dediğiniz şeyi nasıl yaptınız? "Logic analyzer" ile mi?
Üstad araba teypi araç içinde ibus haberleşerek enable oluyor I bus analyzr bir program var pc de o test kodu oluşturuyor farklı bir pc ile comport ile dinleyip hex kodlarını kopyaladım pc den seri port aracılıgıyla teypin ibus hattına gönderdiğimde kaydettiğim hex kodu teyp açılıyor bu işlemi pc değilde pic ile yapmak istedim ama kodlarda sıkıntı var pcden kayıtlı hex kodu pic ile aynısını gönderemedim. Comport ile teypin ibus hattı arasına bir direnç ve transistörlü küçük bir devre var.
Bilgisayardaki dinleme yazılımı, bunun gibi birşey mi:
http://www.tessera.co.jp/board/eng/ibus/apieb2.html (http://www.tessera.co.jp/board/eng/ibus/apieb2.html)
IEBus diye birşey var:
http://www.wikizero.org/index.php?q=aHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSUVCdXM
https://elinux.org/images/e/e1/UPD72042.pdf
Eğer aynı şey ise iebus hakkında biraz döküman okumak gerekir.
Onlar değil usta serial port utility diye masa üstü pro resimdede adı yazıyor.
IBUS BMW arabalarda multimedia cihazlar icin kullanilan bir multimedia haberlesme hattidir.
@bulut_01 asagidaki link isinize yarayabilir.
http://www.reslers.de/IBUS/ (http://www.reslers.de/IBUS/)
Alıntı yapılan: mufitsozen - 18 Aralık 2017, 14:08:00
IBUS BMW arabalarda multimedia cihazlar icin kullanilan bir multimedia haberlesme hattidir.
@bulut_01 asagidaki link isinize yarayabilir.
http://www.reslers.de/IBUS/ (http://www.reslers.de/IBUS/)
Hocam i bus analyzr programını burdan indirdim zaten programın test olarak gönderdiği kodu pic ile gönderim dedim ama olmadı kodda sıkıntılar çıktı hex olarak gönderdiğim veriler text olarak gidiyor burda takıldım. Ayrıca almanlar işi biliyor bmw şaheser gibi bir araba :D
Diyorum bmw teypleri neden hiç çalınmıyor adamlar önlemini almışlar her konuda helal olsun.
@mufitsozen in verdiği linkleri incelediniz mi?
http://www.yeint.ru/suppliers/melexis/pdf/TH3122_004.pdf (http://www.yeint.ru/suppliers/melexis/pdf/TH3122_004.pdf)
6.sayfada örnek uygulama var.
SENSE ucu ile hattı dinleyeceksiniz boş olduğunda UART'tan veriyi göndereceksiniz.
MAX232 kullanmanıza gerek yok. TH3122 veya muadilini kullanacaksınız.
110 bytelık veri dediniz ama Aslında 11 byte uzunluğunda 10 tane paket var orada.
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
Her paket arasına bekleme konabilir. Her bir pakete karşı taraftan cevap gelebilir.
Alıntı yapılan: dumansiz - 18 Aralık 2017, 17:07:51
@mufitsozen in verdiği linkleri incelediniz mi?
http://www.yeint.ru/suppliers/melexis/pdf/TH3122_004.pdf (http://www.yeint.ru/suppliers/melexis/pdf/TH3122_004.pdf)
6.sayfada örnek uygulama var.
SENSE ucu ile hattı dinleyeceksiniz boş olduğunda UART'tan veriyi göndereceksiniz.
MAX232 kullanmanıza gerek yok. TH3122 veya muadilini kullanacaksınız.
110 bytelık veri dediniz ama Aslında 11 byte uzunluğunda 10 tane paket var orada.
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
Her paket arasına bekleme konabilir. Her bir pakete karşı taraftan cevap gelebilir.
Gönderme arasında bekleme gibi bir durum yok aslında bu hex paket codu pic ile gönderemedim
yardımcı olan butun arkadarlara tsk ederim uart ile teyp calıstırdım code son hali budur saolun.
#include <16F628A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#use delay(internal=4000000)
#use rs232(baud=9600,parity=E,xmit=PIN_B2,rcv=PIN_B1,bits=8,stream=UART1,stop=0,errors)
#use fast_io(A)
#use fast_io(B)
int i=0;
int s=0,w=0;
volatile const int veri[]={
0xC8,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0xD0,0x09,0x3B,0x23,0x62,0x30,0x54,
0x45,0x53,0x54,0x3D,0xD8,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0xD0,0x09,0x3B,
0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0xD0,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,
0x3D,0xD0,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0xD0,0x09,0x3B,0x23,0x62,0x30,
0x54,0x45,0x53,0x54,0x3D,0xD0,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0x68,0x09,
0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0x68,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,
0x54,0x3D};
void main()
{
setup_timer_1(T1_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_tris_a(0b00010000);
set_tris_b(0b00000010);
output_a(0x00);
output_b(0x00);
while(TRUE){
if(i==110){
s++;
if(s==3){
w=1;}}
if(w==0){
for(i=0;i<110;i++)
printf("%C",veri[i]);
}}}
uart tanımlaması yapıldıktan sonra
char buffer[110]={'C', '8', '0' ,'9', '3' ,'B...}
int sayac;
for (sayac=0;sayac < 110;sayac++){
putc(buffer[sayac]);
}
tx pini çıkış olarak ayarlanmalı.
saygılar
Konuyu Açan'A; Önerim
1- Usart ı iyi çalış nasıl gönderilir nasıl alınır. Datasheet leri çok dikkatli oku.
2- UART tan seri haberleşme ile göndereceğin verileri tek seferde gönderemezsin. Peşpeşe gönderebilir ve alırsın.Hal böyleyken peşpeşe göndereceğin dataların UART tan gittiğini ve diğer datayı sıraya koyman gerektiğini kontrol etmen gerekir. Aynı şekilde alımlarda bu şekilde yürür. Bu durumda Anahtar kelimen; Veri gönderirken PIR registerinin TXIF bitini her gönderim öncesinde yani sıradaki datayı UART a yollamadan önce kontrol etmen gerekir. Aksi halde UART hatası alırsın.
1. önerimi okurken net bir şekilde görebilirsin.
Sevgiler.
Kesmesiz UART üzerinden Dizi Gönderimlerinde şu şekilde bir yol izlenebilir.
//*****************************************************************************
// TX SERIAL
//input:
// len: Data uzunluğu
// data: Gönderilecek dizi
//Örnek:
// unsigned int8 Send_Zeros[3]={0x00,0x01,0x02}; //UART Hattına Gönderilecek Dizi örneği 3 byte
//
// TX_Serial (sizeof(Send_zeros),Send_Zeros);
//*****************************************************************************
void TX_Serial(unsigned int8 len, unsigned int8* data)
{
unsigned int8 pStr;
pStr = 0;
while (pStr!=len)
{ // dizi gönder
while (TXIF == 0)
{;} // bekle
delay_cycles( 10 ); // 10xNOP
TXREG = data[pStr++]; // karakter gönder
}
}
Alıntı yapılan: Pyrodigy - 03 Ocak 2018, 21:15:31
Kesmesiz UART üzerinden Dizi Gönderimlerinde şu şekilde bir yol izlenebilir.
//*****************************************************************************
// TX SERIAL
//input:
// len: Data uzunluğu
// data: Gönderilecek dizi
//Örnek:
// unsigned int8 Send_Zeros[3]={0x00,0x01,0x02}; //UART Hattına Gönderilecek Dizi örneği 3 byte
//
// TX_Serial (sizeof(Send_zeros),Send_Zeros);
//*****************************************************************************
void TX_Serial(unsigned int8 len, unsigned int8* data)
{
unsigned int8 pStr;
pStr = 0;
while (pStr!=len)
{ // dizi gönder
while (TXIF == 0)
{;} // bekle
delay_cycles( 10 ); // 10xNOP
TXREG = data[pStr++]; // karakter gönder
}
}
Ben bu dili bilmiyorum son yazdıgım kod sorunsuz çalışıyor hata ile karşılaşmadım.
#include <16F628A.h>
#use delay(internal=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8,stream=PORT1,errors)
#define maxLenght 110
int startTx=0;
int stopTx=10;
volatile const int veri[maxLenght]={
0xC8,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0xD0,0x09,0x3B,0x23,0x62,0x30,0x54,
0x45,0x53,0x54,0x3D,0xD8,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0xD0,0x09,0x3B,
0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0xD0,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,
0x3D,0xD0,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0xD0,0x09,0x3B,0x23,0x62,0x30,
0x54,0x45,0x53,0x54,0x3D,0xD0,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0x68,0x09,
0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0x68,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,
0x54,0x3D};
#INT_TBE
void TBE_isr(void)
{
if((startTx++)<stopTx)printf("%c",veri[startTx-1]);
if(startTx==stopTx)disable_interrupts(int_tbe);
}
#INT_RDA
void RDA_isr(void)
{
}
void main()
{
enable_interrupts(INT_TBE);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while(TRUE)
{
if(!input(pin_b0)){while(!input(pin_b0));startTx=0;stopTx=10;enable_interrupts(int_tbe);}
}
}
startTx=0;stopTx=10;enable_interrupts(int_tbe);
bu kodu her gördüğünde yeniden veri aktarımına başlayacak. sona gelince bitirecek. bu arada başka işlerle uğraşabileceksiniz. ben bunu b0 portuna bağladım.
Alıntı yapılan: omereliusuk - 05 Ocak 2018, 00:36:22
#include <16F628A.h>
#use delay(internal=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8,stream=PORT1,errors)
#define maxLenght 110
int startTx=0;
int stopTx=10;
volatile const int veri[maxLenght]={
0xC8,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0xD0,0x09,0x3B,0x23,0x62,0x30,0x54,
0x45,0x53,0x54,0x3D,0xD8,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0xD0,0x09,0x3B,
0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0xD0,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,
0x3D,0xD0,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0xD0,0x09,0x3B,0x23,0x62,0x30,
0x54,0x45,0x53,0x54,0x3D,0xD0,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0x68,0x09,
0x3B,0x23,0x62,0x30,0x54,0x45,0x53,0x54,0x3D,0x68,0x09,0x3B,0x23,0x62,0x30,0x54,0x45,0x53,
0x54,0x3D};
#INT_TBE
void TBE_isr(void)
{
if((startTx++)<stopTx)printf("%c",veri[startTx-1]);
if(startTx==stopTx)disable_interrupts(int_tbe);
}
#INT_RDA
void RDA_isr(void)
{
}
void main()
{
enable_interrupts(INT_TBE);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while(TRUE)
{
if(!input(pin_b0)){while(!input(pin_b0));startTx=0;stopTx=10;enable_interrupts(int_tbe);}
}
}
startTx=0;stopTx=10;enable_interrupts(int_tbe);
bu kodu her gördüğünde yeniden veri aktarımına başlayacak. sona gelince bitirecek. bu arada başka işlerle uğraşabileceksiniz. ben bunu b0 portuna bağladım.
Eyw saol üstad farklı ve güzel yazım şekli her örnekte yeni birseyler ögreniyoruz.