Hi-Tech C ile led yakma kapama projesini çalıştıramıyorum.Hatam nerede acaba?

Başlatan ferhatmacin, 09 Şubat 2012, 21:49:43

ferhatmacin

Hi-Tech C  compiler ile    pic programcılığında yapması en kolay proje olan led yakma kapama projemi çalıştıramıyorum.Yani  yazdığım kod çalışıyor ama proteusta bişilerii eksik yapıyorum.Yaptığım bu eksiklik nedeniyle   tüm projelerimde ledlerin hiçbiri yanmıyor.Yardım etmenizi temenni ederim.Hatamı öğrenmek istiyorum.

Buyrun download linki:
http://www.uploadfiles.org/ders6_1    içinde proteus dosyası mevcuttur.

elektronikhobi

Maalesef verdiğin bağlantı indirilmiyor. O yüzden kaynak kodları, devre şemasını buraya yazmak daha mantıklı. Ayrıca kullanılan PIC'nin çeşidi, derlerken verdiği hata mesajları gibi ayrıntılar da tabi..

Bence herşeyden önce tüm ledleri yakan projeyi dene.

https://github.com/erdemoncel/sicaklik/blob/master/test.c
https://github.com/erdemoncel/sicaklik/blob/master/secenek.h

Burada seçenek dosyası kristal osilatör kullanılacak şekilde ayarlı. (FOSC_XT) Sen eğer kristal osilatör değil de örneğin PIC'nin kendi iç osilatörünü kullanıyorsan seçenek bitlerini ona göre ayarlaman gerekiyor.

Eğer bu çalışıyorsa büyük ihtimal gecikme işlevi biraz değişti. __delay_ms(100) şeklinde olacak. Ondan olabilir.
Endonezyalı kardeşlerimiz hakkımızda ne düşünüyor?

" İzlerken duygulandım.

İslam'ın hâlâ güç ve şeref sahibi olduğu Türkiye'nin artık Batı ve SİYONİSTLER tarafından sömürgeleştirildiğini görmek çok üzücü. "


ferhatmacin

  bu proteustaki görünüm.
Bu main dosyasının içinde yazanlar
#include <htc.h>
#include "delay.h" 
void main(void) 
{
TRISB=0x00; 
PORTB=0x00; 
while (1) 
{
RB0=1; 
DelayMs(250);DelayMs(250); 
RB0=0; 
DelayMs(250);DelayMs(250); 
}
}


bu delay.h  dosyası



#ifndef DELAY_ROUTINE //-- Check if already loaded!!!

#define DELAY_ROUTINE //-- MAKE SURE CANNOT RELOAD
#ifndef   XTAL_FREQ
#error NO XTAL_FREQ DEFINED - Is Required for DelayUs!
#define   XTAL_FREQ   8MHZ    /* Crystal frequency in MHz */
#endif

#define   MHZ   *1000    /* number of kHz in a MHz */
#define   KHZ   *1    /* number of kHz in a kHz */

#if   XTAL_FREQ >= 12MHZ
#if XTAL_FREQ >= 20MHZ
void DelayUs(unsigned char x)
{
unsigned char count,_dcnt;
for(count=0;count<x;count++)
{
_dcnt= ((XTAL_FREQ)/(8MHZ)); //-- 1us worth of delay
while(--_dcnt !=0);
}
}
#else
#define   DelayUs(x)   { unsigned char _dcnt; \
_dcnt = (x)*((XTAL_FREQ)/(12MHZ)); \
while(--_dcnt != 0) \
continue; }
#endif
#else

#define   DelayUs(x)   { unsigned char _dcnt; \
_dcnt = (x)/(12MHZ/(XTAL_FREQ))|1; \
while(--_dcnt != 0) \
continue; }
#endif

extern void DelayMs(unsigned char);
#endif

