I

Picin dahili epromundan veri okurken 65536 degerinin okunması?

Başlatan invisible1907, 02 Mayıs 2012, 01:38:04

invisible1907

Picin dahili epromundan veri okurken 65536 degerinin okunması?

--->Aslında anlatmak istedigim sey şu ki picin eepromuna kaydettigim degerleri ben belirlemiyorum eger öyle olucak olsaydı sorumun cevabı şu kod ile giderilirdi:

if A=65536 then A=10
endif

degerleri ben belirlemiyorum degerler motorun miline baglı bir diskten geliyor daha dogrusu iki motora baglı diskten
şimdi sorum şu bu olayı nasıl halledebilirim yardımlarınızı bekliyorum...

invisible1907

Ya da bana şu şekildede yardım edebilirsiniz ögrenebilir çizgi izleyen robot yapmaya çalışıyorum.
İki adet motor ve ön tarafta 8 sensör QRD1114 yer almaktadır.Buna göre robot yönünü tayin ederek motorlara degerler göndderecek.Basit çizgi izleyen için kodları yazdım fakat ben PID kontrollü yapmak istiyorum bunun görüş ve yardımlarınızı bekliyorum cevap yazan herkez için şimdiden teşekkür ederim.

ete

Programı kim yazıyorsa eproma yazılacak bilgiyide o belirler. Bilgi farklıkaynaktan gelebilir ama programı yazan kişi oradan gelecek bilginin en azındanbyte mı yoksa word mü olacağını bilir.
Bu bilinirse yapılacak iş kolaydır ama gelen bilgi tamamen rastgele ise o zaman tedbir alman gerekir.
En ufak bir olasılık bile olsa eproma daima word yazacak şekilde hazırlık yapmalısın.
Zaten bu iş için kullanacağın değişken türüde bunu belirleyecektir. O zaman Word tipi değişken kullanıp,
WRITE Adres , Gelen. byte1
Write Adres+1,Gelen.Byte0 
Pause 10
şeklinde bilgiyi word formatında eproma yazacaksın demektir.
Okurken ise benzer şekilde,
Read Adres, Gelen.Byte1
Read Adres+1,Gelen.Byte0
şeklinde Gelen isimli değişken değerini epromdan okuyacaksın.

Pid konusu öyle kolay bir şey değil. Bir sürü parametre işin içine girer. Hangi konuda PID kullanacaksın açıklaman gerekiyor. BU sitede Pıd konusu epeyce işlenmiş idi. Orada yazılanları okumanı tavsiye ederim. Sonra  adım adım gidilebilir. Ama önce yazılanları iyice okumalısın.

Ete


invisible1907

teşekkür ederim ete hocam o bölümü baya bi inceledim ama tek başına yapılacak bi iş degil gibi geldi bana ben bi kod yazdım program çalışıyor ama istediklerimi yaptıramıyorum örnegin; solmotorun pwm çıkışını 64 azaltırken sagmotorunkini arttırmaya çalıştım fakat olmadı nerde yanlışyapmış olabilirim ete hocam bi bakarsanız
'****************************************************************
'*  Name    : deneme                                        *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2008 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 02.05.2009                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                  *
'*          :                                                   *
'****************************************************************
Device 16F877A
XTAL 20

PORTA=0:TRISA=0     
PORTB=0:TRISB=%00001111   
PORTC=0:TRISC=%00000000 
CMCON=7
OPTION_REG.7=0  'PULLUP LARI BU KOMUT AÇIYOR GEREKİRSE SİLİP KAPATABİLİRSİN. SENSÖRLER İÇİNDİR.

OPTION_REG=%00110000
INTCON=%10100000
TMR0=6
On Interrupt GoTo KESME
   
