PIC BASIC PRO Öğreniyoruz soru cevapları

Başlatan aster, 19 Mayıs 2005, 17:33:33

ete

Emrah,
GP5 pininin süreki 1 de kalması açılışta o pinin o değeri almasındandır. Başla satırından evvel ;
GPIO=0  komutunu koyarsan bu sorun giderilmiş olacaktır.
Programındaki komutlar doğru ancak neden 4 bitlik bir ADC okuması yapıyorsun anlamadım doğrusu.
Programa bakılırsa GPIO.0 pini Analog olarak kullanılacak. Diğer pinler ise röle çıkışı yapılacak. Doğru kodlar şöyle olmalı;

Ete


@	device  pic12F675, intrc_osc_noclkout, wdt_off, pwrt_on, mclr_off, protect_off	
DEFINE OSCCAL_1K 1  'bu komut mutlaka olacak OSCCAL değerini yeniden pice yazdırıyor

DEFINE OSC 4

DEFINE ADC_BITS 8    ' ADCIN resolution  (Bits)
DEFINE ADC_SAMPLEUS 10 ' ADC sampling time (uSec)
CMCON = 7
ANSEL = %00010001
ADCON0=%10000000
GPIO=0
TRISIO=%00000001
WPU=0  'pullup direnci açık değil

DEGER VAR BYTE
DEGER2 VAR BYTE
PAUSE 200  'açılış gecikmesi mutlaka verilmelidir.
GPIO=0

BASLA:
PAUSE 1500
ADCIN 0,DEGER
DEVAM:
PAUSE 10
ADCIN 0,DEGER2
IF DEGER2<DEGER THEN HIGH GPIO.1
GOTO  BASLA
END
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

emrah

hocam program alını idi. dedğim gibi bu pice hiç program yazmadım daha once ama şimdi böyle bir iş için gerekli. program için sagolun hocam. 
picteki tockı pinleri ile  röleyi nasıl kontrol edebilirm? pul up direncmi koymlaıyım röleyi kontrol eden transistörn beyzine? yoksa gerilim bölücü direnc şeklindemi? bu direnç degereleri ne olmalı?

iyi çalısmalar hocam..

ete

1 adet seri 1K direnç ve peşine 1 adet BC547 koy. Rölenin bir ucunu BC547 nin Collector ucuna diğer ucunu +5V ta bağla. Transistörün Emitter ucunuda GND ye bağla olsun bitsin. Röle bobin uçları arasına 1N4001 diyot bağlamayı ihmal etme.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

emrah

hocam programda gelen analog sinyali karsılastırıp cıkış almak istedim fakat olmadı.

analog girişe pot ile 0-5V gönderiyorum , yazılmsal olara belli bir degerin üstünde çıkıs vermesi gerekmezmi?

@	device  pic12F675, intrc_osc_noclkout, wdt_off, pwrt_on, mclr_off, protect_off	
DEFINE OSCCAL_1K 1  'bu komut mutlaka olacak OSCCAL değerini yeniden pice yazdırıyor

DEFINE OSC 4

DEFINE ADC_BITS 8    ' ADCIN resolution  (Bits)
DEFINE ADC_SAMPLEUS 10 ' ADC sampling time (uSec)
CMCON = 7
ANSEL = %00010001
ADCON0=%10000000
GPIO=0
TRISIO=%00000001
WPU=0  'pullup direnci açık değil

DEGER VAR BYTE
DEGER2 VAR BYTE
PAUSE 200  'açılış gecikmesi mutlaka verilmelidir.
GPIO=0

BASLA: 

ADCIN 0,DEGER
IF DEGER>50 THEN
GPIO.1=1
ELSE
GPIO.1=0
ENDIF


GOTO  BASLA
END

emrah

ADCON0=%10000000 regesterinin 7. bitini 0 yaptım calıstı hocam. yardımlarınız için teşekkür ederim

ete

Evet,
O bit sıfır olmalı. 10 bit olunca 1 yapılıyor.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

emrah

#381
hocam GPIO.3 pin yani MCLR in oldugu pini sürekli 0 konumda. bunu nasıl acacagız? config de mclr off şeklinde ayarlı