bu da delay.c dosyası
// delay.c
/*
 * Copyright (C) 02/08/2000 Mark Zealey (mark@itsolve.co.uk)
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation; either version 2 of the License, or (at your option)
 * any later
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc., 59
 * Temple Place - Suite 330, Boston, MA 02111-1307,
 *
 * This file was added to the ZealOS project on 02/08/2000 at 12:01:12 by Mark
 * Zealey
 */

/* Notes/Changes:
 * OK, the way we calibrate the delay loop is like this:
 * 1) Find a rough value
 * 2) go back down that xor'ing a mask to get the presice value
 * Simple eh?
 * This is quite like how linux does it except it's a bit shorter and a bit
 * quicker.
 *
 * Step 1:
 *	We set an initial delay (of 1) to caliberate with. This then
 *	gets shifted up each time, till the loop is slower than 1000 Hz. It then
 *	shifts it back one.
 * Step 2:
 *	A mask is applied (1 bit) and is rippled up till it's faster than 1000Hz
 *	as before, it's then shifted right by 1 and perminantly applied.
 *	
 */

#include <common.h>
#include <desc.h>
#include <irq.h>
#include <printk.h>
#include <stdio.h>
#include <pit.h>
#include <cpu.h>

IMPORT_SYMBOL(printk);
IMPORT_SYMBOL(pitSet);
IMPORT_SYMBOL(addHandler);
IMPORT_SYMBOL(delHandler);

void usleep(ulong);
void sleep(ulong);

volatile char tick = 0;
/* If we're on a 586 or greater (w/ RDTSC), the following value is in cycles per
 * second. Otherwise, we just calibrate to the milisecond */
ulong loopsPerMs = 1;

/* Ugly kludge for a Us delay on non-RDTSC processors */
#if !(defined(__i386__) && (PROCESSOR >= 5))
ulong loopsPerUs;
#endif

signalHnd(__preInitFunc delayISR)
{
	tick++;
}

/* function: initFunc delayInit()
 * type: Init
 * description: This calibrates the delay for use in sleep() and usleep()
 */
initFunc __preInitFunc delayInit()
{
	ulong mask;
#if !(defined(__i386__) && (PROCESSOR >= 5))
	__uint8 count = 32;
#endif
	printk("Calibrating delay loop: ");

	// Set the PIT to 1000 interrupts a second.
	pitSet(1000, 0);
	// We add a handler to IRQ 0 (PIT).
	addHandler(0, delayISR, 1, NULL);

	do {
#if !(defined(__i386__) && (PROCESSOR >= 5))
		if(!--count)			// If we're about to overflow
			break;
#endif
		loopsPerMs <<= 1;		// * 2
		tick = 0;
		while(!tick) /* Wait */;	// Wait for the next tick
		sleep(1);			// (tick==1)
	} while(tick == 1);

#if !(defined(__i386__) && (PROCESSOR >= 5))
	if(!count) {
		printk("Your processor is just too fast (and too old) :/\n");
		return EPROC;
	}
#endif
	loopsPerMs >>= 1;			// back 1
	mask = loopsPerMs;			// set the mask to us

	while(mask) {				// do fine calibration
		mask >>= 1;			// move the mask bit
		loopsPerMs |= mask;		// Apply the mask
		tick = 0;
		while(!tick) /* Wait */;
		sleep(1);			// (tick now = 1)
		if(tick != 1)			// If a tick has passed
			loopsPerMs ^= mask;	// remove it
	}
#if !(defined(__i386__) && (PROCESSOR >= 5))
	loopsPerUs = loopsPerMs / 1000;		// Ugly hack :/
#endif
	delHandler(0, delayISR);
	pitSet(Hz, 0);				// Reset the Pic

	printk("Done! :)\n");
#ifdef DEBUG_DELAY
	DPRINT("Now delaying 10 seconds to varify that the value is correct\n");
	sleep(10000);
	DPRINT("10 Secs is up. Let's get on wit it! :)\n");	// Test :)
#endif
	return SUCCESS;
}

#if defined(__i386__) && (PROCESSOR >= 5)
// delays for 1Us (shamlessly borrowed from linux ;)
void __1sleepRdtsc()
{
	__uint32 a, b, c;		// a is not actually used
	rdtsc(a,b);
	do {
		rdtsc(a,c);
	} while((c-b) < loopsPerMs);	// Really Us
}

