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 (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
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
arkadaşlar yardım edebilecek kimse yokmu veya bu dili bilen?
Proton biliyorsan bu kodu basitce çevirebilirsin. Mantık zor değil
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.
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?
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
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 :)
Tesadüfen şöyle birşey gördüm belki faydası olur
http://www.piclist.com/techref/piclist/biketut/chapter8.html
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]
ben aynı projeyi CCS ile yaptım. bende de hızı hep 0 gösteriyordu. sorun timer0 kesmesine girememesi. yani sorun timer0la ilgili kodlarda
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...