'----------------------------DONANIMSAL PWM AÇILDI----------------------
CCP1_PIN = PORTC.2
CCP2_PIN = PORTC.1   
;---------------------------------------------------
Symbol SOLSEN=PORTB.0      'SOL SENSOR
Symbol ORTSEN=PORTB.1      'ORTA SENSOR
Symbol SAGSEN=PORTB.2      'SAG SENSOR
;---------------------------------------ÇIKIŞLAR
Symbol SAI =PORTC.1      'SAĞ İleri
Symbol SAE=PORTC.5      'SAĞ Enable
Symbol SOI=PORTC.2      'SOL İLERİ
Symbol SOE=PORTC.6      'SOL Enable
;---------------------------------------PID tanımlamalar
Dim PID_PS  As Byte   ; Oransal Sürücü Değeri
Dim PID_Kp  As Byte   ; Oransal Katsayı Değeri
PID_Kp=1
Dim PID_e   As Byte   ; Hata Değeri ( SET-ÖLÇÜM)
         
    Dim PID_ISET As Byte          ; İntegral sürücü için flag                               
    Dim PID_Ki As Byte                             ; integral kazanc ( Bizim girdiğimiz değer - Matlab ın hesapladığı )   
    PID_Ki=1                        ; integral sürücü ara toplam değeri
   
    Dim Last_PID_e As Byte
    Last_PID_e=0

    Dim PID_Isat As Byte
    Dim PID_Is As Byte
    Dim PID_imax As Byte
    PID_imax=100
   
    Dim PID_Kd As Byte                 ; Türev katsayısı ( Biz belirliyoruz - matlab da yapabiliyor )
    PID_Kd=1
    Dim PID_DS As Byte                  ; Türev sürücü
    Dim PID_son_e As Byte            ; Yeni hata değeri için register
   
    Dim PID_CIKIS As Byte                            ; PID CIKIŞI ( P + I + D )
    Dim PID_CIKIS_ON As Byte                    ; PID sinyali için ön karşılaştırma değeri ( Programın başında değer verilir )
       PID_CIKIS_ON=255

Dim OLCUM As Byte
Dim SABIT As Byte
Dim Kontrol As Byte                            ;Bir kesme rutini ile ya da daha farklı bir yolla sürekli ölçüm alınacak ve "e" değeri bulunacak. ( e=SET-ÖLÇÜM )
Kontrol=0

Dim sagmotor As Byte
sagmotor=255
Dim solmotor As Byte
solmotor=255



;***ILK HAREKET********************************************************

