.nolist
.include "m8def.inc"
.list
.def tmp=R16
;rejestry gdzie laduje argumenty funkcji
.def arg1=R17
.def arg2=R18
;do tch dwoch laduje dwa bajty ktora zciagam ze stosu gdy jestem
;w funkcji
.def highStack = R1
.def lowStack = R2
ldi tmp,HIGH(RAMEND)
out SPH,tmp
ldi tmp,LOW(RAMEND)
out SPL,tmp
ldi tmp,1<<IVCE
out GICR,tmp
ldi tmp,1<<IVSEL
out GICR,tmp
ldi arg1,0x0 ;high UBRR
ldi arg2,0x33 ;low UBRR
;usart
rcall UART_init
;timer
rcall TIMER0_init
;adc
;ADCSRA
ldi tmp,0
;ENABLE FREE STOP INT ENABLE
ldi tmp,(1<<ADEN)|(0<<ADFR)|(1<<ADIE)|(7)
push tmp
;ADMUX
; VREF ADJUST PINY
ldi tmp,0
ldi tmp,(1<<REFS0)|(0<<ADLAR)|(0x3)
push tmp
rcall ADC_init
main:
nop
nop
rjmp main
configure:
RET
ADC_start:
sbi ADCSRA,ADSC
RET
;zmienna na stosie maja tak lezec
;ADMUX
;ADCSRA
ADC_init:
cli
pop highStack
pop lowStack
;zciagam bajt adcsra ze stosu i wrzucam do rejestru
pop tmp
out ADMUX,tmp
;zciagam bajt admux ze storu i wrzucam do rejestru
pop tmp
out ADCSRA,tmp
push lowStack
push highStack
sei
RET
TIMER0_init:
cli
;maska przerwan
ldi tmp,(1<<TOIE0)
out TIMSK,tmp
;prescaler
ldi tmp,5;tutaj ustawiam szybkosc
out TCCR0,tmp
sei
RET
UART_init:
;UMSEL w UCSRC synchr(1)/asynchr
;U2X w UCSRC double speed asynchr
;DDR_XCK(rejestr) w kontroluje czy zegar
;jest wewn czy z zewnatrz doprowadzany
;UBRR ma byc 51 , do UBRRL wpisuje 0x33
;UCSZ2:0 ilosc bitow danych
;UPM1:0 ustawienia bitu parzystosci
;USBS wyborm miedzy jednym a dwoma bitami stopu
cli
;ustawiam UBRR(prescaler)
out UBRRH,arg1
out UBRRL,arg2
;wlaczam transmiter i receiver
ldi tmp,(1<<TXEN)|(1<<TXCIE)
out UCSRB,tmp;
;ustawiam format ramki 2 bity stopu i 8 bitow danych
ldi tmp,(1<<URSEL)|(1<<USBS)|(3<<UCSZ0)
out UCSRC,tmp
sei
RET
UART_send:
pooling:
sbis UCSRA,UDRE
rjmp pooling
out UDR,arg1
RET
USART_TXC:
sbi DDRB,PB1
sbi PORTB,PB1
RETI
TIMER0_OVF:
nop
nop
rcall ADC_start
RETI
ADC_COMPLETE:
nop
nop
nop
ldi arg1,ADCL
ldi tmp,ADCH
rcall UART_send
RETI
;Skoki do procedur obslugujacych przerwania
.org 0xc09
rjmp TIMER0_OVF
.org 0xc0d
rjmp USART_TXC
.org 0xc0e
rjmp ADC_COMPLETE