programın son hali,

@ DEVICE pic12F675                                                   
@ DEVICE pic12F675, WDT_OFF            
@ DEVICE pic12F675, PWRT_ON            
@ DEVICE pic12F675, PROTECT_OFF       
@ DEVICE pic12F675, MCLR_off           
@ DEVICE pic12F675, INTRC_OSC_NOCLKOUT  


DEFINE OSCCAL_1K 1  'bu komut mutlaka olacak OSCCAL değerini yeniden pice yazdırıyor

DEFINE OSC 4

DEFINE ADC_BITS 10    ' ADCIN resolution  (Bits)
DEFINE ADC_SAMPLEUS 3 ' ADC sampling time (uSec)
CMCON = 7
ANSEL = %00010001
ADCON0=%10000000
GPIO=0
TRISIO=%00000001
WPU=0  'pullup direnci açık değil




DEGER VAR WORD

PAUSE 200  'açılış gecikmesi mutlaka verilmelidir.
GPIO=0

BASLA: 


ADCIN 0,DEGER
IF DEGER>50 THEN
GPIO.1=1
ELSE
GPIO.1=0
ENDIF

IF DEGER>200 THEN
GPIO.2=1
ELSE
GPIO.2=0
ENDIF

IF DEGER>350 THEN
GPIO.3=1
ELSE
GPIO.3=0
ENDIF

IF DEGER>450 THEN
GPIO.4=1
ELSE
GPIO.4=0
ENDIF

IF DEGER>550 THEN
GPIO.5=1
ELSE
GPIO.5=0
ENDIF


GOTO  BASLA
END

ete

Bütün MCLR pinleri şayet seçimli ise (off yapılabilenler) yalnızca giriş olarak kullanılabilir. Çıkış olarak kullanılamaz.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com


emrah

merhaba ete hocam,
bilgisayar ile haberleşme denemesi yapıyorum fakat microcode terminalinden gönderdigim sayıları LCD ekranda baska deger olark görüyorum.

örnegin;  terminalden 10 gönderiyorum LCD ekranda hex karşılıgı 31 degeri, desimal karsılıgı 49 görüyorum. ilgili program şu şekilde,

TRISA=0
TRISB=%00010000
TRISC=%10000000
TRISD=0
TRISE=0

porta=0
portb=0
portc=0
portd=0
porte=0
'-------------------------------------------------------------------------------

@ DEVICE pic16F877                                                   
@ DEVICE pic16F877, WDT_OFF              	
@ DEVICE pic16F877, PWRT_ON             	
@ DEVICE pic16F877, PROTECT_OFF         
@ DEVICE pic16F877, XT_OSC


INCLUDE "modedefs.bas"

define osc 4
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 25  ' 2400 Baud @ 4MHz, 0,17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

'-------------------------------------------------------------------------------
DEFINE LCD_DREG PORTD 'LCD data port 
DEFINE LCD_DBIT 4 'LCD data starting bit 0 or 4 
DEFINE LCD_RSREG PORTD 'LCD register select port 
DEFINE LCD_RSBIT 3 'LCD register select bit 
DEFINE LCD_EREG PORTD 'LCD enable port 
DEFINE LCD_EBIT 2 'LCD enable bit 
DEFINE LCD_LINES 2 'Number lines on LCD

'-------------------------------------------------------------------------------
ADCON1=7
'CMCON=7
'-------------------------------------------------------------------------------

VERI VAR BYTE
HAM  VAR BYTE
'-------------------------------------------------------------------------------

LCDOut $FE,1	
pause 200       
'------------------------------------------------------------------------------- 


BASLA:

HSerIn 300,basla,[WAIT("E"),VERI] 

                 
LCDOUT $FE,$80,"HEX: ",hex2 VERI,"  DEC: ",dec2 VERI

PAUSE 1000

GOTO BASLA

ete

