Ассемблер (ASM) для AVR в вопросах и ответах
- kvark85
- Встал на лапы
- Сообщения: 108
- Зарегистрирован: Сб ноя 08, 2008 21:23:06
- Откуда: Харьков
- Контактная информация:
Здравствуйте. Все собрано, все простейшее, и не работает. микросхема ATtiny2313, к одному PortD.5 припаян светодиод. надо чтоб после включения света он погорел чуть чуть и потух, прилагаю простейший код. Кто знает в чем проблема может быть?
- Вложения
-
- code.rar
- (422 байт) 419 скачиваний
kvark85 писал(а):Здравствуйте. Все собрано, все простейшее, и не работает. микросхема ATtiny2313, к одному PortD.5 припаян светодиод. надо чтоб после включения света он погорел чуть чуть и потух, прилагаю простейший код. Кто знает в чем проблема может быть?
Во первых что будет когда программа отработает задержку и выключит светодиод (это я к тому, что зацикливания пограммы нет).
Во-вторых как проявляется "не работает" (светодиод не включается, не выключается, мигает и т. п.)
В третьих схему бы посмотреть (ну кто может знать как вы там диод к порту припаяли - анодом или катодом, и т. п.).
- kvark85
- Встал на лапы
- Сообщения: 108
- Зарегистрирован: Сб ноя 08, 2008 21:23:06
- Откуда: Харьков
- Контактная информация:
хотел чтоб после подачи питания светодиод загорелся и потух. и все. получается он загорается и не тухнет. схема ниже
- Вложения
-
- Vopros.GIF
- (5.1 КБ) 630 скачиваний
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
- kvark85
- Встал на лапы
- Сообщения: 108
- Зарегистрирован: Сб ноя 08, 2008 21:23:06
- Откуда: Харьков
- Контактная информация:
предел широк. пусть хотябы мигнет. причем если так:
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
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
- kvark85
- Встал на лапы
- Сообщения: 108
- Зарегистрирован: Сб ноя 08, 2008 21:23:06
- Откуда: Харьков
- Контактная информация:
только что сделал все вточности как в обучении:
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
всеравно загорается навсегда
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
В железе не пробовал, пока, но в симуляторе AVRStudio все норм: для Temp горит 192 мкс, с Temp1 50мс, с Temp2 - 12с. Может у вас проблемы с железом или МК работает не на 4МГц, а на порядки меньше?! Да и всетаки поставте в конце своей программы бесконечный цикл, программа МК не должна иметь конца.
....
Попробовал в железе, все встало на свои места. Достаточно было поставить в конце бесконечный цикл
Без него светодиод все время горел, а яркость свечения зависела от выставленной задержки 
....
Попробовал в железе, все встало на свои места. Достаточно было поставить в конце бесконечный цикл
Название: Практическое программирование микроконтроллеров 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
Автор: Ю. Ревич
Издательство: БХВ-Петербург
Год: 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
- Demontrup
- Первый раз сказал Мяу!
- Сообщения: 22
- Зарегистрирован: Вт мар 25, 2008 16:23:57
- Откуда: Астрахань
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Не бери от жизни все, а то не унесешь...
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 ;Проверяем нажата ли кнопка
reti2. Перед входом в обработчик в стеке не сохраняются регистры изменяемые в обработчике прерывания (в данном случае может и не влиять на работу программы, но вообще сохранять в стеке регистры изменяющиеся в обработчике прерывания - хороший тон). Подробнее об этом почитайте здесь http://radiokot.ru/forum/viewtopic.php?p=170029#170029
3. В третьих надо почитать даташит на предмет изучения работы АЦП - если бы Вы это сделали, то знали бы, что даже если Вас не интересует старший байт результата преобразования все-равно необходимо вычитывать регистр ADCH.
И общее замечание - Вы хотите, чтобы Вам помогли, но при этом информацию из вас приходится клещами вытягивать - не дело.
-
YurkaM
- Нашел транзистор. Понюхал.
- Сообщения: 151
- Зарегистрирован: Пн сен 01, 2008 14:49:03
- Откуда: Казахстан
Указатель стека забыл настроить
И в прерывании хотя бы флаги надо сохранять:
Код: Выделить всё
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
- Откуда: Астрахань
Ребята в процессе отладки в Протеусе выяснил что у меня не работает АЦП, кто может сказать почему? вот переписал без всего лишнего:
Код: Выделить всё
.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 КБ) 309 скачиваний
Не бери от жизни все, а то не унесешь...