Hoi,

Ik kom hier ff niet uit. Ik heb een interrupt op mijn PIC 16F628 op Timer0. Zonder prescaler. Ik wil hem elke seconde iets laten doen. Dus ik doe 1000000(4MHz)/256 = 3906 Ik verhoog dus telkens een timer tot deze 3900 is en dan komt de rest van de code. Maar het gaat veel te snel. Doe ik wat fout?

void interrupt interrupt_handler()
{
	DI();
	
	if(T0IF)
	{
		timer++;
		
		if(timer == 3900) // seconde
		{
			timer = 0;
			
			Seconds++;
			if(Seconds == 60)
			{
				Seconds = 0;
				Minutes++;
			}
			if(Minutes == 60)
			{
				Minutes = 0;
				Hours++;
			}
			if(Hours == 24)
				Hours = 0;
				
			send_time(Hours, Minutes, Seconds);
		}
	}
	
	EI();
}

Wat onmiddelijk opvalt is dat er een functie (send_time) aangeroepen wordt in een ISR, meestal lopen die ISR'en dan in het honderd.

Werden die variabelen goed gedefinieerd en op NUL gezet bij de start.

Maar over de PIC registers kan ik niet meepraten

Timer is toch wel gedefiniëerd als een 16 (of meer) bits getal ?

Op 30 december 2004 17:33:04 schreef MGP:
Wat onmiddelijk opvalt is dat er een functie (send_time) aangeroepen wordt in een ISR, meestal lopen die ISR'en dan in het honderd.

Werden die variabelen goed gedefinieerd en op NUL gezet bij de start.

Maar over de PIC registers kan ik niet meepraten

Een tijdje terug werkte het nog, maar toen heb ik de snelheid aangepast vanwege een test, maar ik kan de oude waarde niet meer terug vinden... De variabele timer is een integer (16 bits). Op nul zetten lijkt mij niet nodig, want zodra hij een keer 3900 is geworden zet de ISR hem op 0.

Hoe snel telt hij te snel ?

Geeft hij na 1 echte seconde al 3 uur aan ofzo ?

1seconde duurt bij hem 0,9984 seconde
1uS*256*3900=0,9984sec

Op 30 december 2004 19:14:56 schreef k.p.meinesz:
1seconde duurt bij hem 0,9984 seconde
1uS*256*3900=0,9984sec

als dat nou zo was, vond ik het niet erg. Dit met die interrupts is gewoon voorlopig als test, ik ga met de 50Hz van het net werken. Het is zo erg dat als ik naar de 10-tal secondes kijk, deze iets sneller gaan als secondes! Bij de secondes (die van 0 tot 9 gaan) gaat het dus zo snel dat ik de digits nog een beetje zie flikkeren. Dat terwijl hij het eerst wel heeft gedaan....

hmm als je nu zorgt dat je op 1 of andere manier een normaal deelbaar getal krijgt
dus bijv 10 ms ofzow of 25 of iets in die grote
dan kun je in je interrupt een teller laten meelopen

Op 30 december 2004 19:53:37 schreef High met Henk:
hmm als je nu zorgt dat je op 1 of andere manier een normaal deelbaar getal krijgt
dus bijv 10 ms ofzow of 25 of iets in die grote
dan kun je in je interrupt een teller laten meelopen

Huh? Ik vat dit even niet :S De fout moet toch ergens zitten, want eerst deed hij het gewoon...

sorry, je hebt iets wat dus al gewerkt heeft, ik d8 dat je niet op 60 minuten eheel uitkwam, mijn blunder sorry, weinig ervaring met PIC's en interrupts :)

Ik kan het mis hebben, maar volgens mij reset je de interrupt vlag van de timer niet, met als gevolg dat hij blijft interrupten.

1 - 0 voor ATMEL; die reset deze als de interrupt routine uitgevoerd is :)

Op 30 december 2004 21:28:43 schreef Fuzzbass:
Ik kan het mis hebben, maar volgens mij reset je de interrupt vlag van de timer niet, met als gevolg dat hij blijft interrupten.

Das een hele sterke :) Bedankt! Ga kijken of het helpt