Asm ile LCD set-up .

Başlatan oguzerdal, 14 Ocak 2023, 21:56:52

oguzerdal

Değerli ustalar,EPE dergisini ( Everyday Practical Electronic ) ve John Becker'i zamanında Asm ile uğraşmış arkadaşlar mutlaka biliyordur diye düşünüyorum. 98 ve 2003 yıllarında yayınlanmış PIC dersleri vardı. Ben de oradan çalışıyorum. Şimdi diyeceksiniz ki yahu artık asm mi kaldı ama bana sorarsanız başlamak için en iyi ,sağlam yol bu. Ben de geldim geldim bu LCD örneğinde takıldım, haftalardır içinden çıkamıyorum. Yol yordamı anladım, Nybble kavramını,pause koyma,8 biti 4'e indirme tekniği vs..vs..bütün gerekenleri anladım ( sanıyorum :)  ). İşin içinden çıkamadım. ETE hocanın PBP örnekleri kartta çalışıyor,kart iyi, lcd sağlam. Adamın da bütün dersleri çalıştı,Ben de eski H/W'ciyim göya ama yapamadım. Lütfen bir el verin ustalar. Eminim sizin için çok basittir.

; TK3TUT29.ASM 03JAN03 - JOHN BECKER - EPE PIC TUTOR V2
; illustrating use of Timer 0 and LCD set up .  D4-D7 , B0-B3 'e bağlı

        LIST p=16F84A
        include <p16f84A.inc>
        __CONFIG _WDT_OFF & _XT_OSC & _PWRTE_ON & _CP_OFF
                ERRORLEVEL -302            

#DEFINE BANK0 BCF STATUS,5
#DEFINE BANK1 BSF STATUS,5

PCL            EQU 2                  ; Program counter register
STATUS          EQU 3                  ; STATUS register
PORTA          EQU 5                  ; Port A data register
PORTB          EQU 6                  ; Port B data register
INTCON          EQU H'0B'              ; INTCON register
W              EQU 0                  ; Working register flag
F              EQU 1                  ; File register flag
C              EQU 0                  ; Carry flag
Z              EQU 2                  ; Zero flag
DC              EQU 1                  ; Digit Carry flag
                
LOOP            EQU H'20'              ; loop counter 1 - general
LOOPA          EQU H'21'              ; loop counter 2 - LCD use only
CLKCNT          EQU H'22'              ; 1/25 secs counter
STORE          EQU H'23'              ; general store
RSLINE          EQU H'24'              ; bit 4 RS line flag for LCD

                ORG 0                  ; Reset Vector address
                GOTO 5                  ; go to PIC address location 5
                ORG 4                  ; Interrupt Vector address
                GOTO 5                  ; go to PIC address location 5
                ORG 5                  ; Start of Program Memory at location 5

                clrf PORTA
                clrf PORTB
                BANK1
                clrf TRISA              ; Port A0-A4 as output
                clrf TRISB            ; PORTB as output
                movlw B'10000110'      ; move ratio value into W
                movwf OPTION_REG        ; set timer ratio to 1:128 (TMR0 rate)
                BANK0                  ; (light pull-ups off - bit 7 high)
                
                goto SETUP              ; bypass table
TABLCD          addwf PCL,F            ; LCD initialisation table
                retlw B'00110011'  ; initialise lcd - first byte
                retlw B'00110011'  ; 2nd byte (repeat of first)
                retlw B'00110010'  ; set for 4-bit operation
                retlw B'00101100'  ; set for 2 lines
                retlw B'00000110'  ; set entry mode to increment each address
                retlw B'00001100'  ; set display on, cursor off, blink off
                retlw B'00000001'  ; clear display
                retlw B'00000010'  ; return home, cursor & RAM to zero
                                      ; end initialisation table            
MESSAG          addwf PCL,F
                retlw 'R'
                retlw 'E'
                retlw 'A'
                retlw 'D'
                retlw ' '
                retlw 'E'
                retlw 'P'
                retlw 'E'
                
SETUP          call PAUSIT            ; perform first 1/5th sec delay
                
LCDSET          
                clrf LOOP              ; clr LCD set-up loop
                clrf RSLINE            ; clear RS line for instruction send
LCDST2          movf LOOP,W            ; get table address
                call TABLCD            ; get set-up instruction
                call LCDOUT            ; perform it
                incf LOOP,F            ; inc loop
                btfss LOOP,3            ; has last LCD set-up instruction now been done?
                goto LCDST2            ; no
                call PAUSIT            ; yes, perform second 1/5th sec delay
                                        ; to allow final LCD command to occur
                                        ; (it takes longer than the rest)
