NIXIE SAAT VE KELIME SAAT PROJELERI

Başlatan burak ozturk, 07 Ağustos 2012, 20:06:26

burak ozturk

Çok şey ögrendiğim picproje ailesi için birşeyler paylaşmanın vakti geldigini düşünüyorum, basit projeler olmakla birlikte yeni başlayanlar için teşvik, yapacak birşeyler bulamayanlar için fikir olabilmesi umuduyla...

KELİME SAAT :




gördügünüz üzere pek anlatıcak bir şeyi yok :) şablonu reklamcıda imal ettirdim, fakat ilk başta yanlış şablon yaptırdıgımdan ve reklamcıya hatır gönülle iş yaptırdıgım için garanti olsun diye cok uzun ve alelacele bir şablonum oldu biliyorum hatalarım var, eger yapmaya niyetlenirseniz bence uzun tek sıra olacak şekilde yaptırın derim.

videosu :)

http://youtu.be/PhitpQVRHTs



pbp kodları .. ete hocam saygılar :)


'****************************************************************
'*  Name    : KELIMESAAT.BAS                                      *
'*  Author  : [BURAK OZTURK]                                *
'*  Notice  : Copyright (c) 2011 [MAME]                          *
'*          : All Rights Reserved                               *
'*  Date    : 01.05.2012                                       *
'*  Version : 1.0                                           *
'*  Notes   :                                   *
'****************************************************************
INCLUDE "MODEDEFS.BAS"      'SHIFTOUT MODLARI DAHİL ET
PORTA=0:portb=0
TRISB=%00001110    
TRISA=%00000000  
'-----------------------------------------------------------------
@ DEVICE pic16F628A                      'işlemci 16F628                                
@ DEVICE pic16F628A, WDT_Off              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_off            'MCLR pini kullanılMIYOR.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak 
'-----------------------------------------------------------------
DEFINE OSC 4
'-------------------------------------------------------------------------
OPTION_REG=%10000101   'Pull up dirençleri İPTAL- Bölme oranı 1/64.
TMR0=0
CMCON=7  
'---------------------------------------------------------------------------
DTA VAR PORTA.1     'DATA4  4.74 ENTEGRE
CLOCK1 VAR PORTA.0     'CLOCK
CLOCK2 VAR PORTA.7     'DATA3  4.74 ENTEGRE
CLOCK3 VAR PORTA.6     'DATA2  4.74 ENTEGRE  SN NOKTASI 8.BİTİNE BAGLI
CLOCK4 VAR PORTB.7     'DATA1  4.74 ENTEGRE
SYMBOL  RTC_DTA=PORTA.3
SYMBOL  RTC_CLK=PORTA.2
SYMBOL  RTC_RST=PORTB.0
symbol  YUKARI   =PORTB.1  
SYMBOL  SEC =PORTB.2 
SYMBOL  ASAGI=PORTB.3
'-----------------------------------------------------------------------------
SAAT VAR BYTE
DAKIKA VAR BYTE
I     VAR BYTE
BIRVERI VAR BYTE
IKIVERI VAR BYTE
UCVERI VAR BYTE
DORTVERI VAR BYTE
SAATON VAR BYTE
SAATBIR VAR BYTE
DAKIKAON VAR BYTE
DAKIKABIR VAR BYTE
X VAR WORD
GOTVERI VAR BIT
SN          VAR BYTE
GUN         VAR BYTE
AY          VAR BYTE
YIL         VAR BYTE
MEM         var byte ' Temporary data holder
'TARIH       var byte ' Second byte to ds1302
ONLAR       VAR BYTE
BIRLER      VAR BYTE
EDK         VAR BYTE
'BIR VAR BYTE
SAYI VAR BYTE
RANDOM1 VAR WORD
AYARREG VAR BYTE
BIRVERI=0
IKIVERI=0
UCVERI=0
DORTVERI=0
AYARREG=0
low rtc_rst ' Set reset pin low
low rtc_clk ' Set clock pin low
BIR VAR RANDOM1.byte0 
IKI VAR RANDOM1.BYTE1
INTRO:
      AYARREG=2
      FOR I=0 TO 50
      RANDOM SAAT
      RANDOM DAKIKA
      GOSUB KARSILASTIR
      PAUSE 50
      NEXT
      BIRVERI=0:IKIVERI=0:UCVERI=0:DORTVERI=0
      GOSUB EKRAN
      
      random1=%0000000000000001
      DORTVERI.7=1
      GOSUB EKRAN
      PAUSE 75
      DORTVERI.7=0
      for I=0 TO 15
      BIRVERI=BIR
      IKIVERI=IKI 
      gosub ekran
      RANDOM1=RANDOM1<<1
      PAUSE 75
      NEXT I
      BIRVERI=0:IKIVERI=0:UCVERI=0:DORTVERI=0
      
      random1=%0000000000000001
      
      for I=0 TO 14
      UCVERI=BIR
      DORTVERI=IKI 
      gosub ekran
      
      RANDOM1=RANDOM1<<1
