ATmega 128. Проблема с SP

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
aronsky
Родился
Сообщения: 4
Зарегистрирован: Вт ноя 09, 2010 00:23:25
Контактная информация:

ATmega 128. Проблема с SP

Сообщение aronsky »

Пишу программу для логического анализатора на ASM. Пока суть такая:
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 
 
Помогите, пожалуйста, я всю ночь с этой фигнёй возился.
Реклама
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: ATmega 128. Проблема с SP

Сообщение ChipKiller »

... ну а где у Вас строчки с инициализацией стека? .... пардон разглядел :)
надо:
ldi SPH, high(ramend) ;ИНИЦИАЛИЗАЦИЯ СТЕКА
ldi SPL, low(ramend)
Последний раз редактировалось ChipKiller Пн янв 24, 2011 12:32:48, всего редактировалось 2 раза.
Реклама
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: ATmega 128. Проблема с SP

Сообщение ploop »

ldm SPH, high(ramend) ;ИНИЦИАЛИЗАЦИЯ СТЕКА
ldm SPL, low(ramend)

Тут нет ошибки? Вы используете макрос для двухбайтных чисел, там где нужны однобайтные.

----------------
Хотя нет, не на тот макрос глянул...
Аватара пользователя
aronsky
Родился
Сообщения: 4
Зарегистрирован: Вт ноя 09, 2010 00:23:25
Контактная информация:

Re: ATmega 128. Проблема с SP

Сообщение aronsky »

ChipKiller писал(а):ldi SPH, high(ramend) ;ИНИЦИАЛИЗАЦИЯ СТЕКА
ldi SPL, low(ramend)
SPL и SPH - это же РВВ, в них не получится ldi.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: ATmega 128. Проблема с SP

Сообщение ChipKiller »

aronsky ... да со стеком все Ок ( не углядел я макрос :) ). Дома загрузил пример в AVR Studio - никакой ругани со стороны компилятора нет. Скорее всего, что ошибка именно в логике работы.
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»