Ассемблер (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 КБ) 630 скачиваний
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 байт) 391 скачивание
Слава
Открыл глаза
Сообщения: 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 КБ) 309 скачиваний
Не бери от жизни все, а то не унесешь...
Ответить

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