Hur nollställer man Timer på Atmega168(assembler)?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Glattnos
Inlägg: 3106
Blev medlem: 29 oktober 2009, 20:01:18

Hur nollställer man Timer på Atmega168(assembler)?

Inlägg av Glattnos »

Jag försöker nollställa Timer1 i rutinen "INT1_slut". Den nollställs i AVR Studio men när jag kör det i Atmegan så nollställs den inte. Jag har testat att skriva på olika sätt som alla har fungerat i simuleringen men inte på hårdvaran.
Vad är det för fel?
Måste jag göra något mer än att ladda TCNT1 med noll?

Kod: Markera allt

;===========================================================================================
;	AVBROTTSRUTIN EXT_INT0	-	Avbrottsrutin INT0, Inträffar en gång per varv på trumman
;===========================================================================================
Varv_INT0:
	INTERRUPT					;Börja avbrottsrutinen med MACRO INTERRUPT

	sbrc	flagga, 2			;Kolla om flagga3 är nollställd...
	rjmp	INT0_slut			;...om inte så har Timer1 slagit runt och ingen uppdatering...
								;...av tid ska göras

	ldsw	Z, Tid_nu			;Lägg Tid_nu(som vid detta tillfälle är förra tiden)...
	stsw	Tid_nyss, Z			;...i Tid_nyss

	ldsw	Z, TCNT1			;Spara aktuellt varvs tid i Z och...
	stsw	Tid_nu, Z			;...ladda Tid_nu med Z

	sbr		flagga, 0b00000001	;Flagga1 för att tala om att ny tid finns för beräkning

INT0_slut:
	clr		ZL					;Nollställ Z...
	clr		ZH					
	sts		TCNT1L, ZL			;...och flytta till TCNT1 för att nollställa Timer1
	sts		TCNT1H, ZH
	cbr		flagga, 0b00000100
	INTERRUPT_END				;Avsluta avbrottsrutinen med MACRO INTERRUPT_END
Glattnos
Inlägg: 3106
Blev medlem: 29 oktober 2009, 20:01:18

Re: Hur nollställer man Timer på Atmega168(assembler)?

Inlägg av Glattnos »

Jag ser nu att det bara är TCNT1L som nollställs, TCNT1H nollställs inte. Men i AVR Studio nollställs båda och jag kan inte hitta orsaken till att det inte gör det när jag kör det i prosessorn.

Några förslag?
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Hur nollställer man Timer på Atmega168(assembler)?

Inlägg av Swech »

Du skriver till TCNT1L och 1H i fel ordning.
Det finns ett temporärt register inbyggt i processorn som används då 16 bits timers
skrivs till... så man måste skriva i rätt ordning.
Läs på i databladet

Dina macro saknas och kan inte kontrolleras om de är korrekta

Swech
Glattnos
Inlägg: 3106
Blev medlem: 29 oktober 2009, 20:01:18

Re: Hur nollställer man Timer på Atmega168(assembler)?

Inlägg av Glattnos »

Swech: Jag kom precis på det efter en hel del testande. Tackar för svaret!

Detta funkar:

Kod: Markera allt

INT1_slut:
	clr		temp					;Nollställ...
	sts		0x85, temp			;...och flytta till TCNT1 för att nollställa Timer1
	clr		temp
	sts		0x84, temp
	cbr		flagga, 0b00000100
	INTERRUPT_END				;Avsluta avbrottsrutinen med MACRO INTERRUPT_END
Måste alltså nollställa TCNT1H först och TCNT1L sist. Finns fler sätt att skriva på, TCNT1H och TCNT1L är bättre än 0x85 och 0x84.
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Hur nollställer man Timer på Atmega168(assembler)?

Inlägg av Swech »

Kod: Markera allt

sbrc   flagga, 2         ;Kolla om flagga3 är nollställd...
.
.
.
cbr     flagga, 0b00000100
Det borde vara straffbart att skriva så :D
Nejdå skämt å sido men det är väldigt svårläst och blir väldigt lätt buggar.

Kod: Markera allt

.EQU   ZERO_FLAG  = 2
sbrc   flagga, ZERO_FLAG         ;Kolla om flagga3 är nollställd...
.
.
.
.
cbr     flagga, 1 << ZERO_FLAG
Om du jämför detta så i det nedre exemplet så plötsligt behöver man inte
fundera så mycket på varför det står en 2a eller 00000100 utan det blir
ganska självklart.
Samt som bonus.... om du istället vill att bit 5 skall vara flaggbit så ändrar du
bara på 1 rad, EQU raden....

Swech
Glattnos
Inlägg: 3106
Blev medlem: 29 oktober 2009, 20:01:18

Re: Hur nollställer man Timer på Atmega168(assembler)?

Inlägg av Glattnos »

Jaha, när man inte kommenterar koden så får man smisk :shock: och när man kommenterar så får man smisk i alla fall för att man kommenterar fel. :oops:

Haha, nämen tack för tipset. Det blir nog lättare att förstå om man skriver så. :D
I detta fallet är "flagga" ett register där de tre lägsta bitarna är flaggor.

Men egentligen så är ju kommentaren helt riktigt och jag tänkte inte ens på att det såg konstigt ut :humm:
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Hur nollställer man Timer på Atmega168(assembler)?

Inlägg av Swech »

Allt för att underlätta då du kommer tillbaks till dina program om en vecka,
en månad eller nästa år
och sitter :humm: och funderar vad tusan är flagga nr 3 istället för klartext ;)
Idag minns du flagga nr3, kanske i morgon. därefter... borta.

Swech, som lägger smiskpiskan på hyllan för i kväll ;)
Skriv svar