'     BIR VAR RANDOM1.byte0 
'     IKI VAR RANDOM1.BYTE1
      PAUSE 75
      NEXT I
      
      random1=%0010000000000000
      for I=0 TO 13
      UCVERI=BIR
      DORTVERI=IKI 
      gosub ekran
      
      RANDOM1=RANDOM1>>1
'     BIR VAR RANDOM1.byte0 
'     IKI VAR RANDOM1.BYTE1
      PAUSE 75
      NEXT I
      UCVERI=0:DORTVERI=0
      
      random1=%1000000000000000
      for I=0 TO 15
      BIRVERI=BIR
      IKIVERI=IKI 
      gosub ekran
      
      RANDOM1=RANDOM1>>1
'     BIR VAR RANDOM1.byte0 
'     IKI VAR RANDOM1.BYTE1
      PAUSE 75
      NEXT I
      DORTVERI.7=1
      GOSUB EKRAN
      PAUSE 75
      DORTVERI.7=0
      GOSUB ZAMAN_OKU
      
       
      
      AYARREG=0

BASLA:

    GOSUB ZAMAN_OKU
    
    IF EDK<>DAKIKA THEN
    GOSUB KARSILASTIR
    ENDIF
        
    if SEC=1 THEN
    AYARREG=1 
    GOTO AYAR
    ENDIF
    
    goto basla  
        
KARSILASTIR:

     GOTVERI=DORTVERI.7
     BIRVERI=0:IKIVERI=0:UCVERI=0:DORTVERI=0
     DORTVERI.7=GOTVERI

     SAATON=SAAT DIG 1
     SAATBIR=SAAT DIG 0
     DAKIKAON=DAKIKA DIG 1
     DAKIKABIR=DAKIKA DIG 0
     
    
    SELECT CASE SAATON
    
    CASE 0
    IF SAATBIR=0 THEN
    BIRVERI.2=1
    ENDIF
    CASE 1
    BIRVERI.0=1
    CASE 2
    BIRVERI.1=1
    
    END SELECT
    
    SELECT CASE SAATBIR
    
    CASE 1
    BIRVERI.5=1
    CASE 2
    IKIVERI.1=1
    CASE 3
    BIRVERI.3=1
    CASE 4
    IKIVERI.4=1
    CASE 5
    IKIVERI.2=1
    CASE 6
    IKIVERI.0=1
    CASE 7
    IKIVERI.3=1
    CASE 8
    BIRVERI.6=1
    CASE 9
    BIRVERI.7=1
    
    END SELECT
    
    
    SELECT CASE DAKIKAON
    
    CASE 0
    IF DAKIKA=00 THEN
    IKIVERI.6=0
    ELSE
    IKIVERI.6=1
    ENDIF
    CASE 1
    IKIVERI.5=1
    CASE 2
    UCVERI.1=1
    CASE 3
    IF (DAKIKA=30) and (saat<13)  THEN
    DORTVERI.6=1
    ELSE
    UCVERI.0=1
    ENDIF
    CASE 4
    UCVERI.2=1
    CASE 5
    IKIVERI.7=1
    
    END SELECT
    
    SELECT CASE DAKIKABIR
    
    CASE 0
    UCVERI.3=0
    CASE 1
    DORTVERI.1=1
    CASE 2
    UCVERI.5=1
    CASE 3
    DORTVERI.2=1
    CASE 4
    UCVERI.7=1
    CASE 5
    IF (DAKIKA=15) and (saat<13) THEN
    DORTVERI.5=1
    IKIVERI.5=0
    DORTVERI.0=0
    ELSE
    DORTVERI.0=1
    ENDIF
    CASE 6
    UCVERI.6=1
    CASE 7
    DORTVERI.3=1
    CASE 8
    DORTVERI.4=1
    CASE 9
    UCVERI.4=1
    
    END SELECT
    
