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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
PersidCat
Родился
Сообщения: 18
Зарегистрирован: Чт дек 02, 2010 06:08:10
Откуда: Россия
Контактная информация:

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

Сообщение PersidCat »

спасибо вам, GP1 8)
Реклама
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение DX168B »

Немного изменений и будет чуть быстрее:

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

.def n=r17
.def tmp=r16

...
ldi ZL,low(buff1)
ldi ZH,high(buff1)
ldi YL,low(buff2)
ldi YH,high(buff2)
;***************************
ldi  n,  0x0A
NEXT:
       ld tmp,Z+
       st Y+,tmp
       dec  n
       brne NEXT
....
;***************************
.dseg
buff1: .byte 10
buff2: .byte 10
I am DX168B and this is my favourite forum on internet!
Реклама
stima
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Сб ноя 13, 2010 16:16:45

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

Сообщение stima »

Здравствуйте. Сначала немного о задуманном. Атмега 8 + спаренный семисегментный индикатор + кнопка - из этого хочу получить секундомер до 99 секунд счета. Вопрос заключается в динамической индикации, а именно данных для вывода при дин. инд.

Вот к примеру прибдизительный алгоритм(полный код програмы прилагается):

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

timer_0_ovf:
                  lpm temp,z+
                  cpi temp,0b01101111 ;проверка с девяткой
	    breq init           ;инициализирую начало матрици
                  
                 sei       ;разрешение прерывания для срабатывания таймера
	   rjmp inf2 ;переход на бесконечный вывод
Но вопрос возникает в следующем, как использовав только указатель Z выгружать нужные значения для 1 индикатора и для 2 индикатора. Ну с 1 (счет до 9 сек) все ясно (его значения в нарпимер в temp), а как загнать, например, в temp1 нужное значение не потеряв адрес указателя?).

п.с. Понимаю, что вероятно не совсем ясно выразился. Может отредактирую, когда смогу лаконичней сформулировать)
п.с.с. Возможно это делается как-то совершенно подругому. Прошу указать где почитать (а именно материал, для самых твердыхЖ))) или написать кратенький алогиртм с обьяснениями.
Вложения
Секундомер.txt
(2.12 КБ) 327 скачиваний
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

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

Сообщение Meteor »

Наложить маску на младший байт регистра z перед выходом из обработки.
Пример:

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

.org 0x0070
deci_s:.Byte 1; Десятки секунд
.org 0x0071
second:.Byte 1;Единицы секунд
.....
.....
lpm temp,z+; Читаем данные
.....
andi zl, 0x01; Очищаем старшие биты
Вот както так бы и выполнил
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Реклама
Эиком - электронные компоненты и радиодетали
stima
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Сб ноя 13, 2010 16:16:45

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

Сообщение stima »

Если честно, то я не понял).
Вот это типо маска?:
andi zl, 0x01;
И в данном случае ZL это адресс или значение по адрессу? И что это даст?

Немного подкоректиру запрос.

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

.def sec     = r17
.def deci_s = r18
.....
timer_0_ovf:

lpm sec,z+
cpi temp,0b01101111 ;проверка с девяткой
breq init                    ;инициализурую начало матрици
	    
;;Вот здесь надо как-то сохранить указатель секунд;;

lpm deci_s,z              ;(z+?)      ;гружу значения для 2 индикатора
                 
;;Загрузхить значение указателя для десяток. При этом если в предыдущем сравнении небыло правды, то не увеличивать указатель;;
                 
cpi temp,0b01101111   ;проверка с девякой
breq init                      ;инициализурую начало матрици 

;;Сохранить указатель для десяток секунд. Вернуть указатель для секунд;;

rjmp inf2                     ;переход на бесконечный вывод

inf2:
    out portb,sec
    ldi temp,0b00000001
    out portc,temp
    ;rcall delay                              ;возможность регулировки частоты
    out portb,deci_s
    ldi temp,0b00000010
    out portc,temp
    ;rcall delay
    sei                                         ;разрешение прерывания для срабатывания таймера
    rjmp inf2                                ;жду следующего прерывания по таймеру
Может так ясней)
Реклама
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

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

