Перекомпиляция программы Attiny26 под Attiny261

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Сообщения: 49
Зарегистрирован: Ср апр 16, 2014 18:46:46

Сообщение Родион@22 »

Перекомпилируйте новичку программу под Attiny261
Файл прилагаю:
sunmer.asm
(5.45 КБ) 542 скачивания
Реклама
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

Что значит "перекомпилируйте"?

Кстати, уберите из листинга строку

Код: Выделить всё

.org $20
после блока "заглушек". Вы уверены, что рассчитали адрес правильно? Компилятор сам расположит команду метки "RESET" после команды reti. Причем сделает это без ошибок. А при подсчете "вручную" есть риск ошибиться.
Реклама
Открыл глаза
Сообщения: 49
Зарегистрирован: Ср апр 16, 2014 18:46:46

Сообщение Родион@22 »

Что значит "перекомпилируйте"?
я имею ввиду, что переделать код под Attiny261
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1368
Зарегистрирован: Вс мар 28, 2010 12:52:22
Откуда: Беларусь

Сообщение dr.doc »

Должно работать с данной прошивкой (если правильно написана).
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Реклама
Эиком - электронные компоненты и радиодетали
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

Родион@22 писал(а):я имею ввиду, что переделать код под Attiny261
Для Вашего случая будет работать и эта программа (тут я согласен с dr.doc).
Другое дело, что она работать не будет, простите за каламбур.

Всю программу я не анализировал, времени нет. Проверил только АЦП. Скажите, Родион@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
В регистре ADCSR (ADCSRA у ATtiny261) есть флаг ADIF, который устанавливается по завершении преобразования. И тут у Вас всего два пути - или реализовывать чтение результатов преобразования в прерывании, или после старта преобразования циклически опрашивать флаг ADIF и только после его установки читать результат.


И еще странный момент:

Код: Выделить всё

	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
P.S. Простите за заглавные буквы в комментариях, изначально хотел курсивом выделить, но оказалось, что внутри тега CODE этого сделать нельзя.

P.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

Сообщение Родион@22 »

Вы в курсе, что преобразование в АЦП не происходит мгновенно? Что это преобразование требует определенного времени?
Простите, не в курсе :? А каким образом рассчитать время преобразования?
В регистре ADCSR (ADCSRA у ATtiny261) есть флаг ADIF, который устанавливается по завершении преобразования. И тут у Вас всего два пути - или реализовывать чтение результатов преобразования в прерывании, или после старта преобразования циклически опрашивать флаг ADIF и только после его установки читать результат.
Вы не могли бы дать ссылку на литературу по этому МК, это ведь программу не я составлял, а г-н Кравченко("10 практических устройств на AVR-МК") и я ее переписал, но оказалось в ней куча всякий изъянов. Вот теперь отлаживаю :idea: :) Только начал учиться))
Реклама
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

Родион@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       ;результат преобразования
Немного поясню. После завершения преобразования устанавливается флаг ADIF. Для последующей корректной работы после завершения преобразования N этот флаг должен быть сброшен перед выполнением преобразования N+1. Если Вы работаете через прерывания, флаг ADIF сбрасывается автоматически при выходе из обработчика прерывания. Если же Вы работаете по "ручному" опросу флага ADIF, то сбрасывать его нужно тоже "вручную". А теперь внимание - флаг сбрасывается записью в него лог.1! Казалось бы, парадокс, но это так.

Кстати, определитесь, для какого контроллера Вы все же пишете программу. Если для ATtiny261, то в начале листинга укажите правильный "инклюд" - нужно подключать файл "tn261Adef.inc", а не "tn26def.inc". Если же все-таки ATtiny26, то в моем примере название регистра должно быть не ADCSRA, а ADCSR. Адреса у них одинаковые, но с инклюдом "tn26def.inc" компилятор не поймет мнемонику ADCSRA.
Родион@22 писал(а):Вы не могли бы дать ссылку на литературу по этому МК,
Литература по МК - даташит от производителя. Скачивайте файл, помеченный как "Complete", он самый длинный из трех файлов, и изучайте. К сожалению, на английском.
В теме Инициализация стека в Attiny26 Я Вам давал ссылки на книги. В принципе, все AVR-контроллеры одного семейства очень похожи. Для того, чтобы в общих чертах понять, что представляет собой МК семейства tiny, к примеру, можете почитать одну из тех книг. А уж уточненный разбор отличий делать по даташиту. Современный электроник и программист должен знать английский, хотя бы худо-бедно. Привыкайте.
Родион@22 писал(а):это ведь программу не я составлял, а г-н Кравченко
В программах "из интернета" и "из литературы" ошибки встречаются очень часто. Людям некогда отлаживать их программы, им важно выдать в срок текст программы, чтобы он вошел в книгу. В издательстве никто не гоняет в симуляторе принесенные авторами книг программы :))
Привыкайте к тому, что (при наличии известного опыта, конечно) всегда быстрее написать свою программу, чем отлаживать чужую.
А опыт нарабатывается написанием собственных (пусть вначале простеньких) программ и анализом чужих готовых программ с целью изучения подходов и приемов программирования.
Открыл глаза
Сообщения: 49
Зарегистрирован: Ср апр 16, 2014 18:46:46

