Fórum témák

» Több friss téma
Cikkek » Miért éppen assembly?
Miért éppen assembly?
Szerző: sonajkniz, idő: Jún 5, 2020, Olvasva: 11756, Oldal olvasási idő: kb. 5 perc
Lapozás: OK   3 / 4

Ami most jön, az szembeszáll mindazzal, ami a PIC normális használatára vonatkozik.
Nincs áramkorlát a LED-eken, még a kötelező 100 nF-os kondenzátor is hiányzik a tápról. Mindössze a PIC pozitív ágán van 22 Ω. Viszont ennél kevesebb alkatrészből már nehéz lenne elektronikus dobókockát építeni!

dobokocka.jpg

A program elég sajátos módon hajtja meg a LED-eket. Ha pl. RA1 pozitívot ad ki, RA2 pedig negatívot, akkor RA0 bemenetnek van állítva. Ilyen módon multiplexeli 6 lépésben a LED-eket. A középső LED nincs semmivel sorba kötve. Hogy ne világítson jobban a többinél, fele ideig kap csak áramot, mint a sorba kötöttek. Mivel PIC-el nem állítható elő valós véletlenszám, ezért nem is tartalmaz a program random generátort. Viszont garantáltan a véletlenre van bízva a dobás.
Ez egy nagyon egyszerű megoldással kivitelezhető. Timer 2-es számláló folyamatosan számol 0-5-ig 0,008 másodpercenként. A gomb lenyomásának pillanatában a program kiolvassa TMR2-es regiszter tartalmát, amit az épp aktuális kijelzéstől számolva jelenít meg, némi fényjáték után.

  1. ;*******************************************************************************
  2. ;*                                   Dobókocka                                 *
  3. ;*******************************************************************************
  4. LIST P=PIC10F322 ; lista megadása
  5.  RADIX hex ; alapértelmezett számrendszer megadása
  6.  #include "p10F322.inc"
  7.  
  8.  __CONFIG _FOSC_INTOSC & _BOREN_OFF & _WDTE_OFF & _MCLRE_OFF & _LVP_OFF & _LPBOR_OFF
  9.  
  10.  CBLOCK 0x40
  11.  KOCKA
  12.  WAIT
  13.  MELYIK
  14.  LEFUTAS
  15.  KESLELTETES
  16.  MB
  17.  ENDC
  18.  
  19. #define SW1 MB,0
  20.  
  21.  org 0x0000
  22.  nop
  23.  
  24. INICIALIZALAS
  25.  CLRF LATA
  26.  MOVLW B'00001000'
  27.  MOVWF WPUA
  28.  MOVLW B'01000000'
  29.  MOVWF OSCCON
  30.  MOVLW B'00000000'
  31.  MOVWF OPTION_REG
  32.  MOVLW B'00000101'
  33.  MOVWF T2CON
  34.  MOVLW D'5'
  35.  MOVWF PR2
  36.  MOVLW B'11110000'
  37.  MOVWF KOCKA
  38.  CLRF MELYIK
  39.  MOVLW D'16'
  40.  MOVWF WAIT
  41. MAIN
  42.  MOVLW B'00001001'
  43.  MOVWF TRISA
  44.  BTFSC KOCKA,7
  45.  BSF LATA,2 ;0 0
  46.  BTFSS INTCON,2 ;# 0 #
  47.  GOTO $-1 ;0 0
  48.  BCF INTCON,2
  49.  BTFSS INTCON,2
  50.  GOTO $-1
  51.  BCF INTCON,2
  52.  BCF LATA,2
  53.  BTFSC KOCKA,6
  54.  BSF LATA,1 ;0 0
  55.  BTFSS INTCON,2 ;0 # 0
  56.  GOTO $-1 ;0 0
  57.  BCF INTCON,2
  58.  BCF LATA,1
  59.  MOVLW B'00001100'
  60.  MOVWF TRISA
  61.  BTFSC KOCKA,5
  62.  BSF LATA,1 ;# 0
  63.  BTFSS INTCON,2 ;0 0 0
  64.  GOTO $-1 ;0 #
  65.  BCF INTCON,2
  66.  BTFSS INTCON,2
  67.  GOTO $-1
  68.  BCF INTCON,2
  69.  BCF LATA,1
  70.  BTFSC KOCKA,4
  71.  BSF LATA,0 ;0 #
  72.  BTFSS INTCON,2 ;0 0 0
  73.  GOTO $-1 ;# 0
  74.  BCF INTCON,2
  75.  BTFSS INTCON,2
  76.  GOTO $-1
  77.  BCF INTCON,2
  78.  BCF LATA,0
  79.  CALL GOMB
  80.  GOTO MAIN
  81.  
  82. PROGRAM
  83.  DECFSZ WAIT
  84.  RETURN
  85.  MOVF KESLELTETES,W
  86.  MOVWF WAIT
  87.  MOVF MELYIK,W
  88.  CALL ADAT
  89.  MOVWF KOCKA
  90.  INCF MELYIK
  91.  MOVLW D'6'
  92.  SUBWF MELYIK,W
  93.  BTFSS STATUS,C
  94.  GOTO PG2
  95.  CLRF MELYIK
  96. PG2 DECF LEFUTAS
  97.  DECF KESLELTETES
  98.  MOVLW 3
  99.  SUBWF KESLELTETES,W
  100.  BTFSS STATUS,C
  101.  INCF KESLELTETES
  102.  RETURN
  103. GOMB
  104.  BTFSS PORTA,3
  105.  GOTO G2
  106.  BCF SW1
  107. G1 MOVF LEFUTAS,F
  108.  BTFSC STATUS,Z
  109.  RETURN
  110.  GOTO PROGRAM
  111. G2 BTFSC SW1
  112.  GOTO G1
  113.  MOVLW D'36'
  114.  MOVWF LEFUTAS
  115.  MOVF TMR2,W
  116.  ADDWF LEFUTAS,F
  117.  MOVLW D'30'
  118.  MOVWF KESLELTETES
  119.  BSF SW1
  120.  GOTO PROGRAM
  121. ADAT
  122.  ADDWF PCL
  123.  RETLW B'01000000'
  124.  RETLW B'00100000'
  125.  RETLW B'01100000'
  126.  RETLW B'00110000'
  127.  RETLW B'01110000'
  128.  RETLW B'10110000'
  129.  END

 

