Yeniyim, şu kodlara bir bakabilirmisniz? Hiç bişey yapama

Başlatan boraciner, 26 Temmuz 2009, 23:09:23

boraciner

http://rapidshare.com/files/260348490/klvye.rar.html
proje dosyası olarak bu dahili osilator kullanmak istiyorum fakat ayarını yapamadım. 16f628a kullanıyorum..


tek tek:

main.c
#include <htc.h>
#include "delay.h"
#include "keyboard.h"
#include "usart.h"
__CONFIG( PROTECT & CPD & WDTDIS & INTIO & MCLRDIS & LVPDIS & BORDIS & PWRTDIS );
	void main(void)
{
unsigned char input;

	INTCON=0;	// purpose of disabling the interrupts.

	init_comms();	// set up the USART - settings defined in usart.h

unsigned char input;

	unsigned char i;
	int j;
	PORTB=0x00;
	PORTA=0x00;
	
	CMCON=0x07;
	
	TRISB=0x07;
	TRISA=0x00;

	for(;;)
	{   
		i=keyboard();
		putch(i);
	}
}




delay.c
/*
 *	Delay functions
 *	See delay.h for details
 *
 *	Make sure this code is compiled with full optimization!!!
 */

#include	"delay.h"

void
DelayMs(unsigned char cnt)
{
#if	XTAL_FREQ <= 2MHZ
	do {
		DelayUs(996);
	} while(--cnt);
#endif

#if    XTAL_FREQ > 2MHZ	
	unsigned char	i;
	do {
		i = 4;
		do {
			DelayUs(250);
		} while(--i);
	} while(--cnt);
#endif
}



keyboard.c

#include	<pic.h>
#include	"keyboard.h"

const unsigned char kucuk[67][2]={
		{0x0d,0x7e},{0x0e,'"'},{0x15,'q'},{0x16,'1'},
		{0x1a,'z'},{0x1b,'s'},{0x1c,'a'},{0x1d,'w'},
		{0x1e,'2'},{0x21,'c'},{0x22,'x'},{0x23,'d'},
		{0x24,'e'},{0x25,'4'},{0x26,'3'},{0x29,' '},
		{0x2a,'v'},{0x2b,'f'},{0x2c,'t'},{0x2d,'r'},
		{0x2e,'5'},{0x31,'n'},{0x32,'b'},{0x33,'h'},
		{0x34,'g'},{0x35,'y'},{0x36,'6'},{0x39,','},
		{0x3a,'m'},{0x3b,'j'},{0x3c,'u'},{0x3d,'7'},
		{0x3e,'8'},{0x41,0xef},{0x42,'k'},{0x43,3},
		{0x44,'o'},{0x45,'0'},{0x46,'9'},{0x49,7},
		{0x4a,'.'},{0x4b,'l'},{0x4c,2},{0x4d,'p'},
		{0x4e,'+'},{0x52,'i'},{0x54,5},{0x55,0x5f},
		{0x5a,0xa3},{0x5b,0xf5},{0x5d,','},{0x61,'<'},
		{0x69,'1'},{0x6b,'4'},{0x6c,'7'},{0x70,'0'},
		{0x71,','},{0x72,'2'},{0x73,'5'},{0x74,'6'},
		{0x75,'8'},{0x79,'+'},{0x7a,'3'},{0x7b,'-'},
		{0x7c,'*'},{0x7d,'9'},{0,0}
};

const unsigned char buyuk[67][2]={
		{0x0d,0x7e},{0x0e,'é'},{0x15,'Q'},{0x16,'!'},
		{0x1a,'Z'},{0x1b,'S'},{0x1c,'A'},{0x1d,'W'},
		{0x1e,'"'},{0x21,'C'},{0x22,'X'},{0x23,'D'},
		{0x24,'E'},{0x25,'+'},{0x26,'^'},{0x29,' '},
		{0x2a,'V'},{0x2b,'F'},{0x2c,'T'},{0x2d,'R'},
		{0x2e,'%'},{0x31,'N'},{0x32,'B'},{0x33,'H'},
		{0x34,'G'},{0x35,'Y'},{0x36,'&'},{0x39,'L'},
		{0x3a,'M'},{0x3b,'J'},{0x3c,'U'},{0x3d,'/'},
		{0x3e,'('},{0x41,0},{0x42,'K'},{0x43,'I'},
		{0x44,'O'},{0x45,'='},{0x46,')'},{0x49,7},
		{0x4a,':'},{0x4b,'L'},{0x4c,1},{0x4d,'P'},
		{0x4e,'?'},{0x52,6},{0x54,5},{0x55,0x2d},
		{0x5a,0xa3},{0x5b,4},{0x5d,';'},{0x61,'>'},
		{0x69,'1'},{0x6b,'4'},{0x6c,'7'},{0x70,'0'},
		{0x71,','},{0x72,'2'},{0x73,'5'},{0x74,'6'},
		{0x75,'8'},{0x79,'+'},{0x7a,'3'},{0x7b,'-'},
		{0x7c,'*'},{0x7d,'9'},{0,0}
};

unsigned char get_byte(void)
{
	char i;
	unsigned char veri=0;
	
	for(i=0;i<11;i++)				//11 bitlik veri gelecek
	{
		while(Clock);				//İlk önce Clock=1 olmalı
		if( (i<9) && (i>0))			//2->9 bitler
		{
			veri=veri>>1;
			if(Data==1)
				veri=veri | 0x80;
		}
		while(!Clock);				//Son olarak Clock=1 olmalı
	}
	return veri;					//Algılanan değer gönderiliyor
}

