На будущее учту рекомендации по работе с UART'ом, но сей час вставляю код в том виде, в каком он имеется на данный момент:
; Test6 - при нажатии на К1 (РВ0) включает светодиод. При отжимании кнопки светодиод выключается.
; При нажатии на кнопку К2 (РВ1) посылает по UART'у команду "ATS0F=FFFF<CR>", которая
; включает все лампочки.
;;; Список регистров и переменных.
.def temp =r16 ;
.def flags =r17
.equ tx_init_addrl = 0x60 ; адрес начала RAM для передачи
.equ tx_init_addrh = 0x00
.equ rx_init_addrl = 0x60 ; адрес начала RAM для приема
.equ rx_init_addrh = 0x2
.equ fk2 =0 ; флаг кнопки К2
;;; Список выводов порта В
.equ k1 =0 ; кнопка К1
.equ k2 =1 ; кнопка К2
;;; Список выводов порта С
.equ led =0 ; светодиод
.include "m8def.inc"
.dseg
.org 0x60
.db 65,84,83,48,70,61,70,70,70,70,13
; A T S 0 F = F F F F <CR>
; векторы прерываний
.cseg
rjmp RESET ; Reset Handler
rjmp EXT_INT0 ; IRQ0 Handler
rjmp EXT_INT1 ; IRQ1 Handler
rjmp TIM2_COMP ; Timer2 Compare Handler
rjmp TIM2_OVF ; Timer2 Overflow Handler
rjmp TIM1_CAPT ; Timer1 Capture Handler
rjmp TIM1_COMPA ; Timer1 Compare A Handler
rjmp TIM1_COMPB ; Timer1 Compare B Handler
rjmp TIM1_OVF ; Timer1 Overflow Handler
rjmp TIM0_OVF ; Timer0 Overflow Handler
rjmp SPI_STC ; SPI Transfer Complete Handler
rjmp USART_RXC ; USART, RX Complete Handler
rjmp USART_UDRE ; USART, UDR Empty Handler
rjmp USART_TXC ; USART, TX Complete Handler
rjmp ADCC ; ADC Conversion Complete
rjmp EE_RDY ; EEPROM Ready Handler
rjmp ANA_COMP ; Analog Comparator Handler
rjmp TWI ; 2-wire Serial Interface
rjmp SPM_RDY ; Store Program Memory Ready
;;;;;;;; начало основной программы
RESET:
cli ; запретить прерывания
clr temp ; обнулить регистры
clr flags
; инициализация порта С
ldi temp, 0b00000001
out DDRC,temp ; PC0 - выход, остальные - входы
ldi temp, 0b11111110
out PORTC,temp ; выходы - 0, входы - на подтягивающий резистор
; инициализация порта B
ldi temp, 0b00000000
out DDRB,temp ; все входы
ldi temp, 0b11111100
out PORTB,temp ; РВ0 - K1, РВ1 - K2, остальные - на подтягивающий резистор
; настройка USART
; прерывание по завершении приема, приемник включен, передатчик выключен
; асинхронный режим, 1 стоп-бит, нет проверки четности
clr temp
out UCSRA, temp
ldi temp, 0b10010000
out UCSRB, temp
ldi temp, 0b10000110
out UCSRC, temp
; определение скорости передачи - 19200 бит/с
; частота генератора - 8МГц; без удвоения
ldi temp, 0
out UBRRH, temp
ldi temp, 25
out UBRRL, temp
sei ; разрешить прерывания
; Проверка состояния кнопки
button_check:
sbis PINB, k1 ; если кнопка K1 не нажата, то перейти к button_k1_off
rjmp button_k1_off
; Если кнопка K1 нажата:
nop
sbi PORTC, led
rjmp button_check
; Если кнопка K1 не нажата:
button_k1_off:
cbi PORTC, led ; выключить светодиод
sbic PINB, k2 ; если К2 нажата, то перейти к k2_on
rjmp k2_on
nop ; иначе
sbrc flags, fk2 ; проверить флаг К2. Если установлен, то снять
cbr flags, 0b00000001
nop ; иначе перейти к проверке кнопок
rjmp button_check
; Если К2 нажата
k2_on:
sbrc flags, fk2 ; проверить флаг К2. Если установлен, то
rjmp button_check ; перейти к проверке кнопок
nop
sbr flags, 0b00000001 ; установить флаг К2
ldi XL, tx_init_addrl ; задать адрес начала команды для передачи по UART'у
ldi XH, tx_init_addrh ;
rcall transmit ; передать команду по UART'у
rjmp button_check ; перейти к проверке кнопок
; Подпрограмма передачи команды по UART'у
transmit:
sbi UCSRB, TXEN ; включить передатчик
sbi UCSRA, UDRE ; поднять флаг USART Data Register Empty
wait_for_tr:
sbis UCSRA, UDRE
rjmp wait_for_tr
nop
ld temp, X+ ; прочитать данные из RAM в переменную temp
tst temp ; если команда закончилась, то на выход
; cpi temp, 0xff
breq transm_out
; cpi temp, 65
; breq fl
fl_out:
out UDR, temp ; отправить данные в UART
rjmp wait_for_tr ; вернуться в начало для передачи следующего символа
transm_out:
; sbi PORTC, led
cbi UCSRB, TXEN ; выключить передатчик
ret
;fl:
; sbi PORTC, led
; ldi r18, 0xff
;on:
; tst r18
; breq off
; nop
; nop
; nop
; dec r18
; rjmp on
;off:
; cbi PORTC, led
; rjmp fl_out
; Подпрограмма чтения из EEPROM
;eeprom_read:
; cli ; отключить прерывания
;wait_eepr:
; sbic EECR,EEWE ; ждать, пока не закончится запись в EEPROM
; rjmp wait_eepr
; out EEARH, eaddrh ; задать адрес данных
; out EEARL, eaddrl
; sbi EECR,EERE ; разрашить чтение
; in temp,EEDR ; записать данные в temp
; sei ; включить прерывания
; ret
; Подпрограмма записи в EEPROM
;eeprom_write:
; cli ; отключить прерывания
;wait_eepr1:
; sbic EECR,EEWE ; ждать, пока не закончится запись в EEPROM
; rjmp wait_eepr1
; out EEARH, eaddrh ; задать адрес данных
; out EEARL, eaddrl
; out EEDR,temp ; загрузить данные из temp в регистр EEPROM
; sbi EECR,EEMWE ; разрешить запить в EEPROM
; sbi EECR,EEWE ; записать в EEPROM
; sei ; включить прерывания
; ret
USART_RXC:
sbi PORTC, led
in r19, UDR
nop
nop
nop
nop
nop
cbi PORTC, led
reti
;;;;;;;;; конец основной программы
; игнорирование неиспользуемых прерываний
; RESET: ; Reset Handler
EXT_INT0: ; IRQ0 Handler
EXT_INT1: ; IRQ1 Handler
TIM2_COMP: ; Timer2 Compare Handler
TIM2_OVF: ; Timer2 Overflow Handler
TIM1_CAPT: ; Timer1 Capture Handler
TIM1_COMPA: ; Timer1 Compare A Handler
TIM1_COMPB: ; Timer1 Compare B Handler
TIM1_OVF: ; Timer1 Overflow Handler
TIM0_OVF: ; Timer0 Overflow Handler
SPI_STC: ; SPI Transfer Complete Handler
; USART_RXC: ; USART, RX Complete Handler
USART_UDRE: ; USART, UDR Empty Handler
USART_TXC: ; USART, TX Complete Handler
ADCC: ; ADC Conversion Complete
EE_RDY: ; EEPROM Ready Handler
ANA_COMP: ; Analog Comparator Handler
TWI: ; 2-wire Serial Interface
SPM_RDY: ; Store Program Memory Ready
reti
Перемычку прошил только fcksel=4, остальные вроде должны остаться по дефолту.
-
- И еще: из прерывания по завершении приема программа по UART'у как в симуляторе, так и в реальном контроллере возвращается не обратно в то место, где случилось прерывание, а в самое начало программной памяти. Т.е. после каждого принятого по UART'у байта SVladimirU(24 знак., 01.08.2009 18:46, )
- В твоем коде так много тараканов, что сразу и не осилить. Подробно отпишу попозже, а "ресетится" твой контроллер из-за того, что ты указатель стека не инициализировал - MBedder(01.08.2009 19:21)
- Указатель стека помог, теперь не ресетится :) SVladimirU(122 знак., 01.08.2009 20:05, )
- В твоем коде так много тараканов, что сразу и не осилить. Подробно отпишу попозже, а "ресетится" твой контроллер из-за того, что ты указатель стека не инициализировал - MBedder(01.08.2009 19:21)
- И еще: из прерывания по завершении приема программа по UART'у как в симуляторе, так и в реальном контроллере возвращается не обратно в то место, где случилось прерывание, а в самое начало программной памяти. Т.е. после каждого принятого по UART'у байта SVladimirU(24 знак., 01.08.2009 18:46, )