Kod düzenleme pic16f877a

Başlatan ATAU_Muhendis, 18 Mayıs 2016, 09:23:22

ATAU_Muhendis

Merhabalar kayan yazı için örnek bulduğum kod eski pbp ile yazılmış bende şuan pbp 4.0.0 var ve bazı komutlarda hata alıyorum örneğin ''DelayUs 1 PAUSEUS 1'' olacak ama bazı kodlara o kadar hakim değilim. Sizle kodu paylaşmak istiyorum acaba nerelerde hangi kodu düzeltmeliyim yardımcı olur musunuz? Şimdiden teşekkürler  :) Aldığım komut hataları= XTAL,Dim,ALL_DIGITAL = True,Read LETRA,Restore CONTADOR,DelayUs 1)
Device = 16F877A

XTAL =  4

'datos
Data 0,0,0,0,0,0,0,0,0,0,0 'ESPACIO
Data 0,0,0,0,0,0,0,0,0,0,0 'ESPACIO
Data 0,0,0,0,0,0,0,0,0,0,0 'ESPACIO
Data 0,0,0,0,0,0,0,0,0,0,0 'ESPACIO
Data 0,0,0,0,0,0,0,0,0,0,0 'ESPACIO
Data 255,137,137,137,129,0 'LETRA     "E"
Data 98,145,137,137,137,70,0 'LETRA   "S"
Data 255,136,136,136,136,112,0 'LETRA "P"
Data 129,129,255,129,129,0 'LETRA     "I"
Data 255,64,48,12,2,255,0 'LETRA      "N"
Data 126,129,129,129,129,126,0 'LETRA "O"
Data 131,133,137,145,161,193,0 'LETRA "Z"
Data 127,136,136,136,136,127,0 'LETRA "A"
Data 0,0,0,0,0,0,0,0,0,0 'ESPACIO
Data 255,137,137,137,129,0 'LETRA        "E"
Data 98,145,137,137,137,70,0 'LETRA      "S"
Data 255,136,136,136,136,112,0 'LETRA    "P"
Data 255,137,137,137,129,0 'LETRA        "E"
Data 6,129,129,129,254,128,128,0 'LETRA  "J"
Data 126,129,129,129,129,126,0 'LETRA    "0"
Data 0,0,0,0,0,0,0,0,0,0,0 'ESPACIO
Data 2,129,129,255,255,128,128,0 'LETRA "J"
Data 30,63,33,33,63,30,0 'LETRA         "0"
Data 49,57,41,45,39,35,0 'LETRA         "S"
Data 30,63,37,37,61,24,0 'LETRA         "E"
Data 0,0,0,0,0,0,0,0,0,0 'ESPACIO
Data 129,129,255,255,129,129,0 'LETRA "I"
Data 60,62,1,1,62,60,0         'LETRA "v"
Data 30,63,33,33,62,127,99,0 'LETRA   "a"
Data 32,63,63,12,24,63,63,0 'LETRA    "n"
Data 0,0,0,0,0,0,0 'ESPACIO
Data 12,102,99,3,99,102,12,0 'CARITA FELIZ
Data 0,0,0,0,0,0,0 'ESPACIO
Data 255,255,137,137,137,129,0 'letra     'E'
Data 255,255,3,3,3,3,0 'letra             'L'
Data 255,255,137,137,137,129,0 'letra     'E'
Data 255,255,195,195,195,195,0 'LETRA     'C'
Data 192,192,255,255,192,192,0 'LETRA     'T'
Data 255,255,136,140,247,113,0 'LETRA     'R'
Data 126,255,129,129,255,126,0 'LETRA     '0'
Data 255,255,96,24,6,255,255,0 'LETRA     'N'
Data 195,195,255,255,195,195,0 'LETRA     'I'
Data 255,255,195,195,195,195,0 'LETRA     'C'
Data 127,255,200,200,200,255,127,0 'LETRA 'A'
Data 0,0,0,0,0,0,0 'ESPACIO
Data 243,243,211,211,223,206,0,0    'LETRA '5'
Data 30,33,33,33,0,0                'LETRA 'C'
Data 47,0,0                         'LETRA 'I'
Data 30,33,33,33,0,0                'LETRA 'C'
Data 128,255,1,0,0                    'LETRA 'L'
Data 30,33,33,33,30,0               'LETRA 'O'

Data 0,0,0,0,0,0,0,0,0,0,0 'ESPACIO
Data 0,0,0,0,0,0,0,0,0,0,0 'ESPACIO
Data 0,0,0,0,0,0,0,0,0,0,0 'ESPACIO
Data 0,0,0,0,0,0,0,0,0,0,0 'ESPACIO

