Suomen Robottiyhdistyksen http://robotti.wikidot.com projektisivu 2010
Ilmari Tammisen ensimmäinen projekti : Nopeuspeli
PICASM
http://static.ak.fbcdn.net/rsrc.php/z4OG5/hash/7qkbs3nb.swf?v=1602597271748&ev=0

;NOPEUSPELI
;
;A-Portin bitit ohjaavat sekä valoja (2kpl), että tunnustelevat kytkimiä (3kpl).
;Vasemman puoleisen valon palaessa tulee painaa (ennen valon sammumista) vasenta painiketta
;ja oikean valon palaessa tulee painaa oikeaa painiketta (keltainen keltaista ja punainen punaista vastaan). Valojen palaessa yhtäaikaa
;tulee painaa keskimmäistä painiketta (ei molempia yhtä aikaa!). B-portti on kytkety sarjaan oransseja ledejä, jotka esittelevät
;valoesityksiä, sekä pisteitä pelin aikana (binääri). Paras tulos tallentuu SRAM-rekisteriin, jonka
;saa näkyviin painamalla punaista painiketta alkudemon aikana; keltaisella näkyy viimeisin tulos.
;Rekisterit voi nollata alkudemon aikana painamalla kumpaakin painiketta.
;Toistaiseksi rekisterit ovat SRAM:ja, sillä en vielä hallitse EEPROM-rekisterien kirjoittamista/lukemista.
;Ohjelmapätkät yrityksestäni ovat kuitenkin koodien seassa puolipisteellä inaktvivoituina ja
;SRAM:ien käytöllä korvattuina.
;
;Huom: projektini on muutenkin ensimmäinen laatuaan, joten asioita ei olla
;tehty kaiken taiteen sääntöjen mukaan. Lisäksi olen oppinut todella paljon tämän työn aikana! Ohjelma myös kehittyi paljon
;ja muutti muotoaan työn aikana, joten siitä johtuu mahdolliset ristitriitaisuudet ja epäselvyydet kommenteissa (joita koitan
;kuitenkin siivoilla parhaani mukaan, ennen tämän nettiin laittamista). Kaikenlainen kehittävä
;palaute on kuitenkin enemmän kuin tervetullutta :)
;
;Portti A on debounsattu ja sen nykyistä tilaa luetaan epäsuorasti cva-rekisteristä (Current Value).
;Debounce ohjelman löysin netistä ja kirjoitin sen yhteyteen omat kommenttini, koodin toiminnan selkeytymisen vuoksi.
;Pelin satunnaisuus tulee TMR0:sta, jonka vähiten merkitseviä bittejä testataan ARPA-kohdassa. Bittien tilat määräävät
;mikä tilanne pelissä tulee seuraavaksi ja TMR0 nollautuu aina oikeaa painiketta painaessa (pelaaja tuottaa siis itse
;satunnaisuuden, eikä tätä voi mitenkään systemaattisella painikkeiden painalluksilla ohittaa, RC-oskillaattorin
;suuresta taajuudesta johtuen).
Loput lähdekoodista
Nopeuspelin lähdekoodi
Kysymys : Miten Microchip assembler ohjelmassa voi linkittää lähdetiedostoja ?
Ilmari T
+ Vastaus
Yksinkertaisesti lisäämällä rivi
#include omafile.asm