Hyper terminalde bastığın her tuş hemen çıkışa yönlendirilir. Sen 10 yollamak için önce "1" tuşuna ve sonra "0" tuşlarına basarken ilk basılan "1" tuşunun karşılığı hemen çıkışa yönlendirilip sana sana $31 (yani 49 olarak)  ulaşıyor.
Normal şartlarde Hyper terminalden el ile rakam girdiğin için bunları tek rakam halinde birleştirmen zor.
Bu durumda programında değişiklik yaparak gelenleri tek tek değerlendirecek bir sistem düşünmelisin.
Mesela 10 sayısı için önce 49 sonra 48 alacağını hesaba katmalısın.
Bu gelenleri iki değişkende tutarsan ve A=49 ve B=48 olduğunu varsayarsak;
A=A-48 ve B=B-48 şeklinde iki eşitlik kullanırsan rakamların gerçek değerlerine ulaşırsın.
Bunlarıda SAYI=a*10+B şeklinde 10 sayısına çevirebilirsin.

Bilgi yollama işini hyper terminal yerine başka bir ünteden yaparsan istediğin rakamı tabiiki yollayabilirsin. Ama hyperterminalde sistem budur.

Ete

Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

emrah

 cevap icin sagolun hocam.  şöyle bir değişiklik yaptım oldu sanırım;

HSerIn 500,basla,[WAIT("E"),dec VERI]

gelen verinin başına DEC ekledim ve gönderdigim sayı LCD de görünüyor.

iletişim hızını 2400 de kullanıyorum fakat bunu 9600 de kullanmam gerekiyor. sitede 9600 ve 4MHZ için define ayarları arıyorum bulamadım hocam.  9600 baud için ayarlar varmı hocam sızde?

ete

9600 baud için ayarlar şöyle;
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25  ' 9600 Baud @ 4MHz, 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

Hem bu ayar değerlerini hemde başka hesaplamaları yapabilmen için bir basit program var.
Adı "PicMultiCalc"
İnternette ararsan kolyalıkla bulabilirsin. Son versiyonunu (1.3.1) bulmaya çalış. ELinin altında bulunsun.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

emrah


emrah

Erol hocam USART kesmesinde bir sorun yaşıyorum.

RF ile saat bilgisi gönderiyorum gönderici kısımda sorun yok eminim.
fakat saat kısmında sorun var usart ile bilgi alımı yapmaya calıstım gelen bilgiyi displaylere dogrudan yazdırıyım dedim yine görüntü 00:00 şeklinde.  usart ı yanlısmı kullnıyorum yardımcı olabilirmisiniz?

RF den sadece saat ayarı için gönderiyorum dakika ve saati fakat. ilk denemede gelen veriyi okumak için dogrudan displaylere gönderiyorum hiçbir sonuç alamıyorum. ds1302 den okuma yaptıgım zaman saatim sorunsuz çalısıyoror. sorunum USART kesmesinde aceba nerede yanlış yapıyorum?

saygılar....

PORTA=0:PORTB=0   
TRISB=%10000010        
TRISA=%11000000  
'-----------------------------------------------------------------
@ DEVICE pic16F628A                      'işlemci 16F628                                
@ DEVICE pic16F628A, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_off            'MCLR pini kullanılMIYOR.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak 
'-----------------------------------------------------------------
DEFINE OSC 4


DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 25  ' 2400 Baud @ 4MHz, 0,17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

'-------------------------------------------------------------------------
ON INTERRUPT GoTo KESME   
OPTION_REG=%10000101   
INTCON=%11000000  
PIE1.5=1
TMR0=0
CMCON=7  
.
.
.
.
.

DISABLE
KESME:

 HSERIN 3,CIK,[WAIT("YSMIN"),E[0],E[1],E[3],E[4]]
'SERIN2 PORTB.1,3,CIK, [WAIT("YSMIN"),E[0],E[1],E[3],E[4]] 
E[0]=E[0]-16
E[1]=E[1]-32
E[3]=E[3]-48
E[4]=E[4]-64

E[0]=E[0]*10
E[1]=E[0] + E[1]
E[3]=E[3]*10
E[4]=E[3] + E[4]

 
OKU=RCREG   
CIK:     
         RESUME
         ENABLE
                  
         
END