Share Pastebin
Guest
Public paste!

Untitled

By: a guest | Mar 16th, 2010 | Syntax: ASM (NASM) | Size: 9.87 KB | Hits: 72 | Expires: Never
Copy text to clipboard
  1. ;**************************************************************************************************************************
  2. ;**************************************************************************************************************************
  3. ;** Projekt:     MeresLabor2:  3. mérés Házi feladat                                                                                                          **
  4. ;** Leírás:                                                                                                                                                                                                                    **
  5. ;**                                                                                                                                                                                                                                              **
  6. ;** Futófény megvalósítása LED-eken (sorban felgyullad az összes LED, majd az elsőtől kezdve egyenként kialszanak).             **
  7. ;** A léptetés sebessége a BT0 és BT1 nyomógombokkal történjen 100ms időalapal 15 lépésben (100ms - 1.5sec).                   **
  8. ;** BT0 egyszeri megnyomása növeli, BT1 egyszeri megnyomása csökkenti a futófény sebességét 100ms-mal.                                   **
  9. ;** Az időzítés időzítő segítségével történjen.                                                                                                                                                       **
  10. ;** Vigyázat: 1 megnyomásra (bármilyen hosszú is az) csak egy irányváltás legyen!                                                                                 **
  11. ;** A nyomógomb pergésmentesítésével nem kell foglalkozni!                                                                                          **
  12. ;**                                                                                                                                                                                                                                              **
  13. ;** Szerző:      Szabó Bálint                                                                                                     **
  14. ;** Mérőcsoport: 1                                                                                                             **
  15. ;** Készült:     2010. március 16.                                                                                        **
  16. ;**************************************************************************************************************************
  17. ;**************************************************************************************************************************
  18. ;
  19. ;*****************************************************************************
  20. ;* AVR mérőpanel portkiosztás:
  21. ;*****************************************************************************
  22. ;*
  23. ;* LED0(P):PortC.0          LED4(P):PortC.4
  24. ;* LED1(P):PortC.1          LED5(P):PortC.5
  25. ;* LED2(S):PortC.2          LED6(S):PortC.6
  26. ;* LED3(Z):PortC.3          LED7(Z):PortC.7        INT:PortE.4
  27. ;*
  28. ;* SW0:PortG.0     SW1:PortG.1     SW2:PortG.4     SW3:PortG.3
  29. ;*
  30. ;* BT0:PortE.5     BT1:PortE.6     BT2:PortE.7     BT3:PortB.7
  31. ;*
  32. ;*****************************************************************************
  33. ;*
  34. ;* AIN:PortF.0     NTK:PortF.1    OPTO:PortF.2     POT:PortF.3
  35. ;*
  36. ;*****************************************************************************
  37. ;*
  38. ;* LCD1(VSS) = GND         LCD9(DB2): -
  39. ;* LCD2(VDD) = VCC         LCD10(DB3): -
  40. ;* LCD3(VO ) = GND         LCD11(DB4): PortA.4
  41. ;* LCD4(RS ) = PortA.0     LCD12(DB5): PortA.5
  42. ;* LCD5(R/W) = GND         LCD13(DB6): PortA.6
  43. ;* LCD6(E  ) = PortA.1     LCD14(DB7): PortA.7
  44. ;* LCD7(DB0) = -           LCD15(BLA): VCC
  45. ;* LCD8(DB1) = -           LCD16(BLK): PortB.5 (1=Háttérvilágítás ON)
  46. ;*
  47. ;*****************************************************************************
  48.  
  49.                 .nolist
  50.                 .include "m128def.inc"  ; ATMega 128 definíciós fájl
  51.                 .list
  52.  
  53.                 ;***** Konstansok *****
  54.  
  55. ;.equ   tconst  = 150                   ; időzítési konstans (T = 150*10 msec)
  56.  
  57.                 ;***** Regiszterkiosztás *****
  58.  
  59. .def    temp            = r16           ; ált. segédregiszter
  60. .def    megnyomva0      = r17           ; állapotgépben btn0
  61. .def    idoalap         = r18           ; Az időalapot tároló regiszter
  62. .def    btnstate        = r19           ; nyomógombok állapotát tárolja
  63. .def    count           = r20           ; másodlagos segédregiszter a timerhez
  64. .def    megnyomva1      = r21           ; állapotgépben btn1
  65.  
  66. ;*****************************************************************************
  67. ;* Reset & IT vektorok  
  68. ;*****************************************************************************
  69.                
  70.                 .cseg
  71.                
  72.                 .org    0x0000          ; Kódszegmens kezdőcíme
  73.        
  74.                 jmp             main            ; Reset vektor
  75.                 jmp             dummy           ; EXTINT0 Handler
  76.                 jmp             dummy           ; EXTINT1 Handler
  77.                 jmp             dummy           ; EXTINT2 Handler
  78.                 jmp             dummy           ; EXTINT3 Handler
  79.                 jmp             dummy           ; EXTINT4 Handler (INT gomb)
  80.                 jmp             dummy           ; EXTINT5 Handler
  81.                 jmp             dummy           ; EXTINT6 Handler
  82.                 jmp             dummy           ; EXTINT7 Handler
  83.                 jmp             dummy           ; Timer2 Compare Match Handler
  84.                 jmp             dummy           ; Timer2 Overflow Handler
  85.                 jmp             dummy           ; Timer1 Capture Event Handler
  86.                 jmp             dummy           ; Timer1 Compare Match A Handler
  87.                 jmp             dummy           ; Timer1 Compare Match B Handler
  88.                 jmp             dummy           ; Timer1 Overflow Handler
  89.                 jmp             t0it            ; Timer0 Compare Match Handler
  90.                 jmp             dummy           ; Timer0 Overflow Handler
  91.                 jmp             dummy           ; SPI Transfer Complete Handler
  92.                 jmp             dummy           ; USART0 RX Complete Handler
  93.                 jmp             dummy           ; USART0 Data Register Empty Hanlder
  94.                 jmp             dummy           ; USART0 TX Complete Handler
  95.                 jmp             dummy           ; ADC Conversion Complete Handler
  96.                 jmp             dummy           ; EEPROM Ready Hanlder
  97.                 jmp             dummy           ; Analog Comparator Handler
  98.                 jmp             dummy           ; Timer1 Compare Match C Handler
  99.                 jmp             dummy           ; Timer3 Capture Event Handler
  100.                 jmp             dummy           ; Timer3 Compare Match A Handler
  101.                 jmp             dummy           ; Timer3 Compare Match B Handler
  102.                 jmp             dummy           ; Timer3 Compare Match C Handler
  103.                 jmp             dummy           ; Timer3 Overflow Handler
  104.                 jmp             dummy           ; USART1 RX Complete Handler
  105.                 jmp             dummy           ; USART1 Data Register Empty Hanlder
  106.                 jmp             dummy           ; USART1 TX Complete Handler
  107.                 jmp             dummy           ; Two-wire Serial Interface Handler
  108.                 jmp             dummy           ; Store Program Memory Ready Handler
  109.        
  110. ;*****************************************************************************
  111. ;* Főprogram
  112. ;*****************************************************************************
  113.                
  114.                 .org    0x0046
  115.  
  116. ;***** Stack inicializálása *****
  117.  
  118. main:   ldi             temp,LOW(RAMEND)        ; RAMEND = RAM végcíme
  119.                 out             SPL,temp                        ; (ld."m128def.inc")
  120.                 ldi             temp,HIGH(RAMEND)
  121.                 out             SPH,temp
  122.  
  123. ;***** Portok inicializálása *****
  124.  
  125.         ;*** PORTC.0-7: LED0-7 ***
  126.  
  127.                 ldi             temp,0b11111111         ; portbitek kimenetek
  128.                 out             DDRC,temp                       ; PORTC kimenet
  129.  
  130.         ;*** PORTG.0,1,3,4: SW 0,1,3,2 ***
  131.  
  132.                 ldi             temp,0b00000000         ; portbitek bemenetek
  133.                 sts             DDRG,temp                       ; PORTG bemenet
  134.                 ldi             temp,0b11111111         ; pull-up engedélyezve
  135.                 sts             PORTG,temp                      ; PORTG bemenetein
  136.  
  137.         ;*** PORTE.5,6: BT0, BT1 ***
  138.  
  139.                 ldi     temp,0xff                               ;PORTE Hi
  140.                 out     PORTE,temp
  141.                 ldi     temp,0x01                               ;Make port E0 out, others input
  142.                 out     DDRE,temp
  143.  
  144. ;***** Timer 0 inicializálása *****
  145.  
  146.                 ldi             temp,0b00001111
  147.                                 ;          0.......             ; FOC=0
  148.                                 ;          .0..1...             ; WGM=10 (CTC mod)
  149.                                 ;          ..00....             ; COM=00 (kimenet tiltva)
  150.                                 ;          .....111             ; CS0=111 (CLK/1024)
  151.                 out             TCCR0,temp                      ; Timer 0 TCCR0 regiszter
  152.                 ldi             temp,108                        ; 11059200Hz/1024 = 108*100
  153.                 out             OCR0,temp                       ; Timer 0 OCR0 regiszter
  154.                 ldi             temp,0b00000010
  155.                                 ;          000000..             ; Timer2,1 IT tiltva
  156.                                 ;          ......1.             ; OCIE0=1
  157.                                 ;          .......0             ; TOIE0=0
  158.                 out             TIMSK,temp                      ; Timer IT Mask regiszter
  159.                 sei                                                     ; globális IT engedélyezve
  160.  
  161. ;***** időalap és állapotgép inicializálása *****
  162.  
  163.                 ldi     idoalap,10                      ; a kezdő időalap 10ms*10ms(IT) = 100ms
  164.                 mov     count,idoalap           ; kezdő időalap beállítása a timernek
  165.                 ldi             megnyomva0,0            ; btn0 nincs lenyomva
  166.                 ldi             megnyomva1,0            ; btn1 sincs lenyomva kezdésnél
  167.  
  168.  
  169. ;*****************************************************************************
  170.  
  171. ;***** BT0 és BT1  beolvasása, és ezek alapján az időalap állítása               *****
  172.                
  173. loop:
  174.                 in              btnstate,PINE           ; nyomógombok állaptának beolvasása
  175.  
  176. megnez_bt0:
  177.  
  178.                 sbrs    btnstate,5                      ; kihagy egy sort ha nem nyomjuk a BT0-át
  179.                 jmp             bt0_nyomva                      ; ugrás ha BT0 nyomva
  180.                 ldi             megnyomva0,0            ; ha nem nyomjuk a gombot, eltároljuk
  181.                 jmp             megnez_bt1                      ; nezni kell a másik gombot
  182.  
  183. bt0_nyomva:
  184.                
  185.                 sbrs    megnyomva0,0            ; kihagy egy sort ha előzőleg is nyomtuk a bt0 gombot
  186.                 jmp             csokkent                        ; uj lenyomás, csokkenteni kell és beállítani a megnyomva0 regisztert
  187.                 jmp             megnez_bt1
  188.  
  189. csokkent:
  190.                
  191.                 ldi             megnyomva0,1            ; beállítjuk, hogy utoljára nyomva volt a gomb (0. bitje így 1 lesz)
  192.                 ldi     temp,10                         ; ennyivel csökkentünk ha lehet
  193.                 cpse    temp,idoalap            ; kihagy egy sort ha már most is 10, ami a minimum
  194.                 sub             idoalap,temp            ; 10-el csökkentjük ha előző sorban még nem volt a minimum
  195.                 jmp             loop                            ; másik gombot feltételezzük hogy nem nyomjuk egyidőben, ezért előről kezdjük a vizsgálatot
  196.  
  197.  
  198. megnez_bt1:
  199.  
  200.                 sbrs    btnstate,6                      ; kihagy egy sort ha nem nyomjuk a BT1-et
  201.                 jmp             bt1_nyomva                      ; ugrás ha BT1 nyomva
  202.                 ldi             megnyomva1,0            ; ha nem nyomjuk a gombot, eltároljuk
  203.                 jmp             loop                            ; előző gombot már néztük, tehát előről kezdjük a vizsgálatot
  204.  
  205. bt1_nyomva:
  206.                
  207.                 sbrs    megnyomva1,0            ; kihagy egy sort ha előzőleg is nyomtuk a bt1 gombot
  208.                 jmp             novel                           ; uj lenyomás, novelni kell és beállítani a megnyomva1 regisztert
  209.                 jmp             loop                            ; mivel már nyomva volt, most semmi dolgunk, nézzük megint a gombokat
  210.  
  211. novel:
  212.                
  213.                 ldi             megnyomva1,1            ; beállítjuk, hogy utoljára nyomva volt a gomb (0. bitje így 1 lesz)
  214.                 cpi             idoalap,150                     ; megnézzük, hogy nem-e 150 már most, mert akkor semmi dolgunk
  215.                 breq    loop                            ; ha egyenlőek, akkor a Z flag 1-es lesz, tehát nem kell növelni, kezdjük újra a vizsgálatot
  216.                 ldi     temp,10                         ; ennyivel növeljük az időalapot ha lehet
  217.                 add             idoalap,temp            ; megnöveljük 10-el az időalapot, mert biztos hogy nem volt még 150
  218.                 jmp             loop                            ; kezdjük újra a vizsgálatot
  219.  
  220.  
  221.  
  222. ;*****************************************************************************
  223. ;* 10 msec Timer IT rutin
  224. ;*****************************************************************************
  225.  
  226.  
  227.  
  228. t0it:   push    temp                            ; segédregiszter mentése
  229.                 in              temp,SREG                       ; státusz mentése
  230.                 push    temp
  231.  
  232.  
  233.                 dec     count                           ; timer számláló csökkentése
  234.                 brne    t0ite                           ; ugrás, ha nem járt le
  235.                 mov             count,idoalap           ; számláló visszaállítása
  236.  
  237.                 in              temp,PORTC                      ; LED állapot beolvasása
  238.                 clc
  239.  
  240.                 rol             temp                            ; LED-ek léptetése előre
  241.                 brcs    t0it1
  242.                 sbr             temp,1
  243.  
  244. t0it1:  out             PORTC,temp                      ; LED-ek beállítása
  245.  
  246. t0ite:  pop             temp                            ; regiszterek visszaállítása
  247.                 out             SREG,temp
  248.                 pop             temp
  249. dummy:  reti
  250.  
  251. ;*****************************************************************************