12f675

Başlatan fuat16, 12 Ocak 2015, 12:44:43

fuat16

Saygıdeğer dostlar bir devre üzerinde çalışıyorum ve bir çok adım ilerledim fakat bir yerde tıkandım

Kullanılan pıc 12f675
program  CCS C compiler

Şimdi ben program ile pıc ın içine süre girebiliyorum ve role istediğim sürede çekili kalıyor oraya kadar sorunum yok. Fakat ben dışarıdan potansiyometre ile süreyi manuel ayarlamak istiyorum. Örnek olarak  3 sn ile 50 sn arasında. Bunun için nasıl bir kod nasıl bir yol izlemeliyim dostlar. Kolay gelsin.

. Kağan

#1
Bunu bir incele istersen,

Define OSCCAL_1K 1  ' Calibrate internal oscillator  
DEFINE ADC_BITS 10     ' ADCIN resolution  (Bits)
DEFINE ADC_CLOCK 1     ' ADC clock source  (Fosc/8)
DEFINE ADC_SAMPLEUS 11 ' ADC sampling time (uSec)

@ __config _INTRC_OSC_NOCLKOUT&_WDT_OFF&_MCLRE_OFF&_CP_OFF

REM PORTLARIN TANIMLARI
LED Con 1     ' DEGISTIR, GPIO.1 to LED  UYARI CIKISI
'****************************************************************
REM DEGISKENLER
ham var WORD
sure var WORD
I VAR WORD 
'****************************************************************
REM AYAR ISLEMLERI
ANSEL = %00010001  ' Set all digital 
CMCON = 7          ' Analog comparators off 
TRISIO = %00001001   ' GIRIŞ VEYA CIKIS AYARLAMA
ADCON0 = %10000000
REM       GPI43210   ' Port sırası
WPU = 0
'****************************************************************                 
GPIO.0=0
GPIO.1=1
PAUSE 200

BASLA:
     adcin 0, ham            ' ADC KANALINI OKU
     Sure=((ham+1)*/4500)    ' SUREYI HESAPLA   0-3 DK
     GPIO.1=1                ' LEDI YAK 
     GPIO.2=1                ' BUZZER SES CIKAR   
     PAUSE 500               ' 0,5 sn. BEKLE
     GPIO.1=0                ' LEDI SONDUR
     GPIO.2=0                ' BUZZER SUS
     Gosub zaman             ' ZAMAN ETIKETINE GIT
     Goto basla

ZAMAN:
For I=0 to sure      ' "0" DAN sure'YE KADAR SAY
     Pause 10          ' SAYDIGIN SAYININ 10 ms KATI KADAR bekle
Next
Return

fuat16

#2
Daha iyi yardım edecek arkadaşlar olursa. Dışarıdan potansiyometre ile zaman ayarını yapmak istiyorum 1 sn ile 1 dk arası gibi

. Kağan

Daha ne istiyorsun anlamadım. Adcin0 a potansiyometre bağlayacaksın hepsi o kadar.  :)

fuat16

Teşekkürler saygıdeğer ağabey akşama denicem hemen

fuat16

Bu kodlar ccs c derleyicisinde derlenmiyor.

Burak

kaganayanoglu işlemleri Picbasic'e endeksli olarak örneklendirmiş o yüzden CCS'de derlenmeyecektir . C dili bilen bir arkadaş yardımcı olur umarım ama , eğer  bir fikir baabında bilgi gerekiyorsa şöyle diyelim bilen birisi yardımcı olana kadar.  ,

Yapacağın işlem floating sayılarda çalışabiliyorsan , doğrudan 0-1023 aralığını 0-50 skalasına dönüştürmek .

Kısaca 50 / 1024 = 0.0488

(okunan ham adc çevrim değeri) * 0.0488 = değeri seni istediğin değere götürecektir .

Burak
Ω Gens Una Sumus Ω

fuat16

Sadece delay süresini pottan yaptığım ayara göre olmasını istiyorum.

Burak

Daha öncede dediğim gibi C dili bilmiyorum ama akışı takip edersek şu programdaki örnek bize yol gösterir .



/******************************************************
PIC16F877 ile Dahili ADC Uygulaması
PIC PROG/DEKA : Port B jumper'ı LCD konumunda olmalı
*******************************************************/
#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

#device ADC=10 // 10 bitlik ADC kullanılacağı belirtiliyor.

// Denetleyici konfigürasyon ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#use fast_io(c) //Port yönlendirme komutları C portu için geçerli
#use fast_io(e) //Port yönlendirme komutları E portu için geçerli

#define use_portb_lcd TRUE // LCD B portuna bağlı

#include <lcd.c> // lcd.c dosyası tanıtılıyor

#INT_AD // ADC çevrimi bitti kesmesi
void ADC_Kesmesi ( )
{
output_high(pin_c5); // RC5 çıkışı 1
delay_ms(200);
output_low(pin_c5); // RC5 çıkışı 0
}

