CSS C ile bilginin tersini almak

Başlatan ossyle, 02 Aralık 2007, 18:59:38

ossyle

Merhaba.

CSS C ile bir bilginin tersini nasıl alabiliriz acaba ? Seri porttan Max232 yardımı ile haberleşmeye çalışıyorum fakat Max232 bilgiyi tersliyor. Bunu programda tekrar tersleyip gerçek bilgiyi elde etmeye çalışıyorum. Bu konuda yardımcı olursanız sevinirim.

Şimdiden teşekkürler.

piedos

Einstein: "Only two things are infinite, the universe and human stupidity, and I'm not sure about the former."

ossyle

Teşekkürler bu gece deneyeceğim.

SpeedyX

#use RS232 direktifinde "invert" diye bir seçenek bulunuyor zaten

ferdem

Siz kodunuzda herhangi bir ek bildirimde bulunmadıysanız max232 nin terslememesi lazım, zaten max232 nin tersleme gibi bir huyu yoktur:)

Terslediğini nasıl tesbit ettiniz? Osiloskopla mı baktınız? Seri iletişimi gerçeklemeden önce simülasyonunu yaptınız değil mi? Enteresandır bir defasında ben de verinin terslendiğine şahit olmuştum(osiloskopta) ancak sonra kodda herhangi bir değişiklik yapmaksızın düzelmişti ancak olanları pek iyi hatırlamıyorum(!) Sonrasındaki uygulamalarda hiç olmadı sanırım o zaman da iyi yapılamamış bağlantılardan olmuştu.

ossyle

Alıntı yapılan: "ferdem"Siz kodunuzda herhangi bir ek bildirimde bulunmadıysanız max232 nin terslememesi lazım, zaten max232 nin tersleme gibi bir huyu yoktur:)

Terslediğini nasıl tesbit ettiniz? Osiloskopla mı baktınız? Seri iletişimi gerçeklemeden önce simülasyonunu yaptınız değil mi? Enteresandır bir defasında ben de verinin terslendiğine şahit olmuştum(osiloskopta) ancak sonra kodda herhangi bir değişiklik yapmaksızın düzelmişti ancak olanları pek iyi hatırlamıyorum(!) Sonrasındaki uygulamalarda hiç olmadı sanırım o zaman da iyi yapılamamış bağlantılardan olmuştu.

Bende ilk defa seri haberleşme ile uğraşıyorum ondan dolayı zorlanıyorum. Max232'yi aşağıdaki gibi bir devrede deniyorum. Max232'ye verdiğim data ve aldığım dataya Proteusta virtual teminal ile bakıyorum birbirinden farklılar. Bir yerde okudum datayı tersliyor max232 diye bende onun üzerine araştırma yapıyordum. #rs232 inverti ilede sayi=~sayi; ilede başarılı olamadım. Mesela max232'nin çıkışına not kapısı koyup not çıkışına virtual terminal ile baktığımda gönderdiğim veriyi görüyorum. İşte devre ve kodlar bir yanlışlık varsa yardımlarınızı bekliyorum.

Max232 terslemesini kontrol ettiğim devre: Not kapısı varken gönderdiğimi alıyorum. Yokken değişik saçma bişiler alıyorum.



Program için kullandığım devre:


Program.c
#include "C:\Program Files\PICC\Projects\628max232.h"

int deg;
   
void main()
{
   setup_oscillator(OSC_4MHZ);
   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);

while(1)
{
deg=getc();
putc(deg);
}
}

Program.h
#include <16F628A.h>

#FUSES NOWDT                 	//No Watch Dog Timer
#FUSES INTRC_IO              	//Internal RC Osc, no CLKOUT
#FUSES NOPUT                 	//No Power Up Timer
#FUSES PROTECT               	//Code protected from reads
#FUSES NOBROWNOUT            	//No brownout reset
#FUSES NOMCLR                	//Master Clear pin used for I/O
#FUSES NOLVP                 	//No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                 	//No EE protection

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B0,rcv=PIN_B1,bits=8)

Ziya

Alıntı yapılan: "SpeedyX"#use RS232 direktifinde "invert" diye bir seçenek bulunuyor zaten
Bu soft uartta geçerli değil mi? Hardware uartta da geçerliyse verinin önce tümleyenini alıyor demektir.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

MURSEL

arkadaşım picin rx tx uçlarını  10 k ile + uca cekermisin  şekilde göremedim de

ossyle

Şekle tıklarsanız yeni sayfada büyük hali açılıyor. Kolay gözüküyor. İlginiz için teşekkürler. Yardım bekliyorum cıldıracam yoksa   :(

MURSEL

görebildigim şekillerde  bahsettigim olay yok  direncler cekilmemiş

SpeedyX

Alıntı yapılan: "Ziya"
Alıntı yapılan: "SpeedyX"#use RS232 direktifinde "invert" diye bir seçenek bulunuyor zaten
Bu soft uartta geçerli değil mi? Hardware uartta da geçerliyse verinin önce tümleyenini alıyor demektir.

Invert the polarity of the serial pins (normally not needed when level converter, such as the MAX232). May not be used with the internal UART.
demiş.

MAX232 terslemez demiş oda..
Belki yeni versiyonlarında içeride comf yapacağı için may not be used... demişlerdir.

ferdem

Devre şemasını verince mesele çözüldü :)


