Sida 3 av 4

Re: PIC: Hur gör man en bra avstuds-rutin?

Postat: 11 juni 2010, 18:35:37
av JimmyAndersson
Jag har tidigare använt hårdvaru-avstuds med motstånd och konding, men den här gången blev jag nyfiken på hur man löser det med mjukvara.
När man väl hittat rätt metod så får man ju en återanvändbar kodrutin som sparar plats och komponentkostnader
och i värsta fall bara kostar tiden det tar att trycka CTRL C / CTRL V. Det är lite skillnad mot att löda.
Behöver man sedan justera något så behöver man inte ens öppna chassit (så länge man har en bootloader eller ICSP-kontakt).

Tyvärr verkar utvecklingstiden vara lång i just det här fallet, men allt man lär sig har man ju nytta av i framtida projekt.

edit:
Swech: Testade nu med 30,5Hz och det blir likadant, men blinkningarna på lysdioderna blir nu märkbara förstås.
Funderar på COMF-raden... :humm:

Re: PIC: Hur gör man en bra avstuds-rutin?

Postat: 11 juni 2010, 20:05:54
av BJ
Jag kan inte prova ditt program, men kan det inte
bero på att du bara räknar 2 steg?
I mina avstudsnings-rutiner har jag räknat till mer
än det.

Men jag kan ju ha fel...

Re: PIC: Hur gör man en bra avstuds-rutin?

Postat: 11 juni 2010, 22:12:00
av Swech
Men gå andra vägen då för att testa.
Räkna istället upp en byte varje gång knappen studsar och skicka ut resultatet på en ledig port. Så kan du ju få en uppfattning om studsmängden och därefter välja
rätt avstudsningsväg.

Märkligt då i princip alla mjukvaruförslag som presenterats här bör räcka....

Swech

Re: PIC: Hur gör man en bra avstuds-rutin?

Postat: 14 juni 2010, 17:00:42
av JimmyAndersson
Det blir ju lite knasigt om man måste välja avstudsrutin efter vilken knapp man har.
Isåfall är avstudsning med hårdvara bättre. Där fungerar 1st lösning till i princip alla typer av knappar.

Ingen som haft möjlighet att testa min kod?
Eller något som har använt samma typ av knapp och fått (eller inte fått) problem?
Jag har använt den här typen av knappar (ur samma påse) många gånger tidigare (då med hårdvaru-avstuds) utan problem.

Re: PIC: Hur gör man en bra avstuds-rutin?

Postat: 14 juni 2010, 20:10:00
av BJ
JimmyAndersson skrev:Det blir ju lite knasigt om man måste välja
avstudsrutin efter vilken knapp man har.
Man ska inte behöva välja rutin efter vilken
knapp man har. Om man kör sin rutin med
100 Hz och räknar till 20 så måste knappen
ge en etta i 200 ms. Det borde fungera med
dom flesta knapparna.

Tillägg:
Lagt till citatet.

Re: PIC: Hur gör man en bra avstuds-rutin?

Postat: 14 juni 2010, 20:43:02
av Icecap
En avstutsning i mjukvara ska fungera i alla lägen, inte anpassas till vissa knappar! Fungerar det inte har man gjort fel till att börja med!

Re: PIC: Hur gör man en bra avstuds-rutin?

Postat: 14 juni 2010, 21:30:33
av Swech
Det var inte riktigt så jag menade.... Jimmy får ju inte ordning på mjukvaran och
verkar inte ta sig framåt, förslaget innebär att han kan sätta fingret på vad som
är problemet, mjuk eller hårdvara.
Det programförslag han visar kör väl endast avstudning i 2 steg, utan räknare.
Det förslag som jag och andra gav tidigare med räknare har bara rapporterats som icke fungerande

Har själv inte problem med mjukvaruavstudsade knappar.

Swech

Re: PIC: Hur gör man en bra avstuds-rutin?

Postat: 14 juni 2010, 22:01:23
av korp
JimmyAndersson skrev:Hela min kod som den ser ut nu, ifall någon vill testa:
Den där koden kompilerar inte utan fel hos mig. Det är variabler som inte är definerade etc. Har tyvärr inte tid att avlusa den. Skriv rent den så den kompilerar utan fel hos dig så kan jag testa den.

/korp

Re: PIC: Hur gör man en bra avstuds-rutin?

Postat: 14 juni 2010, 22:50:29
av korp
Ok, kunde inte låta bli att avlusa lite. Det var inte så illa ändå;
rakna_knapp fick defineras.
banksel var missat på några ställen.
pagesel tillagt före en del goto:s eftersom code-taggarna kan göra att sektionen hamnar i en annan page, lite beroende på val av processor. Detta gjorde att det inte fungerade alls på min 16f690.

