Lcd Glcd dönüşümü

Başlatan TA7R, 17 Nisan 2015, 23:04:40

TA7R

Merhaba ,
Yapmak istediğim DDS-VFO lara ait bir kaç proje var , ikisinde de asm kaynak kodları ve şema mevcut , Vfo da 2x16 lcd değil de 64x128 Glcd kullanmak istiyorum , yazıları daha büyük fontta yazdırmak , belki sağa sola sabit bir kaç grafik yerleştirmek vs ...
Projelerden birinde 2 adet birbiri ile de haberleşen 16f877 kullanılmış ancak 2x16 lcd ye kumanda eden picin başka işlevleri de var portlar dolu .
Diğer projede ise bir adet 16f84 kullanılmış , lcd , rotary encoder , key , dds modülle haberleşme vs ile  ...
Böyle bir dönüşüm kolaymıdır , nasıl yapmak nerden başlamak gerekir.
İki 16f877 li projeye bir pic daha mı eklemek gerekir?

RaMu

Bildiğin her şey kolay bilmediğin zor,
bu söz burayada çok uygun.

Asm ile lcd ve glcd kontrol eden kodları yazdıysanız
veya en azından hazır bir örneği inceleyip iyice anladıysanız
böyle bir projeyi yapabilirsiniz.

Portların dolu olması önemli değil çözülür.
Asm glcd örnekleri forumda vardı,
benim denediğimde vardı (paylaşmışta olabilrim hatırlamıyorum).


Ama C öğrenip çok daha kısa sürede
ve kolaylıkla yapabilirsiniz.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

TA7R

Merhaba , çözmeye çalıştığım asm yazılımında anlayamadığım eşitlemeler yapılmış , tırnak içinde nokta ve tırnak içinde tire karekterleri var bunlar ne iş görüyor , yazılımının bu bölümünde ne yapılmış ? Elimdeki kitaplarla çözemedim .

; Info for power-up display                                                   
MCODE_REV_0  equ  '7'     ; Current code version is 7.4                     
MCODE_REV_1  equ  '.'     ;                                                   
MCODE_REV_2  equ  '4'     ;                                                   
MCODE_REV_3  equ  '6'     ;

#ifdef AD9850
; changed from 30 to 62
MCODE_REV_4  equ  '6'     ;
MCODE_REV_5  equ  '2'     ;
#endif

#ifdef AD9851
MCODE_REV_4  equ  '6'     ;
MCODE_REV_5  equ  '0'     ;
#endif                                                   

#ifdef MULTBY2
MCODE_REV_6  equ  'x'     ;
MCODE_REV_7  equ  '2'     ;
#else
#ifdef MULTBY4
MCODE_REV_6  equ  'x'     ;
MCODE_REV_7  equ  '4'     ;
#else
MCODE_REV_6  equ  ' '     ;
MCODE_REV_7  equ  ' '     ;
#endif
#endif

RaMu

İki nokta var burada;
biri equ diğeri #if #ifdef vs.

equ nun buradaki kullanımı
birşeyi başka bir şey ile ifade etme
sembol gibi düşünülebilir
tabi burada atanan ifade bir sabit.

Misal afaki bir örnek vereyim
led toggle yapan bir program yazdık
programda bekleme süresini belirleyen altprogramda
değişken olan sayaç değerlerine ilk yükleme değerlerini
movlw 04h;
movwf sayac1;

gibi atıyoruz,
bunun yerine, programın başında
bekle_sabit equ  04h

deyip

daha sonra bekleme rutininde
movlw bekle_sabit       ; bu kısım yukarıdaki tanımlamadan ötürü movlw  04h  ile aynı olur   
movwf sayac1              ;


