pbp Yeni Başlayanların İncelemesi Gerek(surekli güncelle

Başlatan electrotechnics, 10 Şubat 2006, 03:13:11

electrotechnics

tekrar aynı sorun başıma gelir diye.kesik kesik kaydediyorum.
bilgisayarın portları ilede bir bilgi vereyim belki lagzım olur.


ayrıca sana örnek kodda gönderiyorum.ama senin istedigin devre ile şeması uyuşmayabilir.onu sen uclarını uyusacak sekilde baglarsın.

aşagıdakide basic ile yazılmış rs485 protokolünü desteklemektedir...


electrotechnics

aşagıda cok güzel seri haberleşme protokolünü açıklanmıs bir yazıyıda sana sunmak istiyorum.
alıntı:
Seri Haberleşme 1

Bu yazımızda seri haberleşmenin temelleri anlatılacaktır. Paralel haberleşmede 8 bitlik bir veriyi alıcıya ulaştırmak için enaz 10 hat (kablo) kullanmak gereklidir. Bunlardan 8 tanesi veri için 1 adet ortak ground ve 1 adet de senkronizasyon içindir. Bu tip haberleşme genelde çok yüksek hız gerektiren kısa mesafelerde kullanılır. Seri haberleşmede ise 8 yada daha farklı sayıda veriler 2 tel üzerinden iletilirler. Paralel haberleşmeye göre daha uzun mesafelere veriler iletilebilirler. Paralele göre dezavantajı ise veri iletim hızının yavaş olmasıdır.

Seri Haberleşmede Önemli Terimler:
Baud Rate: Veri iletim hızıdır. 1 saniyede iletilen veri adedine denir. Standart olarak veri hızları 300,600,1200,2400,4800,9600,19200, ... şeklindedir. 
Start Bit: Seri haberleşmede veriler senkron yada asenkron olarak iletilebilirler. Senkron iletimde belirli bir başlangıçtan sonra veriler sıralı olarak ard arda gelirler. Uzun bir dosyanın iletiminde bu yol kullanılabilir. Asenkron iletimde ise bir veri gönderildikten sonra yeni bir veri belirli olmayan bir zamanda gelir. İşte bu yeni verinin başlangıcı start biti ile bildirilir. 
Stop Bit: Gönderilen verinin bittiğini ifade eden bittir. Bu biti alan alıcı yeni bir veri için start bitini gözlemeye başlar. haberleşmenin tipine göre 1 yada 2 bit uzunluğunda olabilir.

Eşlik Biti (Parity Bit): Bir çeşit hata denetim bitidir.start ve 8 bitlik bir veri iletildikten sonra stop biti gönderilmeden parity gönderilir. ıletilen 8 bitlik veride 1 lerin sayısı çift ise EVEN tek ise ODD biti gönderilir. Alıcı bu biti kontrol ederek alınan verinin doğru olup olmadığını kontrol eder. 1 parity 1 bit uzunluğundadır.


Sekil-1: Ardarda gelen 8 bitlik iki adet veri katarı.

Burada dikkat edilmesi gereken Start ,Stop ve veri bitlerinin süresidir. Buda bize baud rate'i verir. örnek olarak 2400 Baud'da Start birinin süresi



Buna göre 8 bitlik bir veri parity ile birlikte 4.58 mS de iletim hattından iletilir. 9600 baud için bu hız 1.14 mS ye düşer. 

PIC ile bir uygulama:
Assembler da bir uygulama vermeden önce seri haberleşmenin kolay anlaşılması için TX (Transmit/Gönderme) ve RX(Recieve/Alma) algoritmalarını görelim. 

Aşağıdaki şekilde TX algoritmasını görmektesiniz.

TX Bölümü:



Buradaki 1 bit bekleme süresi yukarda anlatılan formül ile bulunur örnek olarak 2400 baud için bu süre 416 uS dir. Bu algortimanın Assembler kodları aşağıda verilmiştir.

 '****** SERI HABERLEŞME *********
 '****** TX BÖLÜMÜ**************
 '******TX Pin=Portb.0************
 Start:
    movlw 31h
    movwf veri
    bcf portb,0        'start bit send
    call delay_full
    movlw .8
    movwf sayac
TX_Loop:
    rrf veri,f
    btfss status,c
    bcf portb,0
    btfsc status,c
    bsf portb,0
    call delay_full
    decfsz sayac,f
    goto TX_Loop
    bsf portb,0        'stop bit send
    call delay_full
    end


RX Bölümü:

Şimdi ise veri alma bölümünün algoritmasına bakalım,



'****** SERI HABERLEŞME *********
 '****** RX BÖLÜMÜ**************
 '******RX Pin=Portb.1************
 Start:
    clrf RX_veri
    btfsc portb,1
    goto start
    call delay_half
    movlw .9
    movwf sayac
RX_Loop:
    bsf status,c
    btfss portb,1
    bcf status,c
    rrf RX_veri,f
    call delay_full
    decfsz sayac,f
    goto RX_Loop
    call delay_half
STOP_Loop:
    btfss portb,1
    goto STOP_Loop
    end



2 bölümü
Seri Haberleşme 2

Bu yazımızda iki adet PIC16F84 seri olarak 2400 baud hızında haberleşmesine örnek verilmiştir.

Aşağıdaki şekil-1 de TX kısmı görülmektedir.


Şekil-1

Buradaki verici devresinde basılan butonlaro seri çıkış kablosu ile PIC alıcı kısma iletmektedir.

Alıcı kısmın devre şeması ise Şekil-2 de verilmiştir.


Şekil-2

Verici tarafından gönderilen veri ledler vasıtası ile monitör edilmektedir. Burada dikkat edilecek önemli bir husus alıcı ve verici devresinin şaselerinin ortak olamasıdır. Bu iki kablo ile haberleşme en çok 5-10 metre uzunluğunda olabilir. Daha uzak mesafelerde bilgi işareti bozulacaktır.

Daha uzak mesafelere iletişim için RS485 protokolü ve entegresi kullanmak gereklidir. Vericinin kısmın yazılımı TX.HEX da ve alıcının yazılımıda RX.HEX dosyasında bulabilirsiniz.

Bir dahaki yazımızda görüşmek üzere.

Hayırlı çalışmalar dileklerimizle.

Oktay
TURKengineers


şekilli bir şekilde aşagıdaki linkten üsteki yazıyı indirebilirsiniz...
seri haberlesme.rar


ayrıca sana başka bir örnek kod daha vermek istiyorum elinde örnek olması yapacagın işi kolaylaştırır...

dekoder için
;**********************************************************************
; TITLE : Multiplexer data DECODER
;**********************************************************************
;	Filename	: MUX_DE10.ASM
;    	Date Started 	: 21/7/98
;	Last edit 	: 31/7/98
;    	File Version	: 1.0
;                                                                     
;	Author		: David L. Jones
;**********************************************************************
;                                                                     
; Files required:
;	p16F84.inc	
;                                                                     
;**********************************************************************
; Notes:            
;	ASSUMING 1MHz XTAL CLOCK WHICH GIVES 4us PER INSTRUCTION
;	
;**********************************************************************

	list      p=16F84             ; list directive to define processor
	#include <p16F84.inc>         ; processor specific variable definitions

	__CONFIG   _CP_OFF & _WDT_ON & _PWRTE_ON & _XT_OSC

;***** VARIABLE DEFINITIONS
	
LOOP1	EQU	0CH		; LOOP VARIABLE FOR 1ms ROUTINE
COUNT1	EQU	0DH		; DELAY VARIABLE
COUNT2	EQU	0EH		; DELAY VARIABLE
OUTP	EQU	0FH		; TEMP OUTPUT VARIABLE FOR DATA LATCHING
	
;**********************************************************************
	ORG     0x000		; processor reset vector - start of code
	
;******************************* INITIALISATION STUFF
	CLRF	PORTB		; reset portb
	BSF	STATUS, RP0	; select bank 1
	MOVLW	B'00010000'	; PINS RB4=INPUT & ALL OTHERS=OUTPUT
 	MOVWF	TRISB		; UPDATE TRISB REGISTER TO DEFINE I/O PINS
	BCF	STATUS, RP0	; SELECT BANK 0
;******************************* 
START:
	CLRWDT			; RESET WATCHDOG TIMER
	CLRF	COUNT1		; CLEAR LOWER COUNT VARIABLE
	CLRF	COUNT2		; CLEAR UPPER COUNT VARIABLE
CLOOP:
	INCFSZ	COUNT1,1	; INC LOW COUNTER AND SKIP NEXT STATEMENT IF ZERO
	GOTO	SKIP1
	INCF	COUNT2,1	; INCREMENT THE HIGH COUNT VARIABLE
SKIP1:
	BTFSS	PORTB,4		; IF DATA INPUT IF HIGH THEN SKIP NEXT STATEMENT
	GOTO	CLOOP		; LOOP WHILE DATA INPUT IS LOW
	MOVLW	0F0H		
	ANDWF	COUNT2,0	; MASK OUT LOWER 4 BITS OF HIGH COUNTER (TO SET Z FLAG)
				; THIS CHECKS TO SEE IF AT LEAST 16ms HAVE PASSED
	BTFSC	STATUS,Z	; SKIP NEXT STATEMENT OF ZERO FLAG IF NOT SET
	GOTO	CLOOP		; CONTINUE TIMING AND CHECKING PORT IF NOT AT LEAST 16ms
	
	CLRF	OUTP		; CLEAR TEMP OUTPUT LATCH VARIABLE	

	CALL	DELAY1		; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT0
	BTFSC	PORTB,4		; CHECK IF DATA INPUT IS HIGH
	BSF	OUTP,0		; SET BIT0

	CALL	DELAY1		; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT1
	BTFSC	PORTB,4		; CHECK IF DATA INPUT IS HIGH
	BSF	OUTP,1		; SET BIT0

	CALL	DELAY1		; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT2
	BTFSC	PORTB,4		; CHECK IF DATA INPUT IS HIGH
	BSF	OUTP,2		; SET BIT0

	CALL	DELAY1		; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT3
	BTFSC	PORTB,4		; CHECK IF DATA INPUT IS HIGH
	BSF	OUTP,3		; SET BIT0

	MOVF	OUTP,0		; MOVE LATCH VARIABLE INTO W
	MOVWF	PORTB		; LATCH BIT0-BIT3 ONTO PORT PINS

	GOTO	START		; CONTINUE LOOPING FOREVER

;******************************** 1ms DELAY SUBROUTINE
DELAY1:
	MOVLW	0x52		; LOOP COUNT VALUE
	MOVWF	LOOP1		; SET LOOP VARIABLE
L1:	DECFSZ	LOOP1,1		; DEC LOOP COUNTER AND SKIP NEXT STATEMENT IF LOOP COUNTER=0
	GOTO 	L1		; CONTINUE LOOPING UNTIL ZERO
	RETURN

	END			; END OF PROGRAM



enkoder için

;**********************************************************************
; TITLE : Multiplexer data ENCODER
;**********************************************************************
;	Filename	: MUX_EN10.ASM                                          
;    	Date Started 	: 17/7/98                                               
;	Last edit 	: 30/7/98
;    	File Version	: 1.0
;                                                                     
;	Author		: David L. Jones
;**********************************************************************
;                                                                     
; Files required:
;	p16F84.inc	
;                                                                     
;**********************************************************************
; Notes:            
;	ASSUMING 1MHz XTAL CLOCK WHICH GIVES 4us PER INSTRUCTION
;	
;**********************************************************************

	list      p=16F84             ; list directive to define processor
	#include <p16F84.inc>         ; processor specific variable definitions

	__CONFIG   _CP_OFF & _WDT_ON & _PWRTE_ON & _XT_OSC

;***** VARIABLE DEFINITIONS
	
LOOP1	EQU	0CH		; LOOP VARIABLES
LOOP05	EQU	0DH
LOOP100	EQU	0EH
	
;**********************************************************************
	ORG     0x000		; processor reset vector - start of code
	
;******************************* INITIALISATION STUFF
	CLRF	PORTB		; reset portb
	BSF	STATUS, RP0	; select bank 1
	MOVLW	B'00001111'	; PINS RB0-3=INPUT & RB4-7=OUTPUT
	MOVWF	TRISB
	BCF	OPTION_REG,NOT_RBPU	; ENABLE PULL-UP'S ON PORTB PINS
	BCF	STATUS, RP0	; SELECT BANK 0


;******************************* 
START:
	CLRWDT			; RESET WATCHDOG TIMER
	BCF	PORTB, 4	; SET SERIAL DATA O/P LOW
	CALL	DELAY100	; DELAY 100ms
	BSF	PORTB, 4	; SET SERIAL DATA O/P HIGH (START BIT)
	CALL	DELAY05		; DELAY 0.5ms
;******************************** SEND BIT 0
	BTFSC	PORTB, 0	; CHECK BIT 0 I/P, AND SKIP IF CLEAR
	GOTO	SET0
	BCF	PORTB, 4	; BIT 0 MUST BE LOW, SO SET O/P LOW	
	GOTO 	SKIP0
SET0:	BSF	PORTB, 4	; BIT 0 MUST BE HIGH, SO SET O/P HIGH
SKIP0:	CALL	DELAY1		; DELAY FOR 1ms
;******************************** SEND BIT 1
	BTFSC	PORTB, 1	; CHECK BIT 1 I/P, AND SKIP IF CLEAR
	GOTO	SET1
	BCF	PORTB, 4	; BIT 1 MUST BE LOW, SO SET O/P LOW	
	GOTO 	SKIP1
SET1:	BSF	PORTB, 4	; BIT 1 MUST BE HIGH, SO SET O/P HIGH
SKIP1:	CALL	DELAY1		; DELAY FOR 1ms
;******************************** SEND BIT 2
	BTFSC	PORTB, 2	; CHECK BIT 2 I/P, AND SKIP IF CLEAR
	GOTO	SET2
	BCF	PORTB, 4	; BIT 2 MUST BE LOW, SO SET O/P LOW	
	GOTO 	SKIP2
SET2:	BSF	PORTB, 4	; BIT 2 MUST BE HIGH, SO SET O/P HIGH
SKIP2:	CALL	DELAY1		; DELAY FOR 1ms
;******************************** SEND BIT 3
	BTFSC	PORTB, 3	; CHECK BIT 3 I/P, AND SKIP IF CLEAR
	GOTO	SET3
	BCF	PORTB, 4	; BIT 3 MUST BE LOW, SO SET O/P LOW	
	GOTO 	SKIP3
SET3:	BSF	PORTB, 4	; BIT 3 MUST BE HIGH, SO SET O/P HIGH
SKIP3:	CALL	DELAY1		; DLEAY FOR 1ms

	GOTO 	START		; CONTINUE LOOPING FOR EVER


;******************************** 1ms DELAY SUBROUTINE
DELAY1:
	MOVLW	0x52		; LOOP COUNT VALUE
	MOVWF	LOOP1		; SET LOOP VARIABLE
L1:	DECFSZ	LOOP1,1		; DEC LOOP COUNTER AND SKIP NEXT STATEMENT IF LOOP COUNTER=0
	GOTO 	L1		; CONTINUE LOOPING UNTIL ZERO
	RETURN

;******************************** 0.5ms DELAY SUBROUTINE
DELAY05:
	MOVLW	0x28		; LOOP COUNT VALUE
	MOVWF	LOOP05		; SET LOOP VARIABLE
L05:	DECFSZ	LOOP05,1	; DEC LOOP COUNTER AND SKIP NEXT STATEMENT IF LOOP COUNTER=0
	GOTO 	L05		; CONTINUE LOOPING UNTIL ZERO
	RETURN
	
;******************************** 100ms DELAY SUBROUTINE
DELAY100:
	MOVLW	0x64		; LOOP COUNT VALUE (100)
	MOVWF	LOOP100		; SET LOOP VARIABLE
L100:	DECFSZ	LOOP100,1	; DEC LOOP COUNTER AND SKIP NEXT STATEMENT IF LOOP COUNTER=0
	GOTO 	CALL1		; CONTINUE LOOPING UNTIL ZERO
	GOTO	ENDLOOP		; FINISHED LOOPING
CALL1:	CALL	DELAY1		; DELAY FOR 1ms
	GOTO	L100
ENDLOOP:
	RETURN

	END			; END OF PROGRAM


saglıcakla kalın. umarım yardımcı olabilmişimdir...

cirak05

Teşekkürler biraz üzerinde çalışıp kendi istediğim gibi bir hale getiririm inşallah


electrotechnics

geri döndüm. arkadaşlar burdaki derslerimize yer yer devam edecegiz.
sizin için plc notlarımı ve pic programa kitabı ve pic basic notlarımı ekleyecegim....konuyu aratın bulursunuz...

westcoast

çok güzel bir başlık olmuş
devamının gelmeside heyecan verici
tebrikler.

electrotechnics

Alıntı yapılan: "electrotechnics"...

Auto Msg : Reklam..

arkadaşlar burda reklam felan yapmıyorum bunu herkes bilsin...
yazımı tekrar sansurleyerek eklemek istiyorum...

yukarda bazı bölümler gözükmemektedir.
www.xxxxx.com ile yazılı olanlar.ordaki sorunlar benden kaynaklananmamaktadır.
isteyen arkadaşlar.burda bana isteklerini iletsin.onlara mail olarak atacagım.

sunguroglu

keşke güncellenen bir konu olsaymış iyi olurmuş....ben üniversitede elektronik - otomasyon bölümü okumayı düşünüyorum... fakat liseye girerken ben meslek lisesine yönlendirilmedim... şu an bir anadolu lisesindeyim ve 3'e geçtim.

Ama Allah Razı Olsun... bir tanıdığım üniversitede bir adım önde olmak için kendi çabanla pic öğren dedi. bende başladı araştırmaya ve bu forumu buldum... Şu an sıfırım... biraz C++ biliyorum... birazda lite-c ... bu konu bayağı işime yaradı... fakat dediğim gibi keşke devam etseymiş...
Kim fesad-ı ümmetim zamanında Sünnet-i Seniyye'me temessük ederse 100 şehit ecrini ve sevabını kazanabilir......(Hadis-i Şerif)