Ändrade även inverteringarna för lysdioder och knapp eftersom jag testar koden på PICkit2 Low Pin Count Demo board.

Mycket riktigt fungerar inte avstudsen som den ska. Uppskattningsvis var 3-5:e knapptryckning genererar önskat slutresultat.

Kan inte kolla vidare just nu. Får återkomma, om ingen hinner kika före förstås.

Re: PIC: Hur gör man en bra avstuds-rutin?

Postat: 15 juni 2010, 10:28:01
av BJ
Jag skrev 200 ms. Det kanske är lite för lång tid.

Räknar man till 15 som Swech föreslog, så blir det
150 ms, och räknar man till 10 så får man 100 ms.
Det kanske är lite mer användbart.

Re: PIC: Hur gör man en bra avstuds-rutin?

Postat: 15 juni 2010, 12:57:49
av Icecap
Vad jag kan se är hela rutinen fel i grunden.

Definiera "Temp", "Key", "Work" som bytes. De får användas av andra men det är nog en dum idé då de används av timer-interrupten.
Definiera "Previous", "Current" som bytes som är reserverat till denna rutin.

1: Läs Port->"Temp"
(1A: AND med ett bitmönster för knapparna om det inte är alla på porten)
2: AND med "Previous"
3: Spara i "Work" ("Work" är bara en skräp-variabel)
4: "Temp" -> "Previous"
5: "Current" = "Current" & "Temp" // Nollar släppta knappar
Nu är knapp-bit'en (i "Work") bara '1' om BÅDA avläsningar (denna samt den förra) var '1'.
Sedan blir det lite mer knepigt, resten beror ju på vad knappen ska göra, man kanske vill ha 1 steg eller ha den till att slå på något medan man håller knappen men jag utgår ifrån att man vill ha veta att "knappen är intryckt" som en "puls"

6: "Key" = ("Work" XOR "Current") AND "Current"

Nu är det så att i "Current" sätts motsvarande bit eftersom knapparna avkänns stabilt, när en knapp är läst ska man sätta motsvarande bit i "Current", då försvinner den knapp fram till man släpper och trycker igen.

Re: PIC: Hur gör man en bra avstuds-rutin?

Postat: 16 juni 2010, 14:25:26
av JimmyAndersson
Vad jag kan se så beskriver 1-4 samma funktioner som i det förra inlägget du beskrev rutinen i.
Jag har testat rutinen i MPLAB SIM och kommit fram till att den gör vad dessa steg beskriver.

Nu lade jag till steg 5 i min kod (visste inte tidigare vad "Utföra en n-key-rollover" betydde), men det blev ingen skillnad.


Provade nu även att skriva om min rutin från grunden, baserat från stegen i ditt senaste inlägg,
men eftersom jag inte vet vad som var fel i min förra rutin så finns det en risk att felet följer med till den nya rutinen.
Här är iallafall rutinen:

Kod: Markera allt

;1 och 1A: Läs Port->"Temp". AND med ett bitmönster för knapparna om det inte är alla på porten.
	movf		PORTA, 0			;Läs PORTA. Resultatet till W.
	andlw		b'00010000'			;Filtrera bort allt utom bit 4 (PORTA.4 ju..) Resultatet till W.
	movwf		knapp_temp			;Spara i knapp_temp.

;2: AND med "Previous"
	andwf		knapp_previous, 0	;W (knapp_temp) AND med knapp_previous. Resultatet till W.

;3: Spara i "Work" ("Work" är bara en skräp-variabel)
	movwf		knapp_work			;W (resultatet) till knapp_work.

;4: "Temp" -> "Previous"
	movf		knapp_temp, 0		;knapp_temp till W.
	movwf		knapp_previous		;W (knapp_temp) till knapp_previous.

;5: "Current" = "Current" & "Temp" // Nollar släppta knappar
	movf		knapp_current, 0	;knapp_current till W.
	andwf		knapp_temp, 0		;W (knapp_current) AND med knapp_temp. Resultatet till W.
	movwf		knapp_current		;W (resultatet) till knapp_current.

;6: "Key" = ("Work" XOR "Current") AND "Current"
	movf		knapp_work, 0		;knapp_work till W.
	xorwf		knapp_current, 0	;W (knapp_work) XOR med knapp_current. Resultatet till W.
	andwf		knapp_current, 0	;W (knapp_current) AND med knapp_current. Resultatet till W.
	movwf		knapp_key			;W (resultatet) till knapp_key.
Mindre och renare kod än mitt förra försök.