unsigned long int bilgi; // İşaretsiz 16 bitlik tam sayı tipinde değişken tanımlanıyor
float voltaj; // ondalıklı tipte voltaj isminde değişken tanıtılıyor

//********** ANA PROGRAM FONKSİYONU*******

void main ( )
{
setup_psp(PSP_DISABLED); // PSP birimi devre dışı
setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı

set_tris_c(0x00); // C portu komple çıkış
set_tris_e(0x0F); // E portu komple giriş

output_c(0x00); // C portu çıkışını sıfırla

setup_adc(adc_clock_div_32); // ADC clock frekansı fosc/32
setup_adc_ports(ALL_ANALOG); // Tüm AN girişleri analog
enable_interrupts(INT_AD); // AD çevrimi bitti kesmesi tanıtılıyor
enable_interrupts(GLOBAL); // Tüm kesmeler aktif

lcd_init(); // LCD hazır hale getiriliyor

printf(lcd_putc,"\f ADC UYGULAMASI "); // LCD'ye yazı yazdırılıyor
delay_ms(1500);

while(1) // sonsuz döngü
{
set_adc_channel(5); // RE0/AN5 ucundaki sinyal A/D işlemine tabi tutulacak
delay_us(20); // Kanal seçiminde sonra bu bekleme süresi verilmelidir
bilgi=read_adc(); // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor

voltaj=0.0048828125*bilgi; // Dijitale çevirme işlemine uğrayan sinyalin gerilimi hesaplanıyor

printf(lcd_putc,"\fAN5 Kanali");
delay_ms(1500);
printf(lcd_putc,"\fDijital=%lu",bilgi); // AN5 ucundaki sinyalin dijital karşılığı LCD'ye aktarılıyor
printf(lcd_putc,"\nVoltaj=%fV",voltaj); // AN5 ucundaki sinyalin gerilim değeri LCD'ye aktarılıyor
delay_ms(2500);

set_adc_channel(6); // RE1/AN6 ucundaki sinyal A/D işlemine tabi tutulacak
delay_us(20); // Kanal seçiminde sonra bu bekleme süresi verilmelidir
bilgi=read_adc(); // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor

voltaj=0.0048828125*bilgi; // Dijitale çevirme işlemine uğrayan sinyalin gerilimi hesaplanıyor

printf(lcd_putc,"\fAN6 Kanali");
delay_ms(1500);
printf(lcd_putc,"\fDijital=%lu",bilgi); // AN6 ucundaki sinyalin dijital karşılığı LCD'ye aktarılıyor
printf(lcd_putc,"\nVoltaj=%fV",voltaj); // AN6 ucundaki sinyalin gerilim değeri LCD'ye aktarılıyor
delay_ms(2500);

set_adc_channel(7); // RE2/AN7 ucundaki sinyal A/D işlemine tabi tutulacak
delay_us(20); // Kanal seçiminde sonra bu bekleme süresi verilmelidir
bilgi=read_adc(); // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor

voltaj=0.0048828125*bilgi; // Dijitale çevirme işlemine uğrayan sinyalin gerilimi hesaplanıyor

printf(lcd_putc,"\fAN7 Kanali");
delay_ms(1500);
printf(lcd_putc,"\fDijital=%lu",bilgi); // AN7 ucundaki sinyalin dijital karşılığı LCD'ye aktarılıyor
printf(lcd_putc,"\nVoltaj=%fV",voltaj); // AN7 ucundaki sinyalin gerilim değeri LCD'ye aktarılıyor
delay_ms(2500);
}
}



Bu programdaki "bilgi" değişkeni okuduğun ham adc değeri olacak , ardındanda şu satırı bir değiştirelim ..

voltaj=0.0048828125*bilgi satırını

kendimize göre kullanacak olsak şu şekilde değiştirelim

bekleme=0.048828125*bilgi şeklinde değiştirdiğimizde senin işini görecek ....

Yukarıdaki program 16F877'ye göre yazılmış , sen gerekli sigorta ve kayıtçı ayarlarını değiştirip adc okuma komutlarına dokunmadan kendi programını kafana göre modifiye ediceksin, tüm yapman gereken bu . Sadece biraz araştırma lazım ;)

Burak.
Ω Gens Una Sumus Ω

fuat16

Çok teşekkür ederim. Çok araştırdım bir çok  hocaya sordum burada da sormak istedim teşekkürler.

Burak

Umarım fikir sahibi olmuşsundur ... Kolay Gelsin .

Burak.
Ω Gens Una Sumus Ω

Atilla

"gosub zaman" ı pause 500 yerine yazsak istenen sonuc olur gibi

bilsisco

POT PORTB.0,40,X    ' 40 taksimatta X encok 100 oluyor             
PAUSE 20                   ' hafif bir kalibre gecikmesi
saniye=(x/100)*60
---------------------
Portbnin 0. bitine pot tak(orta uc. diger ucu toprak)

Powered by EzPortal