LCDMSG          clrf LOOP              ; clear loop
                bsf RSLINE,4            ; set RS for data send
LCDMS2          movf LOOP,W            ; get table address
                call MESSAG            ; get message letter
                call LCDOUT            ; show it
                incf LOOP,F            ; inc loop
                btfss LOOP,3            ; has last LCD letter been sent?
                goto LCDMS2            ; no, so repeat for next one
                
NOMORE          goto NOMORE            ; yes, so hold here ad infinitum!
                
LCDOUT          movwf STORE              ;temp store data
                movlw 20                ; set minimum time between sending full bytes to
                movwf LOOPA            ; LCD - value of 50 seems OK for this prog with
DELAY          decfsz LOOPA,F          ; XTAL clk of upto 5MHz, possibly 5.5MHz
                goto DELAY              ; keep decrementing LOOPA until zero
                call SENDIT            ; send MSB
                call SENDIT            ; send LSB
                return 
                
SENDIT          swapf STORE,F          ; swap data nibbles
                movf STORE,W            ; get data byte
                andlw 15                ; get nibble from byte (LSB)
                iorwf RSLINE,W          ;OR the RS bit
                movwf PORTB            ; output the byte
                bsf PORTB,5            ; set E line high
                bcf PORTB,5            ; set E line low
                return 
                
PAUSIT          movlw 5                ; set delay counter to 5
                movwf CLKCNT            ; (for 1/25th sec x 5)
                clrf INTCON            ; clear interupt flag
PAUSE                                  ; initial 1/5th sec wait before setting up LCD
                btfss INTCON,2          ; has a timer time-out been detected?
                goto PAUSE              ; no
                bcf INTCON,2            ; yes
                decfsz CLKCNT,F        ; dec counter, is it zero?
                goto PAUSE              ; no
                return                  ; yes
                
                end                    ; final line

onurinci

Becker TASM uzmanı idi,muhtemelen Toolkit 3 ile ASM'ye çevirdi,ve delay'lar tutmadı.uzun yıllar oldu ASM ile çalışmayalı..

oguzerdal

Onur bey, adamcağız bir kaç sene evvel vefat etmiş. Bütün dünya adamın arkasından rahmet diledi. PIC ustası bir adammış belli. Konuyu anlamaya başlayınca ben de anlıyorum zamanlamalarda bir pislik var ama çıkamadım işin içinden.Ustalardan yardım beklemekten başka çarem kalmadı. Tabii daha çok bilgi eksikliğim var, belki daha sonra çözerim. Hayırsever bir usta bi el atsa.  :) .... Size de özellikle teşekkür ederim.

alisumer

zamanlamada pislik derken adam 5 mhz de çalıştırmış çipi sanırım. siz 4 mhz kristal takarsanız çalışmaz doğal olarak ya gecikmeleri kendi frekansınıza göre tekrar baştan yazın yada aynı frekansı kullanın çalışır programda bi hata yoksa.
Hep meraktan

ete

LCD pin tanımlaması göremedim. Yanlızca E pini tanımlanmadan PORTB.5 şekliimnde kullanılmış. Dİğer pinlerin taımlamasını göremedim.

Olması gerekirmi bilemiyorum. Basic de default pinler var onları kullanırsan tanımlama gerekmez ama bu program MPLAB da derleniyor ise ve onunda default ları varsa sorun yok demektir.

Ete

oguzerdal

ETE bey,pin tanımlaması ders içinde aynen B0...B3 >> D4..D7 şeklinde.RS ve E de aynı.Aynen sizin çok iyi bildiğiniz Expkit karttaki gibi.Mesela sizin PBP 4.Ders şıp diye çalıştı.Zamanlamaları da arttırdım, eksilttim ,zaten 2 yerde var, olmadı.Başka ne yapılır bilmiyorum. 

alisumer

#6
 "retlw B'00110010'  ; set for 4-bit operation" komutu 4 bit değil 8 bit için ayarlıyor olması gerek DL biti 0 iken 4  burada 1 yapılmış .lcd nin bilgi sayfasından bakın bence belki farklı bir sürücüsü vardır. HD44780 sürücüsü kullanıyorsan yanlış ayar bunlar komut üstten 3 bit 001 olan kısmı bir sonraki 1 DL biti sonraki 0 N biti  tek satır lcd demek sonraki 0 F biti font için en düşük iki bit kullanılmıyor ne verdiğin önemi değil burada 1 vermiş sanki önemliymiş gibi ya başka bir sürücü yada karıştırmış. 4 bit iletişim için swapf yapıp 8 biti iki seferde yollaması  tamam da ayarı 8 bit yaptıktan sonra bu işe yaramaz sürücü 8 biti tek seferde  bekler .
 