Сообщение Meteor »

Содержимое регистра Z при каждом выполнении команды

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

 lpm temp, z+
будет увеличиваться на 1 и принимать значения
0x0070
0x0071
0x0072
....
0x0080 и т.д.
Наложение же маски не (правильнее маску сделать равной 0x71) не даст возможности увеличиться младшей части регистра Z выше чем 0x71 и при вызове будет цикл
0x0070
0x0071
0x0070
0x0071
Таким образом, каждый раз считывается одно из значений - либо десятки либо единицы секунд (имеет место ограничение области адресуемой памяти).
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Реклама
Аватара пользователя
Necroteeth
Потрогал лапой паяльник
Сообщения: 362
Зарегистрирован: Вс окт 10, 2010 17:43:48
Откуда: Воронеж

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

Сообщение Necroteeth »

не могли бы опытные коты ответить мне, правильно сделаны соединения на плате или нет?
больше всего интересует, правильно ли я понял идею подключения reset и gnd.
распайка DB25 взята отсюда - http://my-avr.at.ua/publ/1-1-0-3
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Necroteeth писал(а):не могли бы опытные коты ответить мне, правильно сделаны соединения на плате или нет?
На какой плате? При чём тут АСМ?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Necroteeth
Потрогал лапой паяльник
Сообщения: 362
Зарегистрирован: Вс окт 10, 2010 17:43:48
Откуда: Воронеж

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

Сообщение Necroteeth »

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

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

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

Necroteeth писал(а):плата самодельная
Платы я не вижу до сих пор. Ресет через 10 кОм на "+" питания, через 0,1 мкФ на "-" питания. "-" питания - GND, "+" питания - Vсс.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Necroteeth
Потрогал лапой паяльник
Сообщения: 362
Зарегистрирован: Вс окт 10, 2010 17:43:48
Откуда: Воронеж

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

Сообщение Necroteeth »

чую я, что-то перепуталось на форуме, коли мое сообщение оказалось здесь и без картинки... картинку добавляю повторно:
схема подключения мега16.JPG
(59.79 КБ) 496 скачиваний
нагрузку в виде LED не стал рисовать, ибо по ней вопросов нет
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

100 мкФ на ресете слишком много, 0.1 будет достаточно. Между питанием и "землёй" можно поставить пару кондёров (неск-ко мкФ электролит + неэлектролит ~0,1 мкФ) поближе к МК.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Roman Venom
Сверлит текстолит когтями
Сообщения: 1135
Зарегистрирован: Сб июл 11, 2009 18:42:21
Откуда: Украина, г.Николаев

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

Сообщение Roman Venom »

