Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Alexeus
Вымогатель припоя
Сообщения: 690
Зарегистрирован: Вс мар 04, 2007 01:17:12

Сообщение Alexeus »

Отлично! спасибо :)
Реклама
Аватара пользователя
kvark85
Встал на лапы
Сообщения: 108
Зарегистрирован: Сб ноя 08, 2008 21:23:06
Откуда: Харьков
Контактная информация:

Сообщение kvark85 »

Здравствуйте. Все собрано, все простейшее, и не работает. микросхема ATtiny2313, к одному PortD.5 припаян светодиод. надо чтоб после включения света он погорел чуть чуть и потух, прилагаю простейший код. Кто знает в чем проблема может быть?
Вложения
code.rar
(422 байт) 419 скачиваний
Реклама
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

kvark85 писал(а):Здравствуйте. Все собрано, все простейшее, и не работает. микросхема ATtiny2313, к одному PortD.5 припаян светодиод. надо чтоб после включения света он погорел чуть чуть и потух, прилагаю простейший код. Кто знает в чем проблема может быть?
Во первых что будет когда программа отработает задержку и выключит светодиод (это я к тому, что зацикливания пограммы нет).
Во-вторых как проявляется "не работает" (светодиод не включается, не выключается, мигает и т. п.)
В третьих схему бы посмотреть (ну кто может знать как вы там диод к порту припаяли - анодом или катодом, и т. п.).
Аватара пользователя
kvark85
Встал на лапы
Сообщения: 108
Зарегистрирован: Сб ноя 08, 2008 21:23:06
Откуда: Харьков
Контактная информация:

Сообщение kvark85 »

хотел чтоб после подачи питания светодиод загорелся и потух. и все. получается он загорается и не тухнет. схема ниже
Вложения
Vopros.GIF
(5.1 КБ) 640 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение BerZerK-ku »

А чуть-чуть по вашему это сколько? на какое время вы рассчитывали написав этот код?
Реклама
Аватара пользователя
kvark85
Встал на лапы
Сообщения: 108
Зарегистрирован: Сб ноя 08, 2008 21:23:06
Откуда: Харьков
Контактная информация:

Сообщение kvark85 »

предел широк. пусть хотябы мигнет. причем если так:

ldi Temp, 0 ;задержка
ldi Temp1, 0
ldi Temp2, 0
ldi Temp3, 0
ldi Temp4, 0

Loop: dec Temp
brne Loop

ldi Temp,0b1111111 ;тушим светодиод
out PortD,Temp

то мигает, а вот если дальше увеличиваю зедержку с использованием остальных Temp1..4. то светодиод загораетс и не тухнет. зависает, чтоли... делал все по обучалке РадиокКота, только на ATtiny2313
Реклама
Аватара пользователя
Alexeus
Вымогатель припоя
Сообщения: 690
Зарегистрирован: Вс мар 04, 2007 01:17:12

Сообщение Alexeus »

конечно не тухнет- время то еще не вышло, может он у вас через 30 минут только потухнет. цикл слишком долгий (а когда моргает- слишком короткий), попробуйте задержку постепенно увеличивать.
Аватара пользователя
kvark85
Встал на лапы
Сообщения: 108
Зарегистрирован: Сб ноя 08, 2008 21:23:06
Откуда: Харьков
Контактная информация:

Сообщение kvark85 »

только что сделал все вточности как в обучении:

ldi Temp,0b0000000 ;присвоение константы
out PortD,Temp ;вывод на индикацию

ldi Temp1,0
ldi Temp2,0
ldi Temp3,10

Loop: dec Temp1
brne Loop

dec Temp2
brne Loop

dec Temp3
brne Loop

ldi Temp,0b1111111 ;тушим светодиод
out PortD,Temp


всеравно загорается навсегда
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение BerZerK-ku »

В железе не пробовал, пока, но в симуляторе AVRStudio все норм: для Temp горит 192 мкс, с Temp1 50мс, с Temp2 - 12с. Может у вас проблемы с железом или МК работает не на 4МГц, а на порядки меньше?! Да и всетаки поставте в конце своей программы бесконечный цикл, программа МК не должна иметь конца.
....
Попробовал в железе, все встало на свои места. Достаточно было поставить в конце бесконечный цикл :) Без него светодиод все время горел, а яркость свечения зависела от выставленной задержки :)
SAU
Вымогатель припоя
Сообщения: 546
Зарегистрирован: Вс сен 10, 2006 00:04:03

Сообщение SAU »

