PIC Ohjelmointikokemuksia

PIC piirien ohjelmointi alkoi 16F84A piirinkokeilulla 2000 luvun alussa ja Mikrobittilehden ohjeiden mukaan tehdyllä PicProm ohjelmointilaitteella, lähinnä ledien sytyttelystä ja sammuttelusta. Kyseinen piiri oli selväpiirteinen ja toimi niin kuin pitikin.  Koskaan ei kiinnostusta herättänyt assembly kielen syvällinen opiskelu, mikä käy varmaankin selville oheisesta esimerkeistä, jossa sama ohjelma on ensin kirjoitettu assemblyllä ja sitten Basicillä. Kyseessä on vain ledien sytyttelystä ja sammuttelusta.

Assembly kielinen versio

; ADDRESS OPCODE     ASM

; ———————————————-

$0000            $2804                                                       GOTO           _main

$0004            $                    _main:

;LED2.pbas,1 ::                                        program LED2

$0004            $                    _main_main:

;LED2.pbas,2 ::                                        TRISC=0

$0004            $1303                                                       BCF              STATUS, RP1

$0005            $1683                                                       BSF               STATUS, RP0

$0006            $0187                                                       CLRF            TRISC, 1

;LED2.pbas,3 ::                                        LOOP:

$0007            $                    _main_loop:

$0007            $1303                                                       BCF              STATUS, RP1

$0008            $1683                                                       BSF               STATUS, RP0

;LED2.pbas,4 ::                                        Delay_ms(100)

$0009            $3082                                                       MOVLW      130

$000A           $00FB                                                      MOVWF      STACK_11

$000B           $30FF                                                       MOVLW      255

$000C           $00FA                                                      MOVWF      STACK_10

$000D           $0BFB                                                      DECFSZ       STACK_11, F

$000E           $2810                                                       GOTO           $+2

$000F            $2813                                                       GOTO           $+4

$0010            $0BFA                                                     DECFSZ       STACK_10, F

$0011            $2810                                                       GOTO           $-1

$0012            $280D                                                      GOTO           $-5

$0013            $3087                                                       MOVLW      135

$0014            $00FA                                                      MOVWF      STACK_10

$0015            $0BFA                                                     DECFSZ       STACK_10, F

$0016            $2815                                                       GOTO           $-1

$0017            $0000                                                       NOP

;LED2.pbas,5 ::                                        PORTC.0=1

$0018            $                    LED2_L_1:

$0018            $1283                                                       BCF              STATUS, RP0

$0019            $1407                                                       BSF               PORTC, 0

$001A           $                    LED2_L_2:

;LED2.pbas,6 ::                                        Delay_ms(100)

$001A           $3082                                                       MOVLW      130

$001B           $00FB                                                      MOVWF      STACK_11

$001C           $30FF                                                       MOVLW      255

$001D           $00FA                                                      MOVWF      STACK_10

$001E           $0BFB                                                      DECFSZ       STACK_11, F

$001F            $2821                                                       GOTO           $+2

$0020            $2824                                                       GOTO           $+4

$0021            $0BFA                                                     DECFSZ       STACK_10, F

$0022            $2821                                                       GOTO           $-1

$0023            $281E                                                       GOTO           $-5

$0024            $3087                                                       MOVLW      135

$0025            $00FA                                                      MOVWF      STACK_10

$0026            $0BFA                                                     DECFSZ       STACK_10, F

$0027            $2826                                                       GOTO           $-1

$0028            $0000                                                       NOP

;LED2.pbas,7 ::                                        PORTC.1=1

$0029            $                    LED2_L_3:

$0029            $1487                                                       BSF               PORTC, 1

$002A           $                    LED2_L_4:

;LED2.pbas,8 ::                                        Delay_ms(100)

$002A           $3082                                                       MOVLW      130

$002B           $00FB                                                      MOVWF      STACK_11

