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

Обсуждаем контроллеры компании Atmel.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Проверял. Правда ещё на 90S4414.
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

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

Сообщение shads »

Gudd-Head писал(а):У кого-нибудь есть практический опыт обращения к памяти данных с немного некорректным указателем?
Т.е. например, у 8-й меги 4к машинных слов (0000h-0FFFh) и 8 кбайт памяти соответственно (0000h-1FFFh).
Если загрузить в указатель Z FFFFh, команда LPM Z достанет байт из адреса 1FFFh, или результат будет непредсказуем?

Гы..... А кудыть такое нужно.....
Помому уж лучше постараться избегать такой ситуации, чего бы там оно не возвращало.....
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

А кудыть такое нужно...
... может Gudd-Head вспомнил про "теневые адреса" при работе с внешним ПЗУ (такая вещь например использовалась в АОНах на Z80), только каким боком здесь AVR ?... :)
culibin 100
Встал на лапы
Сообщения: 88
Зарегистрирован: Ср апр 29, 2009 10:35:56
Откуда: кр. лиман украина

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

Сообщение culibin 100 »

уважаемые коллеги стала необходимость поделить 3-х байтное число на такое же 3-х байтное число . значения чисел будут меняться но величина их так и будет оставаться в три байте .алгоритм функции деления трех байтного на однобайтное уже работает методом замены деления -вычитанием .а с трехбайтным делителем ума не приложу.помогите добрым кодом ))
буду благодарен за любую помощь :beer:
Аватара пользователя
xkp
Опытный кот
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров
Контактная информация:

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

Сообщение xkp »

деление 3 байт на 2 байта. покумекай, может доделаешь до 3 байт и выложишь сюда. буду признателен. подключаемый фаил для АВРстудии на ассемблере.
div_3_2.rar
(327 байт) 163 скачивания
. кому если надо, есть деления до "4 байт на 2 байта".
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Заменяй умножением на два и вычитанием.
A/B = C

Сначала умножаем B на два пока B<A и запоминаем сколько раз это сделали(N) затем вычитаем из А число B и заносим в С "1" в младший разряд (установить С = 1 и сдвинуть число С на один разряд влево). Сдвигаем число B вправо и N = N - 1.
Если A>B - вычитаем из A число B и заносим в С "1" в младший разряд иначе заносим "0" и сдвинуть число С на один разряд влево.
И так N раз.

Как-то вот так. Вспоминаем арифметику 3-го класса, когда делили в столбик - этот алгоритм получается тот же самый.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

shads писал(а):Гы..... А кудыть такое нужно..........

Хочу сэкономить время и место при обращении к памяти данных, расположенной в конце флэша.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
gauss
Держит паяльник хвостом
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

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

Сообщение gauss »

Решил написать вот такую вот программку для управления динамиком:
Спойлер

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

.def temp=R16
.def tembr=R17
.def tembr2=R18
.cseg
rjmp RESET ; Reset Handler
rjmp EXT_INT0 ; IRQ0 Handler
rjmp EXT_INT1 ; IRQ1 Handler
rjmp TIM2_COMP ; Timer2 Compare Handler
rjmp TIM2_OVF ; Timer2 Overflow Handler
rjmp TIM1_CAPT ; Timer1 Capture Handler
rjmp TIM1_COMPA ; Timer1 CompareA Handler
rjmp TIM1_COMPB ; Timer1 CompareB Handler
rjmp TIM1_OVF ; Timer1 Overflow Handler
rjmp TIM0_OVF ; Timer0 Overflow Handler
rjmp SPI_STC ; SPI Transfer Complete Handler
rjmp USART_RXC ; USART RX Complete Handler
rjmp USART_UDRE ; UDR Empty Handler
rjmp USART_TXC ; USART TX Complete Handler
rjmp ADCC ; ADC Conversion Complete Handler
rjmp EE_RDY ; EEPROM Ready Handler
rjmp ANA_COMP ; Analog Comparator Handler
rjmp TWSI ; Two-wire Serial Interface
rjmp SPM_RDY

;RESET:
EXT_INT0:
EXT_INT1:
TIM2_COMP:
TIM2_OVF:
TIM1_CAPT:
;TIM1_COMPA:
;TIM1_COMPB:
TIM1_OVF:
TIM0_OVF:
SPI_STC:
USART_RXC:
USART_UDRE:
USART_TXC:
ADCC:
EE_RDY:
ANA_COMP:
TWSI:
SPM_RDY:
reti
Reset:
ldi temp,0b00010000
out DDRC,temp
ldi temp,0b00010000
out TIMSK,temp
ldi temp,0b00000001
out TCCR1B,temp
ldi tembr,0x08
out OCR1AH,temp
ldi temp,1
out OCR1AL,temp
ldi tembr2,0x16
out OCR1BH,temp
ldi temp,1
out OCR1BL,temp
ldi temp,0
out TCNT1H,temp
out TCNT1L,temp