EKRAN:    
    shiftout DTA,CLOCK1,MSBFIRST,[BIRVERI]:PAUSE 10        
  
    shiftout DTA,CLOCK2,MSBFIRST,[IKIveri]:PAUSE 10
    
    shiftout DTA,CLOCK3,MSBFIRST,[UCVERI]:PAUSE 10
    IF AYARREG=2 THEN 
    'DORTVERI.7=BIRVERI.7
    GOTO GIT
    ENDIF
    IF AYARREG=1 THEN
    TOGGLE DORTVERI.7
    ELSE
    DORTVERI.7=1
    ENDIF
GIT:
    shiftout DTA,CLOCK4,MSBFIRST,[DORTVERI]:PAUSE 10
    PAUSE 10
    EDK=DAKIKA
    return

    '-------------------AYAR AYAR AYAR---------------------------------         
AYAR: 'Bu bölümde saat ayarı yapılıyor
WHILE SEC=1 'hala Mode (seç) tusuna basılı ise
WEND 'Bırakılıncaya kadar bekle

HOUR:
IF SEC=1 THEN
goto MINBIR 'Burada Sec tusuna basılmıs ise Dakika ayarına geç
endIF
IF YUKARI=1 THEN 'Yukarı tusuna basılmıs ise
SAAT=SAAT+1 'saat degerini bir artır.
IF SAAT=24 THEN SAAT=0 'Saat=24 olmus ise saat=0 yap
ENDIF
IF ASAGI=1 THEN 'Asagı tusuna basılmıs ise
SAAT=SAAT-1 'saat degerini bir eksilt
IF SAAT=255 THEN SAAT=23 'sayet saat tekrar 255 olmus ise saat=23 yap
ENDIF
GOSUB GECIKME 'biraz gecikme yap

GOSUB KARSILASTIR
GOTO HOUR 'tekrar Saat ayarına dön.

MINBIR: WHILE SEC=1 'Hala Sec tusuna basılı ise
WEND 'bırakılıncaya kadar bekle


MINUTE: 'Saat degerlerini ekrana yaz.
IF SEC=1 THEN
'gosub ZAMAN_YAZ
'PAUSE 1
goto SECBIR
ENDIF
IF YUKARI=1 THEN
DAKIKA=DAKIKA+1
IF DAKIKA=60 THEN DAKIKA=0
ENDIF
IF ASAGI=1 THEN
DAKIKA=DAKIKA-1
IF DAKIKA=255 THEN DAKIKA=59

ENDIF
GOSUB GECIKME

GOSUB KARSILASTIR
GOTO MINUTE

SECBIR: WHILE SEC=1
WEND

AYARREG=0
GOSUB ZAMAN_YAZ
GOSUB ZAMAN_oku
GOSUB KARSILASTIR
goto BASLA