$002C           $30FF                                                       MOVLW      255

$002D           $00FA                                                      MOVWF      STACK_10

$002E           $0BFB                                                      DECFSZ       STACK_11, F

$002F            $2831                                                       GOTO           $+2

$0030            $2834                                                       GOTO           $+4

$0031            $0BFA                                                     DECFSZ       STACK_10, F

$0032            $2831                                                       GOTO           $-1

$0033            $282E                                                       GOTO           $-5

$0034            $3087                                                       MOVLW      135

$0035            $00FA                                                      MOVWF      STACK_10

$0036            $0BFA                                                     DECFSZ       STACK_10, F

$0037            $2836                                                       GOTO           $-1

$0038            $0000                                                       NOP

;LED2.pbas,9 ::                                        PORTC.2=1

$0039            $                    LED2_L_5:

$0039            $1507                                                       BSF               PORTC, 2

$003A           $                    LED2_L_6:

;LED2.pbas,10 ::                                      Delay_ms(100)

$003A           $3082                                                       MOVLW      130

$003B           $00FB                                                      MOVWF      STACK_11

$003C           $30FF                                                       MOVLW      255

$003D           $00FA                                                      MOVWF      STACK_10

$003E           $0BFB                                                      DECFSZ       STACK_11, F

$003F            $2841                                                       GOTO           $+2

$0040            $2844                                                       GOTO           $+4

$0041            $0BFA                                                     DECFSZ       STACK_10, F

$0042            $2841                                                       GOTO           $-1

$0043            $283E                                                       GOTO           $-5

$0044            $3087                                                       MOVLW      135

$0045            $00FA                                                      MOVWF      STACK_10

$0046            $0BFA                                                     DECFSZ       STACK_10, F

$0047            $2846                                                       GOTO           $-1

$0048            $0000                                                       NOP

;LED2.pbas,11 ::                                      PORTC.3=1

$0049            $                    LED2_L_7:

$0049            $1587                                                       BSF               PORTC, 3

$004A           $                    LED2_L_8:

;LED2.pbas,12 ::                                      GOTO LOOP

$004A           $2807                                                       GOTO           _main_loop

$004B           $284B                                                       GOTO           $

Sama ohjelma kirjoitettuna Basicillä on lyhyempi ja toiminta helpompi ymmärtää:

program LED2

TRISC=0

LOOP:

Delay_ms(100)

PORTC.0=1

Delay_ms(100)

PORTC.1=1

Delay_ms(100)

PORTC.2=1

Delay_ms(100)

PORTC.3=1

GOTO LOOP

END.

Oheinen Basic ohjelma on tehty MicroCodeStudiolla ja PICBasic Pro:lla.  Aloittelijalle ja harvemmin käyttäjälle mielestäni soveltuu hyvin ko. kääntäjä samoin kuin MikroelektronikanBasic kääntäjä. Jälkimmäisen etuna on ilmainen ohjelma ja ilmaiseksi saa myös ohjelmointioppaan.

Molempien toimittajien sivuilta löytyy runsaasti esimerkkejä, joilla pääsee hyvin alkuun. Netistä löytyy myös C kielellä toimivia kääntäjiä, niille joille C++ kieli on tuttu.

Muutaman vuoden väliajan jälkeen tuli tarve käyttää uudelleen PIC kontrollereita ja hankin 16F628 piirejä, jotka sisältävät enemmän ominaisuuksia kuin 16F84A piirit ja ovat kuitenkin hieman halvempia (?). PicProm ohjelmointilaite on edelleen käytössä,  ja toimii ko. piirillä, mutta muuten on vanhentunut eikä ohjelmapäivityksiä ole tullut. On näköjään jätetty oman onnensa nojaan ja netistä löytyy ilmaiseksi Visual Basic koodi, jos haluaa koodia tutkia/parannella. Tuli hankittua Microchipiltä Pickit2 ohjelmointilaite ja 20 pinninen demokortti. Syy hankintaan oli, että on tarve käyttää myös uudempia ja monipuolisempia kontrollereita, esimerkiksi 28 pinnistä 18F2550:aa, jossa on mm USB liityntä ja AD muunnos. Demokortin mukana tuli ennestään outo piiri 16F690. Laite toimi ensi yrittämällä ja demo-ohjelmat toimivat hienosti.