DUZGIT:

        PID_Isat = 0
        Kontrol=0
       
       While ORTSEN=0
       CCP1CON=%00001100 ; HPWM iptal  komutu
       CCP2CON=%00001100 ; 
         HPWM SAI,sagmotor,4000:SAE=1
         HPWM SOI,solmotor,4000:SOE=1
         OLCUM=sagmotor
         OLCUM=solmotor
       Wend
       
       While SOLSEN=0
       CCP1CON=%00001100 ; HPWM iptal  komutu
       CCP2CON=%00001100 ; 
       
       SABIT=191
       
       sagmotor=PID_CIKIS + 191
        HPWM SAI,sagmotor,4000:SAE=1
        HPWM SOI,PID_CIKIS,4000:SOE=0
       Wend
       
       While SAGSEN=0
       CCP1CON=%00001100 ; HPWM iptal  komutu
       CCP2CON=%00001100 ; 
       SABIT=191
          solmotor=PID_CIKIS + 191
        HPWM SOI,solmotor,4000:SOE=1
        HPWM SAI,PID_CIKIS,4000:SAE=0
       Wend
       
       If SAGSEN=1 And SOLSEN=1 And ORTSEN=1 Then
         
         CCP1CON=%00000000 ; HPWM iptal  komutu
         CCP2CON=%00000000 ; 
         
         SAI=0:SOI=0:SAE=0:SOE=0
         pause 1000
         While SAGSEN=1 And SOLSEN=1 And ORTSEN=1
           SAI=0:SAE=1
           SOI=0:SOE=1
         Wend 
       EndIf 
             
       GoTo DUZGIT
   
   Disable       
   KESME:
       
       Kontrol=Kontrol + 1
       If Kontrol=5 Then
         
         PID_e=SABIT - OLCUM
         
         Last_PID_e=PID_e
         
         Last_PID_e=Last_PID_e / Kontrol
         
         PID_PS = Abs Last_PID_e                  ; Hata sinyalinin değerini oransal sürücüye yüklüyoruz
         
         PID_PS = PID_PS * PID_Kp          ; oransal sürücü değeri ile oransal katsayımızı çarpıyoruz (32 bit )         
         
             
         If PID_e > PID_PS   Then PID_PS = - PID_PS;sorun olabilir
         
         
         PID_Isat = PID_Isat + Last_PID_e
         PID_Isat = Abs PID_Isat
         PID_Isat = PID_Isat * PID_Ki
         PID_Isat = PID_Isat / Kontrol
         
         If Last_PID_e > PID_Isat  Then PID_Isat = - PID_Isat
         
        PID_Is = PID_Isat + PID_Is
        PID_Is = Abs PID_Is
          If PID_Is >= PID_imax Then PID_Is=PID_imax
         
          PID_DS = PID_e - PID_son_e     ; Son hata ile ilk hatanın arasındaki farkı alıp DS ( Türev Sürücü ) ye kaydediyoruz
          PID_DS = Abs PID_DS                 ; DS ( Türev Sürücünün ) mutlak değerini alıyoruz
          PID_DS = PID_DS * PID_Kd     ; DS ( türev Sürücü ) ile Kd değerini çarpıyoruz ve artık DS ( Türev Sürücü ) için son
                                                      ; değeri hesaplamış oluyoruz
          PID_son_e = PID_e
         
         
          PID_CIKIS = PID_PS + PID_Is + PID_DS         ; Bütün sürücü değerlerini topluyoruz. ( P + I + D ) CIKIS içine yazıyoruz
          PID_CIKIS= Abs PID_CIKIS                               ; CIKIS bilgisinin mutlak değerini alıyoruz
   
          If PID_CIKIS >= PID_CIKIS_ON Then PID_CIKIS = PID_CIKIS_ON  ;PID CIKIS değeri ile ön değeri karşılaştırıyoruz ( Taşma var mı diye )   
                                                                             
     
   
     
       EndIf
   
       
    INTCON.2=0
    TMR0=6
   
    Resume
    Enable
End

ete

Kullandığın PWM yöntemi 8 bitlik Duty sağlar. Ama hiç bir yerde 8 bitin aşılıyormu kontrol edildiğini görmedim. Ya aşıyorsan. Aşıyorsan değer 255 den sonra yeniden sıfıra döner. Böylece yüksek değerlikli bir duty vereyim derken sıfıra yakın bir değer vermiş olursun. Bu bir hata bence. İşin içine PID mekanizmasıda girince PWM duty oranını 10 bit çalıştırmanda yarar görürüm. Böylece ayar kademen 0-1023 arasında değişir.
Program Protonda yazılmış. Anlıyorum ama takip etmem zorlaşıyor.  Biraz daha çalış bakalım en azından doğru yoldasın.

Ete

veli dayı

Hazır epromdan laf açılmışken ben de bir şey sorsam.


'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 03.05.2012                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
TRISA=%00000001
TRISB=0


@ DEVICE pic16F84A
@ DEVICE pic16F84A, WDT_on
@ DEVICE pic16F84A, PWRT_ON
@ DEVICE pic16F84A, PROTECT_OFF
@ DEVICE pic16F84A, XT_OSC

