Mum efekti hakkında

Başlatan etokar, 15 Ocak 2015, 16:27:33

etokar

Arkadaşlar merhaba.
Üç çıkışlı mum efekti devresi yapacağım. Picbasic'de iyi sayılırım fakat C dili hakkında pek birşey bilmiyorum. Linkteki devrenin kodu C ile yazılmış. Hex dosyası isis'te gayet güzel simüle edilebilyorken devreyi kurunca çalışmıyor. Devrede bir problem yok, PBP diliyle yazmış olduğum başka bir kodu çalıştırabiliyorum. Programın mantığını çözemedim, çözebilseydim PBP'de kendim yeniden yazacaktım. Programın mantığını açıklayabilir misiniz? Kodları yorumlayamıyorum. İsis'te çalışan devre fiziksel olarak neden çalışmaz (pic hiçbir işlem yapmıyor, devre kartında problem yok)?

Link:
http://www.endtas.com/robot/modules.php?name=News&file=print&sid=176

Saygılarımla.

#include <12F675.h>
#use delay (clock=4000000)
#fuses INTRC_IO,WDT,PUT,NOBROWNOUT,PROTECT,NOPUT,NOCPD,NOMCLR

#define    led1      PIN_A0
#define    led2      PIN_A1
#define    led3      PIN_A2

#ROM 0x3ff = {0x3480}

BYTE CONST TABLE [120]= {90,80,70,60,70,80,90,95,90,85,
                90,85,90,95,95,90,110,150,100,220,
                130,210,110,230,90,240,200,205,200,195,
                90,80,70,60,70,80,95,90,85,90,
                90,80,70,60,70,80,90,95,90,95,
                90,100,110,100,105,150,110,120,100,120,
                10,200,10,200,100,250,100,110,100,70,
                120,190,130,100,105,100,90,100,150,200,
                90,95,90,85,90,95,100,120,110,120,
                200,220,205,230,190,220,190,200,190,200,
                200,220,200,220,190,220,190,225,190,220,
                190,225,205,215,190,225,195,223,193,222
            };
//-----------------------------------------

//-----------------------------------------
void main() {

int16 titrval, dampval;
int led1val,led2val,led3val, deger,tablsay,lighthed1,lighthed2,lighthed3;

setup_wdt(WDT_2304MS);

SETUP_TIMER_1(T1_DISABLED );

setup_comparator(NC_NC_NC_NC);

   setup_ADC_ports(NO_ANALOGS);

//led1val = 140;
tablsay = 0;

while(1){

restart_wdt();


deger++;
titrval++;
dampval++;
if (titrval == 2000){
   titrval = 0;
   if (tablsay == 100) tablsay = 0;
   lighthed1 = table [tablsay];
   lighthed2 = table [tablsay+1];
   lighthed3 = table [tablsay+2];     
   tablsay+=3;
}

if (dampval == 10){
   dampval = 0;
   if (led1val < lighthed1) led1val++;
   if (led1val > lighthed1) led1val--;
   if (led2val < lighthed2) led2val++;
   if (led2val > lighthed2) led2val--;
   if (led3val < lighthed3) led3val++;
   if (led3val > lighthed3) led3val--;
   
   
}

if( deger < led1val )
   {
   output_high(led1);
   }
else
   {
   output_low(led1);
   }
   
if( deger < led2val )
   {
   output_high(led2);
   }
else
   {
   output_low(led2);
   }   

if( deger < led3val )
   {
   output_high(led3);
   }
else
   {
   output_low(led3);
   }
}

}

ete

Öncelikle devre neden çalışmıyor ona bir sebep bulayım dedim. Programda;
#ROM 0x3ff = {0x3480}
şeklinde bir komut satırı var. Sanırım bu komut $03FF adresine $3480 bilgisini yazıyor. Bu 12F675'in son adrese fabrikada yazılmış OSCCON değeridir. Dahili OSC bu değer ile çalışır. Bu değer yanlış yada farklı olursa pic osilatörü ya hiç çalışmaz yada yanlış çalışır. Söz konusu değer işlemci bazında değişiklik gösterir. Burada ise sabit bir değer verilmiş ki buda vatandaşın çalıştığı işlemciye ait bir değer olsa gerek. Kendi işlemcinin son adresindeki değeri oku ve orada 3480 yerine okuduğun değeri yazıp yeniden derlemen gerekiyor. Ayrıca pic'e program ayzıldıktan sonra yeniden okuyup son adreste aynı adresin durup durmadığını kontrol etmen gerekiyor. Bunun dışında bir sebep göremedim.