sei
rjmp Loop
TIM1_CompA:
ldi temp,0b00010000
out PortC,temp
ldi temp,0b00001000
out TIMSK,temp
reti
TIM1_CompB:
ldi temp,0
out TCNT1H,temp
out TCNT1L,temp
out PortC,temp
ldi temp,0b00010000
out TIMSK,temp
reti
Loop:
SBIS PINC,1
rjmp left
SBIS PINC,0
rjmp right
rjmp Loop
left:
dec tembr
ldi tembr2,0
add tembr2,tembr
add tembr2,tembr
out OCR1AH,tembr
out OCR1BH,tembr2
rjmp Loop
right:
inc tembr
ldi tembr2,0
add tembr2,tembr
add tembr2,tembr
out OCR1AH,tembr
out OCR1BH,tembr2
rjmp Loop

Вроде все правильно, а кнопки не регулируют частоту. Не мог бы кто-нибудь указать, почему?
:idea:
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Какая-то каша у тебя, не удивительно что в коде очень сложно увидеть ошибки. Это же гениальное решение! Обработчики прерываний находятся где-то в середине программы...
Мда...

Разделите хотябы всю программу на отдельные логические блоки, возможно даже с использованием подпрограмм.

И пожалуй, разрабатывать программы когда в этом нет опыта лучше всего с составления блок-схем на бумаге.

Да, и прежде чем менять регистры сравнения таймера вне прерываний неплохо было бы его остановить для начала? Или как минимум гарантировать что прерывание не возникнет пока будешь менять значение. Может ведь случится так что изменение одного байта приведет к возникновению прерывания по сравнению, тогда как установка всего значения еще не закончена...
Аватара пользователя
gauss
Держит паяльник хвостом
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

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

Сообщение gauss »

Останавливаю таймер. Значение увеличивается только на одно, после отпускания кнопки не сохраняется
:idea:
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Камень какой?
Установить стек
Выполнить все действия по установке портов, таймера и подготовить необходимые разрешения прерываний таймера. Сбросить все флаги требований прерываний
Запустить таймер
Глобально разрешить прерывания
Аватара пользователя
Coldheart
Прорезались зубы
Сообщения: 244
Зарегистрирован: Пт сен 10, 2010 20:39:32
Откуда: Украина Луганская обл.

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

Сообщение Coldheart »

Добрый день !
Продолжаю мучения со счетчиком витков.
Добился, чтобы он у меня считал витки только при нажатии на кнопку.(по восходящему фронту) УРА!
Теперь сделел чтобы он при нажатии PinD,5 он считал в обратную сторону, и загоралась точка на первом разряде УРА!

