Ассемблер (ASM) для AVR в вопросах и ответах
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Все правильно. Так я и считал тоже.
Схему доделал. Поставили на машину. Успешно работает. ))) Изменили только критерии (условия включения и выключения).
Теперь она включает свет туманок только если машина двигается (не важно как, главное, что импульсы от спидометра идут), при этом, включает их только после 5 секунд задержки. Если разогнались до 40 км/ч, то включает второй ближний. Выключает их одновременно, если мы 10 секунд никуда не двигались. Если в течение 10 секунд двигались, то они продолжают гореть.
Как показывает практика, даже в пробках по городу, автомобиль все равно катится чуток, чего вполне достаточно, чтобы не моргали фары.
Как-то так.
Если кому нужно, то выложу схему и исходник.
Схему доделал. Поставили на машину. Успешно работает. ))) Изменили только критерии (условия включения и выключения).
Теперь она включает свет туманок только если машина двигается (не важно как, главное, что импульсы от спидометра идут), при этом, включает их только после 5 секунд задержки. Если разогнались до 40 км/ч, то включает второй ближний. Выключает их одновременно, если мы 10 секунд никуда не двигались. Если в течение 10 секунд двигались, то они продолжают гореть.
Как показывает практика, даже в пробках по городу, автомобиль все равно катится чуток, чего вполне достаточно, чтобы не моргали фары.
Как-то так.
Если кому нужно, то выложу схему и исходник.
Станислав
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
СКАЗОЧНИК писал(а):...
Зачем столько заморочек с фарами? Смысл вашего девайса?
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Заказ, за который я заработал немножко денежков. Подобные заказы на данный момент, практически основной мой источник доходов...