Programın mantığı gayet basit. 120 adet PWM bilgisini sırası şşle tablodan okuyup yazılmsal PWM oluşturarak ledlerin yanması sağlanıp bir mumu taklit etmeleri sağlanmış. Tablodan her seferinde 3 led için sırası ile 3 bilgi okunuyor ve tablo index değişkeni her seferinde 3 artırılıyor.

Ete

etokar

Hocam yanıtın için teşekkür ederim. Bu satır gerekli mi? Ben de 12F675 kullanıyorum, son adres satırını nasıl okuyacağım? Daha önce denemedim. Teşekkürler.

etokar

Hocam malum C dilini hiç bilmediğimden komutları yorumlayamıyorum. PBP diline nasıl çevirebilirim? PBP olursa en azından hataları kendim bulabilirim. Teşekkürler.

ete

Bütün programlayıcılarda arayüz programı kullanılıyor. O program işlemciyide READ komutu veya butonu ile okuyabiliyor.
Okunan program bilgisi ekrana getirildiğinde ekranın sonuna gidip bakın adres 0x3FF olacak en sağda ne yazıyor bakın. Elinizdeki çalışmayan işlemcide muhtemelen yazan değer 3FF şeklindedir. İşlemciyi ERASE (silme) komutu ile silerseniz bu kayıtlı OSCON değeride silinir ve sonrasında iişlemci doğru çalışmaz.
PICKIT2 programlayıcı da bu OSCCON değerini hesaplayıp bulup tekrar yerine yazabilecek bir seçenek var. Onu kullanarak yeniden OSCCON değeri oluşturabilirsiniz tabiiki PICKIT2 programlayıcınız var ise.

PBP da,
DEFINE OSCCAL_1K 1
DEFINE OSCCAL_2K 1

komutları, söz konusu OSCCAL değerini programlamadan önce okutup sonra programlama esnasında geriye yazdırmaktadır.
Bu komutlar olmadan Basic programı yazar ve işlemciye yazdırırsanız işlemcideki OSCCAL değeri bozulacaktır mutlaka.
Bu anlattıklarım yalnızca 12F675 işlemcisine ait özelliktir. Başka işlemcilerde de var şu anda hatırlamıyorum hangilerinde bu özellik var. Yalnızaca 12F675 te buna rasladım şimdiye kadar.

C dilini bende çok iyi bilmiyorum. Yalnızca çok az anlayabiliyorum. Anlayabildiğimi yazdım sadece.
PBP ya direk çevrilmeside mümkün olmayabilir bunuda göz ardı etme.


Ete

etokar

Hocam yardımlarınız için minnettarım. 12F675 'e özel OSCCAL durumunu sizin sayenizde öğrendim. Programlayıcıda OSCCAL bölümünde üç adet seçenek var.
"Keep Old OSCCAL"
"New OSCCAL From HEX-File"
"Manual Selected OSCCAL"

"New OSCCAL From HEX-File" seçeneğini seçerek programladım ve çalıştı.

Tekrar çok teşekkür ederim.

Engin TOKAR
etokar

Saygılarımla.

sonmoikan

#6
Ben Basic diline göre göre yapmaya çalıştım.
İstersen bunu da bir incele, faydalı olur umarım.

'---------------------------SIGORTA AYARLARI------------------------------------             
@ DEVICE pic12F675
@ DEVICE pic12F675, WDT_ON             ; Watchdog Timer ON
@ DEVICE pic12F675, PWRT_ON            ; Power-On Timer ON
@ DEVICE pic12F675, BOD_OFF            ; Brown-Out Detect (sistemde aşırı akım ceken elemanlar var ise ON)
@ DEVICE pic12F675, MCLR_OFF           ; Master Clear Kapalı GPIO.3 giris
@ DEVICE pic12F675, CPD_OFF            ; Bellek Kod Koruma OFF
@ DEVICE pic12F675, PROTECT_OFF        ; Kod koruması OFF
@ DEVICE pic12F675, INTRC_OSC_NOCLKOUT ; Dahili osilato

define NO_CLRWDT 0   'CLRWDT yi Manuel Kullan
CLEARWDT              'Watchdog Timer temizle (uykudan çıkmak içinde kullanılır)
DEFINE OSC 4          'Osilator hızı MHz: 3(3.58) 4 8 10 12 16 20 24 25 32 33 40

DEFINE OSCCAL_1K 1
   
'---------------------------PİN AYARLARI----------------------------------------   
NAP 7                   'Düşük Güç Bekleme Süresi 2.3 saniye         
CMCON  = 7              'Komprator pimleri iptal
ANSEL  = 0         'Tüm Pinler Digital
;INTCON=%10100000     
TrisIO = 0             
GPIO   = 0