'////////////////////////////////////
Dim A As Word
Dim B As Word
Dim C As Word
Dim W As Word
Dim LETRA As Word
Dim CONTADOR As Word
Dim CONTADOR1 As Byte
Dim CONTADOR2 As Byte
Dim CONTADOR3 As Byte

 
Symbol FILA = PORTB       

    ALL_DIGITAL = True
   
    TRISB = %00000000
    TRISC = %00000000
   
    Low PORTB
    Low PORTC

Inicio:

B = 0                   'B SERA EL INICIO DE LAS COLUMNAS DE IZQUIERDA A DERCHA.
B = B + W               'B SE INCREMENTARA DE A UNO, Y 1OOPRE ESTARA SEPARAD0 31 POSICIONES RESPECTO A 'C'
C = B + 31              'SON TODOS LAS COLUMNAS(32) DE DERCHA A ISQUIERDA.

For CONTADOR3 = 0 To 3                'VECES MENSAJE
A=1
For CONTADOR1 = 0 To 7              'ANCHO DE BITS O TAMAÑO DE LETRAS  8 bits

For CONTADOR = B To C                'LARGO DE MATRIS O # DE COLUMNAS(32).

    Restore CONTADOR
    Read LETRA
     
    GoSub escribo

    Next

    FILA = ~A         
    DelayMS 1    'PARA VARIAR LA VELOCIDAD DE LAS LETRAS
    A = A * 2
    FILA = 255  'LA SUMA DE LOS 8 BITS (11111111)=255
               

Next   
Next
W = W + 1        'W SUMA DE A 1 ASTA LLEGAR A 382
If W > 382 Then W=0  'NUMERO DE LETRAS AL DESPLAZARCE  40letras x 9.95 = 382

GoTo Inicio
   
End

'//////////////subrutina/////////////////
escribo:

    Branch CONTADOR1, [b0,b1,b2,b3,b4,b5,b6,b7]
   
       b0:
        If  LETRA.7 = 0 Then
            PORTC.7 = 1     'data
            DelayUS 1
            PORTC.0 = 0      'clock
            DelayUS 1
            PORTC.0 = 1
           DelayUS 1
        Else
            PORTC.7 = 0     'data
            DelayUS 1
            PORTC.0 = 0      'clock
            DelayUS 1
            PORTC.0 = 1
           DelayUS 1   
           
        EndIf
        GoTo retorno
       
       b1:
        If  LETRA.6 = 0 Then
            PORTC.7 = 1     'data
            DelayUS 1
            PORTC.0 = 0      'clock
            DelayUS 1
            PORTC.0 = 1
           DelayUS 1
        Else
            PORTC.7 = 0     'data
            DelayUS 1
            PORTC.0 = 0      'clock
            DelayUS 1
            PORTC.0 = 1
           DelayUS 1   
           
        EndIf
        GoTo retorno
       
       b2:
       If  LETRA.5 = 0 Then
            PORTC.7 = 1     'data
            DelayUS 1
            PORTC.0 = 0      'clock
            DelayUS 1
            PORTC.0 = 1
           DelayUS 1
        Else
            PORTC.7 = 0     'data
            DelayUS 1
            PORTC.0 = 0      'clock
            DelayUS 1
            PORTC.0 = 1
           DelayUS 1   
           
        EndIf
        GoTo retorno
       
       b3:
        If  LETRA.4 = 0 Then
            PORTC.7 = 1     'data
            DelayUS 1
            PORTC.0 = 0      'clock
            DelayUS 1
            PORTC.0 = 1
           DelayUS 1
        Else
            PORTC.7 = 0     'data
            DelayUS 1
            PORTC.0 = 0      'clock
            DelayUS 1
            PORTC.0 = 1
           DelayUS 1   
           
        EndIf
        GoTo retorno
       
       b4:
       If  LETRA.3 = 0 Then
            PORTC.7 = 1     'data
            DelayUS 1
            PORTC.0 = 0      'clock
            DelayUS 1
            PORTC.0 = 1
           DelayUS 1
        Else
            PORTC.7 = 0     'data
            DelayUS 1
            PORTC.0 = 0      'clock
            DelayUS 1
            PORTC.0 = 1
           DelayUS 1   
           
        EndIf
        GoTo retorno
       
       b5:
        If  LETRA.2 = 0 Then
            PORTC.7 = 1     'data
            DelayUS 1
            PORTC.0 = 0      'clock
            DelayUS 1
            PORTC.0 = 1
           DelayUS 1
        Else
            PORTC.7 = 0     'data
            DelayUS 1
            PORTC.0 = 0      'clock
            DelayUS 1
            PORTC.0 = 1
           DelayUS 1   
           
        EndIf
        GoTo retorno
       
       b6:
        If  LETRA.1 = 0 Then
            PORTC.7 = 1     'data
            DelayUS 1
            PORTC.0 = 0      'clock
            DelayUS 1
            PORTC.0 = 1
           DelayUS 1
        Else
            PORTC.7 = 0     'data
            DelayUS 1
            PORTC.0 = 0      'clock
            DelayUS 1
            PORTC.0 = 1
           DelayUS 1   
           
        EndIf
        GoTo retorno
       
       b7:
        If  LETRA.0 = 0 Then
            PORTC.7 = 1     'data
            DelayUS 1
            PORTC.0 = 0      'clock
            DelayUS 1
            PORTC.0 = 1
           DelayUS 1
        Else
            PORTC.7 = 0     'data
            DelayUS 1
            PORTC.0 = 0      'clock
            DelayUS 1
            PORTC.0 = 1
           DelayUS 1   
           
        EndIf
           