GECIKME:
FOR X=0 TO 1800
PAUSEUS 100
NEXT
RETURN 

    ZAMAN_OKU: 
         high RTC_RST
         shiftout RTC_DTA, RTC_CLK, 0, [$BF]
         SHIFTIN RTC_DTA, RTC_CLK, 1, [SN, DAKIKA, SAAT,GUN , AY, MEM, YIL, MEM]  'OKU
         MEM=SN:GOSUB CEVIR:SN=SAYI
         MEM=DAKIKA:GOSUB CEVIR:DAKIKA=SAYI
         MEM=SAAT:GOSUB CEVIR:SAAT=SAYI
         MEM=GUN:GOSUB CEVIR:GUN=SAYI
         MEM=AY:GOSUB CEVIR:AY=SAYI
         MEM=YIL:GOSUB CEVIR:YIL=SAYI
         low RTC_RST 
         return

ZAMAN_YAZ:
      
         high  RTC_RST 
         SHIFTOUT RTC_DTA, RTC_CLK, 0, [$8E, 0]    'WRT Protek açıldı
         low RTC_RST:PAUSEUS 10 
         high RTC_RST
         MEM=SN:GOSUB TERSCEVIR:SN=SAYI 'decimalden hex' çevirme''
         MEM=DAKIKA:GOSUB TERSCEVIR:DAKIKA=SAYI
         MEM=SAAT:GOSUB TERSCEVIR:SAAT=SAYI
         MEM=GUN:GOSUB TERSCEVIR:GUN=SAYI
         MEM=AY:GOSUB TERSCEVIR:AY=SAYI
         MEM=YIL:GOSUB TERSCEVIR:YIL=SAYI           
         SHIFTOUT  RTC_DTA, RTC_CLK, 0, [$BE, SN, DAKIKA, SAAT,GUN , AY, 0, YIL, 128]  'YAZ
         low RTC_RST
         PAUSEUS 10
         return
TERSCEVIR:              'dec-hex  
         ONLAR=MEM DIG 1
         ONLAR=ONLAR<<4
         BIRLER=MEM DIG 0
         SAYI=ONLAR+BIRLER
         RETURN    
               
CEVIR:                   'hex-dec
         ONLAR=MEM & %01110000
         ONLAR=ONLAR>>4
         BIRLER=MEM & %00001111
         SAYI=ONLAR*10+BIRLER
         RETURN



END
         


şema ve tüm dosyalar için link : http://www.upload.gen.tr/d.php/www/dvk99asv/KELIME_SAAT.rar.html


NIXIE SAAT :



ilk nixie tube gordugum andan beri birşeyler yapma istegi sürekli kafamın dönüp durur olmuştu, sonunda dayanamayıp e-bayden nixie tube alarak saati yapmaya koyuldum.

http://youtu.be/iMETovfGq9o

http://youtu.be/0urxPSQJIJY


ccs c kodları, ccs c ile yazdıgım ilk proje olması sebebiyle belki kulagı arkadan tutmus olabilirim ama çalışıyor :)

#include <16F628A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection


#use delay(clock=4000000)
#include "DS1302.c"



#define azalt pin_b0
#define arttir pin_b1
#define sec pin_b2
#define k1551 pin_b4
#define k1552 pin_b5
#define k1553 pin_b6
#define k1554 pin_b7
#define clock pin_a0
#define data pin_a7

int sayi=0;
int saybabamsay=0;
int deger;
int saat;
int dakika;
int saniye;
int16 pvm;
int z=0;
int ayarda=0;

rtc_init();