SYMBOL LED1=GPIO.0
SYMBOL LED2=GPIO.1   
SYMBOL LED3=GPIO.2   

titrval VAR WORD
dampval VAR word
deger   VAR byte

VERI    VAR byte
INDEX   var byte

led1val   VAR byte
led2val   VAR byte
led3val   VAR byte

tablsay   VAR word
lighthed1 VAR byte
lighthed2 VAR byte
lighthed3 VAR byte 

tablsay = 0 

'---------------------------EEPROM DATALARI-------------------------------------   
   DATA @ 0,90,80,70,60,70,80,90,95,90,85,_
            90,85,90,95,95,90,110,150,100,220,_
            130,210,110,230,90,240,200,205,200,195,_
            90,80,70,60,70,80,95,90,85,90,_
            90,80,70,60,70,80,90,95,90,95,_
            90,100,110,100,105,150,110,120,100,120,_
            10,200,10,200,100,250,100,110,100,70_,
            120,190,130,100,105,100,90,100,150,200,_
            90,95,90,85,90,95,100,120,110,120,_
            200,220,205,230,190,220,190,200,190,200,_
            200,220,200,220,190,220,190,225,190,220,_
            190,225,205,215,190,225,195,223,193,222
;-------------------------------------------------------------------------------
   
BASLA:

CLEARWDT          ;uykudan çık
deger=DEGER+1
titrval=Titrval+1
dampval=dampval+1

if titrval = 2000 then
   titrval = 0
   
   if tablsay > 120 then tablsay = 0

   index=tablsay   : read index, veri : lighthed1 = veri
   index=tablsay+1 : read index, veri : lighthed2 = veri
   index=tablsay+2 : read index, veri : lighthed3 = veri
       
   tablsay=tablsay+3
endif

if dampval = 10 then
   dampval = 0
   if led1val < lighthed1 then led1val=led1val+1
   if led1val > lighthed1 then led1val=led1val-1
   if led2val < lighthed2 then led2val=led2val+1
   if led2val > lighthed2 then led2val=led2val-1
   if led3val < lighthed3 then led3val=led3val+1
   if led3val > lighthed3 then led3val=led3val-1;
endif

if deger < led1val then
    high led1
    else
    low led1
endif

if deger < led2val then
    high led2
    else
    low led2
endif 

if deger < led3val then
    high led3
    else
    low led3
endif

GOTO BASLA

ABDULLAH

. Kağan

Alıntı yapılan: sonmoikan - 19 Ocak 2015, 12:00:37
Ben Basic diline göre göre yapmaya çalıştım.
İstersen bunu da bir incele, faydalı olur umarım.

'---------------------------SIGORTA AYARLARI------------------------------------             
@ DEVICE pic12F675
@ DEVICE pic12F675, WDT_ON             ; Watchdog Timer ON
@ DEVICE pic12F675, PWRT_ON            ; Power-On Timer ON
@ DEVICE pic12F675, BOD_OFF            ; Brown-Out Detect (sistemde aşırı akım ceken elemanlar var ise ON)
@ DEVICE pic12F675, MCLR_OFF           ; Master Clear Kapalı GPIO.3 giris
@ DEVICE pic12F675, CPD_OFF            ; Bellek Kod Koruma OFF
@ DEVICE pic12F675, PROTECT_OFF        ; Kod koruması OFF
@ DEVICE pic12F675, INTRC_OSC_NOCLKOUT ; Dahili osilato

define NO_CLRWDT 0   'CLRWDT yi Manuel Kullan
CLEARWDT              'Watchdog Timer temizle (uykudan çıkmak içinde kullanılır)
DEFINE OSC 4          'Osilator hızı MHz: 3(3.58) 4 8 10 12 16 20 24 25 32 33 40

DEFINE OSCCAL_1K 1
   
'---------------------------PİN AYARLARI----------------------------------------   
NAP 7                   'Düşük Güç Bekleme Süresi 2.3 saniye         
CMCON  = 7              'Komprator pimleri iptal
ANSEL  = 0         'Tüm Pinler Digital
;INTCON=%10100000     
TrisIO = 0             
GPIO   = 0

SYMBOL LED1=GPIO.0
SYMBOL LED2=GPIO.1   
SYMBOL LED3=GPIO.2   

titrval VAR WORD
dampval VAR word
deger   VAR byte

VERI    VAR byte
INDEX   var byte

led1val   VAR byte
led2val   VAR byte
led3val   VAR byte

tablsay   VAR word
lighthed1 VAR byte
lighthed2 VAR byte
lighthed3 VAR byte 