Hep meraktan

alisumer

ayrıca retlw ile çağırmaya gerek te yokki bu ayarların bir çoğunu ekran "silme v kursor" hariç program içerisinde değiştirmezsin ayarlamaları yap program başında birkere gönder ayarı sonra bakma bir daha oraya. 
Hep meraktan

alisumer

ete hocanın kodları ile çalıştıysa benim dediğim gibi ayarlaman yanlış .fonksiyon registeri ayarları için basic lib bölümü
    if ((LCD_BITS) == 8)
        call    lcdloop        ; Send init (33) one more time
      if ((LCD_LINES) == 1)
        movlw  30h            ; 8-bit mode, 1 line, 5x7 font
      else
        movlw  38h            ; 8-bit mode, 2+ lines, 5x7 font
      endif
    else
        movlw  22h            ; Send init to 4-bit mode
        movwf  R3              ; Save character
        call    lcdloop        ; Set interface to 4-bit mode
      if ((LCD_LINES) == 1)
        movlw  20h            ; 4-bit mode, 1 line, 5x7 font
      else
      movlw  28h            ; 4-bit mode, 2+ lines, 5x7 
      endif
    endif
burada senin ekrana uyan ayarı alırsın
Hep meraktan

oguzerdal

#9
Ali Sümer bey çok teşekkürler ilgilenmişsiniz. Kusura bakmayın geç bakabildim. Şimdi dediklerinizi çalışacağım.Şimdi bu C kodları falan biraz beni zorluyor. Daha oralara gelmedim :) . Sağolun. Ekran 1602K. Basic veya C derslerdeki programlar hiç sorunsuz çalışıyor. Timinglerde pek fazla yapılacak bir şey yok herhalde. Hepsini arttırıp eksiltip denedim. Artık iş dediğiniz gibi LCD setup değerlerine kalıyor herhalde.

oguzerdal

Ali Sümer bey ilk mesajınızı çalıştım.LCD nin spec. buldum. Ona göre ayarları yaptım. Nafile. Evet 8 bite göre ayarlamış gibi görünüyor ama ben specdeki değerlere göre verdim gene olmadı. bir de anlamadığım şey şu: Fonction set ayarında aynı byte içinde hem 4 bit hem de 2 satır ve Font ayarı var. Neden adam ilk satırda 4 bit ayarı demiş, altına bir daha 2 satır ayarı demiş?  Dahası, lcd.inc dosyasını da buldum dosyaların içinde. Orada da ısrarla aynı ayarı vermiş.2x16 lcd ler bütün markalarda aynıdır diye düşünüyorum.Setup'ı değiştirmezler bence.Takıldım,sinir yaptı bende :)

alisumer

#11
Bilemedim data sayfasına bakınız bence çünkü ayarı ilk 8 bit için yaptıktan sonra gönderdiğiniz sonraki değerleri kontrolcü 8 bit gelecek diye algılar ama swap yaparak 4 -4 göndermeye devam etmiş bence lcd anlamıyor gönderdiğinizi sonrasında birde enable biti gönderilen 8 bitlik veri sonunda 1 ve 0 yapılıyor olması gerekiyor.4 bit için her dört bit sonunda enable yapılıyor programda (yanlış hatırlıyor olabilirim ama veri tamamlanınca yapılmalı diye hatırlıyorum)
düzeltme: yanlış hatırlıyormuşum :)
Hep meraktan

alisumer

#12
; TK3TUT29.ASM 03JAN03 - JOHN BECKER - EPE PIC TUTOR V2
; illustrating use of Timer 0 and LCD set up .  D4-D7 , B0-B3 'e bağlı
 
        LIST p=16F84A
        include <p16f84A.inc>
        __CONFIG _WDT_OFF & _XT_OSC & _PWRTE_ON & _CP_OFF
                ERRORLEVEL -302            
 
#DEFINE BANK0 BCF STATUS,5
#DEFINE BANK1 BSF STATUS,5
 
PCL            EQU 2                  ; Program counter register
STATUS          EQU 3                  ; STATUS register
PORTA          EQU 5                  ; Port A data register
PORTB          EQU 6                  ; Port B data register
INTCON          EQU H'0B'              ; INTCON register
W              EQU 0                  ; Working register flag
F              EQU 1                  ; File register flag
C              EQU 0                  ; Carry flag
Z              EQU 2                  ; Zero flag
DC              EQU 1                  ; Digit Carry flag
                
