är jag bara korkad eller dålig på asm?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Detraw
Inlägg: 630
Blev medlem: 31 januari 2004, 10:32:37
Ort: Stockholm (Nacka)

är jag bara korkad eller dålig på asm?

Inlägg av Detraw »

halloj... Jag håller på att lära mig assambler och har just kommit till timers, jag lyckades programmera Timer1 på en mega16 så att den med någolunda precision kunde räkna upp med hjälp av en LCD sekunder.

Nu är det så att jag vill med hjälp av en knapp kunna starta och stoppa Timer1.

Detta är den kode jag använder för det:

Kod: Markera allt

;temp är register R16
;PINbuttonport är I/O port PA
;cmdStartStop = 2

loop:
	in	temp, PINbuttonport

	sbrs	temp, cmdStartStop
	rcall	startStopPressed

	rjmp	loop

startStopPressed:
	in		temp, TCCR1B
	ldi		temp_1, 0x05
	;sbrs	temp, 0				;skip if bit is set
	cpse	temp, temp_1		;compare, skip if equal
	rjmp	startT1

	rcall	stopTimer1
	rjmp	SP1
	
startT1:
	rcall	startTimer1
SP1:
	in		temp, PINbuttonport
	sbrs	temp, cmdStartStop
	jmp		SP1

	ret

startTimer1:
	cli
	ldi		temp, 0xE1			;initiera Timer/Coutner1
	out 	TCNT1H, temp
	ldi		temp, 0x7B
	out		TCNT1L, temp

	ldi		temp, 0b00000101	;internal clock source with presacaler 1024
	out		TCCR1B, temp

	ldi		temp, 0b00000100	;enable timer/counter1 owerflow interupt
	out		TIMSK, temp
	sei

	ret

stopTimer1:
	cli
	clr		temp			;initiera Timer/Coutner1
	out 	TCNT1H, temp
	out		TCNT1L, temp

	out		TCCR1B, temp
	sei

	ret
Det finns antagligen ett sätt att lösa det på som är mycket bättre än mitt, tipsa mig gärna om förbättringar...

Grejjen med det hela är att den buggar rätt mycket, t ex så går det att stoppa timern på första försöket första gången (timer aktiveras i början av programmet) men sen när man ska starta den igen så starta den ibland, och ibland måste man trycka på knappen ett par gånger, eller hålla in den för att det ska funka... vad kan detta bero på??

Tack på förhand, Daniel

PS. ni får säga till om ni tröttnar på mina dumma(?) frågor DS.
Användarvisningsbild
Hedis
Inlägg: 2488
Blev medlem: 8 december 2003, 15:10:44
Ort: Vänersborg
Kontakt:

Inlägg av Hedis »

Utan att ha kollat igenom koden så:
Har du samma knapp för både start och stopp?
Det kan ju vara så att den hinner stoppa timern och kommer till punkten där den kollar knappen igen innan du har hunnit släppa den, vilken resulterar i att den stannar den igen.

Så prova att köra med 2 separata knappar om du inte har det redan.

Känns som om jag oxå skall lära mig timer´s snart :)

Fipplade igång RS232 kommunikation nu i helgen med en Mega32:a. Det var ett ganska roligt projekt :)
Detraw
Inlägg: 630
Blev medlem: 31 januari 2004, 10:32:37
Ort: Stockholm (Nacka)

Inlägg av Detraw »

Jo jag har samma knapp för både start och stopp, tänkte på det problemet du sa, det är därför jag väntar med att fortsätta körningen tills man har släppt knappen.... kanske är den kod biten som inte funkar riktigt.. :?:

Vad är RS232 komminikation för nått? har hört talas om det, men aldrig riktigt hajjat vad det är..
Användarvisningsbild
Hedis
Inlägg: 2488
Blev medlem: 8 december 2003, 15:10:44
Ort: Vänersborg
Kontakt:

Inlägg av Hedis »

RS232 är den seriella kommunikationen man har till serieporten på datorerna.

Så jag kan skicka data mellan Mega32:an och datorn. Nu har jag bara lekt o skickat det till hyperterminalen i windows. Man kan ju även skicka data ifrån datorn till avr:en.

Så att tex. logga lästa värden på datorn blir en möjlighet.
Styra mikrodatorn mm.

Möjligheterna är oändliga.
Detraw
Inlägg: 630
Blev medlem: 31 januari 2004, 10:32:37
Ort: Stockholm (Nacka)

Inlägg av Detraw »

