USART KESMESI YARDIM

Başlatan designer.21, 25 Aralık 2023, 23:27:36

designer.21

Herkese kolay gelsin,
uzun zaman önce başlamış olduğum assembly dili ile pic programlama çalışmalarım yavaş yavaş sindire sindire ama hız kesmeden devam ediyor.
     
şu sıralar 16f628A ile RF kontrollü bir bir alıcı-verici kodu yazmak. nette asm ile yazılmış hazır kodlar var fakat şu ana kadar geçtiğim derslerde en mantığına inerek çalıştığım için bu konuyu da tam olarak kavramak istiyorum. dediğim gibi alıcı-verici ile ilgili hazır kodlar var sorunsuz çalışıyor

aşağıdaki alıcı-verici kodları 2 pic arasında kablo ile bağlı olunca çalışıyor fakat modül kullandığım zaman sapıtıyor. zaten ETE Hocamın daha önceki konularından da anladığım üzere düzgün çalışmasını beklemiyordum. çünkü bu kod'da bir işaretçi yok, alıcıda kesme yok.

sizlerden sadece destek istiyorum, mantığını anlatabilirseniz çok sevinirim.
mesela HSERIN 15,ATLA,WAIT("ETE"),BILGI bu kod parçasının ne anlama geldiğini biliyorum ama bunu asm ye çevirebileceğim şekilde mantığını anlatabilir misiniz



;===PROG37.ASM====12/09/2005================================
	LIST	P=16F628A
	INCLUDE	"P16F628A.INC"     
	__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON &_MCLRE_OFF & _BODEN_OFF & _LVP_OFF &_CP_OFF & _CP_OFF
;-----------------------------------------------------------
ORG 	h'0000'
SAYAC	EQU	h'20'
SAYAC1	EQU	h'21'
SAYAC2	EQU	h'22'
MOVLW	H'07'		;PortA'nın uçları sayısal I/O
MOVWF	CMCON		;CMCON saklayıcısına yaz
CLRF		PORTA		;PORTA uçlarını sıfırla
CLRF		PORTB		;PORTB uçlarını sıfırla
BANKSEL	TRISA		;BANK1'e geç
MOVLW	h'FF'		;PORTA'nın tüm uçları giriş
MOVWF	TRISA		
MOVLW	b'11111011'	;RB1/RX=giriş, RB2/TX=çıkış
MOVWF	TRISB
MOVLW	d'25'		;9600 baud rate'lik hız için
MOVWF	SPBRG		;25 desimal sayısı yükle
MOVLW	b'00100100'	;BRGH=1, TXEN=1 (gönderme aktif)
MOVWF	TXSTA
BANKSEL	PORTB		;BANK0'e geç
BSF		RCSTA,SPEN	;SPEN=1 (seri iletişim aktif)
CLRF		SAYAC
DONGU		;--------Kısa bir süre bekletme döngüsü------
	DECFSZ	SAYAC,F
	GOTO		DONGU
TEST_RA0		;-------- RA0 ucuna basma kontrolü döngüsü----
	BTFSS	PORTA,0	;RA0 butonuna basıldı mı?
	CALL		MESAJ	;Evet, MESAJ alt programına git.
	CALL		GECIKME	;Buton arkının sönmesini bekle
GOTO		TEST_RA0	;Hayır, RA0 butonunu tekrar test et.
MESAJ	;--------Mesaj gönderme alt programı--------------
	BSF		PORTB,2	;RB2/TX ucunu start "1" durumunda.
	MOVLW	b'10101010'		;
	CALL 	GONDER   ;8 bit'lik b'01000001' sayısını gönder 
	RETURN			;Alt programdan dön.
GONDER ;------TXREG'den STA'ya veri yükleme alt programı-----
	MOVWF	TXREG	; W'deki sayıyı TXREG'e yükle
	BANKSEL	TXSTA	; BANK1'e geç
VERI_SONU_TEST
	BTFSS	TXSTA,TRMT	;STA'ya veri gönderme bitti mi?
	GOTO		VERI_SONU_TEST		;Hayır, tekrar test et
	BANKSEL	PORTB			;Evet, BANK0'a geç ve 
	RETURN					;Alt programdan dön.
GECIKME	;Gecikme alt programı
	MOVLW	h'FF'
	MOVWF	SAYAC1
DONGU1
	MOVLW	h'FF'
	MOVWF	SAYAC2
DONGU2
	DECFSZ	SAYAC2, F
	GOTO	DONGU2
	DECFSZ	SAYAC1, F
	GOTO	DONGU1
	RETURN
	END
;-----------------------------------------------------------


;===PROG38.ASM====14/09/2005================================
	LIST	P=16F628A
	INCLUDE	"P16F628A.INC"     
	__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON &_MCLRE_OFF & _BODEN_OFF & _LVP_OFF &_CP_OFF & _CP_OFF
;-----------------------------------------------------------
ORG 		h'0000'
CBLOCK 0X20
SAYAC1, SAYAC2
ENDC