#ifdef ise şöyle
#ifdef  karşısında birşey
....
#endif
eğer karşısındaki şey programda tanımlanmış ise
(#define   karşısındaki şey seklinde)
endif e kadar olan kısmı derler.
bunlar preprocessor önişlemci komutları,
programın nasıl derleneceğini belirleyen komutlar.

Yani yukarıdaki programda
programın hangi kısmı ne zaman neye göre derlensin diye böylebir sistem yapılmış.

Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

TA7R

@Ramu hocam , çok teşekkür ederim. Ben de öyle düşünmüştüm ama  tırnak içinde (  '.'   ) nokta ve tırnak içinde (  '-'  ) tire nasıl değer olarak atanır ?  Şimdi düşünüyorum da LCD ye karakter yazdırmak için mi mesela 14.100 Mhz in noktasını  mı tanımlıyor acaba ?

RaMu

#5
Evet.
Tırnak içinde yazılan değerin direk ascii karşılığını
derleyici kendi sayı değeri olarak çevirir,
misal

movlw  'A'
movlw  41h
movlw  .65

hepsi aynıdır, hepside W register ına decimal 65 sayısını yükler,
wiev disassembly listing den kontrol edilebilir.

mesaj birleştirme:: 29 Nisan 2015, 19:02:27

Aslında nokta büyük ihtimalle
versiyon numarası için yazılmıştır verdiğin kısımda.
Ama mantık aynı.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

TA7R

Pic asambly de 35 adet işlemci komutu dışında kullanılabilen diğer komut vb .. nerden bulabilirim ? Elimde asambly öğretiyorum iddeasında olan iki üç kitap var ama sadece 35 komutu vermişler.

RaMu

16f için sadece 35 komut var zaten.

İngilizce kaynak olur mu?
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

TA7R

#8
Hocam elimeki kitap da öyle yazıyor ama sonra "deyim" diyor "       "org"  mesela . Bana bu deyim meyim söylem möylem , asm programı yazılırken  ne kullanılabiliyorsa hepsini içeren bir kaynak lazım ama zannedersem Türkçe olarak yok . E-book da olabilir .  Bu deyim konusu da kafamı karıştırdı ya yeteri kadar. Eğer programı yazarken sizin atadığınız bir etiket değilse , programa veya pic e bir iş yaptırıyorsa bu deyim meyim olmaz resmen komut olur. Burda benim bilmediğim şey şu mu , komutlar var pic e iş yaptırıyor , komutlar var programa iş yaptırıyor , böyle mi yani ? 
Not : aradıklarımın bir kısmını "http://robot.ee.hacettepe.edu.tr/Dosyalar/makaleler/Pic_Assembly_ve_Makrolar.pdf" adresinde buldum , mesela bendeki programda #define kullanılmıştı. Üniversitelerde o kadar hocamız var ,bir tanesi Allah rızası için doğru dürüst bir Pic Asambler kitabı yazsa olmaz mı ?
Şimdiki merakım şu programda hiç bir atama yapılmadan peş peşe 30 - 40 etiket yazılmış . Mesela ;
...
CBLOCK  RAMSTART
ENC_HISTORY                     ; Last 4 samples of encoder state.
                COUNT_0                         ; Counter for delay routine.
                COUNT_1                         ; General counter variables.

                COUNT_2                         ; ** All variables from here to the end **
                COUNT_3                         ;    of RAM are cleared at power up.
                COUNT_4                         ;
                TEMP_1                          ; Temporary storage.
                TEMP_2                          ;        "
                TEMP_3                          ;        "
                ENC_COUNTER                     ; 1 to 38 = CW. -1 to -38 = CCW.
                INT_COUNT                       ; 8 to 1. Decremented every 1.024 mS.
                SW_B_CNT                        ; CAL switch pressed counter. (x 8mS)
                SW_B_OLD                        ; State of old switch count.
                SW_C_CNT                        ; TX switch pressed counter.  (x 8mS)
                SW_BC_CNT                       ; RIT switch pressed counter. (x 8mS)
                SW_BC_OLD                       ; State of old switch count.
                TIMEOUT_L                       ; 16 bit display timeout down counter,
                TIMEOUT_H                       ; return to main display when = 0.
                EEPROM_WRITE                    ; EEPROM write update down counter.
                FLAGS                           ; 8 misc flags.
                FLAG2                           ;       "

                FREQUENCY:5                     ; 40 bit frequency.
                STEP_NUM                        ; LCD cursor pos & step size num.(0-7)
                                                ; (Do not separate frequency & STEP_SIZE)
                STEP_RATE                       ;
                DDS_OLD:5                       ; 40 bit previous DDS freq.

                ARG1_10                         ; MSD.    11 byte ASCII buffer.
                ARG1_9                          ; MSD. \
                ARG1_8                          ;       |
                ARG1_7                          ;       |
                ARG1_6                          ;       |
                ARG1_5                          ;       | 80 bit maths buffer.
                ARG1_4                          ;       |
                ARG1_3                          ;       |
                ARG1_2                          ;       |
                ARG1_1                          ;       |
                ARG1_0                          ; LSD. /

                ARG2_4                          ; MSD. \
                ARG2_3                          ;       |
                ARG2_2                          ;       | 40 bit maths buffer.
                ARG2_1                          ;       |
                ARG2_0                          ; LSD. /

                ARG3_4                          ; MSD. \
                ARG3_3                          ;       |
                ARG3_2                          ;       | 40 bit maths buffer.
                ARG3_1                          ;       |
                ARG3_0                          ; LSD. /

                ARG4_4                          ; MSD. \
                ARG4_3                          ;       |
                ARG4_2                          ;       | 40 bit maths buffer.
                ARG4_1                          ;       |
                ARG4_0                          ; LSD. /

                ENDC
--    Bu atanmamış etiketler ne işe yarıyor ?
--    CBLOCK  RAMSTART      nedir bunlar  ?  biri komut diğeri etiket mi , atama mı ?

RaMu

Eminim güzel kitaplar var ama
ben kitapdan öğrenmediğim için
kitap tavsiyesi veremiyorum.
Birde sadece pic için asm biliyorum
daha pc tarafında veya diğer mikrodenetleyici ve
microişlemciler için vs. kullanılanı var.

Pic için dediğiniz gibi oluyor,
mikrodenetleyicinin program hafızasına yazılacak olan
program için 35 adet (16f için) komut var,
bunun yanında kullandığımız ide (misal mplab) ve
kullandığımız derleyici (misal mpasm) için
komutlar (önişlemci komutları) deyimler var.

Asm yazarken dahi işleri kolaylaştırmak lazım
bu nedenle bu önişlemci komutları mevcut.

cblock -başlangıç adresi-
...
endc

burada cblock karşısına başlangıç adresi veriliyor,
misal equ tanımlamalarını 0x20 den başlatıyoruzya
cblock 20h diye yazıyoruz,
sonra equ ile tanımlayacaktık değişkenleri ama
artık cblock yazdık ardına tüm değişkenlerimizi yazıyoruz,
oda sırayla adreslere değişkenleri eşitliyor
örneğin

deg1  equ 20h
deg2  equ 21h
deg3  equ 22h

diyeceğimize
cblock 20h
deg1
deg2
deg3
endc

demek aynı işi yapar.

sizin kodda RAMSTART dediği
kullandığınız mcu kullanıcı(user) ram bölgesi nereden başlıyorsa
(misal 16f877 için 20h adresi)
bu değerin atanmış olduğu bir sabittir
bunuda kullanıcı kendi atamıştır %90.
bir yerde RAMSTART equ 20h veya
(doğrumu hatırlamıyorum #define RAMSTART 20h )
diye bir atama vardır programda.

Bunlarda mcu dan mcu ya kolay aktarılabilecek
veya kolay değişiklik yapılabilecek asm kodları yazmak için yöntem diyebiliriz.

Aslında ide-derleyici kullanmadan da asm kod yazabilirsiniz
http://danamlund.dk/pic_microcontroller_blinking_led_without_cheating.html


Ben genelde merak ettiğim şeyi nete yazıp aradım öğrendim
birde microchip in kaynaklarından faydalandım
http://ww1.microchip.com/downloads/en/DeviceDoc/33014L.pdf
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

TA7R

#10
@Ramu hocam çok teşekkür ederim , bir kaç tane yazılım var aynı iş için bunları inceliyorum yukarıdaki kodlarda #define RAMStart yok ama  yazarken gözümden kaçmış INCLUDE "DD_SYNTH.DAT" dosyası var. Basitleştirmek için ek dosyaları olmayan yazılımda yoğunlaşıyorum , bununla alakalı bir sorum var.

; * Assign names to IO pins.                                                 *
; ****************************************************************************
;
;   B register bits:
;
DDS_clk equ     0x02              ; AD9850/AD9851 write clock
DDS_dat equ     0x03              ; AD9850/AD9851 serial data input
LCD_busy equ    0x03              ; LCD busy bit
LCD_e   equ     0x04              ; 0=disable, 1=enable
LCD_rw  equ     0x05              ; 0=write, 1=read
LCD_rs  equ     0x06              ; 0=instruction, 1=data
DDS_load equ    0x07              ; Update pin on AD9850/AD9851
;
;   A register bits:
;
speaker   equ  0x02              ; Speaker (always exit with a low output)   
pb_3      equ   0x02              ; PB also on this pin                       
pb_2      equ   0x03              ; Bandswitch Pushbutton,                     
pb_1      equ   0x04              ; Tuning-increment/Calibrate Pushbutton     
;

Göreceğiniz gibi işlemcinin pinlerine bağlı elemanlar adreslenmiş ancak , burda hiç bank veya port değiştirilmeden mesela 0x02 adresine ad9850 dds clk bağlamış (yukarıda da picin şeması var ) dds clk RB2 pinine bağlı milkro işlemcinin. Sonra hiç bank port değiştirmeden hemen devamında 0x02 ye speaker bağlamış şemada bu RA2 pininde
hemen altındaki kodda da yine 0x02 adresine pb_3 bağlamış ...
yani 0x02 hem RB2 için adresleniyor hem RA2  burda program veya pic  bu adresi nasıl karıştırmıyor ?

Target Controller -      PIC16F628A in PIC-EL board                           
;                          __________                                         
;     PB_3-Speaker----RA2 |1       18| RA1---------ENCODER A                   
;     PB_2-Bandswitch-RA3 |2       17| RA0---------ENCODER B                   
;     PB_1-Tuning etc-RA4 |3       16| OSC1--------XTAL                       
;     +5V-----------!MCLR |4       15| OSC2--------XTAL                       
;     Ground----------Vss |5       14| VDD---------+5 V                       
;     LCD D4----------RB0 |6       13| RB7---------DDS_LOAD                   
;     LCD D5----------RB1 |7       12| RB6---------LCD_rs  (LCD Pin 4)         
;     LCD D6/DDS_CLK--RB2 |8       11| RB5---------LCD_rw  (LCD Pin 5)           
;     LCD D7/DDS_DATA-RB3 |9       10| RB4---------LCD_e   (LCD Pin 6)         
;                          ----------                                 

RaMu

#11
Burada bir kelimeye veya sembol diyelim
rakam atanmış,
bu sayede misal
eğer
DDS_clk equ     0x02              ; AD9850/AD9851 write clock
yazılırsa;

("ad9850 clk RB2 pinine bağlı")
BSF PORTB,2
yerine
BSF PORTB,DDS_clk equ

diyebiliriz demek oluyor,

Farklı kelimelere aynı rakam değeri atanabilir,
bunda bir problem yoktur,
bu sayede

speaker   equ  0x02              ; Speaker (always exit with a low output)   
yazarsak;
BSF  PORTA,2
yerine
BSF  PORTA,speaker
yazılabilir.


Bu işlemlerin pic içinde işleyek programla hiçbir ilgisi yok,
hepsi derleyici için yapılıyor.

mesaj birleştirme:: 30 Nisan 2015, 15:12:11

Faydası ne?
Şimdi bu programda normalde
LCD_e   equ     0x04              ; 0=disable, 1=enable
LCD_rw  equ     0x05              ; 0=write, 1=read


yazılmış,
biz lcd_e pini ile
lcd_rw pinini yerlerini değiştirmek istiyoruz,
LCD_e   equ     0x05              ; 0=disable, 1=enable
LCD_rw  equ     0x04              ; 0=write, 1=read

şeklinde değiştirmemiz yeterli.

Aksi halde
lcd_e ve lcd_rw nin
bsf portx,5
vs. gibi kullanılan bütün
komutlarını tek tek oturup değiştirmek zorunda kalacaktık.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

TA7R

Yani şöyle anladım , burda genel adresleme yapılıyor , asıl komutlar yazılırken bank/port seçimi yapılacak o zaman program o port için bu adrese bakacak . Verdiğiniz linkleri inceliyorum , teşekkürler selam ve saygılar.

RaMu

Ben teşekkür ederim,
sorunuz olursa çekinmeyin.

Birde bu projeyi yaptıktan sonra
birde C ile yapın aynı işi.

AD985x in datasheet inide incelemekte fayda var,
programı anlamanızı çok kolaylaştırır,
bir asm programın ne işi nasıl yaptığını anlamak çok zordur.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

TA7R

Hocam benim bu programı tamamiyle anlayıp böyle programlar yazmam imkansız. Yapmaya çalıştığım şey lcd ekranı (ve mecburen pic i) değiştirip  18f452 + glcd bağlamak . Düşündüğüm yol ise  asm yazılımını pic-lcd değişikliğiyle mikroc içinde kullanmak .