DEFINE LCD_DREG   PORTB 'LCD  data bacakları hangi Porta bağlı?
DEFINE LCD_DBIT      4  'LCD  data bacakları hangi bitten başlıyor?
DEFINE LCD_EREG   PORTB 'LCD  Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT      3 'LCD  Enable Bacağı Hangi bite bağlı ?
define LCD RWREG         PORTB  'LCD R/W Bacağı Hangi Porta bağlı?
define LCD_RWBIT          2  'LCD R/W Bacağı Hangi bite bağlı ?
DEFINE LCD_RSREG   PORTB 'LCD  RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT   1 'LCD RS  bacağı Hangi Bite bağlı  ?
DEFINE LCD_BITS      4  'LCD 4  bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES   2 'LCD Kaç  sıra yazabiliyor
SAYI VAR WORD
UC VAR WORD
NANE VAR WORD
SAYI1 VAR WORD
DORT VAR WORD
BES VAR WORD
ALTI VAR WORD
YEDI VAR WORD
SEKIZ VAR WORD
DOKUZ VAR BYTE
ONV VAR BYTE
PAUSE 200  ' LCD nin kullanıma hazır hale  gelebilmesi için gerekli süre
LCDOUT $FE,1  ' Ekran silindi

LOW PORTB.2
MAIN:
READ 0,SAYI
SAYI=0
WRITE 0,SAYI
READ 0,SAYI
READ 1,SAYI1
SAYI1=1
WRITE 1,SAYI1
READ 2,NANE
NANE=2
WRITE 2,NANE
READ 2,NANE
READ 3,UC
UC=3
WRITE 3,UC
READ 3,UC
READ 4,DORT
DORT=4
WRITE 4,DORT
READ 4,DORT

READ 5,BES
BES=5
WRITE 5,BES
READ 5,BES
READ 6,ALTI
ALTI=6
WRITE 6,ALTI
READ 6,ALTI
READ 7,YEDI
YEDI=7
WRITE 7,YEDI
READ 7,YEDI

READ 8,SEKIZ
SEKIZ=8
WRITE 8,SEKIZ
READ 8,SEKIZ
READ 9,DOKUZ
DOKUZ=9
WRITE 9,DOKUZ
READ 9,DOKUZ
READ 10,ONV
ONV=10
WRITE 10,ONV
READ 10,ONV
LCDOUT $FE,1," ",#SAYI," ",#NANE," ",#UC," ",#DORT," ",#SAYI1," ",#ONV
lcdout  $fe,$c0," ",#BES," ",#ALTI," ",#YEDI," ",#SEKIZ," ",#DOKUZ

     END

şeklinde bir program yazdım.ne işe yarayacal derseniz acaba 16f 84a entegresinin hafızasına ne kadar veri aldırırım diye öğrenmek hemde sizin eprom kullanımı dersinizi yavaş yavaş öğrenmeye çalışmak için.


http://ww1.microchip.com/downloads/en/devicedoc/35007b.pdf   sayfasından 16f84a nın bilgilerini anlamaya çalıştım ama hafızaya kaç tane bilgi alır soruma bir yanıt bulamadım.sizce  hafızasına kaç değişken alabilir
(ekrana sığdırmaya çalışmıyorum sadece eeproma ne kadar değişken alır acaba diye merak ettim.)buna katoloğun neresinden bakacağız.

Mucit23

Bunun için program yazmana ne gerek var.

Zate herşey datasheetde açık bir şekilde gösterilmiş. İngilizce bilmene gerek yok

Bakalım ;


free picture hosting

Kırmız ile işaretlediğim yerde yazmışlar.

Yazıldığına göre 1024 words Program hafızası var
68 byte Rami var
64 byte da eepromu var.



Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

veli dayı

     

         Gönderdiğiniz resmi açamadım ama dediğinizi anladım. ve daha önce ekte gönderdiğim linkte buldum
• 1024 words of program memory
• 68 bytes of Data RAM
• 64 bytes of Data EEPROM