void ayar()//ayar programi
{


while (ayarda!=0)//eger ayarda isen
{

while(input(sec))//sec e basildikca ledi yanik tut
{
set_pwm1_duty(255);
}

while(ayarda==1) // main de ayar dugmesine basinca ayarda 1 olur dakika ayar dongusune girilir
{
set_pwm1_duty(0);// ledler sonuk durumda 


if (input(arttir))
{
dakika++;
if (dakika==60)
dakika=0;
while (input(arttir))// arttir a bastikca bos doner
{}

}

if (input(azalt))
{

dakika--;
if (dakika==255)
dakika=59;
while (input(azalt))
{}
}


if (input(sec))//sec e ikinci basista saat ayarina git ledi yaktir
{ 
   ayarda=2;
   
while(input(sec))
{
set_pwm1_duty(255);
}

}

}


while(ayarda==2)
{
set_pwm1_duty(0);


if (input(arttir))
{
saat++;
if (saat==24)
saat=0;

while (input(arttir))
{}

}

if (input(azalt))
{

saat--;
if (saat==255)
saat=23;
while (input(azalt))
{}
}


if (input(sec))// ayardan cik rtc saati ayarla
{ 
   ayarda=0;
   rtc_set_datetime(16,04,12,1,saat,dakika);
   
   
while(input(sec))
{
set_pwm1_duty(255);
}

}

}

}
}





int degeral()//saat degerine gore gelir burdan rakam alir
{
switch(deger) 
{
case 0:return 0;break;
case 1:return 16;break;
case 2:return 64;break;
case 3:return 80;break;
case 4:return 128;break;
case 5:return 144;break;
case 6:return 192;break;
case 7:return 208;break;
case 8:return 32;break;
case 9:return 48;break;
case 10:return 96;break;
}
}



#int_timer0
void timer0_kesme()//tarama isini timr0 yapti her geldiginde bir tubu taradik ayni zamanda pwm icin doluluk oranini her geldiginde 2,1 arttikdik
{

set_timer0(6);
sayi++;
saybabamsay++;


if (z==0)//pwm degeri her tmr de 2,1 artiyor
{
   pvm=pvm+2,1;
   if (pvm>1015)
   {
   z=1;
   break;
   }
}
else //pwm degeri her tmr de 2,1 azaltiliyor
{
   pvm=pvm-2,1;
   if (pvm<5)
   {
   z=0;
   break;
   }
}



if (sayi==6) //tarama icin tanimlanmis degisken
   sayi=0;


switch (sayi)//tarama burda yapiliyor
{
case 0:
         deger=10;//bosalt
         output_B(degeral());//katod bcd entegre sürme
         output_bit(data,1);//anod 74ls164 sürme
         output_high(clock);
         output_low(clock);
         deger=saniye%10;//gereken degeri bas
         output_B(degeral());//katod bcd entegre sürme
         break;
         
case 1:  
         deger=10;
         output_B(degeral());//katod bcd entegre sürme
         output_bit(data,0);
         output_high(clock);
         output_low(clock);
         deger=saniye/10;
         output_B(degeral());//katod bcd entegre sürme
         break;
         
case 2:  
         deger=10;
         output_B(degeral());//katod bcd entegre sürme
         output_bit(data,0);
         output_high(clock);
         output_low(clock);
         deger=dakika%10;
         output_B(degeral());//katod bcd entegre sürme
         break;
         
case 3:  
         deger=10;
         output_B(degeral());//katod bcd entegre sürme
         output_bit(data,0);
         output_high(clock);
         output_low(clock);
         deger=dakika/10;
         output_B(degeral());//katod bcd entegre sürme
         break;      
         
        
case 4:  
         deger=10;
         output_B(degeral());//katod bcd entegre sürme
         output_bit(data,0);
         output_high(clock);
         output_low(clock);
         deger=saat%10;
         output_B(degeral());//katod bcd entegre sürme
         break;  
         
case 5:  
         deger=10;
         output_B(degeral());//katod bcd entegre sürme
         output_bit(data,0);
         output_high(clock);
         output_low(clock);
         deger=saat/10;
         output_B(degeral());//katod bcd entegre sürme
         break;           
         
         }         


}




void main()
{
   
   setup_oscillator(OSC_4MHZ);
   setup_ccp1(CCP_PWM);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_8);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_16,255,1);
   enable_interrupts(INT_timer0);
   enable_interrupts(GLOBAL);
   rtc_init();
   rtc_set_datetime(16,04,12,1,21,15);


   