Seri portun pinlerinin yerini karıştırmışsınız, seri portta gördüğünüz TX(transmitter) bilgisayardan gelen(transmitted) veriyi temsil ediyor, dolayısıyla MAX232 entegresinin RS232 inputlarından birine verilmeli. Aynı şekilde RX pini bilgisayara giden ya da bilgisayar tarafından alınan(received) veriyi temsil edeceğinden MAX232 nin RS232 outputlarından birine verilmeli. Sizin devrenizde bu tam tersi, pic ten gelen TTL verinin RS232 karşılığını seri portun outputuna bağlamışsınız(inputuna bağlamanız gerekirken), aynı şekilde receiver de ters.

Bu durumda seri porta giden TX, RX pinlerine giren kabloların yerini değiştirirseniz bu problem hallolur, diğer durumlarda problem yoksa çalışması gerekir. Tabi toprağı bağlamayı unutmayın, bilgisayar+max232+pic li devrenin bir toprağı olacak(ki anlaşabilsinler), bir de "bilgisayar-picli devre bağlantısı yapılırken her iki tarafın da enerjili olmaması gerekir" uyarısı yapılır, aksi halde seri portunuza veya picinize zarar gelebilir, yani tüm bağlantıları yapın en son pice enerji verin(ben bu durumla hiç karşılaşmadım, bir araşıtırın isterseniz).

Son olarak:

#use rs232(baud=9600,xmit=PIN_B0,rcv=PIN_B1) işinizi görecektir parity bitle uğraşmayın, parity bit kontrolü için seri portun diğer pinlerini de bağlamanız gerekiyor olabilir(!) çünkü bir şekilde parity bit uyuşmazsa alıcı taraf "tekrar gönder" diyecek, pic bunu hangi pinden diyecek(!) bilgisayarınız bunu nasıl anlayacak(!) bağlantıları olmadan. Bu yüzden parity kontrol şu durumda anlamsız.

Kolay gelsin, iyi çalışmalar.

ossyle

Alıntı yapılan: "ferdem"Devre şemasını verince mesele çözüldü :)


Seri portun pinlerinin yerini karıştırmışsınız, seri portta gördüğünüz TX(transmitter) bilgisayardan gelen(transmitted) veriyi temsil ediyor, dolayısıyla MAX232 entegresinin RS232 inputlarından birine verilmeli. Aynı şekilde RX pini bilgisayara giden ya da bilgisayar tarafından alınan(received) veriyi temsil edeceğinden MAX232 nin RS232 outputlarından birine verilmeli. Sizin devrenizde bu tam tersi, pic ten gelen TTL verinin RS232 karşılığını seri portun outputuna bağlamışsınız(inputuna bağlamanız gerekirken), aynı şekilde receiver de ters.

Pinlerde bir karışıklık yok. Evet ters bağlı çünkü similasyonda kullandığım port com2 portu. Proteus çalıştığında com2 portunu sadece kendi kullanımına ayırıyor, başka bir program ile com2 portuna bilgi yollayamıyoruz. Bunun için com1 ve com2 bağlantılarını çapraz kablo ile birbirine bağladım. Bu şekilde com1 den yolladığımı com2 den alıyorum. Similasyondada com1'den com2'ye gelen bilgiyi almam gerekyiği için RX bacağını gelen bilgi için, TX bacağını göndereceğim bilgi için kullanıyorum.

ferdem

Hımm, bilemeyeceğim. Eğer gelen veriyi tersleyip okuduğunuzda doğru okuyorsanız demek ki veri bir şekilde tersleniyor. Ben zamanında terslemeden kullanmıştım, düzgün çalışıyordu, hatta baskı devresi hala duruyor, lazım oldukça kullanıyorum, baskısı burda : https://www.picproje.org/index.php/topic,17573

ossyle

Max232 kullanarak devre üzerinde deneme yapmadım henüz ama Proteus'a güvenerek söylüyorum terslerdiğini. Dün gece PIC'in dahili osilatörü yerine 4Mhz kristal osilatör yaptım ve bu şekilde deneme yaptım. Arada max232 olmadan direk rs232 porta bağladım. Pic devamlı porta "Sayı" yazıyor, bilgisayarda manasız birşeyler çıkıyor. Dikkat ettim S harfinin HEX karşılığını alıyor ve HEX karşılığına denk gelen DEC harfi basıyor. Mesela S harfinin HEX değeri xx, bunu alıyor ve decimal xx olan harfi basıyor.

S-- 01010011 bunun tersini alıyor 10101100 ve ¬ karakterini ekrana basıyor.  Programda bilgiyi terslemek istedim rs232 tanımlamalarına invert seçeneğini ekledim bilgi yine düzelmedi. Gönderdiğim bilgi gonder=~gonder; diyerek gonderdim yine olmadı. Bu akşam araya bir max232 koyarak devrede deneyeceğim bakalım sonuç ne olacak. Dün gece denemeler sırasında saat gece yarısını geçtiği için max232 ile denemeye zamanım olmadı :) Bu akşam inşallah.

rs232 tanımlamalarındaki invert ve gonder=~gonder; şeklinde programda neden tersleyemediğim konusunda yorumu olan var mı acaba ?