сделал такую маленькую программку, чтобы разобраться с юсартом.(мега16).
Прога делает следующее. Управляет скоростью мигания светика, путём переноса числа из буфера ЮСАРТа в регистры 16-битного таймера№1. В симуляторе всё работает... а на макетке светик мигает одинаково и никак не реагирует на посылки с компа(через прогу сериал порт монитор) через микруху ST232BN. Ком-порт проверил замыканием оного накоротко - всё в порядке. Напрямую МК к ком-порту не подключал - говорю сразу! В общем, обидно. Просидел с этим делом пару часов и без толку :( . Просьба посмотреть настройку юарта, может где-то косяк(хотя уже выучил все биты!).
На всякий привожу настройку фузов.
.device ATmega16
.nolist
.include "D:\Program Files\Atmel\AVR Studio\Appnotes\m16def.inc"
.list
;********************************

;определяем переменные
;рабочие:
.def work=r16
.def work1=r17
.def h_part=r19
.def l_part=r20
.def t_count1_L=r21
.def count1_symbol=r22
.def t_count0=r23
.def t_count1_H=r24
.def speed_value=r25
.def speed_value_1=r26
.def BLDC_cnt=r27
.def period_cnt=r28
.def data_byte1=r29



;порты:

;PORTD
.equ SHIM=PD7
.equ UH=PD6


;********************************
.cseg
.org 0x0000
;*****************************

jmp RESET ; Reset Handler
jmp EXT_INT0 ; IRQ0 Handler
jmp EXT_INT1 ; IRQ1 Handler
jmp TIM2_COMP ; Timer2 Compare Handler
jmp TIM2_OVF ; Timer2 Overflow Handler
jmp TIM1_CAPT ; Timer1 Capture Handler
jmp TIM1_COMPA ; Timer1 CompareA Handler
jmp TIM1_COMPB ; Timer1 CompareB Handler
jmp TIM1_OVF ; Timer1 Overflow Handler
jmp TIM0_OVF ; Timer0 Overflow Handler
jmp SPI_STC ; SPI Transfer Complete Handler
jmp USART_RXC ; USART RX Complete Handler
jmp USART_UDRE ; UDR Empty Handler
jmp USART_TXC ; USART TX Complete Handler
jmp ADC ; ADC Conversion Complete Handler
jmp EE_RDY ; EEPROM Ready Handler
jmp ANA_COMP ; Analog Comparator Handler
jmp TWSI ; Two-wire Serial Interface Handler
jmp EXT_INT2 ; IRQ2 Handler
jmp TIM0_COMP ; Timer0 Compare Handler
jmp SPM_RDY ; Store Program Memory Ready Handler


EXT_INT0:ret
EXT_INT1:ret
TIM2_COMP:ret
TIM2_OVF:ret
TIM1_CAPT:ret
TIM1_COMPA:ret
TIM1_COMPB:ret
;TIM1_OVF:
TIM0_OVF:ret
SPI_STC:ret
;USART_RXC:
;USART_UDRE:
USART_TXC:ret
ADC:ret
EE_RDY:ret
ANA_COMP:ret
TWSI:ret
EXT_INT2:ret
TIM0_COMP:ret
SPM_RDY:ret

;****************************
; ///TMR1 OVF///
;****************************
TIM1_OVF:
;запретить прерывания по переполнению
;извлекаем номер периода и продолжаем счёт
clr work
out TCCR1B,work;останов таймера
out TCNT1H,work;сбросить таймер-счётчик
out TCNT1L,work
ser work
out TIFR,work;cбросить флаги таймеров
main:
mov t_count1_H,BLDC_cnt;записать число с компа в реги.
mov t_count1_L,BLDC_cnt
exit_1:
ldi work,0b00000011
out TCCR1B,work;пуск таймера 1 с преддел.
out TCNT1H,t_count1_H;записать число с компа в реги таймера
out TCNT1L,t_count1_L
sbis PORTD,UH;светик вкл?
rjmp led_on;
rjmp led_off;тогда вырубить
exit:
reti
;-------------------
led_on:
sbi PORTD,UH
rjmp exit

led_off:
cbi PORTD,UH
rjmp exit

;****************************
; ///USATR RXC///
;****************************

USART_RXC:
in BLDC_cnt,UDR;cчитываем байт
exit_2:
sbi UCSRB,UDRIE;разрешаем прерывание по пустому буферу.
reti



;****************************
; ///USATR UDR///
;****************************

USART_UDRE:;прерывание по пустому буферу.
ser work
out UDR,work
cbi UCSRB,UDRIE;запретить прерывание до след. байта с компа
reti



RESET:
ldi r16,high(RAMEND) ; Main program start
out SPH,r16 ; Set stack pointer to top
ldi r16,low(RAMEND)
out SPL,r16
sei ; Enable interrupts

; ///PORTD///
ldi work,0b11111111
out DDRD,work
ldi work,0b01000000;светик на РД6
out PORTD,work
;***********************************
; ///настройка таймера 1 на прерывание по переполнению///
ldi work,0b00000000;stop timer1
out TCCR1B,work;
ldi t_count1_H,0x00;
ldi t_count1_L,0x00;
out TCNT1H,t_count1_H;clr TCNT
out TCNT1L,t_count1_L;clr TCNT1
ldi work,0b00000100;разрешить прерывание по переполн. таймера1
out TIMSK,work
;***********************************
; ///настройка USART///
; Set baud rate
ldi work,47;предделитель для 9600бодов при частотe 7.3728МГц
out UBRRL,work
; Enable receiver and transmitter
ldi work,(1<<RXEN)|(1<<TXEN)|(1<<RXCIE)|(1<<UDRIE);разрешить П/П, разрешить прерывание по принятому байту в UDR
out UCSRB,work
; Set frame format: 8data, 1 stop bit, no parity
ldi work,10000110;(URSEL, UCSZ1, UCSZ0)
out UCSRC,work
cbi UCSRB,RXCIE


;*****************************
;main loop
;*****************************
main_loop:
ldi work,0b00000011;предделитель
out TCCR1B,work
out TCNT1H,t_count1_H;заряжем таймер первым значением
out TCNT1L,t_count1_L
sbi UCSRB,RXCIE;разрешаем прерывание "байт с компа в буфере"

main_loop_1:
rjmp main_loop_1
Вложения
Безымянный.JPG
фузики
(29.25 КБ) 490 скачиваний
Успех - императив!
Аватара пользователя
Roman Venom
Сверлит текстолит когтями
Сообщения: 1135
Зарегистрирован: Сб июл 11, 2009 18:42:21
Откуда: Украина, г.Николаев

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

Сообщение Roman Venom »

появился следующий прикол.
в прерывании дописал абсолютно левую строчку:
USART_RXC:
in BLDC_cnt,UDR;cчитываем байт
exit_2:
sbi PORTB,PB0
sbi UCSRB,UDRIE;разрешаем прерывание по пустому буферу.
reti
и МК начал принимать данные... но очень странно. пишешь число в порт - скорость мигания светика меняется. пишешь то же число - снова меняется( существенно:на глаз видно). Бывает перестаёт мигать, бывает гаснет на долго...
Успех - императив!
Аватара пользователя
Necroteeth
Потрогал лапой паяльник
Сообщения: 362
Зарегистрирован: Вс окт 10, 2010 17:43:48
Откуда: Воронеж

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

Сообщение Necroteeth »

Gudd-Head писал(а):100 мкФ на ресете слишком много, 0.1 будет достаточно. Между питанием и "землёй" можно поставить пару кондёров (неск-ко мкФ электролит + неэлектролит ~0,1 мкФ) поближе к МК.
спасибо за помощь :) меня именно больше всего смущал вопрос об объединения земли программатора и питания, а также о avcc. ну коли про них Вы ничего не сказали, то добавлю конденсаторы по питанию и буду пробовать :beer:
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Necroteeth писал(а):смущал вопрос об объединения земли программатора и питания, а также о avcc. ну коли про них Вы ничего не сказали, то добавлю конденсаторы по питанию и буду пробовать :beer:
В даташите вроде написано, что на AVcc надо подавать питание, даже если вы не будете использовать аналоговую перифирию. Равно как и AGND стоит соединить с GND от греха подальше.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Roman Venom
Сверлит текстолит когтями
Сообщения: 1135
Зарегистрирован: Сб июл 11, 2009 18:42:21
Откуда: Украина, г.Николаев

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

Сообщение Roman Venom »

добавил сброс UBRRH. но ничего не поменялось :(
///настройка USART///
; Set baud rate
ldi work,23;предделитель для 19200бодов при частотe 7.3728МГц
out UBRRL,work
; Enable receiver and transmitter
ldi work,(1<<RXEN)|(1<<TXEN)|(1<<RXCIE)|(1<<UDRIE);разрешить П/П, разрешить прерывание по принятому байту в UDR
out UCSRB,work
; Set frame format: 8data, 1 stop bit, no parity
ldi work,10000110;(URSEL, UCSZ1, UCSZ0)
out UCSRC,work
ldi work,00000110;писать в UBRRH(URSEL=0)
out UCSRC,work
clr work
out UBRRH,work
out UCSRA,work
cbi UCSRB,RXCIE
Успех - императив!
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Если у меня задефайнен, например, R16 как TMP, могу ли я обращаться к следующему регистру (R17) как-нибудь через "TMP+1"?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

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

Сообщение Engineer_Keen »

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

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

Сообщение GP1 »

Регистры могут адресоваться так же как RAM кто не верит к DiHalt-у :wink:
Чем дальше, тем больше становлюсь занудой...
Изображение
Ответить

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