while(1)
{

set_pwm1_duty(pvm);//led surme



if (input(sec))//ayar 
{ 
   ayarda=1;
   ayar();
}


if (saybabamsay>30)//rtc surekli saat sordugunda sapitiyor her 10 tmr de bir sorgulaniyor.
{
saybabamsay=0;
rtc_get_time(saat,dakika,saniye);

}

}

}



şema ve tüm dosyalar için link : http://www.upload.gen.tr/d.php/www/1kzyepeg/nixiesaat.rar.html
happy coding.

kantirici

Merhaba,
nixie tübleri bende ilk görüdügüm andan beri bir uygulama yapmak istiyorum fakat daha nasip olmadı.nixie tübleri kaç voltla ve nasıl sürdünüz acaba?Ayrıca ebayda satılan sürücü entegrelerinde de aldınızmı yoksa alternatifmi kullandınız?

burak ozturk

hocam sürücü entegre kullandım k155id , ama şimdiki aklım olsa mpsa 92 - mpsa 42 ikilisi ile sürücü kısmını kendim yapardım nettede örnekleri mevcut , biraz gençlik heyecanı biraz entegrenin üstünde kiril alfabesi yazması cezbetti beni :)  birde k155id için şöyle bir durumu mevcut, 74141 ile muadil gözüküyor ancak devreyi buna göre çizdikten sonra oyle olmadıgını görüp programda karakter tablosuyla oynamak zorunda kaldım .

nixie tube leri 170 V ile sürdüm , tarama yaptıgım için programı bitirdikten sonra voltajı biraz daha arttırdım,  power supply konusuna gelince 12V u, 555 li basit bir switch mode yaparak 170V a çıkardım zaten baskı devrede göreceksiniz tek kart üstünde hallettim herşeyi, şu linkte ornek bir power supply şeması mevcut : http://www.ledsales.com.au/kits/nixie_supply.pdf
happy coding.

emrah

güzel çalışma olmuş, ekteki PCB nin açık şeması varmı ? ares şeması felan ?

muat

Merhaba,

Nixie tube'ler hakkında biraz bilgi verebilir misiniz? Diğer displaylere göre nasıl bir avantajları var?


burak ozturk

Alıntı yapılan: emrahGS - 08 Ağustos 2012, 10:10:58
güzel çalışma olmuş, ekteki PCB nin açık şeması varmı ? ares şeması felan ?

malesef direk areste baskı devreyi ezbere çizdim ancak basitçe bahsetmek gerekir ise ; voltajın girdigi kısım da 555 li bir smps mevcut bu tube anodları için gerekli 170V u sağlıyor. 170V 'u anodlara tarama yaptırmak için  74164 ile port çogullama yapıp, onun çıkışlarını mpsa42-mpsa92 transistorleri ile yapılmış sürücü kısımları ile direk tube anodlarına besledim. tubelerin katodlarını ise bir adet k1555id nixie tube ler için imal edilmiş hazır sürücü entegresi ile sürdüm. rtc olarak ds1302 kullandım ve ledler için ccp1 çıkışını bir transistor ile sürdüm. devrenin özeti kısa olarak budur :)


Alıntı yapılan: muat - 08 Ağustos 2012, 15:58:09
Merhaba,

Nixie tube'ler hakkında biraz bilgi verebilir misiniz? Diğer displaylere göre nasıl bir avantajları var?



nixie tube un diger displaylere göre hiçbir avantajı yok hatta dezavantajları mevcut :)7 segmentten önceki teknoloji olarak düşünebilirsiniz.tube içinde akkor teller rakam şeklinde dizilmiş ve voltajı verdiginiz tel kızarıyor. 170V ile sürülmesi, datasheetine göre 5000 saat civarı bir ömrü olması, bulunamıyor ve temininin zor olması dezavantajları ..açıkcası göze hoş gelmesi ve artık bulunamıyor olması açıkcası beni cezbeden tarafı.
happy coding.