LOOP            EQU H'20'              ; loop counter 1 - general
LOOPA          EQU H'21'              ; loop counter 2 - LCD use only
CLKCNT          EQU H'22'              ; 1/25 secs counter
STORE          EQU H'23'              ; general store
RSLINE          EQU H'24'              ; bit 4 RS line flag for LCD
 
                ORG 0                  ; Reset Vector address
                GOTO 5                  ; go to PIC address location 5
                ORG 4                  ; Interrupt Vector address
                GOTO 5                  ; go to PIC address location 5
                ORG 5                  ; Start of Program Memory at location 5
 
                clrf PORTA
                clrf PORTB
                BANK1
                clrf TRISA              ; Port A0-A4 as output
                clrf TRISB            ; PORTB as output
                movlw B'10000110'      ; move ratio value into W
                movwf OPTION_REG        ; set timer ratio to 1:128 (TMR0 rate)
                BANK0                  ; (light pull-ups off - bit 7 high)
                
                goto SETUP              ; bypass table
TABLCD          addwf PCL,F            ; LCD initialisation table
      retlw B'00110011' 
      retlw B'00110010' 
                retlw B'00101000'  ; initialise lcd - first byte
                retlw B'00001110'  ; 2nd byte (repeat of first)
                retlw B'00000110'  ; set for 4-bit operation
 

                                      ; end initialisation table            
MESSAG          addwf PCL,F
                retlw 'R'
                retlw 'E'
                retlw 'A'
                retlw 'D'
                retlw ' '
                retlw 'A'
                retlw 'L'
                retlw 'I'
                
SETUP          call PAUSIT            ; perform first 1/5th sec delay
                
LCDSET          
                clrf LOOP              ; clr LCD set-up loop
                clrf RSLINE            ; clear RS line for instruction send
LCDST2          movf LOOP,W            ; get table address
                call TABLCD            ; get set-up instruction
                call LCDOUT            ; perform it
                incf LOOP,F            ; inc loop
                btfss LOOP,2          ; has last LCD set-up instruction now been done?
                goto LCDST2            ; no
                call PAUSIT            ; yes, perform second 1/5th sec delay
                                        ; to allow final LCD command to occur
                                        ; (it takes longer than the rest)
LCDMSG          clrf LOOP              ; clear loop
                bsf  RSLINE        ,4            ; set RS for data send
LCDMS2          movf LOOP,W            ; get table address
                call MESSAG            ; get message letter
                call LCDOUT            ; show it
                incf LOOP,F            ; inc loop
                btfss LOOP,5          ; has last LCD letter been sent?
                goto LCDMS2            ; no, so repeat for next one
                
NOMORE          goto NOMORE            ; yes, so hold here ad infinitum!
                
LCDOUT          movwf STORE              ;temp store data
                movlw .20                ; set minimum time between sending full bytes to
                movwf LOOPA            ; LCD - value of 50 seems OK for this prog with
DELAY          decfsz LOOPA,F          ; XTAL clk of upto 5MHz, possibly 5.5MHz
                goto DELAY              ; keep decrementing LOOPA until zero
                call SENDIT            ; send MSB
                call SENDIT            ; send LSB

                return 
                
SENDIT  

      swapf STORE,F          ; swap data nibbles
                movf STORE,W            ; get data byte
                andlw .15                ; get nibble from byte (LSB)
                iorwf RSLINE,W          ;OR the RS bit
                movwf PORTB            ; output the byte
        ; set E line high
              bsf PORTB,5  
          nop  
                bcf PORTB,5            ; set E line low    
                return 
                
PAUSIT          movlw 5                ; set delay counter to 5
                movwf CLKCNT            ; (for 1/25th sec x 5)
                clrf INTCON            ; clear interupt flag
PAUSE                                  ; initial 1/5th sec wait before setting up LCD
                btfss INTCON,2          ; has a timer time-out been detected?
                goto PAUSE              ; no
                bcf INTCON,2            ; yes
                decfsz CLKCNT,F        ; dec counter, is it zero?
                goto PAUSE              ; no
                return                  ; yes
                
                end                    ; final line
Böyle çalışıyor.EPE yi ALI yapınca düzeldi :P
Hep meraktan

oguzerdal

Ali bey çok teşekkürler benim için zaman harcamışsınız ama maalesef olmadı.Lcd setup'ı bayağı değiştirmişsiniz ama çalışmadı.Başka bir çalışan asm programı bulmak lazım. :'(

alisumer

hmm bende çalışıp da sende nasıl çalışmadı acaba data bacaklarını ters bağlamış olma ihtimalin varmı.simulasyonda denedinmi mesela


Hep meraktan

Powered by EzPortal