teşekkürederim.bir şey daha sorsam  1024 words of program memory yazıyor ya bu şu manayamı geliyor.
hani microstdiod derliyoz ya   success:437 word used yazıyor ya ozaman biz 16f84a için program derlediğimiz zaman en fazla success:1024 words mu yazmalı.bu o manayamı geliyor.

ete


invisible1907

         İyi günler ete hocam size bi konuda danışmak istiyorum.
Hocam çizgi izleyende yolu robota ezberletmek istiyorum aynı zamanda çizgi izleyen PID kontrollü olucak PID kontrol kısmını hemen hemen bitti sayılır.Şimdi bilgileri epproma kayıt ettirmem gerekiyo kayıtı da gecelim oda kolay digerlerine göre zor olan şu örnegin;Çizgi izleyen diyelim 5. virajda hpwm sai,127,2000  degerini kullandı daha sonra 10. virajda hpwm soi,64,4000 degerini kullandı vebu degerleri belli bir zaman da picin çıkışına gönderdi.Daha sonra pisti tamamladı.Şimdi picin mesela PORTA.0=1 oldugunda dışarıdan bir buton ile pic eepromundaki verileri kullanarak
yolu gidecek diyelim peki pic 5. virajageldigini nasıl anlayacak bunu anlaması için timer kullansak zamanda sapmalar olur ve çıkışa verecegi degerlerdede böylelikle sapmalar gercekleşir.Ama ben TK19 935 diye bir optik göz kullansam bu gözü motor üzerine yerleştirilen bir diskin üzerinde yerleştirip o timer 0 veya timer biri kurup 1/1 oranında saydırıp(örnegin motor düz gidecek düz gittiginde timer1 aktif olucak ne kadar düz gittiyse o kadar sayacak vebunu epproma kaydedecek) Gerektigi zaman ise yani örnegin 5. düzlükte bu epproma kayıt ettigi deger boyunca çıkışa işte diyelim hpwm sai,255,2000,hpwm soi,255,2000 degerini gönderecek böyle bir şekilde yapılaabilir mi?
Bi de hocam iki tane motor var o iki motorun diskine TK19 935 bagliyacagım örnegin birini ttimer 0 ile saydırıp digerini timer 1 ile saydırırsam kesmeye giderken karışıklık olur mu?Olursa bunu şu şekilde halledebilirmiyim örnegim motor sola gidecek sola giderken timer 0 aktif olacak o zaman Programın içine şu satırı eklersem

if Menu=1 or Menu1=1 or Menu3=1 Then Gosub TIMER0
TIMER0:
INTCON=%10100000 'Kesmeler  aktif ve TMR0 kesmesi aktif
OPTION_REG=%00101000
TMR0=6
Return

if Menu3=1 or Menu4=1 or Menu5=1 Then Gosub TIMER1
TIMER1:
    INTCON =%11000000         'diğer tüm kesmelere ve çevresel (PEIE)                  'birimlerden gelen kesmelere izin ver
    PIE1 =  %00000001         'TIMER1 kesmesini aktif et(TMR1IE)
    T1CON = %00000011         'TIMER1 aktif ve prescaler oranı 8   
    TMR1H =0      
    TMR1L =0
Return

Program çalışır mı yani şu şekilde olacak timer 0 aktifken timer 1 aktif degil timer 1 aktifken timer 0 aktif degil şeklinde.

Son olarak epproma verileri nasıl bi şekilde kaydetmek gerekir bi dizi şeklinde mi örnegin select case komutunu kullanarak mı yoksa if then komutlarıyla mı?Çünkü eppromdaki degerleri okurken örnegin 5. düzlükte verileri okumam gerekiyo bunun bi şematik kullanımı var mı?
Yardımlarınızı bekliyorum...

invisible1907

Olayın daha iyi anlaşılması için bir resim ekliyorum.

ete