retorno:   
Return

ete

PBP da versiyon 4.0.0 çıktıda benimmi haberim yok acaba?
Bildiğim kadarı ile versiyon 3.x çıkmış idi. Bir yanlışlık olsa gerek.

Ete

ATAU_Muhendis

Pardon şimdi siz söyleyince baktım microcode studio nun versiyonuymuş o  :-[ pbp 2.60 imiş özür dilerim  :-[

ete

Bu program direk PBP ya çevrilemez. Bazı komutların direk karşılığı yok.
Mesela DATA komutu Protonda matrix bilgilerini vermek için kullanılmış.
Read Lettra diye komut DATA satırlarından sırada hangisi var ise onu okuyor.
Bunu sağlamak içinde komut
    Restore CONTADOR
    Read LETRA
şeklinde kullanılıyor. Restore komutu data pointer dediğimiz ve hangi datanın okunacağına karar veren göstergeyi sıfırlayıp en başa alıyor böylece bu komut ve ardından gelen Read komutu ile Data satırlarının enbaşındaki ilk data dan itibaren okuma yapılmış oluyor. PBP da bu iş daha farklı bir yöntemle yapılmaktadır.
PBP da biz LOOKUP tablosu kullanıyoruz. Benzer şekilde dataları bu tabloya yazıyoruz. Paramtreleri şöyle
LOOKUP , Index,[data1,data2,data3..........],ALINAN
Köşeli parantez içindeki ver miktarı 255 adet olabiliyor. Sonuçta Index değerini kaç vermiş isem program gidip o sıraya dek gelen Datax i alıp ALINAN içine yerleştiriyor ve dönüşte bizde ALINAN isimli değişkeni ne yapacaksak yapıyoruz.
Bizim kullandığımız harf dataları aşağıdaki şekilde programa veriliyor
datalar:
        Lookup adres_sec,[$3F,$48,$48,$48,$3F,0_      ;A
        ,$7f,$49,$49,$49,$36,0_      ;B
        ,$3e,$41,$41,$41,$22,0_      ;C
.....
Satır sonuna 0_ şeklinde alttan bağlaç eklenerek o komutu 255 karektere kadar uzatıyoruz.
Sonunda da ;
,$30,$49,$49,$4a,$3c,0],veri
şeklinde komutu sonladırıyoruz.
Program içinde  dataları almakiçin aşağıdaki yöntemi kullanıyoruz. Yöntem A harf datalarını almak içindir.
          case "A"
          adres_sec=0    :  yinele=5 
Burada Data başlangıç adresini sıfır olarak veriyorum (Adres_Sec=0) çinki A harfi oradan başlıyor ve kaç tane data alınacağınıda yinele=5 vererek 5 adet olarak belirliyorum. Alınan dataları alıp genelde bir dizi değişkenine yerleştiriyorum.

Bence fazla uğraşma. Bu programda bir kaç kusurda gördüm. Çalışıp alışmayacağından emin değilim.
LOW PORTB şeklinde hiç bir zaman komut verilmez Zira LOW bit bazında bir komut dur tek bir Bit'i LOW yapar. Ama PORTB BYTE bazındadır. Dolayısıyla bit basında komut ile BYTE kontrol edilemez. Derleyici belkide hata vermez ama bu sadece PORTB.0 bitini LOW yapar muhtemelen.

Ete

ATAU_Muhendis

Çok teşekkür ederim hocam açıklamanız için ellerinize sağlık. Zaten uğraştıkça sürekli yeni bir hata alıyorum tam anlamıyla olmuyor. Peki pic16f628a kullanılan kayan yazı devresinde pic16f877a kullanabilir miyim ne gibi değişiklikler yapmalıyım? pic16f628a'da A portunda 8 bacak var Ra6 ve Ra7 kristale giden bacaklar fakat ben 877a da hangi bacakları kullanacağım CLKIN,CLKOUT kullanıyorum fakat çalıştırdığımda CLKout pasif gözüküyor yani isiste gri olarak görüyorum ne mavi nede kırmızı oluyor. Bana bir yol gösterir misiniz? (Normalde 628a da çalışan bir devre.) Ödev olarak aldım ama ciddi anlamda tek başıma yapabilecek donanımda değilim bu yüzden affınıza sığınarak yardım istiyorum. Şimdiden çok teşekkür ederim...

ete

#5
Sorunu tam olarak anlamadım. 877A da hangi bacakları kullanacağım derken ne amaçla kullanacaksın.
Kristal bacaklarını soruyor isen;
- 628A da Ra7 ve RA6 pinleri kristal bacağı bunu görmüşsün zaten.
- 877A da ise her hangi bir porta bağlıolmaksızın ayrı kristal bacakları bulunuyor. 13 ve 14 nolu pinler kristal bacaklarıdır.
- 628 de MCLR pini sigorta ayarı ile iptal edilip giriş pini olarak kullanılabilir. Ama 877A da bu yapılamaz. MCLR pini 1 nolu pindir ve 10K ile Pullup yapıması gerekir.
- 628A da comparatör vardır CMCON=7 ile bu özellik iptal edilir. Aynısı 877A da da vardır ve aynı komutla iptal edilir.
- 877A da fazladan A portu ve E portunda Analaog pinler vardır. Bunu iptal etmek için ADCON1=7 komutu verilmelidir. Böylece bütün pinler digital olmuş olur. Kısaca Protonda All_Digital=True komutunun karşılığı PBP da, CMCON=7 ve ADCON1=7 dir.
Bunlar dışında bir fark yok.
Gerekli ayarlamaları yaptıktan sonra her program başka bir işlemcide çalışır.

Ete

ATAU_Muhendis

Dediğiniz gibi yaptığımı düşünüyorum fakat çalışmıyor. Kristal devresinde kapasitörleri 22pF kristalide 4MHz alıyorum fakat şöyle bir iletimsizlik söz konusu ekte fotoğraf mevcut. Devreyi de burada ki eski yazılardan buldum fakat tarih eskiydi bu yüzden yapana ulaşamam sanırım.

ete

Aşağıdaki linki inceledinmi?
http://etepic.com/index.php/topic,836.0.html

Verdiğin kod benim kodlara çok benziyor. Daha doğrusu aynısıda bazı değişiklikler yapılmış.
Linki incele bence.

Ete

ATAU_Muhendis

Evet hocam bu linki inceledim ve buradan bu devreyi edindim fakat benim sorunum devreyi 877a ya nasıl çevireceğimde. Attığım ekte çevrilmişi var ama çalışmıyor tahminimce CLKOUT pinine veri gitmiyor yada başka birşey de olabilir, kodda da hata olabilir. Bunu anlamaya çalışıyorum tabi ki sizin yardımınızla  :) 16 sütunlu kayan yazıyı 74hc154 ile tasarlayıp çalıştırmayı başarıyorum fakat hocanın istediği 32 sütun benim bir hayli kafamı karıştırdı  :(

ete

Kayan yazı sistemlerinde programlar beyni epeyce yorar. Heleki bir zorunluluk nedeni ile uğraşıyorsanız daha fazla strese girersiniz. Sakin sakin çalışmak gerekir. Ufak ufak denemeler yapıp küçükten büyüğe doğru ilerlemek lazım. 32 sütün ile 80 sütün arasındaki fark yalnızca işlenen karekter sayısı ve buna bağlı olarak değişkenlerin özellikle dizi değişkenlerinin sütun sayısına göre artıyor olması ve programda kullanılan kaydırma döngülerinin de sütun sayısına göre arttırılmasıdır. Başka bir şey farketmez.

Zorlandığın noktaları buraya yazarsan yardımcı olacak birileri çıkar elbet. Ama böyle genel anlamda nasıl çevirecem ne yapacam diye konuşursanız hiç bir yardım gelmez bunu bilin daha somut şeylere yönelin bence. Programda sorun çömenin en iyi yolu onu simule etmektir. Gerekirse programda belirli noktalar tespit edip programın o noktaya (satıra) ulaşıp ulaşmadığını test ederek ilerleme sağlarsınız. Mesela bir nokta tespit edin ve program oraya ulaşıyormu anlamak için tam o noktaya geçici bir komut ilave ederek işlemcinin herhangi boş bir pininden HIGH çıkartın ve onu gözlemleyin. Çıkış high oluyor ise program oraya ulaşıyor demektir. Sonra bir adım ileri gidin ve sonuçta kusur ne ise bulursunuz.

Ete

Powered by EzPortal