Projektit2010

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_kytkent%C3%A4kaavio.jpg
pikku%281%29.jpg
;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

mpasm_inlcude.jpg
Lataa ohje ja lue sivu 99

http://www.microchip.com/Microchip.WWW.SecureSoftwareList/secsoftwaredownload.aspx?device=en019469&lang=en&ReturnURL=http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en019469&part=SW007002#

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 .

PIC16F84A.jpeg

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

pic16F690.jpg
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ä

ADCviive1.jpg

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.

ADCviive.jpg

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

ansel2.gifansel.gif
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

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License