Название: Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера
Автор: Ю. Ревич
Издательство: БХВ-Петербург
Год: 2008
Страниц: 384
Формат: djvu-rar+% восст.
Размер: 5,5 Мб
ISBN: 978-5-9775-0277-1
Изложены основные принципы функционирования и особенности архитектуры микроконтроллеров Atmel AVR. Подробно описаны приемы программирования микросхем этого семейства и их отдельных узлов. Вы найдете готовые рецепты для программирования большинства основных функций современной микроэлектронной аппаратуры: от реакции на нажатие кнопки или построения динамической индикации до сложных протоколов записи данных во внешнюю память или особенностей подключения часов реального времени. В книге учтены особенности современных моделей AVR и сопутствующих микросхем последних лет выпуска. Особое внимание уделяется обмену данными микроэлектронных устройств с персональным компьютером, приводятся примеры программ на Delphi. Приложение содержит основные параметры микроконтроллеров AVR, перечень команд и тексты программ для них, а также список используемых терминов и аббревиатур.
http://rs537.rapidshare.com/files/19032 ... mk_avr.rar
Слава
Открыл глаза
Сообщения: 53
Зарегистрирован: Пт авг 08, 2008 18:13:09

Сообщение Слава »

у меня проблема
Вложения
нн.txt
(339 байт) 393 скачивания
Слава
Открыл глаза
Сообщения: 53
Зарегистрирован: Пт авг 08, 2008 18:13:09

Сообщение Слава »

поставил ; в начале 190 строки теперь

G:\AVR\AVR-projects\tutorial>g:\avr\tavrasm\tavrasm.exe -i code.asm -e output\li
stfile.lst -o output\hexfile.hex
No code generated

G:\AVR\AVR-projects\tutorial>pause=null
Для продолжения нажмите любую клавишу . . .
Аватара пользователя
Demontrup
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Вт мар 25, 2008 16:23:57
Откуда: Астрахань

Сообщение Demontrup »

У меня при выходе из прерывания данные с АЦП затираются данными до прерывания, как этого избежать?
Не бери от жизни все, а то не унесешь...
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

Demontrup писал(а):У меня при выходе из прерывания данные с АЦП затираются данными до прерывания, как этого избежать?
Исправить Вашу программу или функцию работающую с АЦП.
Аватара пользователя
Demontrup
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Вт мар 25, 2008 16:23:57
Откуда: Астрахань

Сообщение Demontrup »

smac писал(а):
Demontrup писал(а):У меня при выходе из прерывания данные с АЦП затираются данными до прерывания, как этого избежать?
Исправить Вашу программу или функцию работающую с АЦП.
А каким образом исправить..? ниже код.. затираются регистры r22,25 и 26

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

	; set sinewave output as default
		
		ldi		ZH,high(2*sine)	; setup Z pointer hi
		ldi		ZL,low(2*sine)	; setup Z pointer lo

		; clear accumulator 

		ldi 	r29,0x00		; clear accumulator 
		ldi 	r28,0x00		; clear accumulator 

		; setup adder registers		
		
			; setup adder value
		ldi 	r24,0x14
		ldi 	r25,255	; to 1 kHz
		ldi 	r26,0x00		; 



; main loop
;
;	r28,r29,r30 is the phase accumulator
;  	r24,r25,r26 is the adder value determining frequency
;
; 	add value to accumulator
;	load byte from current table in ROM
;	output byte to port
;	repeat 
;
LOOP1:
		add		r28,r24			; 1
		adc		r29,r25			; 1
		adc		r30,r26			; 1
		lpm						; 3
		out		PORTB,r0		; 1
		rjmp	LOOP1			; 2 => 9 cycles
INT_0: 

sbic PinD,2    ;Проверяем нажата ли кнопка
reti
;Регистр ADMUX - ADC multiplexer Selection Ragister
;7:6-REFS-Reference selection bits ;00-External eference voltage
;5-ADLAR-Left adjust result
;4-NU-Not Used
;3:0-MUX-Analog channel selection bits ;0000-ADC0

;-------------------------------------------------------
;Считываем АЦП ФОРМЫ
;-------------------------------------------------------		
	ldi r16, 0b00000000
	out ADMUX, r16

;Устанавливаем бит старта преобразования

	start:
	sbi adcsra,6
	sbic adcsra,6
	rjmp start
;Считываем значения преобразования АЦП
 	in r17, ADCL
	
;-------------------------------------------------------
;Считываем АЦП МАКСИМАЛЬНОЙ ЧАСТОТЫ.
;-------------------------------------------------------	
	ldi r16, 0b00000001
	out ADMUX, r16

;Устанавливаем бит старта преобразования

	start1:
	sbi adcsra,6
	sbic adcsra,6
	rjmp start1
;Считываем значения преобразования АЦП
 	in r18, ADCL
	mov r24,r18
;-------------------------------------------------------
;Считываем АЦП СРЕДНЕЙ ЧАСТОТЫ.
;-------------------------------------------------------	
	ldi r16, 0b00000010
	out ADMUX, r16

;Устанавливаем бит старта преобразования

	start2:
	sbi adcsra,6
	sbic adcsra,6
	rjmp start2
;Считываем значения преобразования АЦП
 	in r19, ADCL
	mov r25,r19
;-------------------------------------------------------
;Считываем АЦП МИНИМАЛЬНОЙ ЧАСТОТЫ.
;-------------------------------------------------------	
	ldi r16, 0b00000011
	out ADMUX, r16

;Устанавливаем бит старта преобразования

	start3:
	sbi adcsra,6
	sbic adcsra,6
	rjmp start3
