ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
21 ноября
162654 Топик полностью
SVladimirU (01.08.2009 15:23, просмотров: 1) ответил MBedder на "Пустых" байтов не бывает - что запишешь, то и прочитаешь. А если не запишешь - то прочитаешь любую пургу, т.к. МК сам свое ОЗУ при подаче питания никак не инициализирует
На будущее учту рекомендации по работе с 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, остальные вроде должны остаться по дефолту.