tablsay = 0 

'---------------------------EEPROM DATALARI-------------------------------------   
   DATA @ 0,90,80,70,60,70,80,90,95,90,85,_
            90,85,90,95,95,90,110,150,100,220,_
            130,210,110,230,90,240,200,205,200,195,_
            90,80,70,60,70,80,95,90,85,90,_
            90,80,70,60,70,80,90,95,90,95,_
            90,100,110,100,105,150,110,120,100,120,_
            10,200,10,200,100,250,100,110,100,70_,
            120,190,130,100,105,100,90,100,150,200,_
            90,95,90,85,90,95,100,120,110,120,_
            200,220,205,230,190,220,190,200,190,200,_
            200,220,200,220,190,220,190,225,190,220,_
            190,225,205,215,190,225,195,223,193,222
;-------------------------------------------------------------------------------
   
BASLA:

CLEARWDT          ;uykudan çık
deger=DEGER+1
titrval=Titrval+1
dampval=dampval+1

if titrval = 2000 then
   titrval = 0
   
   if tablsay > 120 then tablsay = 0

   index=tablsay   : read index, veri : lighthed1 = veri
   index=tablsay+1 : read index, veri : lighthed2 = veri
   index=tablsay+2 : read index, veri : lighthed3 = veri
       
   tablsay=tablsay+3
endif

if dampval = 10 then
   dampval = 0
   if led1val < lighthed1 then led1val=led1val+1
   if led1val > lighthed1 then led1val=led1val-1
   if led2val < lighthed2 then led2val=led2val+1
   if led2val > lighthed2 then led2val=led2val-1
   if led3val < lighthed3 then led3val=led3val+1
   if led3val > lighthed3 then led3val=led3val-1;
endif

if deger < led1val then
    high led1
    else
    low led1
endif

if deger < led2val then
    high led2
    else
    low led2
endif 

if deger < led3val then
    high led3
    else
    low led3
endif

GOTO BASLA



Sonmoikan bunu denedin mi?

sonmoikan

Gerçekte denemesini yapmadım. Sadece simülasyonda denemelerini yaptım.
Proteus ve kodu ekliyorum. Siz Gerçekte dener iseniz bilgi verirseniz sevinirim.
ABDULLAH

. Kağan

#9
Denedim gayet güzel çalışıyor. İhtiyacı olan yapıp kullanabilir. ;)

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2015 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 16.01.2015                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
'---------------------------SIGORTA AYARLARI------------------------------------             
'@ DEVICE pic12F675, WDT_ON             ; Watchdog Timer ON
'@ DEVICE pic12F675, PWRT_ON            ; Power-On Timer ON
'@ DEVICE pic12F675, BOD_OFF            ; Brown-Out Detect (sistemde aşırı akım ceken elemanlar var ise ON)
'@ DEVICE pic12F675, MCLR_OFF           ; Master Clear Kapalı GPIO.3 giris


@ __config _INTRC_OSC_NOCLKOUT&_WDT_ON&_MCLRE_OFF&_CP_OFF
'&_PWRT_ON&_BOD_OFF

define NO_CLRWDT 0   'CLRWDT yi Manuel Kullan
CLEARWDT              'Watchdog Timer temizle (uykudan çıkmak içinde kullanılır)
DEFINE OSC 4          'Osilator hızı MHz: 3(3.58) 4 8 10 12 16 20 24 25 32 33 40

DEFINE OSCCAL_1K 1
DEFINE OSCCAL_2K 1
   
'---------------------------PİN AYARLARI----------------------------------------   
NAP 7                   'Düşük Güç Bekleme Süresi 2.3 saniye         
CMCON  = 7              'Komprator pimleri iptal
ANSEL  = 0         'Tümü Pinler Digital
;INTCON=%10100000        'Kesmeler aktif ve TMR0 kesmesi aktif
TrisIO = 0             
GPIO   = 0

SYMBOL LED1=GPIO.0
SYMBOL LED2=GPIO.1   
SYMBOL LED3=GPIO.2   

titrval VAR WORD
dampval VAR word
deger   VAR byte

VERI    VAR byte
INDEX   var byte

led1val   VAR byte
led2val   VAR byte
led3val   VAR byte

tablsay   VAR word
lighthed1 VAR byte
lighthed2 VAR byte
lighthed3 VAR byte 

tablsay = 0 