just det, det va därför jag kände igen namnet... hmm det kanske man ska och kolla på efter jag har fått igång det här med timern, det vet man aldrig
Användarvisningsbild
Hedis
Inlägg: 2488
Blev medlem: 8 december 2003, 15:10:44
Ort: Vänersborg
Kontakt:

Inlägg av Hedis »

Vad använder du för processor?
Michel
Inlägg: 436
Blev medlem: 3 februari 2004, 18:08:04
Ort: Stockholm

Inlägg av Michel »

Tänk på att knappar kan 'studsa' upp till 20uS.
Lägg t.ex. kanske in en loop (fördröjning) innan du accepterar ett 'nytt läge'.

Läs av knappen.
Om knappen är nere - ev. liten paus - läs av knappen igen.
Om båda läsningarna gav samma resultat - sätt status.
Liten fördröjning.
Läs av knappen
Om knappen är uppe - ev. liten paus - läs av knappen igen.
Om båda läsningarna gav samma resultat - sätt status.
Liten fördröjning.

Ingen optimal metod kanske, men....

Själv skulle jag nog sätta en konding och pullup på switchens ledning (om switchen jordar) för att studsa av den - d.v.s. ett RC filter.


Ironiskt nog är det normalt Timern man använder för att avstudsa knappar
:oops:
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Nu är inte asm min starka sida. Men hur som helst måste du ha något form av avstudning. Precis när du trycker ner din tryckknapp så blir det alltid lite "studs" fram och tillbaka mellan hög och låg. Under den tiden ska du självklart inte läsa av brytaren på riktigt. Utan registrera när pinnen går hög eller låg (beroende på hur du har kopplat brytaren) sedan väntar du några millisekunder och kollar om pinnen fortfarande är hög/låg. Därefter stannar/stoppar du timern.

Vänta sedan en tid innan du accepterar nästa avläsning.

edit: Jaha Michel han visst före. :)
Och jag fick inte med att du måste registrera när knappen har blivit uppsläppt efter nertryckningen heller.
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Michel: Det kan studsa mer än 20 µs.
Studstest av några brytare :) http://www.embedded.com/showArticle.jht ... D=18400810
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Michels förslag är bra men lite överdrivet tycker jag.
Det räcker med så här:

Kod: Markera allt

SP1: 
    tisdfördröjning
SP1_2:

   in      temp, PINbuttonport 
   sbrs   temp, cmdStartStop 
   jmp      SP1_2
   tisdfördröjning

   ret 
Detraw
Inlägg: 630
Blev medlem: 31 januari 2004, 10:32:37
Ort: Stockholm (Nacka)

Inlägg av Detraw »

aha så det är där det sket sig, har aldrig hört talas om att man var tvungen att göra så, men sen har jag ju inte hålt på med detta så länge heller, bara nån månad. Men jag ska lägga in det i min kod ikväll eller imorrn.

Tusen tack för eran hjälp 8)

ps. Hedi jag använder en atmega16 ds.
Michel
Inlägg: 436
Blev medlem: 3 februari 2004, 18:08:04
Ort: Stockholm

Inlägg av Michel »

Chribbe76 skrev:Michels förslag är bra men lite överdrivet tycker jag.
cykze skrev:Det kan studsa mer än 20 µs
Ha förbarmande med en kille som borde sova istället för att skriva <dynga> här.

Man kan inte vara på topp alltid.
:wink:
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

<dynga>... Nej för du har en poäng med att man ska läsa av knappen fler en 1 gång.
Det kan vara nödvändigt om man har en knapp som gärna glappar när den är nedtryckt.
Detraw
Inlägg: 630
Blev medlem: 31 januari 2004, 10:32:37
Ort: Stockholm (Nacka)

Inlägg av Detraw »

hmm just nu har jag ingen riktig knapp utan bara en stiftlist, men tanken är väl att jag ska fixa ett par microbrytare, men jag såg på elfa att de iaf kostade 12kr / st. MEd min budget så är det mycket så jag får nog vänta lite tills jag har fixat ett jobb :D
Detraw
Inlägg: 630
Blev medlem: 31 januari 2004, 10:32:37
Ort: Stockholm (Nacka)

Inlägg av Detraw »

Jag ska nu löda om mina knappar och allt annat till ett mönsterkort, funderar då på att sätta dit ett RC filter som Michel snackade om, hur skulle jag i sånna fall göra det? resistorn i serie med kondingen till jord och konding parallellt till knappen minns jag fel från mina fysiklektioner??
Skriv svar