16F690 for do 40000 cyklů

Zdravím,
chtěl bych udělat cyklus

for(i=0;i<40000;i++) { }
Ovšem co jsem pochopil, tak to může počítat pouze do 256, šlo by to to nějak udělat? Díky
Napadlo mě udělat víc vnořených for.

Záleží na deklaraci proměnné i. Když bude “unsigned short i”, tak můžeš počítat do 65535. Překladač použije dva 8bitové registry jako jednu 16bitovou proměnnou.

Jde mi o to, že mám ultrazvukový snímač vzdálenosti HC-SR04, na ten přivedu 10us impuls a pak čekám na náběznou hranu, od které měřím čas až po sestupnou. Ale furt mi to hází třeba záporné hodnoty. Vím, že použití __delay_us() není ideální, ale jde mi o to to vyzkoušet a pak to udělat třeba s přerušením. Nějak mi to nefunguje tak jak bych si představoval.

[code]#include “htc.h”
#include <stdio.h>
#include “lcd.h”
#define _XTAL_FREQ 4000000

void main (void)
{
TRISA = 0b00000100;
TRISB = 0b00000000;
TRISC = 0b00000000;

ANSEL = 0b00000000;

char text[20];
int j,time,pom;
unsigned short i;

lcd_init();
lcd_clear();


pom = 1;

while(1)
{
	while(pom)
	{
		RA4 = 0;
		__delay_ms(100);
		RA4 = 1;
		__delay_us(10);
		RA4 = 0;
		pom = 0;
	}
	
	if(RA2 == 1)
	{	

		for(i=0;i<65500;i++)
		{
			__delay_us(1);
			time = i;
			if(RA2 == 0)
			break;
		}
	
		sprintf(text,"Time:  %d us        ",time);
		lcd_goto(0);
		lcd_puts(text);
		time = 0;
		pom = 1;
	}
}

}[/code]

Nevím jaký rozměr má tady číslo typu “int”. Kdyby bylo např. signed short, tak se uložením “i” to “time” zobrazí velké číslo jako záporné. Je-li int jen 8bitový, tak se dokonce oříznou bity. Takže - mělo by pomoct změnit parametr %d na %u (ve funkci sprintf) a ještě asi bude potřeba deklarovat “time” také jako “unsigned short”.

A dále - ve smyčce sice měříš čas s __delay_us(1), ale to Ti není moc platné, protože prováděcí čas jednoho průchodu smyčkou není zanedbatelný - může být jednotky až desítky us. Pokud chceš zvýšit touto metodou měření času, tak buď použij delší čas jednoho kroku (aby se doba smyčky tak moc neprojevila), nebo si ocejchuj smyčku - tj. např. blikej LED s časováním s touto smyčkou, podle intervalu blikání vypočítáš dobu jednoho průchodu smyčkou a o ten čas pak můžeš zkorigovat čekací prodlevu.

Děkuji, ale furt je to nějáký divný. Asi to musím udělat přes to přerušení. Jsem čekal, že to bude nepřesný, ale že až tak, to jsem fakt nečekal :slight_smile:

Udělej si nejdříve zkoušku, zda zobrazuješ správné číslo - tj. nastav do té proměnné “time” určitou konstantu větší než 32767 a ověř zda se správně zobrazí.

Pokud mám proměnnou int a ve sprintf %u tak můžu zobrazit nějákých 65000. a když dám proměnnou unsigned short tak to samé

Jenom k těm datovým typům:

Všechny překladače pro osmibity - aspoň ty se kterými jsem se setkal mají typ int jako 16ti bitový. Velikosti ty pů se vždycky dají najít v nějakém guide, nebo helpu příslušného compilleru. Pro HI-TECH je to třeba tady.
Tvůj problém může být taky v tom, že přiřazuješ různé datové typy

[code]int j,time,pom;
unsigned short i;

time = i; // tedy int= unsigned short

[/code]

a i když mají stejnou velikost - nemusí být stejné. V tabulce z odkazu se totiž vyskytuje pouze typ unsigned int a signed int - stejně jako ostatní typy (char atd…) což většinou znamená to, že si někde v nastavení projektu můžeš nastavit jestli zkrácený zápis int bude signed, nebo unsigned .

Takže v tvém případě buď přetypuj: time = (int)i;

nebo deklaruj všechny proměnné stejně : unsigned short i,j,time,pom;

tak zkus třeba %i, nebo %d

to ze ti to hazi zaporny hodnoty je problem v datovem typu, jak uz bylo receno,
zalezi na prekladaci ale vetsinou,
char,int,short… je znamenkovej typ,polovicni rozsah, unsigned char,unsigned int,unsigned short… neznamenkovy, v helpu je to Basic Data Types ,

proc to neudelas pres casovac ? output_high(TRIG); delay_us(11); output_low(TRIG); while(!INPUT(ECHO)); set_timer3(0); CLEAR_INTERRUPT(INT_TIMER3); while(INPUT(ECHO) && !TMR3IF); if(!TMR3IF){ a=get_timer3(); a=(a/58); output_high(PIN_A1); nokia_gotoxy(0,2); printf(nokia_printchar,"%Lu cm ",a); output_low(PIN_A1);}

Časovač mě nenapadl, ale asi bude nejelegantnější. Díky