Merhaba arkadaslar ben yaptigim uv box icin bir zamanlayici/timer yapmak istiyorum ama bunu picin timer1 ile yapmak istiyorum cunku bana gercek bir zamanlama lazim. Serdar cicek hocamizin kitabindaki en basit timer1 uygulamasini asagida paylasacagim eger bir bilginiz varsa bana bu konuda yardim edip bu programa nasil 7 segmentli display ekleyip dakikayi saniyeyi bu segmente yazdirabilirim acaba.
/******************************************************
PIC16F877 ile Timer1 Uygulamasý-1
PIC PROG/DEKA : Port B jumper'ý LED konumunda olmalý
*******************************************************/
#include <16f877.h> // Kullanýlacak denetleyicinin baþlýk dosyasý tanýtýlýyor.
// 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(b) //Port yönlendirme komutlarý B portu için geçerli
int i=0; // Tamsayý tipinde deðiþken tanýmlanýyor
//****************** Timer0 Kesmesi *****************************
#int_timer1 // Timer1 kesmesi
void timer1_kesme () // Kesme fonksiyonu ismi
{
set_timer1(63036); // TMR1 deðeri belirleniyor
i++; // i deðeri 1 arttýrýlýyor
if (i==50) // i deðeri 50'ye eþit olursa RB0 lojik-1 olsun
output_high(pin_b0);
if (i==100) // i deðeri 100'e eþit olursa RB0 lojik-0 ve i=0 olsun
{
output_low(pin_b0);
i=0;
}
}
/********* ANA PROGRAM FONKSÝYONU********/
void main ( )
{
setup_psp(PSP_DISABLED); // PSP birimi devre dýþý
setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayýcýsý devre dýþý
setup_adc_ports(NO_ANALOGS); // ANALOG giriþ yok
setup_adc(ADC_OFF); // ADC birimi devre dýþý
setup_CCP1(CCP_OFF); // CCP1 birimi devre dýþý
setup_CCP2(CCP_OFF); // CCP2 birimi devre dýþý
set_tris_b(0x00); // B portu komple çýkýþ
output_b(0x00); // B portu çýkýþý ilk anda sýfýrlanýyor
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8); // Timer1 ayarlarý yapýlýyor
set_timer1(63036); // TMR1 deðeri belirleniyor
enable_interrupts(INT_timer1); // int_timer0 kesmesini aktif yapar
enable_interrupts(GLOBAL); // Aktif edilen kesmelere izin ver
while(1); // Sonsuz döngü
}
Serdar Çiçek'in kitabındaki 7 segment display uygulamalarına da baktın mı? Yapacağın şey zamanı bir değişkende saklayacaksın, sonra bunu basamaklara ayırıp display'e göndereceksin.
Dakika Saniye için RTC (Real Time Clock) kullanmak gerekir.
Yok, gerçek zamanlı olmasın diyorsanız Saat kodu yazacaksınız.
Saniyeler, Dakikalar, Saatler, Günler aylar yıllar vs.
O kolay...
Timerı 32768 'de taşar şekilde ayarlayın bu saatin kök noktası olacak buradaki en küçük değişiklik tüm
değerlere büyüyerek sirayet eder.Tabii işlemci clocunu ona göre set edip ideal durumu veya
tam 1 Saniyede İnt oluşacak şekilde ayarlayın.Ama aşağı yukları kayma mutlaka olacaktır.
Önemli değil.
Her int rutininde Saniye değişkenini 0- 59 a kadar arttırıp Dakika değişkenini, Dakika değişkenini 0-59'a kadar bir arttırıp
Saat değişkenini, Saat değişkenini 0-23'e kadar arttırıp Gün,Hafta,Ay vs vs uzar gider neyse.
Bunu yaptıktan sonra bir Display Fonksiyonu yazın,yazdığınız fonksiyonun parametre veya parametrelerine
Saniye,dakika saat vs olacak şekilde aktarın.
Bu kadarcık.
7 segment yerine lcd kullanirsan daha kolay yaparsin.saati dısaridan bagla daha gercekci olur.rtc devreler var.
Alıntı yapılan: serkancetin - 22 Şubat 2017, 14:47:08
7 segment yerine lcd kullanirsan daha kolay yaparsin.saati dısaridan bagla daha gercekci olur.rtc devreler var.
lcd ile yapmasi daha kolay belki ama 7 segment daha az yer kapliyor e benim projem icin daha uygun o yuzden ben 7 segmentte kaliyim) birde saati disardan baglamak daha mantikli dogru soyluyorsun ama benim anladigim kadari ile yada bildigim kadari ile timer1 ile de 5-10 dakikalik sadece dakika ve saniye gosteren bir uygulama cok kucuk bir sapma ile yapiliyor dogru degilmiyim acaba?
Benim yaptığım bir proje vardı. Şuraya not düşeyim de bilgisayara geçince paylaşayım.
Alıntı yapılan: Emre MERMİ - 22 Şubat 2017, 15:49:26
Benim yaptığım bir proje vardı. Şuraya not düşeyim de bilgisayara geçince paylaşayım.
Cok memnun olurum tessekurler. Bu arada bende basit bir sayim devresi yazmayi basardim.Timer olmadan ama butonlari eklemeyi ve timer ile nasil eslestirecegim hakkinda en ufak bir fikrim yok. Birde bu devre ileriye dogru gidiyor)) Geriye dogru gidmesi icin herseyi denedim ama her yol devreyi bozdu. Lutfen kodlari inceleyip fikrinizi belirtirmisiniz?
#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000)
int i,k,c;
const int digit[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C, 0x07, 0x7F, 0x6F, 0x77};
void main ()
{
while(1)
{
for(i=0;i<=9;i++)
{
for(k=0;k<=9;k++)
{
for(c=0;c<=9;c++)
{
output_b(digit[i]);
output_d(digit[k]);
output_c(digit[c]);
delay_ms(500);
}
}
}
}
}
http://www.candrian.gr/index.php/category/microcontrollers/avr/switch-timer/
Ben yaptım güzel çalışıyor. Ancak röleyi biraz daha
büyük seçebilirsiniz...
Alıntı yapılan: mehmet - 23 Şubat 2017, 13:54:39
http://www.candrian.gr/index.php/category/microcontrollers/avr/switch-timer/
Ben yaptım güzel çalışıyor. Ancak röleyi biraz daha
büyük seçebilirsiniz...
cok tesekkur ederim kodlari inceleyecegim ama eger mumkunse ve ccs c ustunde bilgi sahibiyseniz sizde benim yukarida yazdigim kodu inceleyip start,set ve reset butonlarini nasil ekleyecegimi soyleyebilirmisiniz?
#include <16F877.h>
#FUSES NOPUT //No Power Up Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG
#use delay(crystal=20000000)
#use rs232(baud=1200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1)
int1 z=0,y=0;
int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,r=0,s=0,t=0,v=0,a1=0,a2=0,a3=0;
const int digit[16]={0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71}; //ortak katot display için port çıkışları
char veri=0;
#INT_RDA
void RDA_isr(void)
{
veri=getc();
if(veri=='N'){
a1=a1+1;
veri=0;
}
if(a1==5){
reset_cpu();
a=0;b=0;c=0;d=0;e=0;f=0;
}
}
#INT_TIMER2
void TIMER2_isr(void)
{
if(d==1){
g=g+1;
}
h=h+1;
if(h==7){
h=0;
}
}
void saat()
{
if(g==10){
a=a+1;
g=0;
}
if(a==100){
a=0;
b=b+1;
}
if(b==60){
b=0;
c=c+1;
}
if(c==100){
c=0;
b=0;
a=0;
}
}
void display_yaz(){
if(h==0){
output_high(pin_d2);
output_low(pin_d3);
output_low(pin_d4);
output_low(pin_d5);
output_low(pin_d6);
output_low(pin_d7);
j=a%10;
output_b(digit[j]);
}
if(h==1){
output_low(pin_d2);
output_high(pin_d3);
output_low(pin_d4);
output_low(pin_d5);
output_low(pin_d6);
output_low(pin_d7);
k=a/10;
output_b(digit[k]);
}
if(h==2){
output_low(pin_d2);
output_low(pin_d3);
output_high(pin_d4);
output_low(pin_d5);
output_low(pin_d6);
output_low(pin_d7);
l=b%10;
output_b(digit[l]);
output_high(pin_b7); //display nokta.
}
if(h==3){
output_low(pin_d2);
output_low(pin_d3);
output_low(pin_d4);
output_high(pin_d5);
output_low(pin_d6);
output_low(pin_d7);
m=b/10;
output_b(digit[m]);
}
if(h==4){
output_low(pin_d2);
output_low(pin_d3);
output_low(pin_d4);
output_low(pin_d5);
output_high(pin_d6);
output_low(pin_d7);
n=c%10;
output_b(digit[n]);
output_high(pin_b7); // display nokta.
}
if(h==5){
output_low(pin_d2);
output_low(pin_d3);
output_low(pin_d4);
output_low(pin_d5);
output_low(pin_d6);
output_high(pin_d7);
p=c/10;
output_b(digit[p]);
}
}
void display_yaz1(){
if(h==0 || h==2 || h==4 || h==6){
output_high(pin_d2);
output_low(pin_d3);
output_low(pin_d4);
output_low(pin_d5);
output_low(pin_d6);
output_low(pin_d7);
t=r%10;
output_b(digit[t]);
}
if(h==1 || h==3 || h==5 || h==7 ){
output_low(pin_d2);
output_high(pin_d3);
output_low(pin_d4);
output_low(pin_d5);
output_low(pin_d6);
output_low(pin_d7);
v=r/10;
output_b(digit[v]);
}
}
void main()
{
setup_timer_2(T2_DIV_BY_4,178,7); //143 us overflow, 1,0 ms interrupt
enable_interrupts(INT_RDA);
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
set_tris_a(0xF0);
output_a(0x00);
set_tris_b(0x00);
output_b(0x00);
set_tris_a(0x00);
output_a(0x00);
set_tris_c(0xFF);
set_tris_e(0xFF);
output_high(pin_c4);
z=read_eeprom(0);
r=read_eeprom(1);
if(z==1){
y=1;}
while(TRUE)
{
if(input(pin_e0)){
z=z+1;
delay_ms(300);
write_eeprom(0,z);
}
if(z==0){
output_low(pin_c4);
display_yaz();
saat();
y=0;
if(e==0){
if(input(pin_c2)){
d=1;
e=1;
}
}
if(f==0){
if(input(pin_c3)){
d=0;
f=1;
}
}
}
if(z==1){
output_high(pin_c4);
if(input(pin_c2)){
y=1;
}
if(y==0){
i=0;
display_yaz1();
if(input(pin_a4)){
delay_ms(300);
r=r+1;
write_eeprom(1,r);
}
if(input(pin_a5)){
delay_ms(300);
r=r-1;
write_eeprom(1,r);
}
if(r==-1){
r=0;
write_eeprom(1,r);
}
}
if(y==1){
display_yaz();
saat();
if(i<5){
i=i+1;
}
if(i==1){
s=0;
}
if(input(pin_c2)){
delay_ms(50);
if(input(pin_c2)){
d=1;
a2=1;
}
if(a2==1){
if(!input(pin_c2)){
delay_ms(50);
if(!input(pin_c2)){
s=s+1;
a2=0;
}
}
}
if(s>=r){
d=0;
output_low(pin_d7);
}
}
}
}
}
}
burada rda kesmesini knorometreyi uzaktan sıfırlamak için kullandım.
while döngüsü içinde menü yapmıştım, 3 butonla 7 segment displayde menü yapmıştım kendimce bişeyler ayarlanıyordu oradan. birde 2 sensör vardı. onlardan gelen verilere göre knorometre başlıyor yada duruyordu. çok takılacak olursan açıklarım.
proteus ;
http://s9.dosya.tc/server2/t9v4hr/cizim.rar.html
bir de açıklayıcı olması için;
timer kesmesi içindeki ilk if koşulu zamanı saymada 2. if koşulu ise 7 segmentlere yazarken tarama yapmada kullanıyordu.
Alıntı yapılan: emalper - 23 Şubat 2017, 01:37:31
Cok memnun olurum tessekurler. Bu arada bende basit bir sayim devresi yazmayi basardim.Timer olmadan ama butonlari eklemeyi ve timer ile nasil eslestirecegim hakkinda en ufak bir fikrim yok. Birde bu devre ileriye dogru gidiyor)) Geriye dogru gidmesi icin herseyi denedim ama her yol devreyi bozdu. Lutfen kodlari inceleyip fikrinizi belirtirmisiniz?
#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000)
int i,k,c;
const int digit[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C, 0x07, 0x7F, 0x6F, 0x77};
void main ()
{
while(1)
{
for(i=0;i<=9;i++)
{
for(k=0;k<=9;k++)
{
for(c=0;c<=9;c++)
{
output_b(digit[i]);
output_d(digit[k]);
output_c(digit[c]);
delay_ms(500);
}
}
}
}
}
ilk olarak for döngüleri ile yaptığınız bu kodda, denetleyici sürekli delay_ms(500) içinde bekler ve pek bir iş yapmaz. bu yüzden mümkün olduğunca delay kullanmaktan kaçın. timer ile yapın. for döngülerinde arttırdığınız sayacı timer içinde arttırın. örneğin ;
void saat()
{
if(g==10){
a=a+1;
g=0;
}
if(a==100){
a=0;
b=b+1;
}
if(b==60){
b=0;
c=c+1;
}
if(c==100){
c=0;
b=0;
a=0;
}
}
timer içinde bir sayacı arttırın daha sonra bu sayaca göre salise saniye dakikayı ayarlarsınız
display taramasını nasıl yaptınız? algoritmasını söyleyebilir misiniz ve kod da tarama işlemi nerede yapılıyor? ben display sürücüsüz 6 tane displayi süremeye çalışıyorum fakat son digit sabit şekilde yanmakta diğerleri yanıp yanıp sönmektedir. bu soruna çözüm arıyorum yardımcı olursanız sevinirim.