MOVLW	h'07'		;PortA'nın uçları sayısal I/O
MOVWF	CMCON		;CMCON saklayıcısına yaz
CLRF		PORTA		;PORTA uçlarını sıfırla
CLRF		PORTB		;PORTB uçlarını sıfırla
BANKSEL	TRISA		;BANK1'e geç
MOVLW	b'11110000'	;PORTA'nın alt dört bit'i çıkış
MOVWF	TRISA	
MOVLW	b'00000010'	;RB1/RX=giriş, RB2/TX=çıkış
MOVWF	TRISB		;PORTB'nin üst dört bit'i çıkış
MOVLW	d'25'		;9600 baud rate'lik hız için
MOVWF	SPBRG		;25 desimal sayısı yükle
MOVLW	b'00000100'	;SYNC=0(4.bit), BRGH=1(2.bit)
MOVWF	TXSTA
BANKSEL	PORTB		;BANK0'a geç
MOVLW	b'10010000'	;SPEN=1(7.bit),CREN=1(4.bit)
MOVWF	RCSTA
LED_GONDER	;----- Verileri PORTA'daki LED'lere gönder---
	CALL		VERI_AL
	MOVWF	PORTA		;W saklayıcıyı PORTA'ya gönder
	MOVWF	PORTB		;W saklayıcıyı PORTB'ye gönder
	CALL GECIKME
	GOTO		LED_GONDER
VERI_AL	;------RCREG'den veri okuma alt programı-------
	BTFSS	PIR1, RCIF	;RCIF bayrağı "1" mi?
	GOTO		VERI_AL		;Hayır, tekrar test et.
	MOVF		RCREG,W		;Evet, RCREG'i W'ye yükle
	RETURN


GECIKME
	MOVLW 0XFF
	MOVWF SAYAC1
GECIKME1
	MOVLW 0XFF
	MOVWF SAYAC2
GECIKME2
	DECFSZ SAYAC2,F
	GOTO GECIKME2
	DECFSZ SAYAC1,F
	GOTO GECIKME1
	RETURN	

				
	END
;-----------------------------------

ete

Alıcı kısımda RCREG üzerinden veri almayı ve bunuda RCIF bitinin set edilme durumuna göre yapmayı becermişsin zaten. Geriye alınan bilgilerin işaretçiye eşit olup olmamasını test etmek kalmış.
Veriyi aldıktan sonra işaretçiye uyuyormu test etmek zor olmasa gerek.
Önce bunu yapacaksın uymuyor ise yeniden başa veri almanın en başına yollaman gerek programı.

Tabiiki en başta bir işaretçi ve peşinde asıl verinin yolladığı bir alt program yaratman gerekir.
Bilgi yollamayı yapmışsın buda zor olmasa gerek.

HSEROUT daki mantık aslında çok basit. Önce bir "E" sonra "T" ve sonunda tekrar "E" yolluyorsun hemen peşinden de asıl veriyi gönderiyorsun.

Alıcı önce E karekterini almalı ki gerisine devam edebilsin. Dİyelimki almadı. Aradan bir yerden mesela "T" harfinden almaya başlayabilir (senkron uyumsuzluğu) gelen karekter E yerine T ise yine 3 karekter alacak başlangıca yönelmesi gerekir programın.
Diyelimki ilk karekter doğru E karekteri alındı. Ardından gelen karekterin alınıp T olup olmadığına bakman doğru ise devam edip 3 karekteri tamamlaman lazım. Hemen ardından da asıl ver byte'ını alıp işi bitirmen gerekiyor.
Unutma kritik olan şey 3adet ön byte alman gerektiği bunlarında sırası ile E T E olmaları gerekiyor. Bunları alıp test edip sonunda asıl veri byte'ına ulaşman çok zor olmasa gerek.

Ete

designer.21

paylaşmış olduğum kodlar, eskiden olsa bunları anlamak bana hayal gibi gelirdi, hep ezber yollarla kopyala-yapıştır yaparak hiç birşey anlamadan kodları kullanırdım. şimdi bu yukarıdaki kodları da netten buldum ama üzerinde biraz değişiklik yaparak kullandım.
sonuç itibariyle bu yukarıdaki kodun her satırına hakimim hangi satır hangi görevi var, hangi mantıkla kullanılmış. bunlar sizler için küçük, ama benim için büyük bir adım : )

konumuza dönecek olursak;
evet ETE hocam gelen işaretçi bilgisini test etmek kalıyor, peki işaretten önce gelen preambl uyandırma bilgisi hakkında da biraz bilgi verebilir misiniz acaba, kullanılıp kullanılmaması arasındaki fark nedir.

nette asm ile ilgili kaynak sıkıntısı olduğundan, elimdeki toplama bilgilerle, verdiğiniz bu bilgileri de ekleyip sonuca ulaşacağım inşallah.

ete

Preambl size kesme oluşturma anı ile dataların alınması anı arasında zaman kazandırır.
Veri başında preambl var ise sistem önce onları almaya çalışacaktır. Bu esnada sistem de verilere ulaşmaya başlayacak ve bu sayede veri ortasından almaya başlama gibi bir sıkıntı olmayacaktır.