'---------------------------EEPROM DATALARI-------------------------------------   
   DATA @ 0,90,80,70,60,70,80,90,95,90,85,_
            90,85,90,95,95,90,110,150,100,220,_
            130,210,110,230,90,240,200,205,200,195,_
            90,80,70,60,70,80,95,90,85,90,_
            90,80,70,60,70,80,90,95,90,95,_
            90,100,110,100,105,150,110,120,100,120,_
            10,200,10,200,100,250,100,110,100,70_,
            120,190,130,100,105,100,90,100,150,200,_
            90,95,90,85,90,95,100,120,110,120,_
            200,220,205,230,190,220,190,200,190,200,_
            200,220,200,220,190,220,190,225,190,220,_
            190,225,205,215,190,225,195,223,193,222
'-------------------------------------------------------------------------------

   
BASLA:

CLEARWDT          ;uykudan çık
deger=DEGER+1
titrval=Titrval+1
dampval=dampval+1

if titrval = 2000 then
   titrval = 0
   
   if tablsay > 120 then tablsay = 0

   index=tablsay   : read index, veri : lighthed1 = veri
   index=tablsay+1 : read index, veri : lighthed2 = veri
   index=tablsay+2 : read index, veri : lighthed3 = veri
       
   tablsay=tablsay+3
endif

if dampval = 10 then
   dampval = 0
   if led1val < lighthed1 then led1val=led1val+1
   if led1val > lighthed1 then led1val=led1val-1
   if led2val < lighthed2 then led2val=led2val+1
   if led2val > lighthed2 then led2val=led2val-1
   if led3val < lighthed3 then led3val=led3val+1
   if led3val > lighthed3 then led3val=led3val-1;
endif

if deger < led1val then
    high led1
    else
    low led1
endif

if deger < led2val then
    high led2
    else
    low led2
endif 

if deger < led3val then
    high led3
    else
    low led3
endif

GOTO BASLA


Sadece sigorta satırını değiştirdim çalıştı.

sonmoikan

Deneyip de mesaj yazdığın için Teşekkür ederim.
Sigorta Ayarları da aslında aynı fakat Derleyici Ayarları ile alakalı farklılıklar var.
ABDULLAH

. Kağan

#11
Evet benim derleyicide tanımı farklı olmalı.

Son moikan sana bişey sorabilirmiyim.

12f675 ile 4 led kullanarak yumuşak geçişli dönen lamba efekti yapmak istiyorum.

https://www.youtube.com/watch?feature=player_embedded&v=39nbgzAmNxw

bunu yaptım ama leddden lede geçerken kesintisiz olsun istiyorum. Yardımın olabilirmi?

sonmoikan

#12
Ekteki dosya silinmiş olduğundan dolayı yeniden ekliyorum.
RGB Led Proteus model dosyası da eklenmiştir.
ABDULLAH

Analog

Watchdog Timer'ın fonksiyonunu öğrenmek için config ayarlarından kapattım program simülasyonda çalışmadı. WDT yi config ayarlarından açıp, program içindeki ilgili satırları kapattım program çalıştı. WDT nin çalışması ve fonksiyonu hakkında bilgilendirebilirmisiniz arkadaşlar.

ete

Wdt adı üzerinde Türkçesi Bekçi Köpeği olup bu mecazi anlamıdır. Ama fonksiyon olarak benzer işlemi vardır. Programın istem dışı kilitlenmesi durumunda işlemciye reset attırır. Ancak bazen de bunun olmasını siz istemezsiniz. İşin temelinde bir sayaç geri planda çalışır ve önceden belirlenmiş miktara ulaşırsa reset işlemi meydana gelir. Ama arada bir o sayacı sıfırlarsanız hiç bir zaman son noktaya ulaşamayacağı için reset işlemi gerçekleşmez. İşte CLRWDT komutu bu sayac sıfırlama işini yerine getirir.
Faydalı bir işlem gibi gözükse de bazen de işinizi bozan bir fonksiyon olarak karşınıza çıkar. Bu nedenle ya sigorta ayarlarından kapatılır. Yada arada bir CLRWDT komutu kullanılarak sayac sıfırlanır. Basit ve hiç bilmeyenlerin anlayacağı dilden açıklaması böyle. Unutmayın her zaman CLRWDT komutunun kullanılması gerekmiyor. Normal program koşullarında bu komut gerekmeyebilir. Ama yersiz resetler meydana geliyor ise öncelikle WDT ın açık olup olmadığına bakmanızı açık ise kapatmanızı öneririm. Genelde bunun açık olarak kullanılması önerilir. Böylece sistem hiç bir zaman kilitlenmez. Ama dediğim gibi durduk yere de reset meydana gelmeside hiç istenmeyebilir. O zamanda kapatırsınız komutu.


Ete


Powered by EzPortal