#include <ATmega8535.h>
.include "m8535def.inc" ; Prohibits use of non-implemented instructions (ATmega8535)
#define XTAL 11059200
#define USART_BAUD 19200
#define _UBBR(_X,_X_BAUD) ((_X/(16*_X_BAUD))-1)
#message "_UBBR ==" (_UBBR(XTAL, USART_BAUD))
#define PARITY_NONE 0
#define PARITY_EVEN (1<<UPM1)
#define PARITY_ODD ((1<<UPM1)|(1<<UPM0))
#define STOP_BITS_1 0
#define STOP_BITS_2 (1<<USBS)
#define DATA_BITS_5 0
#define DATA_BITS_6 (1<<UCSZ0)
#define DATA_BITS_7 (1<<UCSZ1)
#define DATA_BITS_8 ((1<<UCSZ1)|(1<<UCSZ0))
#define DATA_BITS_9 ((1<<UCSZ2)|(1<<UCSZ1)|(1<<UCSZ0))
.equ RAMSTART=0x0060 ; 96 bytes I/O before.
.def FalseOrZero = r13
.def TrueOrOne = r14
.def DataByte = r16
.def TempA = r17
.def TempB = r18
#define X x
#define Y y
#define Z z
#define LOW low
#define HIGH high
.cseg
;————————————————————————————————————————————————————————————
.org $00 ; Reset Handle
rjmp RESET
;————————————————————————————————————————————————————————————
.org INT0addr ; External Interrupt0 Handle
reti
; rjmp EXT_INT0
;————————————————————————————————————————————————————————————
.org INT1addr ; External Interrupt1 Handle
reti
; rjmp EXT_INT1
;————————————————————————————————————————————————————————————
.org OC2addr ; Output Compare2 (Timer/Counter2 Compare Match) Interrupt Handle
reti
; rjmp TIM2_COMP
;————————————————————————————————————————————————————————————
.org OVF2addr ; Timer/Counter2 Overflow Interrupt Handle
reti
; rjmp TIM2_OVR ; --> Timer2ovr.asm
;————————————————————————————————————————————————————————————
.org ICP1addr ; Input Capture1 (Timer/Counter1 Capture Event) Interrupt Handle
reti
; rjmp TIMER1_CAPT
;————————————————————————————————————————————————————————————
.org OC1Aaddr ; Output Compare1A (Timer/Counter1 Compare Match A)Interrupt Handle
reti
; rjmp TIM1_COMPA
;————————————————————————————————————————————————————————————
.org OC1Baddr ; Output Compare1B (Timer/Counter1 Compare Match B) Interrupt Handle
reti
; rjmp TIM1_COMPB
;————————————————————————————————————————————————————————————
.org OVF1addr ; Timer/Counter1 Overflow Interrupt Handle
reti
; rjmp TIM1_OVR
;————————————————————————————————————————————————————————————
.org OVF0addr ; Timer/Counter0 Overflow Interrupt Handle
reti
; rjmp TIM0_OVR ; --> Timer0ovr.asm
;————————————————————————————————————————————————————————————
.org SPIaddr ; SPI (Serial Transfer Complete) Interrupt Handle
reti
; rjmp SPI_STC
;————————————————————————————————————————————————————————————
.org URXCaddr ; USART Receive Complete Interrupt Handle
reti
; rjmp USART_RXC
;————————————————————————————————————————————————————————————
.org UDREaddr ; USART Data Register Empty Interrupt Handle
reti
; rjmp USART_DDRE
;————————————————————————————————————————————————————————————
.org UTXCaddr ; USART Transmit Complete Interrupt Handle
reti
; rjmp USART_TXC
;————————————————————————————————————————————————————————————
.org ADCCaddr ; ADC Conversion Complete Interrupt Handle
reti
; rjmp ADC_COMPL
;————————————————————————————————————————————————————————————
.org ERDYaddr ; EEPROM Ready Interrupt Handle
reti
; rjmp EE_RDY
;————————————————————————————————————————————————————————————
.org ACIaddr ; Analog Comparator Interrupt Handle
reti
; rjmp ANA_COMP
;————————————————————————————————————————————————————————————
.org TWIaddr ; Irq. Handle for Two-Wire Interface
reti
; rjmp TWSI
;————————————————————————————————————————————————————————————
.org INT2addr ; External Interrupt2 Handle
reti
; rjmp EXT_INT2
;————————————————————————————————————————————————————————————
.org OC0addr ; Output Compare0 Interrupt Handle (Timer/Counter0 Compare Match)
reti
; rjmp TIM0_COMP
;————————————————————————————————————————————————————————————
.org SPMRaddr ; SPM complete (Store Program memory Ready) Interrupt Handle
reti
; rjmp SPM_RDY
;————————————————————————————————————————————————————————————
.dseg
.org RAMSTART
.cseg
.macro LoadZ_LpmAddr
ldi ZL, low(@0<<1) ; Load Z register low
ldi ZH, high(@0<<1) ; Load Z register high
.endmacro
HexAToAB:
mov TempB, TempA
swap TempA
cbr TempA, 0xF0
cpi TempA, 0x0A
brcc TempAGt10
subi TempA, -0x30
rjmp HexTempB
TempAGt10:
subi TempA, -0x37 ; AddByte = 0x37 for adding 0x0A-0x0F
HexTempB:
cbr TempB, 0xF0
cpi TempB, 0x0A
brcc TempBGt10
subi TempB, -0x30
ret
TempBGt10:
subi TempB, -0x37 ; AddByte = 0x37 for adding 0x0A-0x0F
ret
InitRS232:
;———————————Outputs———————————————
ldi DataByte, HIGH(_UBBR(XTAL, USART_BAUD))
out UBRRH, DataByte
ldi DataByte, LOW(_UBBR(XTAL, USART_BAUD))
out UBRRL, DataByte
; - - - - - - - - - - - - - - - -
ldi DataByte, 1<<URSEL|DATA_BITS_8|PARITY_NONE|STOP_BITS_1
out UCSRC, DataByte
; - - - - - - - - - - - - - - - -
sbi UCSRB, TXEN ; Transmitter On
; - - - - - - - - - - - - - - - -
ret
.dseg
bTxBuff:
.byte 0x01
lpSendFlshTxt:
.byte 0x02
DigTxBuff:
.byte 0x04
cDigTxBuff:
.byte 0x01
lpSendDigTxt:
.byte 0x02
.cseg
USARTTxFlshTxtInit:
sts bTxBuff, TrueOrOne
sts lpSendFlshTxt, ZL
sts lpSendFlshTxt+1, ZH
sts cDigTxBuff, FalseOrZero
ret
USARTTxFlshDebgTxt:
sbis UCSRA, UDRE
rjmp USARTTxFlshTxtEnd
lds TempA, bTxBuff
tst TempA
breq USARTTxFlshTxtEnd
lds TempA, cDigTxBuff
tst TempA
breq USARTTxFlshNext
;- - - - - - - - - - - - - - - - - - -
lds XL, lpSendDigTxt
lds XH, lpSendDigTxt+1
ld DataByte, X+
out UDR, DataByte
dec TempA
sts lpSendDigTxt, XL
sts lpSendDigTxt+1, XH
sts cDigTxBuff, TempA
rjmp USARTTxFlshTxtEnd
;- - - - - - - - - - - - - - - - - - -
USARTTxFlshNext:
lds ZL, lpSendFlshTxt
lds ZH, lpSendFlshTxt+1
lpm DataByte, Z+
tst DataByte ; Zero - end of string
breq USARTTxBadOrEndFlshData
;- - - - - - - - - - - - - - - - - - -
USARTTxFlshTstHex:
cpi DataByte, 0x24 ; "$"
brne USARTTxFlshTxt
;- - - - - - - - - - - - - - - - - - -
lpm DataByte, Z+
cpi DataByte, 0x24 ; "$"
breq USARTTxFlshTxt ; double "$" means one...
;- - - - - - - - - - - - - - - - - - -
sbr DataByte, 0x20 ; ASCII higher to lower...
cpi DataByte, 0x73 ; "s" - means SRAM Data
breq USARTTxFlshSendSRAMHex
USARTTxBadOrEndFlshData:
sts bTxBuff, FalseOrZero
rjmp USARTTxFlshTxtEnd
;- - - - - - - - - - - - - - - - - - -
USARTTxFlshSendSRAMHex:
lpm XL, Z+
lpm XH, Z+
ld TempA, X+
rcall HexAToAB
out UDR, TempA
sts DigTxBuff, TempB
ldi TempA, LOW(DigTxBuff)
sts lpSendDigTxt, TempA
ldi TempA, HIGH(DigTxBuff)
sts lpSendDigTxt+1, TempA
sts cDigTxBuff, TrueOrOne
rjmp USARTTxFlshStoreZ
;- - - - - - - - - - - - - - - - - - -
USARTTxFlshTxt:
out UDR, DataByte
USARTTxFlshStoreZ:
sts lpSendFlshTxt, ZL
sts lpSendFlshTxt+1, ZH
USARTTxFlshTxtEnd:
ret
InitSRAM:
in XL, SPL
in XH, SPH
cli
ld TempA, X+ ; inc XL:XH
InitSRAMClr:
st -X, FalseOrZero
InitSRAMLo:
cpi XL, LOW(RAMSTART)
brne InitSRAMClr
InitSRAMHi:
cpi XH, HIGH(RAMSTART)
brne InitSRAMClr
InitSRAMEnd:
sei
ret
TxtDebugKey:
.db "TestVariable == 0x$s", LOW(TestVariable), HIGH(TestVariable)
.db " ", 13, 0
RESET:
;Proc InitStack()
InitStack:
; It must be not to be a subroutine, because must
; be stack point initialised before call it
; Inicialise Stack Point - push decrement it, pop increment
clr FalseOrZero ; fast Access Bool logic FALSE register
ldi TempA, 1
mov TrueOrOne, TempA ; fast Access Bool logic TRUE register
ldi TempA, HIGH(RAMEND)
out SPH, TempA
ldi TempA, LOW(RAMEND)
out SPL, TempA
rcall InitSRAM ; ——> sRAM.asm
rcall InitRS232 ; ——> RS232.asm
.dseg
TestVariable:
.byte 0x01
.cseg
sei
MainProc:
rcall USARTTxFlshDebgTxt ; ——> RS232.asm
lds TempB, bTxBuff
tst TempB
brne MainProc
lds DataByte, TestVariable ; TestVariable
inc DataByte
sts TestVariable, DataByte ; TestVariable
; - - - - - - - - - - - - - - - -
LoadZ_LpmAddr TxtDebugKey
rcall USARTTxFlshTxtInit
rjmp MainProc