När jag simulerar den så lyckas jag inte få något annat än noll på knapp_work och knapp_key.
Det känns spontat som ett fel...

Provade ändå att lägga till följande kod för att kunna toggla lysdioder:

Kod: Markera allt

;Knapp_toggle
	btfss		knapp_key, 4		; <-- Ger ingen reaktion på lysdioderna.
                                 ; knapp_work ger däremot samma resultat som min förra rutin. (Fungerar, men inte bra.)
	goto		LED_visning
	comf		knapp_onoff, 0		;Toggla knapp_onoff. TEST: Resultatet till W.
	andlw		b'00000001'			;TEST för att försäkra mig om att bara första biten används. <<
	movwf		knapp_onoff			;TEST tillbaka med resultatet till knapp_onoff.

LED_visning
	btfsc		knapp_onoff, 0		;Är knapp_onoff = 1 ? Om inte: Hoppa över nästa rad.
	movlw		h'00'				;Tänd lysdioderna. (Inverterat, därav 00.)
	btfss		knapp_onoff, 0 		;Är knapp_onoff = 0 ? Om inte: Hoppa över nästa rad.
	movlw		h'ff'				;Släck lysdioderna. (Inverterat.)
	movwf		PORTC				;Lysdioderna..

Men ändå ingen framgång. Kan man inte toggla lysdioderna som jag gjort?
Jag är vilse (och min GPS stödjer inte MPLAB's .map-filer..)







Definiera "Previous", "Current" som bytes som är reserverat till denna rutin.

Hur reserverar man bytes till en rutin i assembler?



Korp:
räkna_knapp skulle inte ha varit med. Jag missade tydligen ; i början på den raden när jag kopierade koden.
(Variabeln kommer från en debug-test som är bortkommenterad i koden och som jag tog bort när jag klistrade in koden här.)

Var har jag missat banksel?

Tack för att du testade! :tumupp: Då kan jag sluta stirra på knappen. :)

Re: PIC: Hur gör man en bra avstuds-rutin?

Postat: 16 juni 2010, 15:02:53
av sodjan
> Hur reserverar man bytes till en rutin i assembler?

Med RES "som vanligt".
Om du inte vill att den ska synas från andra moduler, så får
du splitta källkoden i flera moduler (d.v.s filer) och inte göra
GLOBAL på den. Då är den reserverad (synlig) enbart för den modulen.

Man jag gissar att Icecap menade "reserverad" mer som ett
tänkt förhållande, d.v.s att du inte använder den till annat.

> (och min GPS stödjer inte MPLAB's .map-filer..)

OK, här är jag helt lost. Vilken "GPS" och vad är det som inte "stöds" ?

Re: PIC: Hur gör man en bra avstuds-rutin?

Postat: 16 juni 2010, 15:51:37
av JimmyAndersson
Det här med GPS'en var bara ett dåligt skämt, eller ett exempel på min associationsförmåga om man så vill.
Jag skrev ju att jag är vilse. Är man vilse så kan en GPS vara bra.
GPS'er använder ju kartor. MPLAB har ju en filändelse som är "map", dvs "karta" på svenska.
That's it. :)

Man jag gissar att Icecap menade "reserverad" mer som ett
tänkt förhållande, d.v.s att du inte använder den till annat.


Ah, så var det nog ja.
Men nu vet jag hur man gör iallafall.

Re: PIC: Hur gör man en bra avstuds-rutin?

Postat: 17 juni 2010, 01:10:53
av korp
JimmyAndersson skrev:Var har jag missat banksel?

Tack för att du testade! :tumupp: Då kan jag sluta stirra på knappen. :)
Jag brukar vara frikostig med banksel så jag lade till det efter rad 205-före koll av PORTA och efter rad 239-före flytt till PORTC. Det är bäst att försäkra sig om att vara i korrekt minnesbank, speciellt när vi tystar denna påminnelse med "errorlevel -302" :)

Efter samma princip lade jag även till "pagesel <label>" på raden före varje "goto|call <label>", om <label> är i ett annat CODE-block än goto:n. Om ett block hamnar på andra sidan 2K-gränsen, dvs i en annan page så sker inte hoppet korrekt. Oftast kör jag pagesel före varje goto|call oavsett CODE-indelning om det inte är väldigt närliggande hopp då jag är säker på jag inte kommer att flytta label:n till ett annat CODE-block.

(Här är min första resa in i detta problem http://elektronikforumet.syntaxis.se/fo ... =7&t=27037)

Det bör tilläggas att jag är en glad amatör på PIC/ASM så allt jag säger bör tas med en nypa salt. Jag kan vara helt ute och cykla. Cykling är för övrigt väldigt bra för både kropp och själ.