A most következő eszközre nagyon haragudott a feleségem a napokban.
Izotópos röntgen vizsgálatra kellett mennie, ahol közölték vele, hogy kiskorú gyermektől tartsa távol magát egy ideig. Amint hazaértünk a vizsgálatról, elővettem a sugárzásjelzőmet. Normál sugárzási szint esetén szórványos pittyegést ad. Közelítve a feleségemhez folyamatosan sípolt. Két napig nem engedtem az unokája közelébe.

sugarzas_jelzo.jpg

Azoknak, akik kedvet kaptak a megépítéséhez:
A sárga karikával behatárolt mezőben a megépítéskor is a rajznak megfelelően kell az alkatrészeket elhelyezni. Azaz, a feszültség ellenőrző pont a C5-ös kondenzátor utánról kell lejöjjön. Ez a kondi pont ez miatt van benne. A 0 V becsatlakozásának is a rajz szerint kell lennie. A szupresszor dióda nem része az áramkör működtetésének, csupán védelmi célokat szolgál; akár el is hagyható, de ajánlott a használata.

A programja jóval bonyolultabb az előzőeknél, ennek ellenére fordítás után rövidebb, mint a kézi gravírozóé.

  1. ;*******************************************************************************
  2. ;*                               Sugárzás jelző                                *
  3. ;*        Egytekercses feszültségnövelő 400 V-os GM csővel PIC10F322-vel       *
  4. ;*******************************************************************************
  5.  
  6.  LIST P=PIC10F322 ; lista megadása
  7.  RADIX hex ; alapértelmezett számrendszer megadása
  8.  #include "p10F322.inc"
  9.  
  10.  __CONFIG _FOSC_INTOSC & _BOREN_OFF & _WDTE_OFF & _MCLRE_OFF & _LVP_OFF & _LPBOR_OFF
  11.  
  12.  CBLOCK 0x40
  13.  WAIT ;Várakozás
  14.  MENT_WREG ;W regiszter értéktároló
  15.  MENT_STATUS ;STATUS regiszter értéktároló
  16.  SIP_IDO ;Hangjelzés időtartama részecske becsapódáskor
  17.  TOLTES_H ;A 400V meglétét figyelő várakozás felső byte-ja
  18.  TOLTES_L ;A 400V meglétét figyelő várakozás alsó byte-ja
  19.  MB ;Belső kapcsolók
  20.  ENDC
  21. IDOZITO MACRO MENNYI ;Időzítő értékfeltöltése macro.
  22.  MOVLW HIGH MENNYI
  23.  MOVWF TOLTES_H
  24.  MOVLW LOW MENNYI
  25.  MOVWF TOLTES_L
  26.  ENDM
  27.  
  28. #define BUZZER LATA,2 ;Hangjelző
  29. #define ISW MB,1 ;Időzítő segédkapcsoló
  30. #define TGYSW MB,2 ;Telep gyenge segédkapcsoló
  31.  
  32.  org 0x0000 ;Programmemória kezdő címe
  33.  nop
  34.  GOTO INICIALIZALAS
  35.  org 0x0004
  36.  GOTO MEGSZAKITAS
  37.  nop
  38.  org 0x000A
  39. INICIALIZALAS
  40.  CLRF LATA ;Kimenetek kikapcsolása
  41.  MOVLW B'00000010' ;\
  42.  MOVWF ANSELA ; \
  43.  MOVLW B'1100101' ;--Analóg bemenet beállítása
  44.  MOVWF ADCON ;_/
  45.  MOVLW B'00001010' ;\
  46.  MOVWF TRISA ;-Ki és bemenetek beállítása
  47.  MOVLW B'00001000' ;\
  48.  MOVWF WPUA ;-RA3-on belső felhúzó ellenállás bekapcsolása
  49.  MOVLW B'01110000' ;\
  50.  MOVWF OSCCON ;-Oszcillátor beállítása 16MHz-re
  51.  MOVLW B'11001000' ;\
  52.  MOVWF INTCON ;-Megszakítás bemenet változásra engedélyezése
  53.  MOVLW B'00000010' ;\
  54.  MOVWF PIE1 ;-Timer 2 megszakítás engedélyezése
  55.  CLRF IOCAP ;\
  56.  MOVLW B'00001000' ;-Megszakítást kiváltó bemenet kiválasztása
  57.  MOVWF IOCAN ;/
  58.  CLRF OPTION_REG ;OPTION_REG törlése
  59.  MOVLW B'01111100' ;\
  60.  MOVWF T2CON ; \
  61.  MOVLW D'99' ; \
  62.  MOVWF PR2 ;---PWM beállítása 40KHz-re 70%-os kitöltéssel, FLAG
  63.  CLRF PWM1DCL ;---bit beállítása 400 usecenkénti bebillenésre.
  64.  MOVLW D'70' ; /
  65.  MOVWF PWM1DCH ;_/
  66.  CLRF MB ;Belső kapcsolók törlése
  67. MAIN
  68.  BTFSC TGYSW ;Ha telep gyenge kapcsoló be van kapcsolva, a program
  69.  GOTO TELEP_GYENGE ;átugrik TELEP_GYENGE rutinra.
  70.  INCFSZ WAIT ;Mivel a 400V-os feszültség felépülése jóval lassabb
  71.  GOTO $-1 ;folyamat annál, mint amennyi idő alatt a program
  72.  BCF INTCON,GIE
  73.  BSF ADCON,1 ;körbefordul, ezért kivárok két mérés között.
  74.  BTFSC ADCON,1 ;Bár az időközben bejövő megszakítás elronthatja a
  75.  GOTO $-1 ;mérési eredményt, a teljes működésre nincs komoly
  76.  BSF INTCON,GIE
  77.  MOVLW D'100' ;kihatása, viszont ha ilyenkor leállítom a megsza-
  78.  SUBWF ADRES,W ;kítást, lemaradhatok egy jelről, ezért nem teszem.
  79.  BTFSS STATUS,C ;Ezután ellenőrzöm, elérte-e a feszültség a kívánt
  80.  GOTO MAIN2 ;értéket. Ha nem, MAIN2-re ugrok. Ha igen, leállítom
  81.  CLRF PWM1CON ;a PWM kimenetet, kikapcsolom az időzítő segédkapcsoló-
  82.  BCF ISW ;ját és visszatérek a program elejére.
  83.  GOTO MAIN
  84. MAIN2
  85.  MOVLW B'11000000' ;Ha a program ide jön, bekapcsolom a PWM-et, és be-
  86.  MOVWF PWM1CON ;állítom a PWM kimenetét.
  87.  BTFSC ISW ;Ellenőrzöm időzítő segédkapcsolóját. Ha be van kap-
  88.  GOTO MAIN ;csolva, visszatérek a program elejére. Ha nincs,
  89.  IDOZITO D'12500' ;feltöltöm értékkel az időzítőt, majd bekapcsolom
  90.  BSF ISW ;időzítő segédkapcsolóját.
  91.  GOTO MAIN ;Visszatérek a program elejére.
  92. ;-------------------------------------------------------------------------------
  93. TELEP_GYENGE ;Ha a telep gyengesége, vagy egyéb okból nem jön
  94. CLRF PWM1CON ;létre megadott időn belül a 400V, akkor kikapcsolom
  95.  BSF BUZZER ;a PWM csatornát, és szaggatott hangjelzést adok.
  96.  IDOZITO D'1250'
  97.  BSF ISW
  98.  NOP
  99.  BTFSC ISW
  100.  GOTO $-1
  101.  BCF BUZZER
  102.  IDOZITO D'800'
  103.  BSF ISW
  104.  NOP
  105.  BTFSC ISW
  106.  GOTO $-1
  107.  GOTO TELEP_GYENGE
  108. ;-------------------------------------------------------------------------------
  109. MEGSZAKITAS
  110.  MOVWF MENT_WREG ;Elmentem W regiszter aktuális értékét
  111.  SWAPF STATUS,W
  112.  MOVWF MENT_STATUS
  113.  BTFSS INTCON,0 ;Ellenőrzöm, mi váltotta ki a megszakítást. Ha nem
  114.  GOTO MSZ1 ;részecske becsapódás, akkor csak Timer 2 lehetett,
  115.  MOVLW D'100' ;ezért átugrom MSZ1-re. Ha mégis, akkor SIP_IDO-be
  116.  MOVWF SIP_IDO ;100-at töltök, bekapcsolom a Buzzert, törlöm IOC
  117.  BSF BUZZER ;FLAG bitjét, valamint IOCAF regisztert, majd MSZ4-re
  118.  BCF INTCON,0 ;ugrok.
  119.  CLRF IOCAF
  120.  GOTO MSZ4
  121. MSZ1
  122.  BTFSS ISW ;Ha időzítő segédkapcsoló be van kapcsolva, akkor
  123.  GOTO MSZ2 ;visszaszámoltatom a beálított értékről.
  124.  MOVLW 1 ;Mivel a PIC10-es nem ismeri a SUBWFB parancsot, és a
  125.  SUBWF TOLTES_L ;DECF parancs nincs hatással a CARRY bitre, ezért
  126.  BTFSC STATUS,C ;kicsit kacifántosabb a két byteos érték visszaszámolá-
  127.  GOTO MSZ2 ;sa. Valamint nem 0-nál, hanem csak mínusz 1-nél jár
  128.  SUBWF TOLTES_H ;le, de ennek nincs nagy jelentőssége.
  129.  BTFSC STATUS,C ;Ha lejár, kikapcsolom időzítő segédkapcsolóját, és
  130.  GOTO MSZ2 ;bekapcsolom telep gyenge segédkapcsolót.
  131.  BSF TGYSW
  132.  BCF ISW
  133. MSZ2
  134.  BTFSC TGYSW ;Ha a telep gyenge segédkapcsoló be van kapcsolva, ezt
  135.  GOTO MSZ3 ;a rutint átugrom. Ez a rutin a becsapódáskori hang-
  136.  BTFSS BUZZER ;jelzés idejét állítja be 40msec-re.
  137.  GOTO MSZ3
  138.  DECFSZ SIP_IDO
  139.  GOTO MSZ3
  140.  BCF BUZZER
  141. MSZ3
  142.  BCF PIR1,1 ;Timer 2 FLAG bitjének kikapcsolása.
  143. MSZ4
  144.  SWAPF MENT_STATUS,W
  145.  MOVWF STATUS
  146.  MOVF MENT_WREG,W ;W regiszter tartalmának visszatöltése
  147.  RETFIE ;Kilépés a megszakításból.
  148.  
  149.  END


A cikk még nem ért véget, lapozz!
Következő: »»   3 / 4
É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