unsigned char keyboard(void)
{
	unsigned char data=0;
	unsigned char shift=0, i;
	for(;;)
	{
		data=get_byte();
		while(get_byte()==0xF0);

		if((data==0x12)||(data==0x59))	//Sağ ya da sol shifte mi basıldı
			shift=!shift;				//Capslock gibi çalışacak
		
		if(data==0x58)					//Capslock'a basıldıysa
			shift=!shift;
		
		for(i=0;kucuk[i][0]!=data && kucuk[i][0]; i++);		//Tuşun ascii karşılığı bulunuyor
		
		if(kucuk[i][0]==data)			//Data ascii tablolarımızda var mı bakılıyor
		{
			if(shift==0)				//Capslock açık değilse küçük harf, açıksa büyük harfin ascii değeri geri gönderiliyor
				return kucuk[i][1];
			else
				return buyuk[i][1];
		}
	}
}



usart.c
#include <htc.h>
#include <stdio.h>
#include "usart.h"

void 
putch(unsigned char byte) 
{
	/* output one byte */
	while(!TXIF)	/* set when register is empty */
		continue;
	TXREG = byte;
}

unsigned char 
getch() {
	/* retrieve one byte */
	while(!RCIF)	/* set when register is not empty */
		continue;
	return RCREG;	
}

unsigned char
getche(void)
{
	unsigned char c;
	putch(c = getch());
	return c;
}


delay.h
/*
 *	Delay functions for HI-TECH C on the PIC
 *
 *	Functions available:
 *		DelayUs(x)	Delay specified number of microseconds
 *		DelayMs(x)	Delay specified number of milliseconds
 *
 *	Note that there are range limits: x must not exceed 255 - for xtal
 *	frequencies > 12MHz the range for DelayUs is even smaller.
 *	To use DelayUs it is only necessary to include this file; to use
 *	DelayMs you must include delay.c in your project.
 *
 */

/*	Set the crystal frequency in the CPP predefined symbols list in
	HPDPIC, or on the PICC commmand line, e.g.
	picc -DXTAL_FREQ=4MHZ
	
	or
	picc -DXTAL_FREQ=100KHZ
	
	Note that this is the crystal frequency, the CPU clock is
	divided by 4.

 *	MAKE SURE this code is compiled with full optimization!!!
	
 */

#ifndef	XTAL_FREQ
#define	XTAL_FREQ	4MHZ		/* Crystal frequency in MHz */
#endif

#define	MHZ	*1000L			/* number of kHz in a MHz */
#define	KHZ	*1			/* number of kHz in a kHz */

#if	XTAL_FREQ >= 12MHZ

#define	DelayUs(x)	{ unsigned char _dcnt; \
			  _dcnt = (x)*((XTAL_FREQ)/(12MHZ)); \
			  while(--_dcnt != 0) \
				  continue; }
#else

#define	DelayUs(x)	{ unsigned char _dcnt; \
			  _dcnt = (x)/((12MHZ)/(XTAL_FREQ))|1; \
			  while(--_dcnt != 0) \
				  continue; }
#endif

extern void DelayMs(unsigned char);


keyboard.h

/*					www.FxDev.org
 * 				2x16 LCD Kullanım Klavuzu
 * Shift ve Capslock tuşu ile büyük, küçük ve tuşların ikinci görevleri kullanılabilir.
 * i=get_byte(); şeklinde klavyeden gelen byte'lık veriler okunur.
 * i=keyboard(); şeklinde klavyeden okunan kod direk ascii olarak gönderilir.
 *					www.FxDev.org 
*/

#define Clock RB0	//Pin tanımlamaları
#define Data  RB1
#define Anahtar RB2
extern unsigned char get_byte(void);
extern unsigned char keyboard(void);


usart.h
#ifndef _SERIAL_H_
#define _SERIAL_H_

#define BAUD 9600      
#define FOSC 4000000L
#define NINE 0     /* Use 9bit communication? FALSE=8bit */

#define DIVIDER ((int)(FOSC/(16UL * BAUD) -1))
#define HIGH_SPEED 1

#if NINE == 1
#define NINE_BITS 0x40
#else
#define NINE_BITS 0
#endif

#if HIGH_SPEED == 1
#define SPEED 0x4
#else
#define SPEED 0
#endif

#if defined(_16F628) || defined(_16F628A)
	#define RX_PIN TRISB6
	#define TX_PIN TRISB7
#else
	#define RX_PIN TRISB6
	#define TX_PIN TRISB7
#endif

/* Serial initialization */
#define init_comms()\
	RX_PIN = 1;	\
	TX_PIN = 1;		  \
	SPBRG = DIVIDER;     	\
	RCSTA = (NINE_BITS|0x90);	\
	TXSTA = (SPEED|NINE_BITS|0x20)

void putch(unsigned char);
unsigned char getch(void);
unsigned char getche(void);

#endif

Chan86

Bunlar kütüphane kodları.Yani sen kodların başındaki komutu yazında alttaki işlemleri hazır olarak yazmış kabul ediyor ve sen işlem yaptığında direk devreye alıyor.

Okan AKÇA

ne yapmak istedigini tam olarak bilirsen sorunun cözülür

boraciner

kodları derledim , seri port kütüphanesi ekleyim seriporta da veri aktarıyorum fakat dahili osilatoru kararsız olduğundan kullanmamalıymışım o yüzden harici 20 mhz taktım fakat config bitlerini ayarlayamadım. gönderdiğim string garip karakterler gidiyor. sorun nerede olabilir?
#define XTAL_FREQ 20MHZ
başında belirtip
osilatoru HS olarak seçtim .. =(

boraciner

bir arkadaşım max232 koymak zorundasın dedi az önce... ben pbasic ile yaparken hiç koymamıştım ve çalışıyordu. sizce nasıl olacak?