Перекомпиляция программы Attiny26 под Attiny261
Добавлено: Сб апр 26, 2014 22:54:16
Перекомпилируйте новичку программу под Attiny261
Файл прилагаю:
Файл прилагаю:
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
Код: Выделить всё
.org $20я имею ввиду, что переделать код под Attiny261Что значит "перекомпилируйте"?
Для Вашего случая будет работать и эта программа (тут я согласен с dr.doc).Родион@22 писал(а):я имею ввиду, что переделать код под Attiny261
Код: Выделить всё
ldi tmp3, $83 ;внутренний источник, вход ADC3
out ADMUX, tmp3 ;коммутация входов АЦП ; ВЫБРАЛИ ТИП ИОН И НОМЕР КАНАЛА
clr tmp2
clr tmp3
ldi tmp2, $C4 ;одиночное, запуск, 1/16
out ADCSR, tmp2 ;запуск АЦП на преобразование ; ЗАПУСТИЛИ ПРЕОБРАЗОВАНИЕ
;Сохранение данных АЦП ; ПОЧЕМУ ВЫ ЧИТАЕТЕ РЕЗУЛЬТАТ, НЕ ДОЖДАВШИСЬ ЗАВЕРШЕНИЯ ПРЕОБРАЗОВАНИЯ?
in tmp2, ADCL
in tmp3, ADCH
Код: Выделить всё
ldi tmp3, $80 ;источник питания, ADC2, ADMUX
ldi tmp2, $C6 ; одиночное, запуск, 1/64, ADCSR ; ЗАПУСТИЛИ ПРЕОБРАЗОВАНИЕ
; опрос уровня заряда конденсатора
rcall adcn ; ПЕРЕШЛИ НА ПОДПРОГРАММУ adcn
...
adcn: nop ; В КОТОРОЙ
nop
nop
nop
nop
nop
nop
clr tmp
awe: nop
cpi tmp, $04
brsh ass
clr tmp3 ; НЕ ДОЖИДАЯСЬ ОКОНЧАНИЯ ПРЕОБРАЗОВАНИЯ И НЕ ЧИТАЯ РЕЗУЛЬТАТ
ldi tmp3, $83 ;внутренний источник, вход ADC3 ; ПЕРЕКЛЮЧАЕТЕ МУЛЬТИПЛЕКСОР ВЫБОРА КАНАЛА НА ДРУГОЙ КАНАЛ
out ADMUX, tmp3 ;коммутация входов АЦП ;
clr tmp2
clr tmp3
ldi tmp2, $C4 ;одиночное, запуск, 1/16
out ADCSR, tmp2 ;запуск АЦП на преобразование
;Сохранение данных АЦП ; НУ И ДАЛЬШЕ С ТОЙ ЖЕ ОШИБКОЙ ЧТЕНИЯ РЕЗУЛЬТАТА, КОГДА РЕЗУЛЬТАТ ЕЩЕ НЕ ГОТОВ
in tmp2, ADCL
in tmp3, ADCHКод: Выделить всё
;Подпрограмма обработки прерывания по получению байта по USART --------------------------------------------------------------------------
adrURXC: ;USART RX Complete Handler
push R16 ;Сохранить на стеке рег.R16
in R16,SREG ;Сохранить на стеке
push R16 ;регистр состояния SREG
push YL ;Сохранить на стеке
push YH ;рег.пару Y
push R17 ;Сохранить на стеке рег.R17
push R18 ;Сохранить на стеке рег.R18
lds R16,UDR0 ;Занести принятый по USART байт в рег.R16
lds R17,RECVBYT ;Занести в рег.R17 кол-во принятых байт пакета
tst R17 ;Кол-во принятых байт равно нулю? (это первый байт пакета?)
brne USRXC2 ;Если нет, то переход на метку USRXC2
;Принят первый байт пакета (байт адреса)
;Инициализировать таймер 2 на отсчет 5мс, за которые весь пакет должен быть принят
USRXC1: ;
;Инициализировать таймер-счетчик 2 на отсчет интервала 5 мс. По окончанию интервала - сбрасывать UASRT и обнулять счетчик принятых байт
lds YL,FLAGS ;Занести в рег.YL содержимое ячейки FLAGS
andi YL,~(1<<SELDELAY) ;Обнулить бит SELDELAY для того, чтобы переполнение таймера-счетчика 2 обрабатывалось как отсчет
;времени приема пакета запроса
sts FLAGS,YL ;Сохранить в памяти новое значение ячейки FLAGS
ldi YL,0x9F ;Инициализировать таймер-счетчик
sts TCNT2,YL ;на отсчет 5мс при тактовой частоте 20МГц и коэффициенте деления 1024
ldi YL,0x07 ;Запустить таймер-счетчик 2
sts TCCR2B,YL ;с коэффициентом деления тактовой частоты 1024
ldi YL,(1<<TOIE2) ;Разрешение прерываний
sts TIMSK2,YL ;по переполнению таймер-счетчика 2
rjmp USRXC3 ;Перейти на метку USRXC3 для записи принятого байта в буфер принимаемого пакета
;Принят не первый байт пакета
USRXC2: cpi R17,0x02 ;Принят третий байт пакета?
brne USRXC3 ;Если нет, то переход на метку USRXC3
;Принят третий байт пакета, откорректировать длину принимаемого пакета
ldi YL,0x05 ;В рег. YL занести кол-во служебных байт пакета (без учета длины поля данных)
add YL,R16 ;Теперь в рег.YL общая длина принимаемого пакета
sts LONGRECV,YL ;Сохранить новое значение длины пакета в ячейке LONGRECV
;Запись полученного по USART байта в буфер принимаемого пакета
USRXC3: ldi YL,low(BUFRECV) ;Занести в рег.пару Y
ldi YH,high(BUFRECV) ;адрес начала буфера принимаемого пакета
add YL,R17 ;Прибавить к адресу начала буфера смещение,
brcc USRXC4 ;соответствующее адресу текущего
inc YH ;принимаемого байта
USRXC4: st Y,R16 ;Сохранить текущий принятый байт в буфер принимаемого пакета
lds R16,LONGRECV ;Занести в рег.R16 длину принимаемого пакета
inc R17 ;Инкремент кол-ва принятых байт
cp R17,R16 ;Принят весь пакет данных?
brlo USRXC4_0 ;Если кол-во принятых байт меньше длины пакета, то пакет принят не полностью,
;переход на метку USRXC100
rjmp USRXC4_1 ;Иначе пакет принят полностью, перейти на метку USRXC4_1
USRXC4_0: rjmp USRXC100 ;Пакет принят не полностью, перейти на метку USRXC100
USRXC4_1:
;Иначе принят весь пакет, рассчитать CRC принятого пакета
subi R17,0x02 ;Вычислить длину пакета за вычетом двух байт CRC
sts LENPAK,R17 ;Занести уменьшенную на 2 длину пакета в ячейку LENPAK
ldi YL,low(BUFRECV) ;Занести в рег.пару Y
ldi YH,high(BUFRECV) ;адрес начала буфера принимаемого пакета
call CRC ;Вызвать подпрограмму расчета CRC, результат в ячейках CRC_L и CRC_H
ldi YL,low(BUFRECV) ;Занести в рег.пару Y
ldi YH,high(BUFRECV) ;адрес начала буфера принимаемого пакета
add YL,R17 ;Прибавить к адресу начала буфера смещение,
brcc USRXC5 ;соответствующее адресу текущего
inc YH ;принимаемого байта
Простите, не в курсеВы в курсе, что преобразование в АЦП не происходит мгновенно? Что это преобразование требует определенного времени?
Вы не могли бы дать ссылку на литературу по этому МК, это ведь программу не я составлял, а г-н Кравченко("10 практических устройств на AVR-МК") и я ее переписал, но оказалось в ней куча всякий изъянов. Вот теперь отлаживаюВ регистре ADCSR (ADCSRA у ATtiny261) есть флаг ADIF, который устанавливается по завершении преобразования. И тут у Вас всего два пути - или реализовывать чтение результатов преобразования в прерывании, или после старта преобразования циклически опрашивать флаг ADIF и только после его установки читать результат.
Вспомнился анекдот:Родион@22 писал(а):А каким образом рассчитать время преобразования?
Код: Выделить всё
ldi tmp3, $83 ;внутренний источник, вход ADC3
out ADMUX, tmp3 ;коммутация входов АЦП
ldi tmp2, $C4 ;одиночное, запуск, 1/16
out ADCSRA, tmp2 ;запуск АЦП на преобразование
WAIT:
sbis ADCSRA,ADIF ;Если флаг ADIF установлен, пропустить следующую команду
rjmp WAIT ;Иначе флаг ADIF сброшен, преобразование не завершено, вернуться на метку WAIT для опроса флага
;Флаг ADIF установлен, преобразование завершено.
in R16,ADCSRA ;Считать содержимое ADCSRA в рег.R16
ori R16,(1<<ADIF) ;Установить бит ADIF, не трогая остальные биты
out ADCSRA,R16 ;Занести в ADCSRA содержимое R16 c установленным битом ADIF для сброса флага ADIF
in tmp2, ADCL ;Прочитать
in tmp3, ADCH ;результат преобразования
Литература по МК - даташит от производителя. Скачивайте файл, помеченный как "Complete", он самый длинный из трех файлов, и изучайте. К сожалению, на английском.Родион@22 писал(а):Вы не могли бы дать ссылку на литературу по этому МК,
В программах "из интернета" и "из литературы" ошибки встречаются очень часто. Людям некогда отлаживать их программы, им важно выдать в срок текст программы, чтобы он вошел в книгу. В издательстве никто не гоняет в симуляторе принесенные авторами книг программыРодион@22 писал(а):это ведь программу не я составлял, а г-н Кравченко
выдает ошибку, может просто 261?tn261Adef.inc
Я окончил радиофак Уральского Государственного Технического Университета в 2000 году. С тех пор работаю инженером-электроником.Родион@22 писал(а):А можно спросить для справки, какое заведение вы закончили или заканчиваете?
Есть и файл "tn261Adef.inc", и "tn261def.inc", подключать нужно в соответствии с типом используемого МК. Но для начала - в какой среде Вы работаете?Родион@22 писал(а):выдает ошибку, может просто 261?
Ну так все понятно. Когда выпустили v 4.16, контроллеров ATtiny261 еще не было. Соответственно, там в библиотеке нет такого "инклюда".Родион@22 писал(а):ошибка: не найден "инклюд" файл: tn261Adef.inc
AVR Studio 4.16
Ну, если есть 261, ставьте его, я ж написал выше.Родион@22 писал(а):наверное 261 только есть, все думаю если 26 подходит зачем морочить голову?
Учту ваши рекомендацииРекомендую скачать с сайта ATMEL версию "посвежее".
С Протеусом ничем помочь не могу.Родион@22 писал(а):только жаль что Протеус никак не реагирует
Выбирал вначале AVR Simulator однако понять как он именно симулирует не могу)А симулировать прямо в AVR Studio не пробовали? По-крайней мере, логику работы программы проверить можно.
Только в части времени исполнения команд, подпрограмм и отсчета таймеров.Родион@22 писал(а):Вопрос: изменение частоты влияет на симуляцию?
"Долго" - это сколько? Совершенно не техническое определение. В течение какого времени устанавливается флаг?Родион@22 писал(а):Флаг ADIF долго устанавливается