Serial Porta bagli PIC16F84A 'yi kontrol etmek.

Başlatan Digimensch, 14 Ekim 2003, 13:49:37

Digimensch

Ben Pic16F84A 'yi  su sekilde programlayacagim.
RAO bitine PC'nin Serial Portundan gelecek Ascii koduna göre
PortB bitlerine bagli ledlerin yanmasini istiyorum.
Yani Klavyenin 1 Numarali tusuna basinca Pic'in RB0 bacagina bagli Ledin  Klavyenin 2 Numarali tusuna basinaca Pic'in RB1 bacagina bagli Ledin
Klavyenin 3 Numarali tusuna basinaca Pic'in RB2 bacagina bagli Ledin
Klavyenin 4 Numarali tusuna basinaca Pic'in RB3 bacagina bagli Ledin  yanmasini istiyorum.
PC den Serial Porta Ascii kodlarini yollama islemini C++ Builder ile yapmak istiyorum.Bu isi C++ Builder ile nasil yapabilirim?Yani C++ ile Serial Portu nasil acabilirim ve TxD bacagina Ascii kodlarini nasil gönderebilirim?
Bana bu konuda örnek kod ile bilgi verirseniz sevinirim.
saygilar

Digimensch

Arkadaslar su yukardaki sorumla ilgili bana yardimci olacak yokmu?

bmutlu

Alıntı yapılan: "Digimensch"Arkadaslar su yukardaki sorumla ilgili bana yardimci olacak yokmu?

İlk önce C++ builder i brak çünkü onun seri port kompanentini bulman gerekir bunu bulamazsan yapman çok zor. VB ile yapmaya kalkarsan bu işi senin için daha kolay olur çünkü seriport komponenti zaten içinde vardır.
PIC kısmını ise bu formu iyi gez burada seri port ile ilgili bilgiler var.Sana tavsiyem PIC asm sini bilmiyor isen PBP basic kompaylır veya  ccs gibi c kompaylır gibi yuksek seviyeli bir dil ile bu işlemini daha kolay halledersin. Kolaygelsin.

birumher

Birkan.Herguner

Digimensch

Aslinda ben bir örnek program buldum fakat Serial Porta gönderecegim ascii kodu nereye nasil yazacagimi bir türlü beceremedim.Acaba su asagidaki kodu aciklayabilecek varmi?Yada bu  örnek ile Klavyenin 1 Numarali tusuna basinca bu tusun ascii kodunu Serial Porta iletecek bir örnek yapabilecek varmi?
Kod söyle
---------------------------
#include<windows.h>
//#include<ras.h>
//#include<raseapif.h>
HANDLE hComm;
hComm = CreateFile( gszPort,  
                   GENERIC_READ | GENERIC_WRITE,
                   0,
                   0,
                   OPEN_EXISTING,
                   FILE_FLAG_OVERLAPPED,
                   0);
if(hComm==INVALID_HANDLE_VALUE)
   {  
Application->MessageBox("Fehler beim Ínitialisieren der Schnittstelle.\n\n"
                               "Schnittstelle nicht vorhanden, oder ein anderes\n"
                               "Programm hat diese noch geöffnet.",ComPort.c_str(),MB_ICONEXCLAMATION);
       return(false);
}

WriteFile(hComm,        // der Datei oder was auch immer
             &DATA,          //&DATA, Daten die Du schreiben willst (Puffer)
             sizeof(DATA),   //Die grösse der Daten zum schreiben
             &D_WRITTEN,     //Gibt zurück wieviel geschrieben wurde
             NULL);
Err = GetLastError(); //Letzten Fehler ermitteln
return 0;
CloseHandle(hComm)
}

birumher

Bence hazır bir class veya component bul. Ben bu işi delphi de DCComms diye bir component seti ile yapıyorum. Bu componenti Visual C ye de tanıtabilirsin sanıyorum.
ama illa ki C kodu istiyorsan al sana denenmiş kod. Klavyeye bastığını gönderiyor. Baud rate vs. ayarlarını da yapıyorsun. Com portun adresini bilmen lazım. Kodda zaten açıklamalar da var.
_bios_serialcom(1,COM1,in); satırı karakter gönderiyor. in içerisindeki karakteri değiştirerek istrediğini gönderirsin...


#include<bios.h>
#include<conio.h>
#include<dos.h>
#include<stdio.h>

#define DTR 0x01 //Data Terminal Ready..
#define RTS 0x02 //Ready To Send
#define COM1PORT 0x0000 //Pointer to location of COM1 port
#define COM2PORT 0x0002 //Pointer to location of COM2 port
#define COM1 0
#define COM2 1
#define DATA_READY 0x100
#define FALSE 0
#define TRUE !FALSE

#define SETTINGS (0xE0 | 0x00 | 0x02 | 0x00) //9600,N,7,1

int main(void)
{
int in,out,status;
int DONE=FALSE;
int far *RS232_Addr;

/* Determine port location of COM1..
0x40:0x00= COM1 I/O port address
0x40:0x02= COM2 I/O port address
*/

RS232_Addr=(int *far)MK_FP(0x0040,COM1PORT);
if(!*RS232_Addr)
return -1;

_bios_serialcom(0,COM1,SETTINGS);
printf("...BIOSCOM [ESC] to exit..\n");

while(!DONE)
{
// Reset DTR and RTS to prepare for send/receive of next character..
outportb(*RS232_Addr+4,DTR|RTS);

//Get status of com port
status=_bios_serialcom(3,COM1,0);
if(status & DATA_READY)
// There's a character on the port. Get it and echo
if((out=_bios_serialcom(2,COM1,0) & 0x7F) !=0)
putch(out);

if(kbhit()) // key has been struck.get it and send to port
if((in=getch())=='\x1B')
//user pressed ESCAPE.don't send to port..
DONE=TRUE;
else
//send character to com port..
_bios_serialcom(1,COM1,in);

}
return 0;
}
Birkan.Herguner

yıldırım ak

VB de mscomm1 nesnesi ile bu işi 30-40 satırlık bir program kodu ile yapabilirsin.

Bu adreste bir arkadaşın mscomm1 nesnesi ile ilgili türkçe makalesi var.

http://www.vbturk.net/idsorgula.asp?id=171
"... Bana kulluk et; Beni anmak için namaz kıl" (Taha 14)

james

yukarıdaki programda bios.h header dosyası bende yok.buraya koyabilirmisin onu
ARAMIYORUM , BULUYORUM