/* function: void usleep(ulong us)
 * type: Global
 * description: Sleeps for 'us' millionths of a second. See also sleep()
 */
void usleep(ulong us)
{
	for(;us;us--)
		__1sleepRdtsc();
}

/* function: void sleep(ulong ms)
 * type: Global
 * description: Sleeps for 'ms' thousandths of a second. See also usleep()
 */
void sleep(ulong ms)
{
	for(;ms;ms--)
		usleep(1000);
}
#else
// delays for x ms
void sleep(ulong ms)
{
	ulong t;
	for(;ms;ms--)
		for(t=loopsPerMs;t;t--)
			/* Wait */;
}

// delays for x us
void usleep(ulong us)
{
	ulong t;
	for(;us;us--)
		for(t=loopsPerUs;t;t--)
			/* Wait */;
}
#endif

EXPORT_SYMBOL(usleep);
EXPORT_SYMBOL(sleep);

// END


Buyurun dosyaları paylaştım başka paylaşmam gereken bişi varsa on da ekleyebilirim.

elektronikhobi

Programda bir hata yok. Ancak seçenek bitlerinde bir problem olabilir.



Bu fotoğrafın üzerine tıklarsan orada bir not yazdım. Şekildeki gibi (ama tabi PIC16F877A için 13 ve 14. uçlara takılacak) 2 tane kondansatör ve kristal takıp denermisin.

Ondan sonra seçenek bitlerini de

https://github.com/erdemoncel/sicaklik/blob/master/secenek.h

dosyada olduğu gibi ayarla. Yani yeni bir dosya oluştur. İsmine secenek.h olarak kaydet. Sonra ana programında #include "delay.h" ın hemen altına #include "secenek.h" diye bir bölüm ekle. Böylece bizim belirlediğimiz seçenek seçme bitlerini kullanacak.

Çalışması lazım  ;)

Endonezyalı kardeşlerimiz hakkımızda ne düşünüyor?

" İzlerken duygulandım.

İslam'ın hâlâ güç ve şeref sahibi olduğu Türkiye'nin artık Batı ve SİYONİSTLER tarafından sömürgeleştirildiğini görmek çok üzücü. "


ferhatmacin

Usta ben bu işe yeni başladım =)  Yani yazdığın şeyi anladım ama temelden girmek istedim yukardaki  projemi göstererek. O projede nereyi düzeltmem gerekiyor ki   çalışsın ?

elektronikhobi

Alıntı yapılan: ferhatmacin - 10 Şubat 2012, 00:56:33
O projede nereyi düzeltmem gerekiyor ki   çalışsın ?

Daha açık nasıl anlatabilirim bilmiyorum  ::) 13 ve 14. uçlara 2 tane 22pF kondansatör ve 4 Mhz kristal bağla. (Bunlar yukarıda verdiğim resimin üzerine tıklarsan gelen bağlantıda not olarak yazıyor)

İkincisi seçenek bitlerini değiştir. Verdiğim bağlantıdaki gibi o dosyanın aynısını secenek.h olarak kaydet. Sonra ana programına ekle.

Burada ne yaptığımıza gelince PIC'ye gelen saat pulsunun ne tür olduğu gibi çeşitli ayarları yapıyoruz. Örneğin XT("Crystal") osilatör denince kristal osilatör (bizim yukarıdaki 13. ve 14. uçlara takdığımız türde kullandığımızı belirtiyoruz.  Ya da başka seçenekler işte kodumda kod koruması istiyorum mu vs..

Bir de tam olarak hata mesajını yazarsan sorunun nereden kaynaklandığı daha iyi anlaşılır. Ama bunları yaptıktan sonra çalışması lazım.
Endonezyalı kardeşlerimiz hakkımızda ne düşünüyor?

" İzlerken duygulandım.

