Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Uebung3.asm
- *
- * Created: 31.10.2013 15:25:47
- * Author: mt
- */
- .include "ATXmega128A1def.inc"
- .org 0x0000
- rjmp RESET
- .def Temp2=r16;
- .def buzzervar=r17
- .def clocktemp=r19
- RESET:
- //Init IO
- ldi Temp2, PORT_INVEN_bm ; PINnCTRL Bit6 (0100 0000) -> inverted I/O enable, da ansonsten LEDS low-active
- sts PORTB_PIN1CTRL, Temp2
- sts PORTA_PIN7CTRL, Temp2
- sts PORTA_PIN5CTRL, Temp2
- sts PORTA_PIN3CTRL, Temp2
- ldi Temp2,(1<<7)|(1<<5)|(1<<3) ;Port A 1010 1000
- sts PORTA_DIR, Temp2 ;setze Port A als output
- ldi Temp2, (1<<1)
- sts PORTB_DIR, Temp2 ;setze Port B als output
- ldi Temp2, PORT_OPC_PULLUP_gc | PORT_INVEN_bm
- sts PORTB_PIN2CTRL, Temp2 ;für SW1
- sts PORTB_PIN0CTRL, Temp2 ;für SW2
- sts PORTA_PIN6CTRL, Temp2 ;für SW3
- sts PORTA_PIN4CTRL, Temp2 ;für SW4
- ;Buzzer initialisieren
- ldi buzzervar,0x01
- ldi Temp2, 0x03 ;0000 0011
- sts PORTE_DIR, Temp2
- ldi Temp2, 0x01 ;Wert zum toggeln benutzen
- sts PORTE_OUT, Temp2
- LOOP:
- ;überprüfe SW1, SW2, SW3 und SW4 mit IN Register
- lds Temp2, PORTB_IN
- sbrc Temp2, 2 ;überspringe wenn Bit in 2 null ist
- call ALARM1_ON
- lds Temp2, PORTB_IN
- sbrc Temp2, 0 ;für SW2
- call ALARM2_ON
- lds Temp2, PORTA_IN
- sbrc Temp2, 6 ;für SW3
- call SWITCH_TO_EXT_32MHZ
- lds Temp2, PORTA_IN
- sbrc Temp2, 4 ;für SW4
- call ALARMS_OFF
- sbrc buzzervar, 0x01 //schauen ob der Alarm schon aktiv ist
- call BEEP
- rjmp LOOP
- ALARM1_ON:
- ldi buzzervar,0x03
- lds Temp2, PORTB_OUT
- ori Temp2, 0x02 ; or mask 0000 0010
- sts PORTB_OUT, Temp2 ; turns on LED 1
- lds Temp2, PORTA_OUT
- ori Temp2, 0x08 ; or mask 0000 1000
- sts PORTA_OUT, Temp2 ; turns on LED 4
- ret
- ALARM2_ON:
- call BEEP
- lds Temp2, PORTA_OUT
- ori Temp2, (1<<7)|(1<<3)
- sts PORTA_OUT, Temp2
- ret
- ALARMS_OFF:
- ldi buzzervar,0x01
- lds Temp2, PORTB_OUT
- clr Temp2 ; or mask 0000 0010
- sts PORTB_OUT, Temp2 ; turns on LED 1
- lds Temp2, PORTA_OUT
- clr Temp2 ; or mask 0000 1000
- sts PORTA_OUT, Temp2 ; turns on LED 4
- ldi Temp2, 0x01 ;Wert zum toggeln benutzen
- sts PORTE_OUT, Temp2
- ret
- BEEP:
- ldi buzzervar, 0x03
- //TODO: PIN toggeln + Delay
- ldi temp2, 0x03
- sts PORTE_OUTTGL, temp2
- call DELAY
- ret
- DELAY: //Verzögerungsschleife, 255*255
- ldi r20, 0xAA
- DELAY_1:
- ldi r21, 0x01
- DELAY_2:
- dec r21
- brne DELAY_2
- dec r20
- brne DELAY_1
- ret
- SWITCH_TO_EXT_32MHZ:
- //configure XTAL 2-9MHz, 1 KCLK startup
- ldi clocktemp, OSC_XOSCSEL_XTAL_1KCLK_gc | OSC_FRQRANGE_2TO9_gc ;0100 0111
- sts OSC_XOSCCTRL,clocktemp ;external oscillator enable
- //configure PLL (external clock, multiplication factor 4)
- ldi clocktemp, OSC_PLLSRC_XOSC_gc |0x04
- sts OSC_PLLCTRL, clocktemp
- //enable PLL and XTAL
- ldi clocktemp, OSC_PLLEN_bm | OSC_XOSCEN_bm
- sts OSC_CTRL, clocktemp
- SWITCH_TO_EXT_32MHz_1:
- lds r16, OSC_STATUS
- sbrs r16, OSC_PLLRDY_bp
- rjmp SWITCH_TO_EXT_32MHz_1
- //disable change protection
- ldi clocktemp, 0xD8
- sts CPU_CCP, clocktemp
- //seet clock to PLL (with 32MHz)
- ldi clocktemp, CLK_SCLKSEL_XOSC_gc
- sts CLK_CTRL, clocktemp
- ret
- //wait for PLL to be stable
Advertisement
Add Comment
Please, Sign In to add comment