;**************************************************************************************************************************
;**************************************************************************************************************************
;** Projekt: MeresLabor2: 3. mérés Házi feladat **
;** Leírás: **
;** **
;** Futófény megvalósítása LED-eken (sorban felgyullad az összes LED, majd az elsőtől kezdve egyenként kialszanak). **
;** 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). **
;** BT0 egyszeri megnyomása növeli, BT1 egyszeri megnyomása csökkenti a futófény sebességét 100ms-mal. **
;** Az időzítés időzítő segítségével történjen. **
;** Vigyázat: 1 megnyomásra (bármilyen hosszú is az) csak egy irányváltás legyen! **
;** A nyomógomb pergésmentesítésével nem kell foglalkozni! **
;** **
;** Szerző: Szabó Bálint **
;** Mérőcsoport: 1 **
;** Készült: 2010. március 16. **
;**************************************************************************************************************************
;**************************************************************************************************************************
;
;*****************************************************************************
;* AVR mérőpanel portkiosztás:
;*****************************************************************************
;*
;* LED0(P):PortC.0 LED4(P):PortC.4
;* LED1(P):PortC.1 LED5(P):PortC.5
;* LED2(S):PortC.2 LED6(S):PortC.6
;* LED3(Z):PortC.3 LED7(Z):PortC.7 INT:PortE.4
;*
;* SW0:PortG.0 SW1:PortG.1 SW2:PortG.4 SW3:PortG.3
;*
;* BT0:PortE.5 BT1:PortE.6 BT2:PortE.7 BT3:PortB.7
;*
;*****************************************************************************
;*
;* AIN:PortF.0 NTK:PortF.1 OPTO:PortF.2 POT:PortF.3
;*
;*****************************************************************************
;*
;* LCD1(VSS) = GND LCD9(DB2): -
;* LCD2(VDD) = VCC LCD10(DB3): -
;* LCD3(VO ) = GND LCD11(DB4): PortA.4
;* LCD4(RS ) = PortA.0 LCD12(DB5): PortA.5
;* LCD5(R/W) = GND LCD13(DB6): PortA.6
;* LCD6(E ) = PortA.1 LCD14(DB7): PortA.7
;* LCD7(DB0) = - LCD15(BLA): VCC
;* LCD8(DB1) = - LCD16(BLK): PortB.5 (1=Háttérvilágítás ON)
;*
;*****************************************************************************
.nolist
.include "m128def.inc" ; ATMega 128 definíciós fájl
.list
;***** Konstansok *****
;.equ tconst = 150 ; időzítési konstans (T = 150*10 msec)
;***** Regiszterkiosztás *****
.def temp = r16 ; ált. segédregiszter
.def megnyomva0 = r17 ; állapotgépben btn0
.def idoalap = r18 ; Az időalapot tároló regiszter
.def btnstate = r19 ; nyomógombok állapotát tárolja
.def count = r20 ; másodlagos segédregiszter a timerhez
.def megnyomva1 = r21 ; állapotgépben btn1
;*****************************************************************************
;* Reset & IT vektorok
;*****************************************************************************
.cseg
.org 0x0000 ; Kódszegmens kezdőcíme
jmp main ; Reset vektor
jmp dummy ; EXTINT0 Handler
jmp dummy ; EXTINT1 Handler
jmp dummy ; EXTINT2 Handler
jmp dummy ; EXTINT3 Handler
jmp dummy ; EXTINT4 Handler (INT gomb)
jmp dummy ; EXTINT5 Handler
jmp dummy ; EXTINT6 Handler
jmp dummy ; EXTINT7 Handler
jmp dummy ; Timer2 Compare Match Handler
jmp dummy ; Timer2 Overflow Handler
jmp dummy ; Timer1 Capture Event Handler
jmp dummy ; Timer1 Compare Match A Handler
jmp dummy ; Timer1 Compare Match B Handler
jmp dummy ; Timer1 Overflow Handler
jmp t0it ; Timer0 Compare Match Handler
jmp dummy ; Timer0 Overflow Handler
jmp dummy ; SPI Transfer Complete Handler
jmp dummy ; USART0 RX Complete Handler
jmp dummy ; USART0 Data Register Empty Hanlder
jmp dummy ; USART0 TX Complete Handler
jmp dummy ; ADC Conversion Complete Handler
jmp dummy ; EEPROM Ready Hanlder
jmp dummy ; Analog Comparator Handler
jmp dummy ; Timer1 Compare Match C Handler
jmp dummy ; Timer3 Capture Event Handler
jmp dummy ; Timer3 Compare Match A Handler
jmp dummy ; Timer3 Compare Match B Handler
jmp dummy ; Timer3 Compare Match C Handler
jmp dummy ; Timer3 Overflow Handler
jmp dummy ; USART1 RX Complete Handler
jmp dummy ; USART1 Data Register Empty Hanlder
jmp dummy ; USART1 TX Complete Handler
jmp dummy ; Two-wire Serial Interface Handler
jmp dummy ; Store Program Memory Ready Handler
;*****************************************************************************
;* Főprogram
;*****************************************************************************
.org 0x0046
;***** Stack inicializálása *****
main: ldi temp,LOW(RAMEND) ; RAMEND = RAM végcíme
out SPL,temp ; (ld."m128def.inc")
ldi temp,HIGH(RAMEND)
out SPH,temp
;***** Portok inicializálása *****
;*** PORTC.0-7: LED0-7 ***
ldi temp,0b11111111 ; portbitek kimenetek
out DDRC,temp ; PORTC kimenet
;*** PORTG.0,1,3,4: SW 0,1,3,2 ***
ldi temp,0b00000000 ; portbitek bemenetek
sts DDRG,temp ; PORTG bemenet
ldi temp,0b11111111 ; pull-up engedélyezve
sts PORTG,temp ; PORTG bemenetein
;*** PORTE.5,6: BT0, BT1 ***
ldi temp,0xff ;PORTE Hi
out PORTE,temp
ldi temp,0x01 ;Make port E0 out, others input
out DDRE,temp
;***** Timer 0 inicializálása *****
ldi temp,0b00001111
; 0....... ; FOC=0
; .0..1... ; WGM=10 (CTC mod)
; ..00.... ; COM=00 (kimenet tiltva)
; .....111 ; CS0=111 (CLK/1024)
out TCCR0,temp ; Timer 0 TCCR0 regiszter
ldi temp,108 ; 11059200Hz/1024 = 108*100
out OCR0,temp ; Timer 0 OCR0 regiszter
ldi temp,0b00000010
; 000000.. ; Timer2,1 IT tiltva
; ......1. ; OCIE0=1
; .......0 ; TOIE0=0
out TIMSK,temp ; Timer IT Mask regiszter
sei ; globális IT engedélyezve
;***** időalap és állapotgép inicializálása *****
ldi idoalap,10 ; a kezdő időalap 10ms*10ms(IT) = 100ms
mov count,idoalap ; kezdő időalap beállítása a timernek
ldi megnyomva0,0 ; btn0 nincs lenyomva
ldi megnyomva1,0 ; btn1 sincs lenyomva kezdésnél
;*****************************************************************************
;***** BT0 és BT1 beolvasása, és ezek alapján az időalap állítása *****
loop:
in btnstate,PINE ; nyomógombok állaptának beolvasása
megnez_bt0:
sbrs btnstate,5 ; kihagy egy sort ha nem nyomjuk a BT0-át
jmp bt0_nyomva ; ugrás ha BT0 nyomva
ldi megnyomva0,0 ; ha nem nyomjuk a gombot, eltároljuk
jmp megnez_bt1 ; nezni kell a másik gombot
bt0_nyomva:
sbrs megnyomva0,0 ; kihagy egy sort ha előzőleg is nyomtuk a bt0 gombot
jmp csokkent ; uj lenyomás, csokkenteni kell és beállítani a megnyomva0 regisztert
jmp megnez_bt1
csokkent:
ldi megnyomva0,1 ; beállítjuk, hogy utoljára nyomva volt a gomb (0. bitje így 1 lesz)
ldi temp,10 ; ennyivel csökkentünk ha lehet
cpse temp,idoalap ; kihagy egy sort ha már most is 10, ami a minimum
sub idoalap,temp ; 10-el csökkentjük ha előző sorban még nem volt a minimum
jmp loop ; másik gombot feltételezzük hogy nem nyomjuk egyidőben, ezért előről kezdjük a vizsgálatot
megnez_bt1:
sbrs btnstate,6 ; kihagy egy sort ha nem nyomjuk a BT1-et
jmp bt1_nyomva ; ugrás ha BT1 nyomva
ldi megnyomva1,0 ; ha nem nyomjuk a gombot, eltároljuk
jmp loop ; előző gombot már néztük, tehát előről kezdjük a vizsgálatot
bt1_nyomva:
sbrs megnyomva1,0 ; kihagy egy sort ha előzőleg is nyomtuk a bt1 gombot
jmp novel ; uj lenyomás, novelni kell és beállítani a megnyomva1 regisztert
jmp loop ; mivel már nyomva volt, most semmi dolgunk, nézzük megint a gombokat
novel:
ldi megnyomva1,1 ; beállítjuk, hogy utoljára nyomva volt a gomb (0. bitje így 1 lesz)
cpi idoalap,150 ; megnézzük, hogy nem-e 150 már most, mert akkor semmi dolgunk
breq loop ; ha egyenlőek, akkor a Z flag 1-es lesz, tehát nem kell növelni, kezdjük újra a vizsgálatot
ldi temp,10 ; ennyivel növeljük az időalapot ha lehet
add idoalap,temp ; megnöveljük 10-el az időalapot, mert biztos hogy nem volt még 150
jmp loop ; kezdjük újra a vizsgálatot
;*****************************************************************************
;* 10 msec Timer IT rutin
;*****************************************************************************
t0it: push temp ; segédregiszter mentése
in temp,SREG ; státusz mentése
push temp
dec count ; timer számláló csökkentése
brne t0ite ; ugrás, ha nem járt le
mov count,idoalap ; számláló visszaállítása
in temp,PORTC ; LED állapot beolvasása
clc
rol temp ; LED-ek léptetése előre
brcs t0it1
sbr temp,1
t0it1: out PORTC,temp ; LED-ek beállítása
t0ite: pop temp ; regiszterek visszaállítása
out SREG,temp
pop temp
dummy: reti
;*****************************************************************************