Lataa ohje ja lue sivu 99
kysymys miten makrot toimivat?
Vastaus
Makrot ovat samanlaisia kuin #include tiedosto.asm . Se on ohje kääntäjälle laittaa makron paikalle etukäteen määritelty pätkä koodia.
Koodin ei tarvitse olla eri tiedostossa.
Makro on ohje kääntäjälle. Kun makro on tehty kerran sitä voidaan käyttää monta kertaa myöhemmin.
Kun makro ajetaan, makron nimi löytyy lähdekoodista ja makron sisältö kopioidaan makron paikalle lähdekoodiin
.
Esimerksi voi tehdä uuden "käskyn" jz ,makron (Jump to Address if Flag is Zero")).
Makro pitää ensin luoda a vasta sitten käyttää
jz macro Hyppyosoite ; hyppää tähän osoitteseen jos osoite on nolla
btfsc STATUS, Z ; tarkista onko osoitteen arvo nolla?
goto Hyppyosoite ; lippu asetettu
endm ; makron loppu
#define Vakio1 5
movf omarekisteri, w ; päohjelman koodi
xorwf Vakio1 ; vertaa muuttujaa vakioon
jz hyyppyosoite ; Hyppää uuteen paikkaan jos muuttuja oli sama kuin vakio Vakio1
makro"jz Hyppyosoite " kaskyn koodi asennetaan "macro" ja "endm" välistä. Tulos on
movf omarekisteri, w ; päohjelman koodi
xorwf Vakio1 ; vertaa muuttujaa vakioon
btfsc STATUS, Z ;tarkista onko osoitteen arvo nolla?
goto hyyppyosoite ; jos samoja hyppää uuteen paikkaan
Kysymys nopeuspelin ledohjaustransistoreista, miten ne mitoitetaan ?
Vastaus
Paras jättää transistorit pois, PIC pystyy ohjamaan tarpeeksi virtaa ylös ja alaspäin.
ledin kanssa ei välttämättä tarvitse laittaa edes vastusta, mutta jos haluat säästää virtaa laita seuraavasti:
- kirkas LED 220R 16mA
- keskikirkas 470R 7.5mA
- Himmeä 1k 3.5mA
Kuten olet huomannut A4 ei pysty antamaan jännitettä, mutta se pystyy vertämään led virran alaspäin.
Vastukset kannattaa merkitä vakiovastuarvoihin 1.5, 2.2, 3.3, 4.7, 6.8, 10 vaikka sinulla olisi käytössä joku muu vastus.
Esim 14.7k vastus kannattaisi merkitä 15k.
PIC16F84A nasta 4 on reset-nasta, joka pitäisi laittaa +5V, paitsi resetoinititlanteessa .

Kysymys Timer nastoista
Onko 16f690 piirin pinna 17 T0CKI se jolla tehdään esim. taajuuslaskurin sisäänmeno (50MHz)? Käyttää kaiketi TIMER0 sisäisiä kaluja toimintaansa.
Onkos olemassa sopivia LCD-moduleja suurilla kirjaimilla ja suurilla katselukulmilla?
Jukka OH3HYP
Vastaus

Käytä mieluumin nastaa 2 se on Timer1:n tulo. Timer1 on 16-bitin laskuri ja TImer0 on 8 bitin laskuri
50 Mz nopeus toimi vain jos laitat vähintää yhden esijakajan käyttöön.
Unohda iso LCD:t, pitkille matkoille käytä LED pohjaisia näyttöjä. Isoina nekin maksavat paljon. Katso mallia täältä http://www.probyte.fi/info/urheilu.htm
Sivulla on ensimmäinen näytö käytössä juuri tämän vuoden Big-Brother ohjelmassa joka päiviä kello 15:00
Kysymys epäsuorasta osoitustavasta
Onkos esim. PIC16f690 piirin ohjelmoinnissa mahdollista käyttää jollakin konstilla indeksoitua osoitusmuotoa?
Käskykannasta ei ymmärtääkseni löydy suoraan tällaista. Sellaisesta vois olla iloa vaikkakin muistialueet ovat pienet.
Jukka OH3HYP
Vastaus Microchip indeksoidusta osoitemuodosta
Hyvä kysymys.
Kaikilla prosessoreilla voi tehdä indexoituja osoiteuksia. Toisilla helpomin ja toisilla vaikeammin.
Microchip on varannut indeksointiin oman rekisterin, joten erillistä käskyä ei tarvita.
Kaikki c-kieliset ohjelmat ovat täynnä osoittimia ja indeksointuja käskyjä.
Alla esimerkki RAM alueen tyhjentämiseen index-rekisterin avulla.
Alkupään tärkeä rekisteriarvot ovat:
OSOITE Kuvaus Nimi
---------------------------------------------------------------------------------------
000H Epäsuora osoiterekisteri INADDR
001H TIMER/COUNTER FILE TMR0
002H Ohjelmalaskuri PCL
003H STATUS Rekisteri STATUS
004H FILE SELECT REGISTER FSR
005H Portti A PORTA
006H Portti A PORTB
----- Laskurit, keskeytykset jne.
020CH Vapaan RAMin alku
01FFH Vapaan RAMin loppu ( bank3)
Epäsuora muistin osoitus
Epäsuora muistinosoitus on monille PIC:n käyttäjille jäänyt hämäräksi. Otetaan tästä siksi esimerkki.
,***************************************************
; Bank0 vapaan RAMin tyhjennys epäsuoran osoituksen avulla. Microchip MPASM:kieli/MPLAB-ympäristö
;***************************************************
LIST P= 16F628 ; käytä 16F628 prosessoria
CLEAR RAM
movlw 007H ; siirrä 07h luku W-rekisteriin
movwf FSR ; siirrä W-> FSR rekisteriin
CLEAR_AGAIN
clr INADR ; nollaa rekisteri, jota FSR-osoittaa eli 07H
incf FSR ; lisää FSR-rekisterin arvoa yhdellä
btfss FSR,4 ; testaa FSR-rekisterin 4.s bitti ja hyppää
; seuraavan käskyn yli , jos se on asetettu (=1)
goto CLEAR_AGAIN ; hyppy taas seuraavaan muistipaikkaan
GOTO CLEAR_RAM ; valmis, tee sama uudestaan
;**************************
Käyttämällä epäsuoraa osoitetta säästettään paljon kooditilaa.
Huomaa, että epäsuorassa osoituksessa käytetään kahta rekisteriä, ensiksi FSR-rekisteriä, joka osoittaa sen mihin muistipaikkaan käsky kohdistetaan ja INADR, jolla käsky suoritetaan.
RAM-muistia on aina liian vähän, mutta prosessorin hinnan ja kooditilan huomioonottaen voidaan RAMia olevan kuitenkin riittävästi.
Vastaukset Pekka OH3GDO
Kysymys AD-konvertoinnista
Käytän PIC16F88-kontrolleria. ADC-tarkkuuden varmistamiseksi, tulee ennen mittausta odottaa ns. acquisition -viive jännitteiden tasaantumiseksi (viiveen pituuteen vaikuttaa mm. analogisen lähteen impedanssi). Eräässä tutoriaalissa mainitaan, että viive pitää odottaa analogisen lähteen valitsemisen ja itse mittaamisen välissä, mutta 16F88-manuaalia lukiessani en enää olekkaan varma siitä, milloin viivettä käytännössä tarvitaan.
Jos omistan yhden nastan (RA0) ainoastaan ADC-käyttöön, asetan sen ohjelman aikana vain kerran TRISA- ja ANSEL-rekistereistä analogiseksi (en siis vaihtele tätä asetusta), mittauskanavana on myös jatkuvasti tämä nasta (CHS-bitit ADCON0-rekisteristä), niin tarviiko laskettua viivettä odottaa enää toista kertaa näiden asetusten jälkeen? Tarviiko viive odottaa aina mittausten välissä vai ei? Linja on siis aina sama, mutta pidän ADC-moduulia auki vain mitattaessa – asetan ADON-bitin ADCON-rekisteristä ennen mittausta, minkä jälkeen käynnistän mittauksen GO/DONE-bitin avulla samaisesta rekisteristä (lopuksi taas sammutan ADC-moduulin virran säästämiseksi).
Immu
Microchip ADC viiveestä

Et tarviste uutta viivettä, jos kanava ei vaihdu. ADC kytkentäimpedanssi vaikuttaa tähän viiveesen. Pidä ulkoinen impedanssi pienenä. Tarvittaessa käytä ulkoista buffer vahvistinta.
Oheisessa kuvassa on tarkemmat laskelmat.
Jos kanavia on monta, kannattaa ohjelmassa vaihtaa kanava etukäteen heti kun edellinen kanava on luettu. Näin ei tarvitse odottaa kanavan vaihtumista. Sen jälkeen voi käsitellä juuri tehty mittaus.
Jos ohjelma ei ole kovin aikakriittinen kannattaa jättää reilusti aikaa kanavan vaihdon jälkeen.
Oheisessa esimerkissä tarvitaan vähintään 5us viive.
Jos unohdat tehdän tämän viiveen, kanavat tuntuvat menevän sekaisin.
Jos jossakin kanavassa ei ole kytketty mitään, siinä näkyy edellisen ADC kanavan haamujännite.

Kysymys analogia ANSEL REGUSTERS
The ANSEL and CM2CON0 registers
must be initialized to configure an analog
channel as a digital input. Pins configured
as analog inputs will read ‘0’.
Tuollainen note on pic16f690 datalehdellä sivu DS41262E -page 208 sivulla.
mitähän siinä oikeen halutaan sanoa?
Jukka T.
Vastaus


Analogianastat ovat aluksi analogianastoja (ANSEL bitit ovat 1) ,
Jos haluat käyttää niitä digitaalinastoina pitää vastaavat ANSEL ja CM2CON0 rekisterit laittaa digitaali inputiksi =0.
Pekka OH3GDO