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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

Все правильно. Так я и считал тоже.
Схему доделал. Поставили на машину. Успешно работает. ))) Изменили только критерии (условия включения и выключения).
Теперь она включает свет туманок только если машина двигается (не важно как, главное, что импульсы от спидометра идут), при этом, включает их только после 5 секунд задержки. Если разогнались до 40 км/ч, то включает второй ближний. Выключает их одновременно, если мы 10 секунд никуда не двигались. Если в течение 10 секунд двигались, то они продолжают гореть.
Как показывает практика, даже в пробках по городу, автомобиль все равно катится чуток, чего вполне достаточно, чтобы не моргали фары.
Как-то так.

Если кому нужно, то выложу схему и исходник.
Станислав
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

СКАЗОЧНИК писал(а):...

Зачем столько заморочек с фарами? Смысл вашего девайса?
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

:) Все очень просто. :)
Заказ, за который я заработал немножко денежков. Подобные заказы на данный момент, практически основной мой источник доходов... :dont_know:

З.Ы. А практический смысл в том, что по вразумению того человека его ксеноновые фары в туманках в маленьком объеме будут греться. Если в движении они лучше остывают, а когда остановился, чтобы зря не горели и не забывать выключать их.
Станислав
Аватара пользователя
Seriyvolk
Друг Кота
Сообщения: 4961
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

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

Сообщение Seriyvolk »

Хоть и оффтоп, но от такого дрыгания ксенону придёт трындец ещё быстрее.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

А нет никакого дрыгания.. :) Он не выключается, пока не остановишься. А когда останавливаешься, обычно сам выключаешь его...
Станислав
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

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

Сообщение alex38779 »

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

Для отладки сделал так первая - горит диод, вторая - мигает.

Изначально горит, нажимаю и держу кнопку- мигает, отпускаю -снова горит. Как сделать что бы осталась подпрограмма где мигает светодиод? В ручную вбиваю индекс подпрограммы - все переходит и работает.

регистры:

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

 .def temp = r20
 .def temp1 = r21


это в озу

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

;выбор подпрограммы
   count_prog:  .byte 1
   count_prog1:  .byte 1


таблица подпрограмм:

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

;таблица подпрограмм
table_prog:
   .dw program_z, program_0, program_1, program_2, program_3


сам код

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

main:   
   lds temp, count_prog
   ;выбор подпрограммы
   in temp1, PINB ;кнопка, подтянута к плюсу
   sbrс temp1, 3 ;если в ноль то пропуск след команды
   rjmp main_1
   inc temp
   sts count_prog, temp

 main_1:
   ;выбор из таблицы
   lds temp, count_prog
   lds temp1, count_prog1   
   ldi ZL, low(table_prog<<1)
   ldi ZH, high(table_prog<<1)
   lsl temp
   clr temp1
   add zl, temp
   add zh, temp1
   lpm temp, Z+
   lpm temp1, Z
   movw ZH:ZL, temp1:temp
   ldi temp, 0
   ldi temp1, 0   
   ijmp ;переход по адресу


   rjmp main


разобрался. не правильный ход алгоритма :)
12val12
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

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

Сообщение 12val12 »

Фонарик с включением-выключением нефиксированной кнопкой
и накачкой меандром (~100кГц) на at90s1200 написать на asm как можно ближе к следующему коду

