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ä