Сообщение Родион@22 »

"Alkul" спасибо вам большое. А можно спросить для справки, какое заведение вы закончили или заканчиваете?
Последний раз редактировалось Родион@22 Вс апр 27, 2014 22:09:31, всего редактировалось 1 раз.
Открыл глаза
Сообщения: 49
Зарегистрирован: Ср апр 16, 2014 18:46:46

Сообщение Родион@22 »

tn261Adef.inc
выдает ошибку, может просто 261?
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

Родион@22 писал(а):А можно спросить для справки, какое заведение вы закончили или заканчиваете?
Я окончил радиофак Уральского Государственного Технического Университета в 2000 году. С тех пор работаю инженером-электроником.
Родион@22 писал(а):выдает ошибку, может просто 261?
Есть и файл "tn261Adef.inc", и "tn261def.inc", подключать нужно в соответствии с типом используемого МК. Но для начала - в какой среде Вы работаете?
Мои советы относятся к AVR Studio v.4.19.
Проверьте для начала, есть ли у Вас эти файлы-описания.
Ну и хотелось бы увидеть листинг и точное описание ошибки. Фраза "выдает ошибку" мне совершенно ничего не говорит.
Открыл глаза
Сообщения: 49
Зарегистрирован: Ср апр 16, 2014 18:46:46

Сообщение Родион@22 »

ошибка: не найден "инклюд" файл: tn261Adef.inc
наверное 261 только есть, все думаю если 26 подходит зачем морочить голову? :o
AVR Studio 4.16
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

Родион@22 писал(а):ошибка: не найден "инклюд" файл: tn261Adef.inc
AVR Studio 4.16
Ну так все понятно. Когда выпустили v 4.16, контроллеров ATtiny261 еще не было. Соответственно, там в библиотеке нет такого "инклюда".

Рекомендую скачать с сайта ATMEL версию "посвежее".
Найдите в списке пункт AVR Studio 4.19 (build 730), его и качайте.
Родион@22 писал(а):наверное 261 только есть, все думаю если 26 подходит зачем морочить голову? :o
Ну, если есть 261, ставьте его, я ж написал выше.
Но правильнее все же поставить AVR Studio более "свежей" версии.
Открыл глаза
Сообщения: 49
Зарегистрирован: Ср апр 16, 2014 18:46:46

Сообщение Родион@22 »

Рекомендую скачать с сайта ATMEL версию "посвежее".
Учту ваши рекомендации
Открыл глаза
Сообщения: 49
Зарегистрирован: Ср апр 16, 2014 18:46:46

Сообщение Родион@22 »

только жаль что Протеус никак не реагирует..... :shock:
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

Родион@22 писал(а):только жаль что Протеус никак не реагирует
С Протеусом ничем помочь не могу.
А симулировать прямо в AVR Studio не пробовали? По-крайней мере, логику работы программы проверить можно.
Открыл глаза
Сообщения: 49
Зарегистрирован: Ср апр 16, 2014 18:46:46

Сообщение Родион@22 »

А симулировать прямо в AVR Studio не пробовали? По-крайней мере, логику работы программы проверить можно.
Выбирал вначале AVR Simulator однако понять как он именно симулирует не могу)
Смотрел на квадратики (биты) и все)) Вопрос: изменение частоты влияет на симуляцию?
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

Родион@22 писал(а):Вопрос: изменение частоты влияет на симуляцию?
Только в части времени исполнения команд, подпрограмм и отсчета таймеров.
На запись в регистры и вывод в порты частота симуляции не влияет.
Открыл глаза
Сообщения: 49
Зарегистрирован: Ср апр 16, 2014 18:46:46

Сообщение Родион@22 »

Флаг ADIF долго устанавливается
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

Родион@22 писал(а):Флаг ADIF долго устанавливается
"Долго" - это сколько? Совершенно не техническое определение. В течение какого времени устанавливается флаг?
В окне "Processor" есть пункт "Stop Watch", там указывается время выполнения команд.
Вообще, у симулятора AVR Studio такой момент есть. Если Вы симулируете цикл задержки длительностью , допустим, 1 секунда, то ожидать время его выполнения в симуляции будете несколько минут. Нужно смотреть время выполнения команд. Ну и установить в симуляции ту частоту, на которой будет работать Ваш контроллер в реальности.
Ответить

Вернуться в «AVR»