З.Ы. А практический смысл в том, что по вразумению того человека его ксеноновые фары в туманках в маленьком объеме будут греться. Если в движении они лучше остывают, а когда остановился, чтобы зря не горели и не забывать выключать их.
Станислав
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Хоть и оффтоп, но от такого дрыгания ксенону придёт трындец ещё быстрее.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
А нет никакого дрыгания..
Он не выключается, пока не остановишься. А когда останавливаешься, обычно сам выключаешь его...
Станислав
- alex38779
- Потрогал лапой паяльник
- Сообщения: 386
- Зарегистрирован: Чт окт 31, 2013 10:54:32
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Хочу переходить по подпрограммам из таблицы по нажатию кнопки, но что то не выходит.
Для отладки сделал так первая - горит диод, вторая - мигает.
Изначально горит, нажимаю и держу кнопку- мигает, отпускаю -снова горит. Как сделать что бы осталась подпрограмма где мигает светодиод? В ручную вбиваю индекс подпрограммы - все переходит и работает.
регистры:
это в озу
таблица подпрограмм:
сам код
разобрался. не правильный ход алгоритма
Для отладки сделал так первая - горит диод, вторая - мигает.
Изначально горит, нажимаю и держу кнопку- мигает, отпускаю -снова горит. Как сделать что бы осталась подпрограмма где мигает светодиод? В ручную вбиваю индекс подпрограммы - все переходит и работает.
регистры:
Код: Выделить всё
.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разобрался. не правильный ход алгоритма
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Фонарик с включением-выключением нефиксированной кнопкой
и накачкой меандром (~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;
}
и накачкой меандром (~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;
}
ух ты.... показывает
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Писать эту лабуду не буду, но тут не соблюден баланс скобок: While (1) { не закрыт. Если писать на асме, нужно знать, как принимает параметр подпрограмма задержки. Или она рассчитана на тупо отмерить всегда 200ms ?
И вообще: что за странная задача - очередной курсач ? И что за бессмысленное пихание одной и той же инфы несколько раз в порт ?
И вообще: что за странная задача - очередной курсач ? И что за бессмысленное пихание одной и той же инфы несколько раз в порт ?
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Могу написать. За деньги. 1000 р на карту сбербанка. Предоплата.
Приведенный код никуда не годится.
Приведенный код никуда не годится.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Могу за бесплатно
, если спрошающий объяснит внятно, что должен делать этот бред сивой кобылы код и расставит скобки и ; . О том, что исходник д.быть читаемо отформатирован, и мечтать уж не приходится. 
Последний раз редактировалось Jack_A Вт апр 19, 2016 19:39:55, всего редактировалось 1 раз.
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Jack_A писал(а):Могу за бесплатно, если спрошающий объяснит внятно, что должен делать этот бред сивой кобылы код .
Товарищ даже не потрудился сказать: мол, ребята, так и так, я полный лох чайник, помогите, пожалуйста, написать программу примерно такого плана "бла-бла".
Он просто поставил перед фактом. А ну-ка быстренько накидали мне на асме по моему невнятному ТЗ.
Все еще есть желание заняться бесплатным альтруизмом?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
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 даже не вникая в джампы
стек в апаратный и все
смысл прост кнопкой без фиксации включаем-выключаем генератор накачки удвоитель или степап на светодиод
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 в вопросах и ответах
12val12 писал(а):второй оратор веселит .
Самим в лом написать, если вас ораторы веселят? Почему выбран такой древний МК, у которого аппаратный стек, и который снят с производства? У вас остался этот камушек? Вот и пишите сами программу под этот камень. Не хотите сами, выбросьте каку приведенный код, напишите нормальное ТЗ, без приведения сторонних кодов, которые только с толку сбивают. И просите нормально. А не ставьте перед фактом. Типа, запилите-ка мне программу на асме. За спасибо.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ну вот, уже баланс скобок появился. Все, оказывается, не так уж безнадежно. Вместо фиксированного delay200ms появился задающий время параметр. Теперь под пытками будет вытянуто: в чем он передается? Сама подпрограмма задержки будет библиотечная, и она сработает на 1200-м? Тогда в чем смысл переписки на асм? И сакральные мантры PORTB=0x1C; тоже имеют магический смысл?
Если бы в Радиокоте провели конкурс на самое замудомудренное описание самой простейшей задачки - вот кандидат на победителя.
Если бы в Радиокоте провели конкурс на самое замудомудренное описание самой простейшей задачки - вот кандидат на победителя.
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Jack_A писал(а):...
Многократный вывод в порт - аналог асм команд nop или rjmp PC+1. Только товарищ просит меандр, а по программе ни хрена не меандр.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Заработало можно сказать с НУЛЕВОГО раза т е мгновенно
скопировал аsm листинг main с кодевижена .
на всяк случай оставил инит выклченного компаратора. задержка с прошлого проекта
заполнение 55 % включается выключается . можно сказать меандр .
Все
подправил вторую задержку до 0.3 сек лучше срабатывает кнопка
спасибо тов akl за процедуру задержки .
скопировал а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 в вопросах и ответах
Алгоритм работы:
1 - Ждем нажатия кнопки.
Если не нажато, то п. 1.
Если нажато, то п.2.
2 - Задержка 30-40 мс, по окончании задержки, если еще нажато, то п.3, если нет, то п. 1.
3 - Если флаг 0, то включаем генератор и флаг =1, если флаг=1, то выключаем генератор и флаг=0. Генератор-таймер в режиме ШИМ.
4 - Ждем отжатия кнопки.
Если не отжато, то п. 4.
Если отжато, то задержка 30-40 мс, по окончании задержки, если еще не отжато, то п. 4, если отжато, то п. 1.
1 - Ждем нажатия кнопки.
Если не нажато, то п. 1.
Если нажато, то п.2.
2 - Задержка 30-40 мс, по окончании задержки, если еще нажато, то п.3, если нет, то п. 1.
3 - Если флаг 0, то включаем генератор и флаг =1, если флаг=1, то выключаем генератор и флаг=0. Генератор-таймер в режиме ШИМ.
4 - Ждем отжатия кнопки.
Если не отжато, то п. 4.
Если отжато, то задержка 30-40 мс, по окончании задержки, если еще не отжато, то п. 4, если отжато, то п. 1.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Не нашёл, где задать свой вопрос, потому спрошу здесь.
Объясните, пожалуйста как работает статусный регистр, пользоваться я им умею и назначение всех его битов мне понятно. Не могу понять как он "привязывается" к регистру, как МК понимает, что именно в этом регистре отрицательное число или вот в том регистре флаг заёма?
И попутно 2й вопрос, какие служебные регистры можно использовать для своих целей? Например, USIBR при неиспользуемом USI?
Спасибо.
Объясните, пожалуйста как работает статусный регистр, пользоваться я им умею и назначение всех его битов мне понятно. Не могу понять как он "привязывается" к регистру, как МК понимает, что именно в этом регистре отрицательное число или вот в том регистре флаг заёма?
И попутно 2й вопрос, какие служебные регистры можно использовать для своих целей? Например, USIBR при неиспользуемом USI?
Спасибо.
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
SatinS писал(а):Не нашёл, где задать свой вопрос, потому спрошу здесь.
Объясните, пожалуйста как работает статусный регистр, пользоваться я им умею и назначение всех его битов мне понятно. Не могу понять как он "привязывается" к регистру, как МК понимает, что именно в этом регистре отрицательное число или вот в том регистре флаг заёма?
Спасибо.
После каждого выполнения каждой команды в регистре SREG в зависимости от команды устанавливаются или сбрасываются те или иные флаги. Есть команды, которые не влияют на регистр SREG.
Если выполняются операции на регистрах, то после выполнение команды те или иные флаги относятся к тому регистру, на котором совершаются операции.
Установка или сброс флагов происходят внутри АЛУ (арифметико-логическое устройство). Это уже относится к схемотехнике цифровых устройств.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Demiurg писал(а):...
Вот мне и интересно - как происходит механизм запоминания, к какому именно регистру относится флаг, и сколько регистров с флагами можно обрабатывать, в даташите на авр я ничего об этом не нашёл.