İslam'ın hâlâ güç ve şeref sahibi olduğu Türkiye'nin artık Batı ve SİYONİSTLER tarafından sömürgeleştirildiğini görmek çok üzücü. "


elektronikhobi

Bir de şemadan görülmüyor ama VDD yazan uçlar 5V'a VSS yazan uçlar toprağa bağlı olacak. Yani 16F877A için 11 ve 32 nolu uçlar 5V, 12 ve 32 nolu uçlar toprağa bağlanıyor.
Endonezyalı kardeşlerimiz hakkımızda ne düşünüyor?

" İzlerken duygulandım.

İslam'ın hâlâ güç ve şeref sahibi olduğu Türkiye'nin artık Batı ve SİYONİSTLER tarafından sömürgeleştirildiğini görmek çok üzücü. "


ferhatmacin

http://e1202.hizliresim.com/u/b/2l6l9.png

Az önce tam resim gözükmüyordu galiba.    Bu resimdeki gibi olan projeden bahsediyorum  yani  farklı  elemanlar eklemeden

elektronikhobi

Evet ama gönderdiğin resimde bahsettiğim toprak ve 5V uçları yok  :D

Tam olarak devre şeması şu şekilde olacak.



Tabi burada bu kadar çok led takmayabilirsin..
Endonezyalı kardeşlerimiz hakkımızda ne düşünüyor?

" İzlerken duygulandım.

İslam'ın hâlâ güç ve şeref sahibi olduğu Türkiye'nin artık Batı ve SİYONİSTLER tarafından sömürgeleştirildiğini görmek çok üzücü. "


MrDarK

elektronikhobi; arkadaş sadece proteusta deneme yapmak istiyor, proteusta gerçekleştirememiş işi ona yanıyor :)

Bu arada programında son yazdığın include çağırmasının altına şunu ekle
yani #include "delay.h" altına
__CONFIG (UNPROTECT & WDTDIS & HS & LVPDIS & PWRTDIS & BORDIS);  // Konfigürasyon verileri yüklendi
Picproje Eğitim Gönüllüleri ~ MrDarK

ferhatmacin


MrDarK

Ehehe (: olur böyle durumlar. Yeni başlıyosun demek hocam derdi ledi yakan moturuda döndürür displayde saydırır herşeyi yapar. İlk adımı attın mikrodenetleyicilere hayırlı olsun. Çalıştı dimi ayarları verince :)

Bu arada o __CONFIG ayarlarında yazan HS ibaresi kristal değerine göre değişiyor. Eğer takacağın kristal 8MHZ'den küçük ise XT yazacaksın, 8MHZ veya üstü ise HS yazacaksın.

Ayrıca Hi-tech C ile yazılım hayatına giriş yapman en güzeli (:
Picproje Eğitim Gönüllüleri ~ MrDarK

ferhatmacin

Dediklerinizi yaptım gene yemedi :D  o dediğiniz ifadeyi delay.h ın aşağısına ekledim. :D

arslan74

Alıntı yapılan: ferhatmacin - 10 Şubat 2012, 11:48:42
Dediklerinizi yaptım gene yemedi :D  o dediğiniz ifadeyi delay.h ın aşağısına ekledim. :D

Eğitim dokümanı hazırlamıştım. Onları okuyup denediniz mi? Yazdıklarımı yaparsanız problem yaşamassınız.

Linkleri:

Hi-Tech PICC Eğitim dökümanı

1) https://www.picproje.org/index.php/topic,19127.msg127454.html#msg127454

2) Hi-Tech PICC Eğitim Dökümanı Bölüm3
https://www.picproje.org/index.php/topic,19152.msg127650.html#msg127650

3) Hi-Tech PICC Eğitim Dökümanı Bölüm4
https://www.picproje.org/index.php/topic,19169.msg127792.html#msg127792

4) Hi-Tech PICC Eğitim Dökümanı Bölüm5
https://www.picproje.org/index.php/topic,19170.msg127793.html#msg127793

Arama:
https://www.picproje.org/index.php?action=search2

Kolay gelsin.