bisiklet hız göstergesi

Başlatan onursamur, 02 Mayıs 2010, 19:29:01

onursamur

merhaba arkadaşlar.
ben pic16f84 ile bisiklet hızını ölçmek ve kaç km gittiğini eeproma yardırarak enerji kesilse bile  km yi hafıza da tutmayı planlıyorum.
tubitak ın sitesinde bulduğum c kodları var fakkat fazla birşey anlamadım. sayet pbp ile çalışıyorum.
bu konuda kodları çevirmek için yardım istiyorum
hızı ölçmek için reed röle kullanacağım.
devre şeması da bu linkte teşekkürler
http://www.biltek.tubitak.gov.tr/gelisim/elektronik/dosyalar/31/devre.jpg

#include <pic.h>
#include <delay.c>
#include <lcd.c>
#include <stdio.h>

//Konfigurasyon ayarlari
__CONFIG(WDTDIS&LVPDIS&PWRTEN&XT);

// Reed anahtar RA0'a pinine bagli
#define SW RA0 

// Global degiskenler
unsigned char kontrol=0;
unsigned char sonuc[]="                ";
unsigned int CX;
float pi=3.14159, r=0.3302; //Teker yaricapi

//---- TIMER kesme alt programi -----
void interrupt kesme(void){
CX++;
if(CX>10000)kontrol=1;
	
T0IF=0; // Bayragi temizle
TMR0=131; // TIMER'i tekrar yukle
}

//--------- LCD alt programi----------
void LCD_yaz(void){
float hiz;
unsigned int hiz2;

lcd_clear(); // LCD'yi temizle
hiz=2*pi*r*3600/CX; // km/saat cinsinden
hiz2=(int)hiz; // hiz degerini hesapla

lcd_goto(0x00); lcd_puts(" HIZ GOSTERGESI ");

if(kontrol==0){ // Sonucu LCD'ye yazdir
sprintf(sonuc+3,"%d Km/Saat",hiz2);
lcd_goto(0x40); lcd_puts(sonuc);
}

else{ // Bisiklet duruyorsa Hiz=0 yazdir 
lcd_goto(0x41); lcd_puts("*** HIZ=0 ***");
}
	
}
//----------- ANA PROGRAM ------------

main(void)
{
       	
TRISA=0x01; // Port A'nin ilk pini giris  
TRISB=0x00; // PortB'nin hepsi cikis
CMCON=0x07; // PortA sayisal giris
PORTA=0; // Baslangic durumu ayarlari
PORTB=0;  

// LCD islemleri
DelayMs(250);
lcd_init();
lcd_clear();
lcd_write(0x0C); //imleci gizle
lcd_goto(0x00); lcd_puts(" HIZ GOSTERGESI ");

// TIMER islemleri
T0CS=0; // Dahili clock
PSA=0; // Prescaler TMR0 icin ayarli
PS0=0; PS1=1; PS2=0; // Oran 1:8
ei(); // Butun kesmeler etkin
T0IE=0; // Baslangicta TIMER pasif
T0IF=0; // Bayrak temizle

// Hiz olcum islemleri
for(;;){

CX=0; kontrol=0;
	
while(SW==0); // Giris 0 ise bekle
TMR0=131; // 125 sayim (256-131=125)
T0IE=1; // TIMER baslat
while(SW==1); // Giris 1 ise bekle
while(kontrol==0){if(SW==1)break;}

T0IE=0; // TIMER'i durdur
LCD_yaz(); // LCD alt programina git

DelayMs(250); // 250 ms bekle
while(SW==1); 

} // islemleri tekrarla
} // Programin sonu

SERRO EFE

#1
Kodları basice çeviremem ama mantık şudur:
ne kadar gittiğini bulmak için:
tekerin çavre uzunluğunu bulacaksın.(cm yada mt) sana kalmış.
tekerin bir tur döndüğünü okutup.bulduğun çevre uzunluğu ile çarpacaksın.çıkan sonucu arka arkaya toplayacaksın sana kaç mt yada cm gittiğin çıkacak.uygun zaman aralıklarındada lcd de gösterirsin.
hızı için:
bi tane timer kurup (1 sn olacak muhtemelen) timer çevrimi içinde gelen palsleri saydıracaksın. misal 10 sn de 100 pals geldi. senin 1 palsin 2 mt buda 200 mt yapar orantıyı kurup 10 sn de şu kadar gidersem saatte (saati sn cinsinden yazacaksın) şukadar gider deyip km saat hızını bulursun