DDRD=0x00;PORTD=0x01;
DDRB=0x1C;PORTB=0x00;
R28=1;
While(1)
{
if (PIND.1 ==0)
{ delay_200ms (+-50%)
if (PIND.1 ==0 )
{ if ( R28==0) R28=1;
else R28=0;
delay_200ms (+-50%)
}
}
if (R28==1)
{
PORTB=0x1C;
PORTB=0x1C;
PORTB=0x1C;
PORTB=0x1C;
PORTB=0x1C;
PORTB=0x0;
PORTB=0x0;
}
ух ты.... показывает
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

Писать эту лабуду не буду, но тут не соблюден баланс скобок: While (1) { не закрыт. Если писать на асме, нужно знать, как принимает параметр подпрограмма задержки. Или она рассчитана на тупо отмерить всегда 200ms ?
И вообще: что за странная задача - очередной курсач ? И что за бессмысленное пихание одной и той же инфы несколько раз в порт ?
Изображение
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

Могу написать. За деньги. 1000 р на карту сбербанка. Предоплата.
Приведенный код никуда не годится.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

Могу за бесплатно :) , если спрошающий объяснит внятно, что должен делать этот бред сивой кобылы код и расставит скобки и ; . О том, что исходник д.быть читаемо отформатирован, и мечтать уж не приходится. :(
Последний раз редактировалось Jack_A Вт апр 19, 2016 19:39:55, всего редактировалось 1 раз.
Изображение
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

Jack_A писал(а):Могу за бесплатно :) , если спрошающий объяснит внятно, что должен делать этот бред сивой кобылы код . :(

Товарищ даже не потрудился сказать: мол, ребята, так и так, я полный лох чайник, помогите, пожалуйста, написать программу примерно такого плана "бла-бла".
Он просто поставил перед фактом. А ну-ка быстренько накидали мне на асме по моему невнятному ТЗ.

Все еще есть желание заняться бесплатным альтруизмом?
12val12
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

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

Сообщение 12val12 »

DDRD=0x00;PORTD=0x01;
DDRB=0x1C;PORTB=0x00;
PowerOn=1;
while (1)
{
if (PIND.0 ==0)

{ PORTB=0x1C;
delay_ms(100);
PORTB=0x0;
if (PIND.0 ==0 )
{ if ( PowerOn==0) PowerOn=1;
else PowerOn=0;
delay_ms(100);
}
}
if (PowerOn==1)
{
PORTB=0x1C;
PORTB=0x1C;
PORTB=0x1C;
PORTB=0x1C;
PORTB=0x1C;
PORTB=0x1C;
PORTB=0x1C;
PORTB=0x1C;
PORTB=0x1C;
PORTB=0x1C;
PORTB=0x0;
}
}
вот рабочий код (tiny2313) хочу на асм (90s1200) PowerOn - любой РОН
собственно даже код не нужен
но duty cycle на выходе 40 -60%

второй оратор веселит .

сосбственно проще asm листинг подкорректировать под 1200 даже не вникая в джампы
стек в апаратный и все
смысл прост кнопкой без фиксации включаем-выключаем генератор накачки удвоитель или степап на светодиод
ух ты.... показывает
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

12val12 писал(а):второй оратор веселит .

Самим в лом написать, если вас ораторы веселят? Почему выбран такой древний МК, у которого аппаратный стек, и который снят с производства? У вас остался этот камушек? Вот и пишите сами программу под этот камень. Не хотите сами, выбросьте каку приведенный код, напишите нормальное ТЗ, без приведения сторонних кодов, которые только с толку сбивают. И просите нормально. А не ставьте перед фактом. Типа, запилите-ка мне программу на асме. За спасибо.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

Ну вот, уже баланс скобок появился. Все, оказывается, не так уж безнадежно. Вместо фиксированного delay200ms появился задающий время параметр. Теперь под пытками будет вытянуто: в чем он передается? Сама подпрограмма задержки будет библиотечная, и она сработает на 1200-м? Тогда в чем смысл переписки на асм? И сакральные мантры PORTB=0x1C; тоже имеют магический смысл?
Если бы в Радиокоте провели конкурс на самое замудомудренное описание самой простейшей задачки - вот кандидат на победителя.
Изображение
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

Jack_A писал(а):...

Многократный вывод в порт - аналог асм команд nop или rjmp PC+1. Только товарищ просит меандр, а по программе ни хрена не меандр.
12val12
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

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

Сообщение 12val12 »

Заработало можно сказать с НУЛЕВОГО раза т е мгновенно
скопировал аsm листинг main с кодевижена .
на всяк случай оставил инит выклченного компаратора. задержка с прошлого проекта
заполнение 55 % включается выключается . можно сказать меандр .
Все
подправил вторую задержку до 0.3 сек лучше срабатывает кнопка

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

    .INCLUDE "1200def.inc"
   .equ   Fo=4000000
 ;NAME DEFINITIONS FOR GLOBAL VARIABLES ALLOCATED TO REGISTERS
    .def   COUNTER=R20   
   .DEF _PowerOn=R3 
   .CSEG
.ORG   $0000
   RJMP   INIT ; Reset Handler
   RJMP EXT_INT0 ; IRQ0 Handler
;.ORG   $0006
.ORG   $0002
  CLI
EXT_INT0:
INIT:
; 0000 0071 // Analog Comparator initialization
; 0000 0072 // Analog Comparator: Off
; 0000 0073 // The Analog Comparator's positive input is
; 0000 0074 // connected to the AIN0 pin
; 0000 0075 // The Analog Comparator's negative input is
; 0000 0076 // connected to the AIN1 pin
; 0000 0077 ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
   LDI  R30,LOW(128)
   OUT  0x8,R30
; 0000 0078 // Digital input buffer on AIN0: On
; 0000 0079 // Digital input buffer on AIN1: On
; 0000 007A DIDR=(0<<AIN0D) | (0<<AIN1D);
   LDI  R30,LOW(0)
   OUT  0x1,R30
; 0000 007B
; 0000 007C
; 0000 007D
; 0000 007E
; 0000 007F DDRD=0x00;PORTD=0x01;
   OUT  0x11,R30
   LDI  R30,LOW(1)
   OUT  0x12,R30
; 0000 0080 DDRB=0x1C;PORTB=0x00;
   LDI  R30,LOW(28)
   OUT  0x17,R30
   LDI  R30,LOW(0)
   OUT  0x18,R30
; 0000 0081 PowerOn=1;
   LDI  R30,LOW(1)
   MOV  R3,R30
; 0000 0082 while (1)
_0x3:
; 0000 0083 {
; 0000 0084    if (PIND.0 ==0)
   SBIC 0x10,0
   RJMP _0x6
; 0000 0085
; 0000 0086      {   PORTB=0x1C;
   LDI  R30,LOW(28)
   OUT  0x18,R30
; 0000 0087          delay_ms(100);
 ; ----------
   LDI   R20,BYTE3(100*Fo/1000/5)
   LDI   R21,BYTE2(100*Fo/1000/5)
   LDI   R22,BYTE1(100*Fo/1000/5)
   RCALL   DELAY
; 0000 0088          PORTB=0x0;
   LDI  R30,LOW(0)
   OUT  0x18,R30
; 0000 0089         if (PIND.0 ==0 )
   SBIC 0x10,0
   RJMP _0x7
; 0000 008A           {  if ( PowerOn==0)  PowerOn=1;
   TST  R3
   BRNE _0x8
   LDI  R30,LOW(1)
   MOV  R3,R30
; 0000 008B                  else  PowerOn=0;
   RJMP _0x9
_0x8:
   CLR  R3
; 0000 008C                 delay_ms(300);
_0x9:
   LDI   R20,BYTE3(300*Fo/1000/5)
   LDI   R21,BYTE2(300*Fo/1000/5)
   LDI   R22,BYTE1(300*Fo/1000/5)
   RCALL   DELAY
; 0000 008D            }
; 0000 008E        }
_0x7:
; 0000 008F if (PowerOn==1)
_0x6:
   LDI  R30,LOW(1)
   CP   R30,R3
   BRNE _0xA
; 0000 0090   {
; 0000 0091     PORTB=0x1C;
   LDI  R30,LOW(28)
   OUT  0x18,R30
; 0000 0092     PORTB=0x1C;
   OUT  0x18,R30
; 0000 0093     PORTB=0x1C;
   OUT  0x18,R30
; 0000 0094     PORTB=0x1C;
   OUT  0x18,R30
; 0000 0095     PORTB=0x1C;
   OUT  0x18,R30
; 0000 0096     PORTB=0x1C;
   OUT  0x18,R30
; 0000 0097     PORTB=0x1C;
   OUT  0x18,R30
; 0000 0098     PORTB=0x1C;
   OUT  0x18,R30
; 0000 0099     PORTB=0x1C;
   OUT  0x18,R30
; 0000 009A     PORTB=0x1C;
   OUT  0x18,R30
; 0000 009B     PORTB=0x0;
   LDI  R30,LOW(0)
   OUT  0x18,R30
; 0000 009C    }
; 0000 009D    }
_0xA:
   RJMP _0x3
; 0000 009E
; 0000 009F   }
_0xB:
   RJMP _0xB
; .FEND



 
;
;
;----------
DELAY:
   SUBI   R22,BYTE1(1)
   SBCI   R21,BYTE2(1)
   SBCI   R20,BYTE3(1)
   BRNE   DELAY
   RET


спасибо тов akl за процедуру задержки .
ух ты.... показывает
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

Алгоритм работы:
1 - Ждем нажатия кнопки.
Если не нажато, то п. 1.
Если нажато, то п.2.
2 - Задержка 30-40 мс, по окончании задержки, если еще нажато, то п.3, если нет, то п. 1.
3 - Если флаг 0, то включаем генератор и флаг =1, если флаг=1, то выключаем генератор и флаг=0. Генератор-таймер в режиме ШИМ.
4 - Ждем отжатия кнопки.
Если не отжато, то п. 4.
Если отжато, то задержка 30-40 мс, по окончании задержки, если еще не отжато, то п. 4, если отжато, то п. 1.
SatinS
Открыл глаза
Сообщения: 53
Зарегистрирован: Пн ноя 09, 2009 20:14:52

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

Сообщение SatinS »

Не нашёл, где задать свой вопрос, потому спрошу здесь.
Объясните, пожалуйста как работает статусный регистр, пользоваться я им умею и назначение всех его битов мне понятно. Не могу понять как он "привязывается" к регистру, как МК понимает, что именно в этом регистре отрицательное число или вот в том регистре флаг заёма?
И попутно 2й вопрос, какие служебные регистры можно использовать для своих целей? Например, USIBR при неиспользуемом USI?
Спасибо.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

SatinS писал(а):Не нашёл, где задать свой вопрос, потому спрошу здесь.
Объясните, пожалуйста как работает статусный регистр, пользоваться я им умею и назначение всех его битов мне понятно. Не могу понять как он "привязывается" к регистру, как МК понимает, что именно в этом регистре отрицательное число или вот в том регистре флаг заёма?
Спасибо.

После каждого выполнения каждой команды в регистре SREG в зависимости от команды устанавливаются или сбрасываются те или иные флаги. Есть команды, которые не влияют на регистр SREG.
Если выполняются операции на регистрах, то после выполнение команды те или иные флаги относятся к тому регистру, на котором совершаются операции.
Установка или сброс флагов происходят внутри АЛУ (арифметико-логическое устройство). Это уже относится к схемотехнике цифровых устройств.
SatinS
Открыл глаза
Сообщения: 53
Зарегистрирован: Пн ноя 09, 2009 20:14:52

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

Сообщение SatinS »

Demiurg писал(а):...

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

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