Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

HI-TECH DONGU SORUNU??

Başlatan neotr, 08 Ekim 2008, 10:00:47

neotr

Merhaba arkadaşlar elimde bir deneme kiti vardı ve bu kiti test etmek i.in ufak bir 0-F sayıcı yaptım kendimce fakat bu programı derleyıp yukledıgımde benı sasırtan bır sonuc cıktı..

#include "htc.h"
#include "pic.h"
#include "delay.h"

 const int digit[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C,
					0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 
					0x79, 0x71};



void main(void)
{
	unsigned char i;
	TRISD=0x00;
	TRISB=0x00;
	PORTB=0x01;
	PORTD=0x00;
	while(1)
	{	
	   i=0;
		do{
			PORTD=digit[i];
			DelayMs(1000);
			i++;
		}while(i<16);	
				
			
		
	}
}


kod bu fakat her defasınsda i 0 dan baslarsa 7 ye kadar cıkıyor mesela i=4 yapsam gene 4 un 8 fazlasını sayıyor...bunu for(;;) dongusuyle yapsamda aynı sonucu alıyorum..burda HI-TECH te yapmam gereken bır ayar vardır dıye dusunuyorum yorumlarınızı beklıyorum...

Gurkan-Demirbas

Hocam,
Hiç emin olmamakla bereber !.......

const int digit[16]

yerine
const unsigned char digit[16]

şeklinde tanımlasan olmaz mı acaba?
int 16 bitlik bir sayıyı tanımlar çünkü

GürkaN

neotr

gürkanc söylediğin dogru fakat ben dizideki her bir değere int desemde bu
int 0x3F olsun derleyıcı bunu su sekılde yorumlar 0000 0000 0011 1111
ve PORTD 8 bitlik bir regidterdir RAM haritasında Ben PORTD ye bu sayıyı atadıgımda 0011 1111 seklinde görcektir;) umarım anlamışsındır ben derleyıcı ayarlarından olabılecegını dusunuyorum cunku bu derleyıcıde printf floatı falan ayarlarını yapmazsan basmıyor... senın dedıgınde o kadar cebelleştımkı senın dedıgını bende denedım ama baya bı umutsuz denedım ve bekledıgım sonuc yukarda acıkladıgım sonuctu sadece ne olur ne olmaz la denedım yanı sorun başka bır sorun ama hala bulamadım....

arslan74

Merhaba,

Sen DelayMs()  fonksiyonunu hazır fonksiyonlardanmı aldım. Evet öyle ise DelayMs unsigned char değişken aliyor. Bu durumda unsigned char 'a 1000 atadığında taşma olur. Hata vermez ama derleyici sana bir uyarı vermesi gerekir. Sayma işemi cok hızlı olduğu için, geçişleri düzgün göremessin.

Sana örnek bir delay kod gönderiyorum. 4mhz kristal için hazırlanmıştır.

void
delay_ms(unsigned char cnt){

	unsigned char c2,c3;

	while (cnt--){
		c2 = 10;
		while (c2--){
			NOP();
			NOP();
			NOP();
			c3 = 14;
			while(--c3)
			;
		}
	}


}

void 
delay_1s(void){
	
	delay_ms(200);
	delay_ms(200);
	delay_ms(200);
	delay_ms(200);
	delay_ms(200);	//
	
	delay_ms(200);
	delay_ms(200);
	
}

void delay_s(unsigned char d){
	
	while (d--)
	delay_1s();	
	
}


Bunu kullanırsan düzgün çalışır.

Ayrıca Gurkan-Demirbas ın uyarısnı dikkate al. sonucta bu 8bit işlemci. char kullanabileceğin bir yerde int veya daha yüksek değişken kullanma. Performansı doğrudan etkiler, ayrıca çalışma acısından char işlemleri daha güvenilir kodlar üretir.

Selamlar,

Gurkan-Demirbas

Evet hocam haklısın;
Üstadım senin programını derledim ve isis'de simüle ettim; hiç bir problem yaratmadan istediğin gibi sorunsuz çalışıyor.
işlemcini bilemiyorum ama ben 16F628A olarak derledim. Eğer simülasyonda çalışıyorsa, programda birşey yok demektir.
Configürasyon ayarlarından kaynaklanıyor ola bilirmi acaba? nebilim WDT off yapmak çözüm olabilir mi acaba?



neotr

Yani gürkan senin dediğin gibi bende simülasyonunuda yapıyorum simülasyonda tüm aralık sayılıyor.. fakat donanıma geçince çalışmıyor,
yüksek bir ihtimalle bir ayarı vardır diye dusunuyorum cunku sımulasyonada aynı hex donanımada aynı hex atıyorum donanımda hata yok bundan kesın emınım cunku tum degerlerı tek tek dizi sayesınde bastım porta ve farklı bır derleyıcıde aynı programı derledım onda calıstı...

@aslan74 üstat dedıgınde haklısın int yerıne char 8 bitlik işlemcilerde char kullanılması avantajdır hele bitsel işlemlerde dahada gereklıdır ama burdakı kullanımda ben sonucu degıstırmeycegınden bahsettım o acıdan yaklastım sonuca benım kullandıgım Delay_Ms hazır fonksıyon evet dedıgın gıbı 1000 yazınca tam 1 sn vermıyor bu uyarın ıcın teşekkürler HI-TECH e yenı yenı alısmaya calısıyorum bende uuzn zmandır CCS de calıstım fakat artık sıktı ...

Gurkan-Demirbas

işlemcin nedir?
Configürasyon ayarlarını tekrar kontrol etmek lazım. WDT off'mu?

GürkaN

neotr

işlemci 16f877 WDT default olarak kapalı olabılır dıye dusundum ama emın degılım bundan mantıklı bır yaklasım WDT off oldugunndan emın bır sekılde aksam Tekrar test edıcem su anda işte oldugumdan ötürü...

Gurkan-Demirbas

Eğer işlemcin erase edilmişse 3FFFh'dir yani WDT enable'dır.
problemin buradan kaynaklanacağından da emin değilim ama, çünkü simülasyonda da çalışmazdı.

GürkaN


neotr

Evet Gürkan Watchdog Timer default olarak ENABLE mıs onu Disable olarak yapınca bir sorun kalmadı... sağol fikrin için..İşte buda bu işin cilvesi olsa gerek ne uzun programlarda WDT ı dıkkate alıyoruz boyle basıt programlarda unutunca basımıza ne işler açıyor:)

NOT: Burdan simülasyonlara her zman güvenmememiz gerektiği tekrar ortaya cıktı bir WDT ı bile dikkate almadıkları ortada..