;Считываем значения преобразования АЦП
 	in r20, ADCL
   mov r26,r20
sbis PinD,2    ;Проверяем отпущена ли кнопка
rjmp INT_0
reti
Не бери от жизни все, а то не унесешь...
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

Demontrup писал(а): А каким образом исправить..? ниже код.. затираются регистры r22,25 и 26
Сначала формальные замечания:
1. В Вашем коде, без обид, черт ногу сломит:
а) в тексте моного числовых константа, значение которых непонятно
б) в тексте куча конструкций типа

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

sbi adcsra,6
и

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

ldi r16, 0b00000001
	out ADMUX, r16
, которые следует заменить на

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

sbi adcsra,ADSC
и

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

ldi r16, (1<<MUX0)
	out ADMUX, r16
и им подобные
в) неплохо бы сделать форматирование текста программы чтобы метки и другие конструкции были заметны
г) неплохо бы указывать тип микроконтроллера для которого пишете
2. Желательно точно указать место в программе, где по вашему происходит ошибка.
3. Код приведен не полностью.
4. Не указано как вы провереяете работоспособность - в железе или на симуляторе.
Теперь по существу.
1. Проверка нажатия кнопки реализована без защиты от дребезга - один из источников глюков.

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

sbic PinD,2    ;Проверяем нажата ли кнопка
reti
2. Перед входом в обработчик в стеке не сохраняются регистры изменяемые в обработчике прерывания (в данном случае может и не влиять на работу программы, но вообще сохранять в стеке регистры изменяющиеся в обработчике прерывания - хороший тон). Подробнее об этом почитайте здесь http://radiokot.ru/forum/viewtopic.php?p=170029#170029
3. В третьих надо почитать даташит на предмет изучения работы АЦП - если бы Вы это сделали, то знали бы, что даже если Вас не интересует старший байт результата преобразования все-равно необходимо вычитывать регистр ADCH.
И общее замечание - Вы хотите, чтобы Вам помогли, но при этом информацию из вас приходится клещами вытягивать - не дело.
YurkaM
Нашел транзистор. Понюхал.
Сообщения: 151
Зарегистрирован: Пн сен 01, 2008 14:49:03
Откуда: Казахстан

Сообщение YurkaM »

Указатель стека забыл настроить

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

init:
		ldi	r16,high(RAMEND)
		out	SPH,r16
		ldi	r16,low(RAMEND
		out	SPL,r16
И в прерывании хотя бы флаги надо сохранять:

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

INT0:
	push	r16
	in	r16,SREG
	push	r16
......
......
......

	pop	r16
	out	SREG,r16
	pop	r16
	reti
Аватара пользователя
Demontrup
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Вт мар 25, 2008 16:23:57
Откуда: Астрахань

Сообщение Demontrup »

Так сейчас попробуем...заранее спасибо..если что еще спрошу
Не бери от жизни все, а то не унесешь...
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

Demontrup писал(а):Так сейчас попробуем...заранее спасибо..если что еще спрошу
ADCH не забывайте вычитывать.
Аватара пользователя
Demontrup
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Вт мар 25, 2008 16:23:57
Откуда: Астрахань

Сообщение Demontrup »

Ребята в процессе отладки в Протеусе выяснил что у меня не работает АЦП, кто может сказать почему? вот переписал без всего лишнего:

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

.include "m8def.inc"

;Сегмент кода

.cseg
.org 0

;Определяем вектора прерываний

rjmp init			;External Pin, Power-on Reset, Brown-out Reset, and Watchdog Reset
rjmp INT_0			;External Interrupt Request 0




init:
 ldi   r16,high(RAMEND)
      out   SPH,r16
      ldi   r16,low(RAMEND)
      out   SPL,r16
sei						; global enable interrupts

ser	r16				; 
out	DDRB,r16				; set all PORTB bits as output
ser	r16
out	DDRC,r16

ldi r16,0b00000000
out MCUCR,r16            ;микроконтр регистр контроля

ldi r16,0b01000000
out GIMSK,r16				;регистр маски прерывание разрешение внешнего прерывания

 
ser r16	
star:

dec r16
out portb, r16
rjmp star


INT_0: 
in   r16,SREG 
push   r16
  
sbic PinD,2    ;Проверяем нажата ли кнопка
reti

	ldi r19, 0b10000011
	out ADCSRA, r19

	ldi r19, 0b00000000
	out ADMUX, r19

;Устанавливаем бит старта преобразования

	start:
	sbi adcsra,6
;Считываем значения преобразования АЦП
	sbic adcsr,ADSC
	rjmp start
	in r17, ADCL
	in r18, ADCH


	out portc,r17
	


   sbis PinD,2    ;Проверяем отпущена ли кнопка
rjmp INT_0
pop   r16
out   SREG,r16 
reti
Вложения
Проект.rar
Тут проект в протеусе и АВР СТУДИО,прошивка. Результат АЦП по задумке должен светится на порту С и в регистрах
(24.76 КБ) 310 скачиваний
Не бери от жизни все, а то не унесешь...
Ответить

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