Assembyl ile lcd çalıştıramadık

Başlatan Mucit23, 27 Mart 2014, 12:39:29

Mucit23

Merakımdan dolayı Assembly ile biraz uğraşayım dedim. Kendim CCS de kullandığım 2x16 LCD kütüphanesine bakarak LCD kütüphanesi yazmaya çalıştım. Yahu bir türlü LCD de A harifini çıkaramadım. Daha önce ASM ile çok çok az uğraştım. Şu 4 bit haberleşme işinde yanlış yapıyorum büyük ihtimal.

Yazdığım kodlar bunlar.
LIST P=16F628A
INCLUDE "P16F628A.inc"

__config _INTRC_OSC_NOCLKOUT  & _WDT_OFF & _MCLRE_OFF & _LVP_OFF & _CP_OFF

  BSF STATUS,5 ;BANK1'E GEÇ
  MOVLW H'00'  ;PortA'yı Çıkış yaptık
  MOVWF TRISA  ;
  MOVLW H'00'  ;PortB'yı Çıkış yaptık
  MOVWF TRISB
  BCF STATUS,5
  CLRF PORTB
  CLRF PORTA

  MOVLW H'07'  ;Comparator Kapatılıyor
  MOVWF CMCON

  COUNTER   EQU H'20'
  COUNTER1  EQU H'21'
  COUNTER2  EQU H'22'
  LCD_DATA  EQU H'23'

  CALL DELAY2   ;Biraz bekleki LCD kendine gelsin.
  CALL LCD_INIT  

  MOVLW H'80' ;Ekrana kordinatlar gönderiliyor. 1. Satır 1. Sütün
  MOVWF LCD_DATA
  CALL LCD_SEND_BYTE
 
  BSF PORTA,1  ;RS=1 yapıldı
  MOVLW D'65'  ;A harfini gönder
  MOVWF LCD_DATA
  CALL LCD_SEND_BYTE
BASLA

GOTO BASLA

LCD_INIT
  BCF PORTA,1      ;RS=0 Yapıldı
  BCF PORTA,0      ;E=0 Yapıldı

  CALL DELAY1       ;Bekle

  MOVLW H'03'      ;LCD'ye Binary olarak 00000011 gönderildi
  CALL LCD_SEND_DATA
  CALL DELAY1
  MOVLW H'03'      ;LCD'ye Binary olarak 00000011 gönderildi
  CALL LCD_SEND_DATA
  CALL DELAY1
  MOVLW H'03'      ;LCD'ye Binary olarak 00000011 gönderildi
  CALL LCD_SEND_DATA
  CALL DELAY1
  MOVLW H'02'      ;LCD'ye Binary olarak 00000010 gönderildi 
  CALL LCD_SEND_DATA
  CALL DELAY1

  MOVLW H'28'      ;LCD'ye Binary olarak 00101000 gönderildi
  MOVWF LCD_DATA
  CALL LCD_SEND_BYTE
  MOVLW H'0C'      ;LCD'ye Binary olarak 00001100 gönderildi
  MOVWF LCD_DATA
  CALL LCD_SEND_BYTE
  MOVLW H'01'      ;LCD'ye Binary olarak 00000001 gönderildi
  MOVWF LCD_DATA
  CALL LCD_SEND_BYTE
  MOVLW H'06'      ;LCD'Ye Binary olarak 00000110 gönderildi
  MOVWF LCD_DATA
  CALL LCD_SEND_BYTE
RETURN


LCD_SEND_BYTE
  BCF PORTA,0        ;E=0 Yapıldı
  MOVLW H'0F'        ;W Registerine binary olarak 00001111 yükleniyor
  SWAPF LCD_DATA,F   ;LCD_Data Registerinde yüksek 4 bit ile düşük 4 bit yer değiştiryor
  ANDWF LCD_DATA,W   ;LCD_Data registeri w ile and işlemine tabi tutuluyor
  CALL LCD_SEND_DATA ;Yüksek 4 Biti LCD Ye gönderdik
  MOVLW H'0F'        ;W Registerine binary olarak 00001111 yükleniyor
  SWAPF LCD_DATA,F   ;LCD_Data Registerinde yüksek 4 bit ile düşük 4 bit yer değiştiryor
  ANDWF LCD_DATA,W   ;LCD_Data registeri w ile and işlemine tabi tutuluyor
  CALL LCD_SEND_DATA ;Düşük 4 Biti LCD Ye gönderdik  
RETURN

LCD_SEND_DATA  
  MOVWF PORTB      ;Datayı PortB'ye Yaz
  BSF PORTA,0      ;E=1 Yapıldı
  NOP              ;2uS Bekle
  NOP
  BCF PORTA,0      ;E=0 Yapıldı
RETURN

DELAY1
  MOVLW D'40'
  MOVWF COUNTER2
WAIT1
  MOVLW D'100'
  MOVWF COUNTER1
WAIT2
  DECFSZ COUNTER1,F
  GOTO WAIT2
  DECFSZ COUNTER2,F
  GOTO WAIT1 
RETURN

DELAY2
  MOVLW D'1'
  MOVWF COUNTER2
DONGU1
  MOVLW D'100'
  MOVWF COUNTER1
DONGU2
  MOVLW D'200'
  MOVWF COUNTER
DONGU3
  DECFSZ COUNTER,F
  GOTO DONGU3
  DECFSZ COUNTER1,F
  GOTO DONGU2
  DECFSZ COUNTER2,F
  GOTO DONGU1
RETURN 

END


LCD bağlantılarım aşağıdaki gibi

RS = Porta.1
E   = Porta.0
LCD_DB4=Portb.0
LCD_DB5=Portb.1
LCD_DB6=Portb.2
LCD_DB7=Portb.3

CCS de kullandığım kütüphanede LCD ye 8 bit data gönderirken ilk önce yüksek 4 bit sonra düşük 4 bit gönderiliyor.
Bende aynısını yaptım.

Kodlarda yapılanlarla biraz açıklama yapmaya çalıştım. Acaba nerde hata yapıyorum?

Mucit23

Kodu biraz daha düzenledim. İsiste debug yapıyorum herşey olması gerektiği gib ama LCD de bir türlü görüntü alamadım.

Fikri olan yokmu?

ErsinErce

genelde delay kısmında sıkıntı çıkıyor.
gecikmeyi biraz arttırın

Mucit23

Çalışmasına etkisi yoktu ama değişkenleri yanlış yere tanımlamıştım. Onuda düzelttim. Biraz delaylara bakınayım.

z

LCD_SEND_DATA 
  MOVWF PORTB      ;Datayı PortB'ye Yaz
  BSF PORTA,0      ;E=1 Yapıldı
  NOP              ;2uS Bekle
  NOP
  BCF PORTA,0      ;E=0 Yapıldı
RETURN

Aşağıdaki satırdan sonra biraz bekleme yapmayı dene. Mesela 5..10 tane NOP komutu koy.

  BCF PORTA,0      ;E=0 Yapıldı

  NOP              ;2uS Bekle
  NOP

yazan yerdeki NOP sayısını da artır.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Mucit23

Evet delayların sayısını bayağı bir arttırdım. Şimdi çalıştı ama çok yavaş. Optimun değerleri bulmaya çalışayım.