pic 16F628 ?

Başlatan skylink_ktef, 06 Mayıs 2006, 11:37:09

skylink_ktef

Merhabalar ;

Elimde PIC16F84 ile LCD ye "123456789" yazan assembly kodları var. Proteusda 16f84 devresini kurdum ve çalıştırdım sorun yok.Ben bu kodu PIC16F628 de çalıştırmak istiyorum. Proteusda Pic16f628 devresini kurdum fakat LCD de hiçbirşey göremedim.

Sizce Ne Yapmalıyım ?

Program şu şekilde
LIST		P=16F628
	INCLUDE		"P16F628.INC"


	cntl	equ	0x10
	cnth	equ	0x11
	cx	equ	0x12
	sayac	equ	0x14
	vericnt	equ	0x13
	RS	equ	0x00
	RW	equ	0x01
	EN	equ	0x02
	
	org	0x00	

basla		clrwdt
		call	initial		;portları kur
		call 	LCD_RESET	;LCD reset
		call	clear		;ekranı temizle
		call	two_line	;iki satır aktif
		call	display_on	;display on
		call	cursor_inc	;kursör 1 artan modda
		call	clear		;ekranı temizle
		call	mesaj		;verileri yaz
tekrar		goto	tekrar		;programı sonlandır


initial		bsf	STATUS,RP0	;BANK1 e geç
		clrf	TRISA		;PORTA -- çıkış
		clrf	TRISB		;PORTB -- çıkış
		bcf	STATUS,RP0	;BANK0 a dön
		clrf	vericnt		;vericnt -- 0
		return


clear		call	timer_low	;Bekle
		movlw	0x01		;displayi temizle
		movwf	PORTB		;kursörü 1.satirin başına al
		bcf 	PORTA,RS	;RS -- Komut
		bcf	PORTA,RW	;RW -- Yaz
		bsf	PORTA,EN	;--
		nop				
		bcf	PORTA,EN	;--
		return	


LCD_RESET	movlw	0x03
		movwf	cx
nexti		call	timer_low	;bekle
		bcf	PORTA,RS	;RS -- Komut
		bcf	PORTA,RW	;RW -- Yaz
		movlw	0x30
		movwf	PORTB
		bsf	PORTA,EN	;--
		nop				
		bcf	PORTA,EN	;--
		decfsz	cx,F		;cx -- cx-1
		goto	nexti
		return	


two_line	call	timer_low	;bekle
		movlw	0x38		;iki satır aktif
		movwf	PORTB
		bcf	PORTA,RS	;RS -- Komut
		bcf	PORTA,RW	;RW -- Yaz
		bsf	PORTA,EN	;--
		nop				
		bcf	PORTA,EN	;--
		return	

cursor_inc	call	timer_low	;bekle
		movlw	0x06		;Kursör 1 artan mod
		movwf	PORTB
		bcf	PORTA,RS	;RS -- Komut
		bcf	PORTA,RW	;RW -- Yaz
		bsf	PORTA,EN	;--
		nop				
		bcf	PORTA,EN	;--
		return	
		

display_on	call	timer_low	;bekle
		movlw	0x0E		;LCD ON
		movwf	PORTB
		bcf	PORTA,RS	;RS -- Komut
		bcf	PORTA,RW	;RW -- Yaz
		bsf	PORTA,EN	;--
		nop				
		bcf	PORTA,EN	;--
		return

mesaj

m_devam		call	timer_low	;bekle
		bsf	PORTA,RS	;RS -- veri
		bcf	PORTA,RW	;RW -- YAZ
		movf	vericnt,W	;w -- vericnt
		call	mesaj_verisi	;veriyi al
		iorlw	0		;0 ile test et
		bz	m_son		;0 ile	m_son etiketine git
		movwf	PORTB		;0 değilse veriyi PORTB ye yaz
		
		incf	vericnt,1	;bir sonraki veriyi adresle
		bsf	PORTA,EN	; -- 
		nop				
		bcf	PORTA,EN	;--
		goto	m_devam		;veri yazma işine devam et
		

m_son		goto basla

mesaj_verisi	addwf	PCL,1
		retlw	"1"
		retlw	"2"
		retlw	"3"
		retlw	"4"
		retlw	"5"
		retlw	"6"
		retlw	"7"
		retlw	"8"
		retlw	"9"
		retlw	"0"
		retlw	0



timer_low	movlw	0xFF		;LCD işlem yaparken gerekli
		movwf	cnth		;zamanı sağlamak için
next2		movlw	0xFF		;bekle
		movwf	cntl		;count -- 0xff
next1		decfsz	cntl,F		;count=count - 1, c=0 mı?
		goto 	next1		;hayır. next1 e git
		decfsz	cnth,F
		goto	next2	
		return			;evet. timer alt programından çık
		end


Mod Notu: Program kodlarını code tagi içine alalım !

ismetelk

aynı programın hex ini attıysan olmaz.
628 de porta nin ilk 4 bitini dijital I/O yapmak için CMCON registerine 07 değerini ataman gerekli.

skylink_ktef

Teşekkür ederim. Proteus da çalıştırdım. Fakat program 16F84 de "123456789" yazarken, 16F628 de sadece  "1111111...." değerlerini getiriyor.
tablodan değerleri aldırırken ADDWF  PCL,1 komutu var buradaki PCL çalışmıyor olabilir mi.
Programın hepsi aynı sadece başlık bilgisini değiştiriyorum iki pic arasında.

Sorun ne olabilir ?

ismetelk

sayac ve vericent diye tanımladığın değişken adreslerini 0x20 ve 0x21 olarak değiştirirsen kessin çalışacaktır.