Fórum témák

» Több friss téma
Cikkek » PIC-ekről kezdőknek
PIC-ekről kezdőknek
Szerző: mspike, idő: Jan 10, 2006, Olvasva: 94352, Oldal olvasási idő: kb. 2 perc
Lapozás: OK   6 / 7
A következőkben egy példaprogramot mutatok be, időhiánymiatt nem tudom bemutatni az MPLAB programot, de nagyjából megfelel egy sima szövegszerkeztőnek, az ICD2-höz való tudás pedig megtalálható abban a cikkben, illetve az ajánlott irodalomba. A JDM-hez tartozó irodalom is megtalálható a másik cikkben. Az itt található példaprogram eredeti verzióját a UMSZKI tanárai írták, utólagos engedelmükkel felhasználom, itt és most oktatási célokra.
  1. 00      LIST    P=16F871
  2. 01      INCLUDE <p16f871.inc>
  3.         CBLOCK       0x80
  4.         TIMERL,TIMERH,TIMERM
  5.         ENDC
  6. 02      ORG     0003           
  7. 03      banksel TRISC
  8. 04      movlw   B"00000000"
  9. 05      movwf   TRISC
  10. 06      banksel PORTC
  11. 07      movlw   B"00001100"
  12. 08      movwf   PORTC
  13. 09 BALRA   rlf  PORTC,F
  14. 10                 call                var
  15. 11      btfss   PORTC,7
  16. 12      goto    BALRA
  17. 13 JOBBRA  rrf  PORTC,F
  18. 14                 call                var
  19. 15      btfss   PORTC,0
  20. 16      goto    JOBBRA
  21. 17      goto    BALRA
  22. 18 var           movlw  0x04
  23. 19      ;várakozunk, várakozunk
  24. 20      movwf   TIMERH          ;626ms!
  25. 21  ide3         movlw  0xff            ;
  26. 22      movwf   TIMERM          ;
  27. 23 ide2         movlw   0xff            ;
  28. 24      movwf   TIMERL          ;
  29. 25 ide           nop                    ;
  30. 26      decfsz  TIMERL          ;
  31. 27      goto    ide             ;
  32. 28      decfsz  TIMERM          ;
  33. 29      goto    ide2            ;
  34. 30      decfsz  TIMERH          ;
  35. 31      goto    ide3            ;
  36. 32      return                  ;
  37. 33      end


A program egyszerű oda-vissza futófényt valósít meg a pic PORTC kimenetén. (8biten) Nézzük hát a forráskódot :


00 Pic definiálása
01 Include file behozatala, ebből tudja a fordító, hogy pl. a PORTC mit is jelent
02 A fordító a 3. programrekesztől kezdi el feltölteni a memóriát, erre itt azért volt szükség, mert egy speciális úgynevezett downoladerrel töltötték le a programokat a suliba mely elfoglalja az első három memória rekeszt. ICD2 nél érdemes az első parancsnak egy NOPot tenni.
03 Kiválasztjuk a TRISC regiszter bankját. (Memória szervezés, regiszterek bankokban !!)
04 betesszük a W-be 00h értéket (itt binárisan megadva)
05 betesszük a W-t TRISC-be, itt jól látszik a kétlépcsős értékadás. Egy konstans a W-be majd az a regiszterbe, 16-os piceknél ezt így lehet csak ! Másfelöl még nem tárgyaltuk a regiszterek jelentését, de a TRISx regiszter mindig a portok irányát állítják. Ha nullát írunk valamelyik bitre akkor annak a portnak az adott lába kimenet lesz, ha 1-et akkor bemenet, és ezt menet közben bármikor állíthatjuk !
06 Kiválasztjuk a PORTC bankját
07 Kezdőértéket teszünk a W-be
08 Majd átadjuk PORTC-nek itt már két led világít ! (a középső kettő, a bináris értékadás jól szemlélteti !!)
09 balra forgatjuk a PORTC-t, ezzel máris lépett egyett a futófény balra
10 meghívjuk a var rutint, mely egy tipikus késleltető rutin !
11 Megvizsgáljuk a PORTC legmagasabb 7. bitjét (0-7 így jön ki a 8bit) ha ez egyes akkor elértünk a szélére és tovább, ha nem akkor vissza BALRA cimkére, tehát ez egy ciklust alkot, addig tolja balra míg el nem éri a szélét, ha elérte kihagyja a 12-es sort
12 visszaugrás a BALRA cimkéhez
13 elkezdjük jobbra forgatni a biteket
14 meghívjuk a várakozó rutint.
15 ugyan olyan ellenőrzés mint az előbb csak most a legkissebb biten
16 ugyancsak az ugrás csak itt a Jobbra cimkére
17 ugrás a balra forgatásra, ha elértük a jobb szélét
18 varakozó rutin megvalósítása, W-be kezdoertek
19 kommentek
20 W értéke TIMERL regiszterbe. A program elején található egy szakasz mely nem lett megsorszámozva, CBLOCK ... ENDC. A CBLOCK egy a fordítónak szánt valami, ami a 0x80 címtől lefele annyi regiszternek ad "virtuális nevet" ahány nevet beírunk, ezekre a regiszterekre késöbb immár a nevükkel hivatkozhatunk.
21... 31 Itt ezt a szakaszt egybeveszem, szerintem elég ha funkcionálisan elmagyarázom : a lényeg, hogy 3 egymásba ágyazott ciklust látunk, melyek változói a TIMERL TIMERH és TIMERM. Ezen ciklusok lefutási ideje határozza meg a várakozás mértékét, tehát ha lassítani akarjuk a futást, akkor elég pl. az első 18. sorban lévő értéket magasabbra átírni.
32 return utasítás amely mutatja, hogy vége a subrutinnak, és pic autómatikusan visszaugrik a CALL utásítás utáni sorra. Fontos, hogy akárhány subrutint nem ágyazhatunk egymásba. Ezek maximális szám a az úgynevezet STACK mélységével egyenlő. Egy-egy subrutin híváskor a STACKben tárolódnak el a környezeti változók, mint a programszámláló. Folyt köv.
A cikk még nem ért véget, lapozz!
Következő: »»   6 / 7
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem