1. Через UART с компьютера происходит передача запускающего байта, затем ещё двух байтов конфигурационных и одного, означающего окончание передачи конфигурационных данных. Пока конфигурационные данные - это число измерений и число в младшем регистре сравнения таймера-счётчика 1.
2. Как только МК получил данные, запускается чтение порта С заданное количество раз с заданным интервалом и сохранение данных в память.
3. Когда чтение завершилось, происходит передача данных из памяти на компьютер с помощью UART.
Собственно, программа написанна и работает, естественно, не так, как надо. И первое, что меня очень смущает- это сообщения "Uninitialized stack pointer used at ...." при попытке пошагового запуска в AVR Studio.
Вот текст программы:
Код: Выделить всё
.include "m128def.inc"
.equ baudrate=4000000/(16*9600)-1
.def temp=R16
.def count=R17
.def count2=R18
.def temp2=R19
.def user_conf=R20
.MACRO ldm
ldi temp, @1
out @0, temp
.ENDM
.MACRO lmm
ldi temp, @1
sts @0, temp
.ENDM
.MACRO ldx
ldi XH, high(@0)
ldi XL, low(@0)
.ENDM
.dseg
conf_array: .byte 3
data_array: .byte 16
.cseg
.org 0
rjmp reset
.org $18
rjmp read_port
.org $24
rjmp recieve_conf
.org $26
rjmp send_data
.org $50
reset:
ldm TCCR1B, (1<<WGM12|1<<CS10) ;прерывание по совпадению, без пределителя
ldm UCSR0B, (1<<RXEN0|1<<TXEN0|1<<RXCIE0) ;включить передачу и приём, разрешить прерывание по приёму
lmm UCSR0C, (0<<USBS0|1<<UCSZ00|1<<UCSZ01) ;тип передачи
ldm UBRR0L, baudrate ;установка скорости
ldm SPH, high(ramend) ;ИНИЦИАЛИЗАЦИЯ СТЕКА
ldm SPL, low(ramend)
defaults: ;параметры по умолчанию
ldi temp2,0
ldi count, 2
ldx conf_array ;указатель Х на массив конфигурации
ldi user_conf,0
ldi count2, 0x00
clt
sei
main:
brts get_data ;если Т установлен - перейти к получению данных
sbrs user_conf,2
rjmp main
rjmp defaults
read_port: ;функция получения данных (запуск по прерыванию)
in temp, PORTC
st X+, temp ;запись в массив данных с порта
dec count2
breq stop_reading
reti
stop_reading:
ldm TIMSK, (0<<OCIE1A) ;запрет прерываний по слвпадению таймера
ldx data_array ;в указатель X - начало массива данных
sbi UCSR0B,UDRIE0 ;разрешить прерывание по опустошению буфера
ldm UDR0, 0xFF ;передатать число
reti
send_data: ;функция передачи массива
ld temp, X+
out UDR0, temp ;посылка элемента массива
dec temp2 ;декриментация счётчика
breq stop_sending ;если дошёл до 0 - перестать отправлять
reti
stop_sending: ;для того, чтоб перестать отправлять
cbi UCSR0B, UDRIE0 ;запретим прерывание по опустошению
sbrs user_conf,2
reti
recieve_conf: ;функция получения конфигурации
in temp, UDR0 ;получить данные из UART
cpi user_conf, 0x01 ;проверить, установлен ли бит 1 регистра user_conf
breq store_conf ;установлен - перейти к приёму информации
cpi temp, 0x20 ;проверка включающего бита
;sez
breq set_bit_in_user_conf ;если пришёл - уствновить бит 1 ругистра user_conf
reti
store_conf: ;приём информации
st X+, temp ;запись в массив
dec count
breq clear_bit_in_user_conf ;если count=0 - сброс бита 1 регистра user_conf
reti
set_bit_in_user_conf: ;установка
ldi user_conf,0x01
reti
clear_bit_in_user_conf:;сброс
cbr user_conf,1
set ;установка пользовательского флага Т
reti
get_data: ;функция чтения порта
clt ;сбросить пользовательский флаг Т
ldx conf_array ;указатель Х на начало массива конфигурации
;ld count2, X+ ;запись количества измерений
ldi count2, 0x10
mov temp2, count2 ;продублировать
ld temp, X+
;out OCR1AL,temp ;запись временного интервала
ldm OCR1AL, 0xFF
ldx data_array ;указатель на массив данных
ldm TIMSK, (1<<OCIE1A) ;разрешить прерывание по совпадению
ret