Preambl olmaz ise sistem direk gelen verileri almaya çalışacak ama baştan bir iki tanesini kaçırma ihtimali yüksek olacak ve sonuçta verileri almaya veri paketinin ortalarından başlamış olacaktır.

Arada ki fark budur.
Ete

designer.21

Teşekkür ederim ETE Hocam; Preamble olmazsa iletişimde sorun çıkacaracağa benziyor. kesme'li bir kod var. kablolu olunca sorunsuz çalışıyor fakat bunda da modül kullanınca yine sapıtıyor. bunun sebebi preambl olmayışı olabilir mi acaba

alisumer

#5
rcreg den aldığın verinin E olduğunu tespit için

movf rcreg ,w
xorlw "E"  ; yada E nin sayısal karşılığı ascci tablodan bakarsın
btfss status ,z
....
....
eğer gelen değer E ise z bayrağı sıfır vererek btfss den iki alta dallanarak işlemin davamını eğer E harici bir değer ise Btfss nin bir altından goto ile yanlış veri aldığında yapacağın işlemlere dallanabilirsin
Hep meraktan

designer.21

alisumer hocam iki alta inmek btfss değil de BTFSC yapmam gerekmez mi, gerçi öyle de sonuca ulaşamadım ama en azından yoğunlaşayım : )

alisumer

btfss ile btfsc arasındaki çalışma farkı sadece btfss eğer yüksek ise atla btfsc düşük ise atla demek ikisini de kullanabilirsin birbirinin yerine verdiğim örnekte btfsc kullanırsan bayrak kalktığında bir alta iner oradan devam edeceğin yere dallandırırsın bayrak indiğinde ise iki alta iner orada yaparsın yapacağını sadece altında yazdığın dallanmaların yerini değiştirerek ikisini de kullanabilirsin fark etmez
Hep meraktan

designer.21

bu XORLW mantığı yeni öğreniyorum ve gerçekten çok işime yarayacak, çünkü assembly'de bir veriyi nasıl şart koşacağımı bilmiyordum, bana kalsaydı tüm bitleri tek tek test edecektim. gelen bilginin beklediğim bilgi olup olmadığını bu sayede rahatlıkla öğrenebilecem.

amacım asm ile hazırlanmış bir rf alıcı verici hazırlamak. ve net ortamında da bununla ilgili bir kaynak bulamadım. siz ve bu sayfadaki diğer değerli hocalarımızın da yardımları sayesinde inşallah bu işin altından  kalkacam.

alisumer

yardımı olduğuna sevindim .hayalini kurabiliyorsan gerçekleştirebileceğine eminim başarılar
Hep meraktan

designer.21

çok teşekkür ederim. bu akşam bir adım daha yaklaştım. bu iş olacak inşallah : )

designer.21

Hamdolsun sonunda, baştan sona assembly ile yazılmış 8 kanallı bas-bırak bir alıcı verici programı yazabildim çok şükür : ) keyfe keder düzenlemelere kaldım sadece. fakat şöyle bir durum var normal mi yoksa devrem ile ilgili bir problemden mi kaynaklı anlamadım. şöyle, alıcıdaki ledler yandığında gözle çok zor farkedilecek kadar dalgalanmalar oluyor sanki. yani tam anlamıyla sabit değiller.

testleri de RCREG deki bitleri kontrol ederek yapmam gerekti. diğer türlüsü hata veriyordu
...
...
KONTROL1
	BTFSS RCREG,0
	GOTO KONTROL2
	GOTO LED1_YAK
KONTROL2
	BTFSS RCREG,1
	GOTO KONTROL3
	GOTO LED2_YAK
...
...

alisumer

verdiğin koddan çıkarım yapacak birşey yok malesef kırpışma için diğer kodlarda sıkıntın vardır. anladığım kadarıyla bir portu tamamiyle ledlere ayırdın yada iki portun bir kısmını.madem çalışman bas bırak çalışıyor movf rcreg ,w  movwf portb şeklinde yapsan kodun kısalır daha iyi çalışır
Hep meraktan

designer.21

Hocam maşallah çok güzel fikirler veriyorsunuz : )
Yarın bunu da değerlendiricem.

designer.21

#14
Alıntı yapılan: alisumer - 28 Aralık 2023, 14:02:26rcreg den aldığın verinin E olduğunu tespit için

movf rcreg ,w
xorlw "E"  ; yada E nin sayısal karşılığı ascci tablodan bakarsın
btfss status ,z
....
....
eğer gelen değer E ise z bayrağı sıfır vererek btfss den iki alta dallanarak işlemin davamını eğer E harici bir değer ise Btfss nin bir altından goto ile yanlış veri aldığında yapacağın işlemlere dallanabilirsin


alisumer hocam, çok farklı bir projede sıkıştığım ve uzun bir zamanımı alan bir yer vardı. sizin verdiğiniz bu bilgi sayesinde çözdüm çok şükür. buradan paylaşmak istedim. : ) teşekkürü tekrardan borç bilirim.

Powered by EzPortal