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_OFFREM PORTLARIN TANIMLARILED Con 1     ' DEGISTIR, GPIO.1 to LED  UYARI CIKISI'****************************************************************REM DEGISKENLERham var WORDsure var WORDI VAR WORD  '****************************************************************REM AYAR ISLEMLERIANSEL = %00010001  ' Set all digital  CMCON = 7          ' Analog comparators off  TRISIO = %00001001   ' GIRIŞ VEYA CIKIS AYARLAMAADCON0 = %10000000REM       GPI43210   ' Port sırasıWPU = 0'****************************************************************                 GPIO.0=0GPIO.1=1PAUSE 200BASLA:      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 baslaZAMAN:For I=0 to sure      ' "0" DAN sure'YE KADAR SAY     Pause 10          ' SAYDIGIN SAYININ 10 ms KATI KADAR bekleNextReturn

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 kesmesivoid 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ıyorfloat 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