onursamur

arkadaşlar yardım edebilecek kimse yokmu veya bu dili bilen?

orhanc

Proton biliyorsan bu kodu basitce çevirebilirsin. Mantık zor değil
i'm doing nothing... Giddy Up  http://www.drorhan.com

Tagli

SERRO EFE ihtiyacın olan tüm bilgiyi vermiş zaten. Gerisi senin PicBasic Pro bilgine kalıyor. Eğer programı kendin yazabilecek bilgi birikimine sahip değilsen iki seçeneğin var: Ya çalışarak kendini gerekli olan seviyeye çıkaracaksın, ya da çalıştığı bilinen hazır bir program kullanacaksın.

Eğer çalışan mevcut C programında yapmak istediğin değişiklikler varsa bunları belirt, dili bilen arkadaşlar ilgileceklerdir. Ama ortada bir sebep yokken C kodunu Basic'e çevirmek anlamsız, özellikle de PicBasic Pro'nun kesmeler konusunda sabıkalı olduğu bilinirken.
Gökçe Tağlıoğlu

onursamur

teşekkür ederim  ama c dilini hiç bilmiyorum
bu dili  ve pbp yu bilen bilen arkadaşlar yardım edemez mi pbp ye  çeviremez mi?

onursamur

arkadaşlar aşağıda yazan kodların bazıları ne yapmak istiyor anlamadım bilen bir arkadaş anlatırsa sevinirim

//---- TIMER kesme alt programi -----
void interrupt kesme(void){
CX++;
if(CX>10000)kontrol=1;
   
T0IF=0; // Bayragi temizle
TMR0=131; // TIMER'i tekrar yukle
}

ve // TIMER islemleri
T0CS=0; // Dahili clock
PSA=0; // Prescaler TMR0 icin ayarli
PS0=0; PS1=1; PS2=0; // Oran 1:8
ei(); // Butun kesmeler etkin
T0IE=0; // Baslangicta TIMER pasif
T0IF=0; // Bayrak temizle

// Hiz olcum islemleri
for(;;){

CX=0; kontrol=0;
   
while(SW==0); // Giris 0 ise bekle
TMR0=131; // 125 sayim (256-131=125)
T0IE=1; // TIMER baslat
while(SW==1); // Giris 1 ise bekle
while(kontrol==0){if(SW==1)break;}

T0IE=0; // TIMER'i durdur
LCD_yaz(); // LCD alt programina git

DelayMs(250); // 250 ms bekle
while(SW==1);
kıemıezı ile yazılanlar ne  anlama geliyor mesela

orhanc

#7
Kesme Nedir ?

Kesmeler bir programın daha önemli başka bir görevin yerine getirilmesi için kesilmesine izin veren bir mekanizmadır. Bu görevler tuş takımından bir karekter okunması veya farenin yeni koordinatlarının alınması gibi işlemler olabilir. Kesmeler tarafından idare edilecek olaylar sadece donanım tasarımcılarının hayal gücüyle sınırlıdır.

Peki bu niye bu kadar önemli ? Eğer kesmeler oluşmasaydı, her programın bu olayları kontrol etmesi gerekirdi. Yazılım kendi çalışmasını kesip, giriş aygıtlarındaki verileri kontrol etmek zorunda kalacaktı. Kontrol edilecek verilerin ulaşma sıklığı az olmadığı sürece, tüm olayların yakalanma şansı böyle bir yöntemle oldukça düşük olacaktı.

Fonksiyonları da bir incele

http://www1.gantep.edu.tr/~bingul/c/index.php?ders=8

cx++ integer değişken ve kendini bir arttırıyor.

Buradan atama operatörlerini incele.

http://www.kadirga.k12.tr/egitim/c_programlama/ders.php-id=3.htm

while kısmında ise belirli bir koşul sağlanana kadar döngü içinde kalır. SW 1e eşit olduğu sürece iş yap..

http://www.kadirga.k12.tr/egitim/c_programlama/ders.php-id=8.htm

C dilini öğrenmende fayda var. C dili çoğu dilden daha kolay okunur. En kolay okunanı Pascal bence :)