Kätevä piirre ohjelmointilaitteessa on USB liitäntä ja se että enää ei tarvita erillistä jännitelähdettä kuten Picpromissa (15 V). Etu on myös siinä että piiri voi olla ohjelmoinnin/testauksen ajan kiinni demokortissa. Piirien irrottelussa ja liikuttelussa on aina riskinsä ja muutamia piirejä on tullut tuhotuksi jännitepiikkien ja väärin päin asentamisen takia. 

PicPromissa ei myöskään ollut mahdollista valita sisäistä oskillaattoria. Tosin oskillaattori valitaan jo ohjelmointivaiheessa, eikä tullut koskaan kokeiltua sitä PicPromissa, jossa se on valittava kontrollerin kirjoituksessa. Sisäisen oskillaattorin käyttö yksinkertaistaa piiriä, että kiteen ja kaksi kondensaattoria voi jättää pois (ainakin silloin kun ei tarvita tarkkaa taajuutta) ja yksinkertaisimmillaan esimerkiksi 16F628 piirissä tarvitaan vain yksi oheiskomponentti,  5 10 k vastus.

Alkuun 16F628:lle tehdyt ohjelmat eivät alkaneet toimia ja piti etsiä syy. Tietysti voi sanoa että pitäisi lukea tarkkaan piirin datalehdet, mutta kun  on muutama sata sivua suhteellisen ikävää luettavaa ja pitäisi myös ymmärtää syvällisesti, mitä se tarkoittaa, niin jäi se tekemättä.  Helpompi tapa tässäkin tapauksessa oli selata nettiä ja löytää vastaus. Ohjelman alkuun kun kirjoittaa  CMCON = 7 jolloin lähdöt toimivat kuten 16F84A:lla

Työskentely MikroElektronikan MBasicillä ohjeita:

Uusi ohjelma: luo uusi kansio, jonne sijoitat ohjelman

Luo MikroBasicissä uusi projekti, jonka talletetat em. kansioon

Lähde sitten kirjoittamaan koodia ja voit kääntää sen jolloin tallentaa sen samaan kansioon kuin projektitiedosto: projektitiedosto = .pbb, käännösyksikkö = pbas

Avaa ohjelma avamalla projekti tiedosto. On olemassa sekaantumismahdollisuus, että käännösyksikkö ei menekään oikeaan hakemistoon. Itse pidän auki aina ohjelmakansiota ja kääntämisen jälkeen voi katsoa, että .hex tiedosto on päivittynyt (kelloaika resurssihallinnassa tiedoston vieressä).

Etene vähitellen, aloita toimivasta koodista (esimerkiksi ledien vilkutus ja lisää uutta ja kokeile välillä. Jos kirjoitat pitkän pätkän uutta koodia, voi vian löytäminen olla hankalampaa.

Toimimattomuuden syitä: itse syntaksi virheet on helpompi löytää kuin loogiset virheet.

Tarkista pinnit ja johdot että varmasti menevät oikein.

Tarkista yleismittarilla, että käyttöjännite on kytketty.

Joskus jännitenousu (lasku) on liian hidas, schmitt triggeri (CMOS 4093) , pufferipiiri 4050 voivat korjata asian. Esimerkiksi optohaarukalta tuleva jännite voi olla  liian hidas, eikä PIC tunnista sitä. Tarkoitus on vastaisuudessa lisätä nettisivuille tehtyjä sovellutuksia ja ohjeita ja lähinnä toteutetuna MikroElektronikan Basicillä 

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *