Файл прилагаю:
Перекомпиляция программы Attiny26 под Attiny261
- Сообщения: 49
- Зарегистрирован: Ср апр 16, 2014 18:46:46
Перекомпилируйте новичку программу под Attiny261
Файл прилагаю:
Файл прилагаю:
- Реклама
Что значит "перекомпилируйте"?
Кстати, уберите из листинга строку
после блока "заглушек". Вы уверены, что рассчитали адрес правильно? Компилятор сам расположит команду метки "RESET" после команды reti. Причем сделает это без ошибок. А при подсчете "вручную" есть риск ошибиться.
Кстати, уберите из листинга строку
Код: Выделить всё
.org $20- Сообщения: 49
- Зарегистрирован: Ср апр 16, 2014 18:46:46
я имею ввиду, что переделать код под Attiny261Что значит "перекомпилируйте"?
Должно работать с данной прошивкой (если правильно написана).
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Для Вашего случая будет работать и эта программа (тут я согласен с dr.doc).Родион@22 писал(а):я имею ввиду, что переделать код под Attiny261
Другое дело, что она работать не будет, простите за каламбур.
Всю программу я не анализировал, времени нет. Проверил только АЦП. Скажите, Родион@22, Вы в курсе, что преобразование в АЦП не происходит мгновенно? Что это преобразование требует определенного времени? Вы в курсе, что читать результат преобразования нужно тогда, когда преобразование завершено, а не в произвольный момент, когда преобразование, возможно, еще "в процессе", что называется?
Вот смотрите, Ваш код с моими комментариями:
Код: Выделить всё
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, ADCHP.P.S. Вообще, рекомендую на будущее писать более расширенные комментарии. Уж все команды условных переходов-то точно нужно комментировать. Под спойлером пример кода из моей программы. Я комментирую каждую строку. Если одновременно ведешь несколько проектов то это очень полезно. да и вообще полезно - иной раз грамотный комментарий позволит увидеть ошибку в логике работы.
Спойлер
Код: Выделить всё
;Подпрограмма обработки прерывания по получению байта по 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 ;принимаемого байта
- Реклама
- Сообщения: 49
- Зарегистрирован: Ср апр 16, 2014 18:46:46
Простите, не в курсеВы в курсе, что преобразование в АЦП не происходит мгновенно? Что это преобразование требует определенного времени?
Вы не могли бы дать ссылку на литературу по этому МК, это ведь программу не я составлял, а г-н Кравченко("10 практических устройств на AVR-МК") и я ее переписал, но оказалось в ней куча всякий изъянов. Вот теперь отлаживаюВ регистре ADCSR (ADCSRA у ATtiny261) есть флаг ADIF, который устанавливается по завершении преобразования. И тут у Вас всего два пути - или реализовывать чтение результатов преобразования в прерывании, или после старта преобразования циклически опрашивать флаг ADIF и только после его установки читать результат.
Вспомнился анекдот:Родион@22 писал(а):А каким образом рассчитать время преобразования?
"-Моню не надо нюхать, Моню надо учить" (с)
Время преобразования не надо рассчитывать. По окончании преобразования устанавливается флаг ADIF в регистре ADCSRA.
Вы можете или проверять этот флаг "вручную", или организовать получение результатов преобразования через прерывание по завершению преобразования АЦП. Я ведь об этом уже писал выше. Вы невнимательно читаете.
"Вручную" это делается примерно так:
Код: Выделить всё
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 ;результат преобразования
Кстати, определитесь, для какого контроллера Вы все же пишете программу. Если для ATtiny261, то в начале листинга укажите правильный "инклюд" - нужно подключать файл "tn261Adef.inc", а не "tn26def.inc". Если же все-таки ATtiny26, то в моем примере название регистра должно быть не ADCSRA, а ADCSR. Адреса у них одинаковые, но с инклюдом "tn26def.inc" компилятор не поймет мнемонику ADCSRA.
Литература по МК - даташит от производителя. Скачивайте файл, помеченный как "Complete", он самый длинный из трех файлов, и изучайте. К сожалению, на английском.Родион@22 писал(а):Вы не могли бы дать ссылку на литературу по этому МК,
В теме Инициализация стека в Attiny26 Я Вам давал ссылки на книги. В принципе, все AVR-контроллеры одного семейства очень похожи. Для того, чтобы в общих чертах понять, что представляет собой МК семейства tiny, к примеру, можете почитать одну из тех книг. А уж уточненный разбор отличий делать по даташиту. Современный электроник и программист должен знать английский, хотя бы худо-бедно. Привыкайте.
В программах "из интернета" и "из литературы" ошибки встречаются очень часто. Людям некогда отлаживать их программы, им важно выдать в срок текст программы, чтобы он вошел в книгу. В издательстве никто не гоняет в симуляторе принесенные авторами книг программыРодион@22 писал(а):это ведь программу не я составлял, а г-н Кравченко
Привыкайте к тому, что (при наличии известного опыта, конечно) всегда быстрее написать свою программу, чем отлаживать чужую.
А опыт нарабатывается написанием собственных (пусть вначале простеньких) программ и анализом чужих готовых программ с целью изучения подходов и приемов программирования.
- Сообщения: 49
- Зарегистрирован: Ср апр 16, 2014 18:46:46
Я окончил радиофак Уральского Государственного Технического Университета в 2000 году. С тех пор работаю инженером-электроником.Родион@22 писал(а):А можно спросить для справки, какое заведение вы закончили или заканчиваете?
Есть и файл "tn261Adef.inc", и "tn261def.inc", подключать нужно в соответствии с типом используемого МК. Но для начала - в какой среде Вы работаете?Родион@22 писал(а):выдает ошибку, может просто 261?
Мои советы относятся к AVR Studio v.4.19.
Проверьте для начала, есть ли у Вас эти файлы-описания.
Ну и хотелось бы увидеть листинг и точное описание ошибки. Фраза "выдает ошибку" мне совершенно ничего не говорит.
- Сообщения: 49
- Зарегистрирован: Ср апр 16, 2014 18:46:46
ошибка: не найден "инклюд" файл: tn261Adef.inc
наверное 261 только есть, все думаю если 26 подходит зачем морочить голову?
AVR Studio 4.16
наверное 261 только есть, все думаю если 26 подходит зачем морочить голову?
AVR Studio 4.16
Ну так все понятно. Когда выпустили v 4.16, контроллеров ATtiny261 еще не было. Соответственно, там в библиотеке нет такого "инклюда".Родион@22 писал(а):ошибка: не найден "инклюд" файл: tn261Adef.inc
AVR Studio 4.16
Рекомендую скачать с сайта ATMEL версию "посвежее".
Найдите в списке пункт AVR Studio 4.19 (build 730), его и качайте.
Ну, если есть 261, ставьте его, я ж написал выше.Родион@22 писал(а):наверное 261 только есть, все думаю если 26 подходит зачем морочить голову?
Но правильнее все же поставить AVR Studio более "свежей" версии.
- Сообщения: 49
- Зарегистрирован: Ср апр 16, 2014 18:46:46
Учту ваши рекомендацииРекомендую скачать с сайта ATMEL версию "посвежее".
- Сообщения: 49
- Зарегистрирован: Ср апр 16, 2014 18:46:46
С Протеусом ничем помочь не могу.Родион@22 писал(а):только жаль что Протеус никак не реагирует
А симулировать прямо в AVR Studio не пробовали? По-крайней мере, логику работы программы проверить можно.
- Сообщения: 49
- Зарегистрирован: Ср апр 16, 2014 18:46:46
Выбирал вначале AVR Simulator однако понять как он именно симулирует не могу)А симулировать прямо в AVR Studio не пробовали? По-крайней мере, логику работы программы проверить можно.
Смотрел на квадратики (биты) и все)) Вопрос: изменение частоты влияет на симуляцию?
Только в части времени исполнения команд, подпрограмм и отсчета таймеров.Родион@22 писал(а):Вопрос: изменение частоты влияет на симуляцию?
На запись в регистры и вывод в порты частота симуляции не влияет.
- Сообщения: 49
- Зарегистрирован: Ср апр 16, 2014 18:46:46
"Долго" - это сколько? Совершенно не техническое определение. В течение какого времени устанавливается флаг?Родион@22 писал(а):Флаг ADIF долго устанавливается
В окне "Processor" есть пункт "Stop Watch", там указывается время выполнения команд.
Вообще, у симулятора AVR Studio такой момент есть. Если Вы симулируете цикл задержки длительностью , допустим, 1 секунда, то ожидать время его выполнения в симуляции будете несколько минут. Нужно смотреть время выполнения команд. Ну и установить в симуляции ту частоту, на которой будет работать Ваш контроллер в реальности.