Daire ile işaretlediğin noktalarda robot yoldan çıkacaktır. Çıkınca hem çizgiye girecek ayarlamayı yapar hemde epromdan sıradaki bilgiyi okuyarak motorlara iletir. Bir programda aynı anda hem TMR0 hemde TMR1 kesmesi elbette kullanılabilir. Ayrımı kesme bayrakları ile yapacaksın. Kime ait kesme oluşmuş ve program Kesme etiketine gitmiş ise ona ait bayrak set edilmiştir. Bayrakları test ederek hangi timer kesmesi oluşmuş anlayacak ve ona uygun işlemleri yaptıracaksın.

Eproma bilgi kaydetmenin yolu basit. İster dizi şeklinde ister tek tek kavşağa geldikçe kayıt yapabilirsin. Kayıt işlemi 10 ms lik bir zaman gerektirir. Bunu bir çaok kayıt emrini verdikten sonra bir kereliğine 10 ms bekleme koyarsanda olur her kayıt sonunda 10 ms beklesende olur. Ama kayıt emrini verdin 500 ms sonra bekle dedin o olmaz. Burada sana uygun olan kavşak geldikçe kayıt emri vermek şeklinde olacaktır. Her kayıt sonunda adres değerini bir artırırsın böylece WRITE Adres,Veri şeklinde otomatik kayıt yapabilirsin.

Yukarıda da bahsettiğin gibi senin sorunun kavşak noktalarının belirlenmesi olacaktır. Sen okurken olan sorunu ortaya koymuşsun ama aynı sorun ilk kayıt esnasında da karşına çıkıyor aslında. O zaman kayıt işine nasıl karar verebiliyor isen okurkende aynı şekilde okumaya karar vermelisin.
Kayıt yaparken araç ilerliyor ve kavşağa geldi çizgiden çıkacak ve otomatik reaksiyon gösterip çizgiye girmeye çalışacak hemen PWM oranlarını düşüreceksin elbette. Bu değerleir o anda kayıt edeceksin. Epromdan çalışırken de o noktada araç yine çizgiden çıakcak sende bu sefer epromdaki değeri okyup vereceksin olay budur. Bu işte yolun eproma kayıt edilmesi işi bana pek mantıklı gelmiyor her nedense. Aracın kendi yolunu kendi bulması daha mantıklı.


Ete

Burak

Acaba PID kodunun modifiye edilmiş , hatalarından ayıklanmış ve çalışır halini tekrar paylaşabilir misiniz ? PID konusunda kod yazmak gerçekten benim korkulu rüyam .. Bir kodu modifiye ederek projemde uygulamak bana hem zaman hemde pratik kazandıracak ..
Şimdiden teşekkürler ..
Ω Gens Una Sumus Ω

hamzahaluk

Hocam, yol ezberletme konusunda benimde birkaç sorum olacaktı. Diyelim ki X sensöründen gelen bilgi 1 olduğunda bir alt programa gidilsin ve bu aşamadan sonra robot gittiği yolu belleğine(2-3 saniyelik bir kısım) kaydetsin daha sonra X sensörüne bilgi geldiğinde hep o kaydettiği programı çalıştırsın. Bu PIC'de nasıl yapılabilir? Nasıl programlanır?
Önceki mesajlarda şöyle bir örnek verilmiş mesela;

LOW PORTB.2
MAIN:
READ 0,SAYI
SAYI=0
WRITE 0,SAYI
READ 0,SAYI
READ 1,SAYI1
SAYI1=1
WRITE 1,SAYI1
READ 2,NANE
NANE=2
WRITE 2,NANE
READ 2,NANE
READ 3,UC
UC=3
WRITE 3,UC
READ 3,UC

F®T

invisible1907 eğer G kuvvetini İMU ile ölçersen virajlardaki G kuvvetinden nerde olduğunu anlarsın.starttada encoder ile gittiğin yolu ölçer hangi noktada viraj var anlarsın ona göre o noktalara gelmeden önce hızını azaltırsın.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

Powered by EzPortal