Ассемблер (ASM) для AVR в вопросах и ответах
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Подскажите пожалуйста литературу, где подробно описана работа с жки на ассемблере для avr. Почти везде встречается язык си. Из того,что нашел, "научился" выводить информацию с помощью масок. Задача предстоит выводить изменяющееся напряжение на элемене например каждую секунду. Настройка ацп, прерывание таймера по компоратору вроде ясно, а вот как вывести неизвестные заранее цифры на индикатор не понятно.
- Реклама
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Эта литература - даташит индикатора. В нем описаны и команды, и данные для вывода. Протокол опять же.
Docendo discimus
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Все равно не понял. Например на вход АЦП контроллера поступило напряжение 3 В, он преобразовал его в цифровой сигнал 00000011. Теперь мне надо это значение вывести на ЖКИ, но цифре "3" соответствует кодировка 00110011 HD44780.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
так прибавь 0x30
subi Rx,-0x30 исправил
subi Rx,-0x30 исправил
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Измеряемое напряжение находится в пределах от 0в до Хвольт. Вернее Х вольт - заданное Vref. На выходе АЦП будет от 0 до 1024. Убираем младшие два бита, т.к. они шумливые. Остается от 0 до 255. Делим 255 на Х и получаем количество отсчетов на один вольт. Это будет коэффициент пересчета, заранее подготовленное значение. А вот в программе уже этим коэффициентом переводите данные АЦП в число вольт, далее это число переводите в строку, которую и выпуливаете в ЖКИ.
Пример:
Vref задано 5вольт. 255/5= 51 значение на вольт. В процессе измерения получено с АЦП число 147. 147/51= 2.88. (Тут надо заметить, что алгоритмы деления могут быть разные. Опять же насколько точно нам надо.) Это число 2.88 переводим в строку - 0х32, 0х38, 0х38. И вот уже эти данные выпуливаем. Не забываем про точку.
Пример:
Vref задано 5вольт. 255/5= 51 значение на вольт. В процессе измерения получено с АЦП число 147. 147/51= 2.88. (Тут надо заметить, что алгоритмы деления могут быть разные. Опять же насколько точно нам надо.) Это число 2.88 переводим в строку - 0х32, 0х38, 0х38. И вот уже эти данные выпуливаем. Не забываем про точку.
Docendo discimus
- Реклама
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
pyzh_man писал(а):Убираем младшие два бита, т.к. они шумливые.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Согласно даташита, последние пара бит ненадежные. Нет, они конечно работают и все такое. Да я их всегда отсекаю.
Docendo discimus
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
+1
10 разрядный код АЦП как правило избыточен для большинства конструкций, а с 8битами на асме работать гораздо комфортнее.
10 разрядный код АЦП как правило избыточен для большинства конструкций, а с 8битами на асме работать гораздо комфортнее.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добрый день
подскажите пож. есть такая команда ASM которая может за один раз выводить байт в разные порты?.
то есть переменную записать: часть битов в порт С, другую часть в порт D (atmega168),.
--
спасибо
подскажите пож. есть такая команда ASM которая может за один раз выводить байт в разные порты?.
то есть переменную записать: часть битов в порт С, другую часть в порт D (atmega168),.
--
спасибо
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Такой команды нет и не может быть в принципе.
Docendo discimus
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Да и не надо 
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Как бы мне 8-ми битное число со знаком прибавлять к младшему байту 16-ти битного числа со знаком?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Как вариант
Добавил
Этот код имеет порок, т.к. действителен не для всей области определения 16-разрядного числа. Например 32760+100 получится лажа.
Так лучше
Код: Выделить всё
.def HIGH8 =R20
.def LOW8 =R21
.def HIGH16 =R10
.def LOW16 =R11
;*******************************************************
CLR HIGH8
SBRC LOW8,7
SER HIGH8
ADD LOW16,LOW8
ADC HIGH16,HIGH8Этот код имеет порок, т.к. действителен не для всей области определения 16-разрядного числа. Например 32760+100 получится лажа.
Так лучше
Код: Выделить всё
.def HIGH8 =R20
.def LOW8 =R21
.def HIGH24 =R9
.def HIGH16 =R10
.def LOW16 =R11
;*******************************************************
CLR R16 ; расширим 16-разрядное число до 24 разрядов
SBRC HIGH16,7 ;
SER R16 ; со знаком
MOV HIGH24,R16
CLR HIGH8
SBRC LOW8,7
SER HIGH8
ADD LOW16,LOW8
ADC HIGH16,HIGH8
ADC HIGH24,HIGH8 ; можно быть уверенным, что сделано правильно
Последний раз редактировалось akl Вт окт 11, 2011 13:30:40, всего редактировалось 2 раза.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Спасибо! Меня больше устраивает этот код, т.к. он быстрее и компактнее. А защиту от переполнения я организую программно в другом месте.akl писал(а):Как вариантКод: Выделить всё
.def HIGH8=R20 .def LOW8=R21 .def HIGH16=R10 .def LOW16=R11 ;******************************************************* CLR HIGH8 SBRC LOW8,7 COM HIGH8 ADD LOW16,LOW8 ADC HIGH16,HIGH8
Кстати, я чуток усовершенствовал ваш код: вместо "SER HIGH8" — "COM HIGH8", и теперь в качестве HIGH8 можно использовать младший регистр! Что скажете?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Да, так лучше.Gudd-Head писал(а): ...вместо "SER HIGH8" — "COM HIGH8", и теперь в качестве HIGH8 можно использовать младший регистр!
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
возник тут на днях вопрос по практическому применению микроконтроллера тини13а
накидал на си код:
теперь бы это всё перекинуть на ассемблер.
случилась загвоздка в следующем:необходимо сделать прерывание от любого изменения ноги PB0
в даташите написано
Table 9-2. Interrupt 0 Sense Control
ISC01 ISC00 Description
0 0 The low level of INT0 generates an interrupt request.[/list]
0 1 Any logical change on INT0 generates an interrupt request.
1 0 The falling edge of INT0 generates an interrupt request.
1 1 The rising edge of INT0 generates an interrupt request.[/list]
только вот при выполнении кода при "любом" изменении порта в симуляторе студии ничего не происходит...
и в протеусе тоже ничего, только при запуске происходит единичный проход прерывания0.
не обращайте внимания на то что код в си не совсем соответствует коду в асме.Это уже будет второй вопрос, если сам не дойду.
вопрос в том как организовать правильно прерывание ИНТ0 от любого изменения ноги инт0.
накидал на си код:
Код: Выделить всё
#include <avr/io.h>
//#include <stdint.h>
#include <avr/interrupt.h>
//#include <avr/eeprom.h>
#define IN_K 11060
#define OUT_K 5060
#define SIGN_OUT 2
float IMP = 0;
float const addition =OUT_K/IN_K;
//Прерывание 0
ISR(INT0_vect){
IMP += addition;
}
int main(void){
asm("sei");
//sei();
while(1){
if (IMP >=1 ){
IMP--;
PORTB ^= _BV(SIGN_OUT);
}//if
}//while (1)
}//main
случилась загвоздка в следующем:необходимо сделать прерывание от любого изменения ноги PB0
в даташите написано
Table 9-2. Interrupt 0 Sense Control
ISC01 ISC00 Description
0 0 The low level of INT0 generates an interrupt request.[/list]
0 1 Any logical change on INT0 generates an interrupt request.
1 0 The falling edge of INT0 generates an interrupt request.
1 1 The rising edge of INT0 generates an interrupt request.[/list]
только вот при выполнении кода при "любом" изменении порта в симуляторе студии ничего не происходит...
и в протеусе тоже ничего, только при запуске происходит единичный проход прерывания0.
не обращайте внимания на то что код в си не совсем соответствует коду в асме.Это уже будет второй вопрос, если сам не дойду.
Код: Выделить всё
.include "D:\Program Files\Atmel\AVR Studio 5.0\avrassembler\include\tn13Adef.inc"
.def Temp=R16
.def Temp1=R17
.def Temp2=R18
.def Temp3=R19
.def Temp4=R20
.macro outi // Макрос отправка константы в регистр в/в
ldi r16, @1
out @0, r16
.endmacro
.macro sbit // Макрос установка битов в регистре в/в
in r16,@0
sbr r16, @1
out @0, r16
.endmacro
.macro cbit // Макрос очистка битов в регистре в/в
in r16, @0
cbr r16, @1
out @0, r16
.endmacro
.cseg
.org 0
rjmp RESET ;External Pin, Power-on Reset,rown-out Reset, Watchdog Reset
rjmp INT_0 ;External Interrupt Request 0
rjmp PCINT_0 ;Pin Change Interrupt Request 0
rjmp TIM0_OVF ;Timer/Counter Overflow
rjmp EE_RDY ;EEPROM Ready
rjmp ANA_COMP ;Analog Comparator
rjmp TIM0_COMPA ;Timer/Counter Compare Match A
rjmp TIM0_COMPB ;Timer/Counter Compare Match B
rjmp WDT ;Watchdog Time-out
rjmp ADC_Complete ;ADC Conversion Complete
;RESET:
;INT_0:
;PCINT_0:
TIM0_OVF:
EE_RDY:
ANA_COMP:
TIM0_COMPA:
TIM0_COMPB:
WDT:
ADC_Complete:
reti
reset: outi SPL,low(RAMEND) ; инициализация стека
cbit MCUCR,(1<<PUD)|(1<<ISC01)|(1<<ISC00) ;подтяжка портов включена
sbit MCUCR,(1<<SE) ;Активация режима сна
outi GIMSK,0x40
outi DDRB,0b00000010; Пин 1 выход остальные вход
outi PORTB,0x01;подтяжка Пин 0
outi PCMSK,0x01
in temp1,0x20
sei
main: rjmp main
INT_0: reti
PCINT_0: in temp1,PINB
lsl temp1
out portb,temp1
exit_int: reti
.eseg
IN_K: .dw in_K
OUT_K: .dw out_K
Последний раз редактировалось vitalik_1984 Пн ноя 07, 2011 21:52:50, всего редактировалось 1 раз.
В поисках истины человек развивается.
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
а теперь сравниvitalik_1984 писал(а): в даташите написано
Table 9-2. Interrupt 0 Sense Control
ISC01 ISC00 Description
0 0 The low level of INT0 generates an interrupt request.[/list]
0 1 Any logical change on INT0 generates an interrupt request.
1 0 The falling edge of INT0 generates an interrupt request.
1 1 The rising edge of INT0 generates an interrupt request.[/list]
Код: Выделить всё
cbit MCUCR,(1<<PUD)|(1<<ISC01)|(1<<ISC00) ;подтяжка портов включена
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
да это я уже в процессе запуска по разному пробовал.GP1 писал(а):а теперь сравниvitalik_1984 писал(а): в даташите написано
Table 9-2. Interrupt 0 Sense Control
ISC01 ISC00 Description
0 0 The low level of INT0 generates an interrupt request.[/list]
0 1 Any logical change on INT0 generates an interrupt request.
1 0 The falling edge of INT0 generates an interrupt request.
1 1 The rising edge of INT0 generates an interrupt request.[/list]
Код: Выделить всё
cbit MCUCR,(1<<PUD)|(1<<ISC01)|(1<<ISC00) ;подтяжка портов включена
работает только этот вариант, но он в мою конструкцию никак не подходит.
а в студии второй пункт вообще(0 1 Any logical change on INT0) подписан как Резерв!
кому верить?
я понимаю, что пожно по другому прерыванию активировать, но у него приоритет ниже чем у ИНТ0 и через ИНТ0 прерывание можно из сна пробуждать насколько я понял.
В поисках истины человек развивается.
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
если мне память ни с кем не изменяет, из сна можно только по низкому уровню пробуждать, и то 0 должен быть не короче 4х тактов, это если я правильно помню, но могу и ошибаться, давно ДШ в руки не брал. 