Хочу теперь чтобы он переключался на счет, обрантую сторону также по восходящему фронту.
И все это без прерываний.
Отстрелить не могу как это осуществить в данном случае. Время убиваю в невероятных поличествах.
а толку нет ( Помогите плиз.. Задолбался уже (
Всю документацию прилагаю.

Спойлер

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

.include "tn2313def.inc"         

.dseg


.cseg
        ldi R16,low(RamEnd)  ;установка указателя стека
          out SPL,R16
       
        ldi R16,0b11111111   ;настройка портов B
          out DDRB,R16

        ldi R16,0b00011111   ;настройка портов D
          out DDRD,R16
   clr r23
   clr r24
   clr r25
   clr r26
      
Start:
   in r16,PinD      ; пересылаем r16
   sbic PinD,4      ; бит 4
   rcall CycleINC
   
Indic:
          ldi R17,0b00000111                       
          out PortD,R17
        mov R22,r23
        rcall Decoder
        sbic PinD,5
        sbr r17,0b10000000
        out PortB,R17
        rcall Delay1         
     
          ldi R17,0b00001011                         
          out PortD,R17
        mov R22,r24
          rcall Decoder       
          out PortB,R17     
          rcall Delay1

          ldi R17,0b00001101                         
          out PortD,R17
        mov R22,r25
          rcall Decoder       
          out PortB,R17     
          rcall Delay1

        ldi R17,0b00001110                 
        out PortD,R17
        mov R22,r26
          rcall Decoder       
          out PortB,R17   
          rcall Delay1
      
   in r3,PinD   ; пересылаем порт в r3
   and r3,r16   ; проверяем, изменился ли 4-й бит
   sbrc r3,4   ; бит 4 в r3 очищен?
   rjmp Indic   ; нет => Индикация
   rjmp Start    ; да => Старт
   
CycleINC:
   sbic PinD,5
   rjmp CycleDEC
   inc r23
   cpi r23,10
   breq M
   ret
M:
   clr r23   
   inc r24
   cpi r24,10
   breq F
   ret
F:
   clr r24   
   inc r25
   cpi r25,10
   breq W
   ret
W:
   clr r25   
   inc r26
   cpi r26,10
   breq T
   ret
T:
   clr r26
   ret

          

CycleDEC:
   dec r23
   cpi r23,255
   breq M1
   ret
M1:
   ldi r23,9
   dec r24
   cpi r24,255
   breq F1
   ret
F1:
   ldi r24,9   
   dec r25
   cpi r25,255
   breq W1
   ret
W1:
   ldi r25,9
   dec r26
   cpi r26,255
   breq T1
   rjmp Indic
T1:
   ldi r26,9
   rjmp Indic
      
Decoder:            

          ldi ZL,Low(DcMatrix*2)      ;инициализация массива
          ldi ZH,High(DcMatrix*2)
        ldi R18,0       ;прибавление переменной
          add ZL,R22                 ;к 0-му адресу массива
          adc ZH,R18

          lpm                     ;загрузка значения
          mov R17,r0 
        ret

DcMatrix:
;массив - таблица истинности декодера
              ; hgfedcba   hgfedcba
          .db 0b00111111,0b00000110   ;0,1
          .db 0b01011011,0b01001111   ;2,3
          .db 0b01100110,0b01101101   ;4,5
          .db 0b01111101,0b00000111   ;6,7
          .db 0b01111111,0b01101111   ;8,9
         
Delay1:
           ldi R20,20
           ldi R21,11
d11:       
         dec R20
           brne d11
           dec R21
           brne d11
           ret


Изображение
Вложения
Proteus.rar
(27.38 КБ) 125 скачиваний
Последний раз редактировалось Coldheart Ср окт 24, 2012 11:18:59, всего редактировалось 1 раз.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

начнем с того, что если ты делаешь счетчик витков, а не стенд для изучения аврок, то без прерываний тебе не обойтись, в противном случае пропуски в подсчете неизбежны
Чем дальше, тем больше становлюсь занудой...
Изображение
culibin 100
Встал на лапы
Сообщения: 88
Зарегистрирован: Ср апр 29, 2009 10:35:56
Откуда: кр. лиман украина

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

Сообщение culibin 100 »

замути по прерываниям это самый надежный способ.и используй оптокодер там пропуски исключены ))
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

дело не в оптокодер, а в методе индикации... :wink:
Чем дальше, тем больше становлюсь занудой...
Изображение
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Coldheart писал(а):...Продолжаю мучения со счетчиком витков.

У Вас лапа PD4 настроена выходом 0, PD3 выходом 1. Протеусу этот факт "до лампочки", а вот контроллеру нет. Индикация будет с паразитным подсветом. Попробуйте так

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

   LDI R16,0b00001111   ;настройка портов D
;        ldi R16,0b00011111   ;настройка портов D
          out DDRD,R16
Последний раз редактировалось akl Ср окт 24, 2012 13:56:33, всего редактировалось 2 раза.
culibin 100
Встал на лапы
Сообщения: 88
Зарегистрирован: Ср апр 29, 2009 10:35:56
Откуда: кр. лиман украина

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

Сообщение culibin 100 »

какая у вас проблема с индикацией?
Аватара пользователя
Coldheart
Прорезались зубы
Сообщения: 244
Зарегистрирован: Пт сен 10, 2010 20:39:32
Откуда: Украина Луганская обл.

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

Сообщение Coldheart »

akl писал(а):У Вас лапа PD4 настроена выходом 0, PD3 выходом 1.
Попробуйте так.....

ОК! Просмотрел! Спасибо! :)
Yur
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Пт май 16, 2008 23:11:39

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

Сообщение Yur »

Люди добрые подскажите, кто сможет связать таких зверей :
ATMEGA8 +AD9835+ валкодер + 4разряда динамической индикации = простой синтезатор частоты
Естественно не бесплатно.
Просто не знаю к кому обратиться.
(сам глушняк - дальше бегущих огней не пошел....)

С уважением Юрий
www.y-u-r.ru
culibin 100
Встал на лапы
Сообщения: 88
Зарегистрирован: Ср апр 29, 2009 10:35:56
Откуда: кр. лиман украина

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

Сообщение culibin 100 »

сейчас такую зверюгу ковыряю.а в чем проблема спаять или программа?
Ответить

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