i'm doing nothing... Giddy Up  http://www.drorhan.com

orhanc

i'm doing nothing... Giddy Up  http://www.drorhan.com

onursamur

aarkadaşlar yaardımınız gerekli
hız göstergesini yaptım fakat hız ı 0 gösteriyor ölçüm yapmıyor
sanırım kesmenin acılma ve kapanma süresi yani ta tb süresini ölcemedim
yardımlarınızı bekliyorum.
PORTA=0:portb=0
TRISB=%00000000   'PortB tamamı çıkış yapıldı.
TRISA=%00000001   'A portu 0. BİTİ GİRİŞ YAPILDI.
'-----------------------------------------------------------------
@ DEVICE pic16F628                      	     'işlemci 16F628                                
@ DEVICE pic16F628, WDT_OFF                      'Watch Dog timer kapalı
@ DEVICE pic16F628, PWRT_ON                      'Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF                  'Kod Koruma kapalı
@ DEVICE pic16F628, MCLR_off                     'MCLR pini kullanılıyor.
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT           'Dahili osilatör kullanılacak 
'-----------------------------------------------------------------
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
'------------------------------------------------------------------------- 
ON INTERRUPT GoTo KESME       'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%00000010   	      'Pull up dirençleri İPTAL- Bölme oranı 1/8
INTCON=%10100100  		      'Kesmeler başlangıçta  TMR0 kesmesi ETKİN
DISABLE INTERRUPT                             'KESMELER KAPALI
TMR0=0
CMCON=7    			          '16F628 de komparatör pinleri iptal hepsi giriş çıkış

SAYAC           VAR   word       
KONTROL         VAR   BYTE
HIZ             VAR   WORD
ROLE            VAR   PORTA.0
PI              VAR   BYTE  
R               VAR   BYTE
PI              =   3
R               =   1/2


'----------------------------------------------------------------------------
'HIZ ÖLÇÜM İŞLEMLERİ
SAYAC       =       0   'SAYAC 0
KONTROL     =       0   'KONTROL 0
WHILE  ROLE=0 
PAUSE 1 
WEND
TMR0=131
ENABLE INTERRUPT
WHILE ROLE=1
PAUSE 1
WEND
DISABLE INTERRUPT
GOTO LCDALT



'-------------------------------------------------------------------------------
'LCD İŞLEMLERİ 

LCDALT:
HIZ     =  (3*1/2)/SAYAC  
PAUSE 250
LCDOUT $FE,1
LCDOUT $FE,1,"HIZ = ",#HIZ
     
      LCDOUT $FE,$C0, " LCD ORNEK PROG."


    
'-------------------------------------------------------------------------------
KESME                                       'KESME OLUŞTUĞUNDA
    DISABLE INTERRUPT                                      'BAŞKA KESME OLMASIN      
    SAYAC=SAYAC+1                           'SAYAÇ I 1 ARTIR
    if  SAYAC>10000    then    kontrol=1    'SAYAÇ 10000 İ GEÇTİYSE KONTROL Ü 1 YAP
    INTCON.2=0                              'TMR 0 BAYRAĞI TEMİZLE
    TMR0=131                                'TMR 0 A 131 YÜKLE
    RESUME                                  'KALDIĞI YERE DÖN
    ENABLE INTERRUPT
'-------------------------------------------------------------------------------

            
        [img][/img]

VFR

ben aynı projeyi CCS ile yaptım. bende de hızı hep 0 gösteriyordu.  sorun timer0 kesmesine girememesi. yani sorun timer0la ilgili kodlarda

maviveda

eger ugrasmak ıstemıyorsan sitesinde hex kodu zaten var hex kodlarını kopyala bi notepad ac yapıştır uzantısını hex e cevir pic e at. ben yaptım bu göstergeyi sorunsuz çalışıyor bilgine...