Anonieme Gebruiker
Hier kan ook uw advertentie staan!
Hallo allemaal.
Ik heb een vraag over het proggen van een pic in asm.
Ik heb een progje geschreven dat de tv afstandsbediening ontvangt, en de code die door de afstandsbediening word verzonden in een byte zet. Nu wil ik dat de controller reageert als ik bijvoorbeeld of 1 of 2 of 3 druk. De binaire waarde hierbij is gewoon binair 1 resp 2 resp 3.
Nu wil ik een soort 'als, dan' - constructie maken waardoor mijn programma reageert op de ingedrukte toets.
zoiets als:
als register is 00000001
dan zet project aan
als register is 00000002
dan zet project uit
Hoe maak ik zoiets met asm commando's? ik heb de instruction set geraadpleegt maar kom er niet uit. Ik neem aan dat ik niet elke bit afzonderlijk moet testen? dit zal namelijk erg veel werk in beslag nemen. Dus wie weet hoe dit simpel kan in asm?
alvast bedankt en met vriendelijke groet
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
movf register,w
xorlw d'1'
btfsc status,z
goto project_aan
movf register,w
xorlw d'2'
btfsc status,z
goto project_uit
...
...
Peter Claus
It is so simple to be happy, but it is so difficult to be simple
Je maakt het verschil met je register en je getal (vb 00000001 (SUBWF).
Je vraagt de zero vlag af met BTFSC (als de zero vlag geset is wil het zeggen dat de register 00000001 is).
Na deze instruktie zet je een CALL naar "zet project aan". Deze wordt dan enkel uitgevoerd als als de zero vlag "1" is.
Je doet nog eens BTFSC voor eventuele andere waarden.
Dit is een beetje zoals een "CASE" in C.
klein is fijn
Moderator
Of je knutselt iets met SUBWF (Subtract W from f) of SUBLW (Subtract W from Literal). Als beide getallen overeen komen is het resulataat 0 waarop je een bitcheck uit kan voeren.
/edit, hetgeen cosphi ook al voorstelde..
[Bericht gewijzigd door klein is fijn op (11%)]
Anonieme Gebruiker
Hier kan ook uw advertentie staan!
guidob
Overleden
mijn versie:
na de org en goto naar de start van het hoofdprogramma en de goto naar de interrupt routine nog een aantal goto's achter elkaar opnemen naar de diverse routines. Die goto's hebben dus elk een oplopend adres.
Dan een tabel in de interne eeprom, waarbij de code van de rc5 gebruikt wordt als adres van een eprom locatie en de inhoud wordt gevuld met het adres van de goto.
Dus b.v. 'aan' is code 12 en de goto voor 'aan' staat op adres 10. Dan is de inhoud van adres 12 van de eprom dus 10. De inhoud van niet gebruikte adressen (lees codes) vullen met b.v. ff.
Als je nu op 'aan' drukt op de ab, krijg je code 12 binnen. Die gebruiken als adres om de eeprom uit te lezen (dan even checken of je niet ff terug krijgt), krijg je 10 terug. Die waarde dan wegschrijven op de program counter en hoppa, de goto naar 'aan' wordt uitgevoerd.
Voordeel: nieuwe code toevoegen is dan alleen maar de
goto toevoegen achter aan het lijstje en dan de inhoud van de eeprom (adres=waarde nieuwe code) vullen met het adres van de goto.
Dat bespaart een hele berg checks per rc5 code apart.