Ассемблер (ASM) для AVR в вопросах и ответах
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Очень полезная и хорошая информация, только я бы оформил в отдельную статейку. Можно к обучалке по АВР. Т.к. здесь со временем уйдет все это и найти будет очень сложно... 
Станислав
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Подскажите решение небольшой задачки кто разбирается а ASM и циклических буферах
со входа 8 бит порта каждый третий такт записывается его состояние A[i]
на другой 8 бит порт выход выводится на 20 тактов задержаннный A[i-20]
подразумевается использование регистиров у которых время доступа 1 такт (32 штв ниличии должно хватить)
так сказать цифровая ЛЗТ .Напомню записывается каждый третий такт
со входа 8 бит порта каждый третий такт записывается его состояние A[i]
на другой 8 бит порт выход выводится на 20 тактов задержаннный A[i-20]
подразумевается использование регистиров у которых время доступа 1 такт (32 штв ниличии должно хватить)
так сказать цифровая ЛЗТ .Напомню записывается каждый третий такт
ух ты.... показывает
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
надеюсь, считываются они тоже "каждый третий такт"? вы об этом умолчали...12val12 писал(а):со входа 8 бит порта каждый третий такт записывается его состояние A[i]
на другой 8 бит порт выход выводится на 20 тактов задержаннный A[i-20]
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Ассемблер (ASM) для AVR в вопросах и ответах
записывается и выводится каждый третий такт
ух ты.... показывает
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
так в чем проблема у вас? самое простое: заводите буфер на 256 ячеек, в регистровую пару, допустим, X записываете адрес начала этого буфера, а в регистровую пару, допустим, Y - записываете адрес на 20 больше. ну а потом пишите в буфер командой st Y+, R16, а считываете командой ld R17, X+ , после чего регистры XH и YH снова заполняете старшим байтом адреса буфера. вот и все.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Думаю что таким образом темп записи будет гораздо меньше чем каждый третий такт
запись из порта в регистр 1 такт из регистра в озу 2 такта уже три ..
обратно из озу в регистр и из регистра в порт еще три..
таким образом темп записи будет каждый шестой такт это без учета закольцовывния
в общем ОЗУ исключается. только регистры и порты
запись из порта в регистр 1 такт из регистра в озу 2 такта уже три ..
обратно из озу в регистр и из регистра в порт еще три..
таким образом темп записи будет каждый шестой такт это без учета закольцовывния
в общем ОЗУ исключается. только регистры и порты
ух ты.... показывает
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
это очевидно12val12 писал(а):Думаю что таким образом темп записи будет гораздо меньше чем каждый третий такт
да?12val12 писал(а):в общем ОЗУ исключается. только регистры и порты
чтение из порта в регистр - 1 такт
запись из регистра в порт - 1 такт
чтобы все это зациклить - минимум 2 такта, но чаще 3.
итак, на подготовку (перемещение, задержку) данных уже не остается ничего...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Ассемблер (ASM) для AVR в вопросах и ответах
А что, никак-никак не обойти привязку к тактам?
Я всё-всё узнAю и стану профессором.
- Starichok51
- Модератор
- Сообщения: 19046
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
12val12 писал(а):Напомню записывается каждый третий такт
1 такт - чтение из порта.
еще 1 такт - вывод в порт.
остается тебе придумать, как за 1 такт сделать задержку на 20 тактов.
а это возможно только телепортацией, причем в канал телепортации встроить задержку на 20 тактов.
короче, твои желания не реализуемы.
читать порт и выводить в порт можно только с одинаковой скоростью.
1. чтение из порта.
2. задержка на 18 тактов.
3. вывод в порт.
таким образом, читать ты сможешь только через каждые 20 тактов.
делал я подобную "линию задержки" в стародавние времена, еще на "Спектруме" - и получился у меня ревербератор.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Код: Выделить всё
.dseg
buf:
.byte 256
.cseg
ldi XL, lo(buf)
ldi r17, hi(buf)
ldi YL, lo(buf)+20
loop:
mov XH, r17 ; 1 такт
mov YH, r17 ; 1 такт, итого 2
in r16, PINB ; 1 такт, итого 3
st Y+, r16 ; 2 такта, итого 5
ld r16, Х+ ; 2 такта, итого 7
out PORTD, r16 ; 1 такт, итого 8
rjmp loop ; 2 такта, итого 10
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Starichok51
- Модератор
- Сообщения: 19046
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
а сколько тактов по твоему коду уйдет, пока адрес передвинется на 20 байт?
а уйдет (10 твоих тактов) умножить на 20 = 200 тактов. а ему нужно задержать всего на 20 тактов.
а для 20 тактов смещение адреса должно быть +2, а не +20.
к тому же, твой цикл - бесконечный.
а программе нужно заниматься еще и своим делом, и только с некоторой периодичностью обращаться к вводу и выводу.
но тут автор вопроса не дал разъяснений. может, у его программы и не будет других дел, как только бегать по такому циклу бесконечно...
а уйдет (10 твоих тактов) умножить на 20 = 200 тактов. а ему нужно задержать всего на 20 тактов.
а для 20 тактов смещение адреса должно быть +2, а не +20.
к тому же, твой цикл - бесконечный.
а программе нужно заниматься еще и своим делом, и только с некоторой периодичностью обращаться к вводу и выводу.
но тут автор вопроса не дал разъяснений. может, у его программы и не будет других дел, как только бегать по такому циклу бесконечно...
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
вот набросал похожее схематически .(не силен я в программировании)
тут задержка >22 тактов . с равномерным темпом ввода -вывода 1/4
возможно ли исключить 1 nop?возможно заджампить в начало за 1 такт ?
контроллер кроме как задержкой заниматься не будет
цель - другой контроллер смотрит сигнал . ловит событие одним портом
а после срабатывания сможет видеть за пару мкс до события задержанной линией
тут задержка >22 тактов . с равномерным темпом ввода -вывода 1/4
возможно ли исключить 1 nop?возможно заджампить в начало за 1 такт ?
контроллер кроме как задержкой заниматься не будет
цель - другой контроллер смотрит сигнал . ловит событие одним портом
а после срабатывания сможет видеть за пару мкс до события задержанной линией
Код: Выделить всё
1 in r0,PORTA
out portB,r5
nop nop
in r1,PORTA
out portB,r6
nop nop
in r2,PORTA
out portB,r7
nop nop
in r3,PORTA
out portB,r8
nop nop
in r4,PORTA
out portB,r9
nop nop
in r5,PORTA
out portB,r10
nop nop
in r6,PORTA
out portB,r0
nop nop
in r7,PORTA
out portB,r1
nop nop
in r8,PORTA
out portB,r2
nop nop
in r9,PORTA
out portB,r3
nop nop
in r10,PORTA
out portB,r4
jmp 1 ух ты.... показывает
- Starichok51
- Модератор
- Сообщения: 19046
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
12val12 писал(а):возможно заджампить в начало за 1 такт ?
это сначала нужно разработать новый процессор, в котором джамп выполняется за 1 такт.
12val12 писал(а):тут задержка >22 тактов
я насчитал 26 тактов (4 * 6 + 2 = 26 - от чтения в r0 до вывода из r0).
а если убрать один nop, то тогда задержка составит 3 * 6 + 2 = 20 тактов.
в твоем тексте чтение происходит каждый четвертый такт. а без одного nop будет происходить каждый третий такт (что тебе и нужно). и задержка составит ровно 20 тактов (что тебе и нужно).
правда, джамп будет периодически делать сбой на 1 такт...
можно оставить оба nop. но тогда делать вывод из r0 после чтения в r5, тогда задержка будет 22 такта, и джамп мешать не будет.
но и придется мириться с чтением каждый четвертый такт...
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Starichok51 писал(а):а сколько тактов по твоему коду уйдет, пока адрес передвинется на 20 байт?
а уйдет (10 твоих тактов) умножить на 20 = 200 тактов. а ему нужно задержать всего на 20 тактов.
а для 20 тактов смещение адреса должно быть +2, а не +20.
к тому же, твой цикл - бесконечный.
а программе нужно заниматься еще и своим делом, и только с некоторой периодичностью обращаться к вводу и выводу.
но тут автор вопроса не дал разъяснений. может, у его программы и не будет других дел, как только бегать по такому циклу бесконечно...
независимо от того, на сколько и когда сдвинется адрес, мой код будет выдавать данные с строго фиксированным запаздыванием. про такты я не особо парился, смещение можно сделать любым в пределах 0 - 255
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Starichok51
- Модератор
- Сообщения: 19046
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
ну так и автор вопроса в своем коде сделал фиксированную задержку.
только в твоем коде чтение порта будет через 10 тактов, а автору нужно чаще...
только в твоем коде чтение порта будет через 10 тактов, а автору нужно чаще...
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Все равно у меня проблема... )))
Написал все. Даже работает. При 15 км/ч включает туманки, при 40 км/ч включает второй ближний свет, при 5 км/ч выключает их. Но.
врем от времени моргает! Сволочь!
Мой аналитический склад ума дошел до того, что это либо импульсы на тахометр идут не ровно, а у меня замеряет между двух импульсов период... Может и попадает на такой, который не ровный... Думал даже считывать несколько значений и вычислять среднее арифметическое...
Потому что при 60 км/ч и больше - обе фары прекрасно светят и ничего не моргает.
З.Ы. Естественно проверяли не по самим фарам, а по светодиодам на плате.
Значения в памяти прекрасно сохраняет. Проверял ЕЕПРОМ, там значения четкие, т.е. длинное, а потом короче и еще короче.
Прикреплю текст программы. МК. ТИНИ13. Частота рабочая 4,8 МГц.
Может у кого будут идеи еще?
Написал все. Даже работает. При 15 км/ч включает туманки, при 40 км/ч включает второй ближний свет, при 5 км/ч выключает их. Но.
врем от времени моргает! Сволочь!
Мой аналитический склад ума дошел до того, что это либо импульсы на тахометр идут не ровно, а у меня замеряет между двух импульсов период... Может и попадает на такой, который не ровный... Думал даже считывать несколько значений и вычислять среднее арифметическое...
Потому что при 60 км/ч и больше - обе фары прекрасно светят и ничего не моргает.
З.Ы. Естественно проверяли не по самим фарам, а по светодиодам на плате.
Значения в памяти прекрасно сохраняет. Проверял ЕЕПРОМ, там значения четкие, т.е. длинное, а потом короче и еще короче.
Прикреплю текст программы. МК. ТИНИ13. Частота рабочая 4,8 МГц.
Может у кого будут идеи еще?
Спойлер
Код: Выделить всё
; ******************************************************
; * Автор: СКАЗОЧНИК *
; * Дата: 30.03.2016 *
; * Версия: 160330 *
; * Имя файла: АЦП *
; * Для AVR: ATTiny13 *
; * Тактовая частота: 4,8 MHz *
; * Среда разработки: AVR Studio 4.19 *
; * *
; * Выполняемые функции: включение фар от скорости *
; * *
; * *
; ******************************************************
; ================
; ПОДКЛЮЧАЕМЫЕ БИБЛИОТЕКИ (.include)
; ================
.include "tn13Adef.inc"
; ============
; ТИП МИКРОКОНТРОЛЛЕРА (.device)
; ============
.device ATtiny13A
; =================
; ОБЪЯВЛЕНИЯ И КОНСТАНТЫ (.def, .equ)
; =================
.def temp = R16
.def cnt = R20
.def OFFL = R17
.def OFFH = R24
.def ONTumL = R18
.def ONTumH = R25
.def ONBlL = R19
.def ONBlH = R26
.def PERIODL = R21
.def OVF = R22
.def PERIODH = R23
.def Addres = R27
; ====
; ПЕРЕМЕННЫЕ В ОЗУ (.dseg) RAM (.byte 1)
; ====
.dseg
;Counter1: .BYTE 1 ;Счетчик 0 для нулевого канала ШИМ
; ====
; МАССИВЫ И Т.Д. (.eseg) EEPROM (.db, .dw)
; ====
.eseg
.org 0x05
EE_PARAM:
.db 0xD8, 0x0E, 0x1F, 0x07, 0xA1, 0x04
; =================
; МАКРОСЫ (.MACRO)
; =================
.MACRO PUSHF ; Положить СРЕГ в стек
push r16
in r16, SREG
push r16
.ENDM
.MACRO POPF ; Достать СРЕГ из стека
pop r16
out SREG, r16
pop r16
.ENDM
; ******************************
; НАЧАЛО ПРОГРАММЫ (.cseg) FLASH
; ******************************
.cseg
; ----------
; ВЕКТОРЫ ПРЕРЫВАНИЙ
; ----------
rjmp RESET ; Reset Handler
rjmp INT0add ; External Interrupt0 Handler
rjmp PCI0add
rjmp OVF0add
rjmp ERDYadd
rjmp ACIadd
rjmp OC0Aadd
rjmp OC0Badd
rjmp WDTadd
rjmp ADCCadd
;RESET: ; Reset Handler
;INT0add: ; External Interrupt0 Handler
PCI0add:
;OVF0add:
ERDYadd:
ACIadd:
OC0Aadd:
OC0Badd:
WDTadd:
ADCCadd:
reti ; Выход из прерываний, которые не используются
; ----------
; ОБРАБОТЧИКИ ПРЕРЫВАНИЙ
; ----------
INT0add:
push temp ; Закидываем в стек темп
in temp, SREG ; Закидываем в стек СРЕГ
push temp
in temp, TIFR0 ; Проверка флага переполнения таймера
andi temp, (1<<1) ; Накладываем маску, если 1 бит был единицей, то он и останется, все остальные будут 0. Если он 0, то будет флаг Z
breq NOFLAG ; Нет флага (стоит Z), значит уходим, иначе обрабатываем флаг
out TIFR0, temp ; В темп уже есть этот флаг, как 1, снова его запихиваем и тем самым скинем флаг
inc OVF ; Добавляем еще одно переполнение к таймеру
NOFLAG: in PERIODL, TCNT0 ; Считываем значение младшего
mov PERIODH, OVF ; Считываем занчение старшего
clr OVF ; Чистим все для очередного замера
out TCNT0, OVF
pop temp ; Вытаскиваем из стека СРЕГ
out SREG, temp
pop temp ; Вытаскиваем из стека темп
reti
;----------
OVF0add:
inc OVF
cpi OVF, 251
brsh OVER
reti
OVER: ldi OVF, 250
reti
; **************************************************************************************************
; ИНИЦИАЛИЗАЦИЯ МК (логическое начало основной программы) ******************************************
; **************************************************************************************************
; --------- конфигурация портов ----------
Reset: ldi temp, (0<<PB4)|(0<<PB3)|(1<<PB2)|(0<<PB1)|(1<<PB0) ; Конфигурация порта
out DDRB, temp
ldi temp, (1<<PB4)|(1<<PB3)|(0<<PB2)|(1<<PB1)|(0<<PB0)
out PORTB, temp
ldi temp, low(RAMEND) ; Загрузка указателя стека
out SPL, temp
clr temp
out TCCR0A, temp ; Нормальный режим счета (выводы отключены)
out TCNT0, temp ; Очищаем счетный регистр
ldi temp, (0<<FOC0A)|(0<<FOC0B)|(0<<WGM02)|(1<<CS02)|(0<<CS01)|(0<<CS00) ; Делитель 256
out TCCR0B, temp
ldi temp, (0<<OCIE0B)|(0<<OCIE0A)|(1<<TOIE0) ; Разрешаем прерывание по переполнению
out TIMSK0, temp
ldi temp, (1<<ISC01)|(1<<ISC00) ; Запуск прерываний по переднему спаду (внешние)
out MCUCR, temp
ldi temp, (1<<INT0) ; Запуск прерывания внешнего
out GIMSK, temp
sbis PINB, 4 ; Если джампер снят, то пропускаем режим программирования
rcall PROGRAMM ; иначе уходим в режим программирования РАЗРЕШИТЬ ПРЕРЫВАНИЯ!!!!!!!!!!!!
G: sbis PINB, 4 ; Снова проверяем перемычку, если стоит, то идем покругу.
rjmp G ; чтобы не выполлялась программа дальше, пока не уберут перемычку
;----------
ldi temp, 5 ; Здесь хранится первое значение скорости, при котором все выключается
out EEARL, temp ; загружаем адрес нужной ячейки
sbi EECR, EERE ; Выставляем бит чтения
in OFFL, EEDR ; Забираем из регистра данных результат
ldi temp, 6 ; Здесь хранится первое значение скорости, при котором все выключается
out EEARL, temp ; загружаем адрес нужной ячейки
sbi EECR, EERE ; Выставляем бит чтения
in OFFH, EEDR ; Забираем из регистра данных результат
;----------
ldi temp, 7 ; Здесь хранится второе значение скорости, при котором включаются туманки
out EEARL, temp ; загружаем адрес нужной ячейки
sbi EECR, EERE ; Выставляем бит чтения
in ONTumL, EEDR ; Забираем из регистра данных результат
ldi temp, 8 ; Здесь хранится второе значение скорости, при котором включаются туманки
out EEARL, temp ; загружаем адрес нужной ячейки
sbi EECR, EERE ; Выставляем бит чтения
in ONTumH, EEDR ; Забираем из регистра данных результат
;----------
ldi temp, 9 ; Здесь хранится третье значение скорости, при котором включается ближний свет
out EEARL, temp ; загружаем адрес нужной ячейки
sbi EECR, EERE ; Выставляем бит чтения
in ONBlL, EEDR ; Забираем из регистра данных результат
ldi temp, 10 ; Здесь хранится третье значение скорости, при котором включается ближний свет
out EEARL, temp ; загружаем адрес нужной ячейки
sbi EECR, EERE ; Выставляем бит чтения
in ONBlH, EEDR ; Забираем из регистра данных результат
ldi temp, 0 ; Закидываем нулевой адрес в ЕЕПРОМ
out EEARL, temp ;
ldi PERIODL, 250
ldi PERIODH, 250
; ---------- разрешение прерываний ----------
sei ; Разрешаем прерывания
; *******************************************************************************************************************
; ОСНОВНАЯ ПРОГРАММА (основной цикл) ********************************************************************************
; *******************************************************************************************************************
Start:
cp ONBlL, PERIODL
cpc ONBlH, PERIODH
brsh ONB
rjmp T
ONB: sbi PORTB, 2
T: cp ONTumL, PERIODL ; Если
cpc ONTumH, PERIODH
brsh ONT
rjmp O
ONT: sbi PORTB, 0
O: cp OFFL, PERIODL ; Сравниваем с настоящим значением накопленного
cpc OFFH, PERIODH ; Если начисленное больше, то выключаем (скорость сильно маленькая)
brlo OFF
rjmp Start
OFF: cbi PORTB, 0
cbi PORTB, 2
rjmp Start ; Конец программы, переход на начало
; *******************************************************************************************************************
; ПОДПРОГРАММЫ ******************************************************************************************************
; *******************************************************************************************************************
PROGRAMM:
sei ; Разрешаем прерывания! Этим запускаем прерывания по спаду фронта
ldi cnt, 3
ldi Addres, 5
DO: sbis PINB, 3 ; Если кнопка не нажата, то выходим
rjmp STORE ; И идем сохранять значение
rjmp DO ; Иначе, крутимся бесконечно, пока не нажмут кнопку
STORE:
EEWrite: sbic EECR, EEPE ; Ждем готовности памяти к записи. Крутимся в цикле
rjmp EEWrite ; до тех пор пока не очистится флаг EEWE
cli
;ldi temp, 5
out EEARL, Addres ; Загружаем адрес нужной ячейки
out EEDR,PERIODL ; и сами данные, которые нам нужно загрузить
sbi EECR,EEMPE ; взводим предохранитель
sbi EECR,EEPE ; записываем байт (не более 4х таков ожидание)
EEWrite1: sbic EECR, EEPE ; Ждем готовности памяти к записи. Крутимся в цикле
rjmp EEWrite1 ; до тех пор пока не очистится флаг EEWE
inc Addres
out EEARL, Addres ; Загружаем адрес нужной ячейки
out EEDR,PERIODH ; и сами данные, которые нам нужно загрузить
sbi EECR,EEMPE ; взводим предохранитель
sbi EECR,EEPE ; записываем байт (не более 4х таков ожидание)
ldi temp, 0 ; Закидываем нулевой адрес в ЕЕПРОМ
out EEARL, temp ;
sei
inc Addres ; Сдвинули для следующего круга
cpi Addres, 9
brne TT
sbi PORTB, 0 ; Включаем туманки (светодиод)
;
TT: cpi Addres, 11
brne N
sbi PORTB, 2 ; Включаем ближний (светодиод)
N: rcall DELAY ; Подавляем дребезг
sbis PINB, 3 ; Проверка (отпустили ли кнопку)
rjmp N
clz
dec cnt ; Считаем очередной круг
breq END ; Уходим, если уже три круга прошло
rjmp DO ; И если не прошло три круга, то идем на очередной
; sbis PORTB, 0
; rjmp ON
; rjmp OFF
;
; ON: sbi PORTB, 0
; rjmp N
;;
; OFF: cbi PORTB, 0
;
END:
ret
;=============
;================
DELAY: ; Веся задержка будет равна примерно 50 мкс
push temp ; Положим перменную в стек, может она еще где-то используется
in temp, SREG ; Закидываем в стек СРЕГ
push temp
ldi R16, 200 ; Задержка ~8.107 mсек
ldi R28, 200
ldi R29, 0
Loop3: subi R16, 1
sbci R28, 0
sbci R29, 0
brcc Loop3
pop temp ; Вытаскиваем из стека СРЕГ
out SREG, temp ; Возвращаем занчение обратно из стека
pop temp ; Вытаскиваем переменную из стека
ret
;====================
Станислав
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
СКАЗОЧНИК писал(а):...
В портянку не собираюсь вникать. Сделайте гистерезис. Достигло определенных оборотов, входим в это состояние и теперь следим пока не упадет до заданных оборотов.
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Так и есть... Это все меня не тревожит. Меня тревожит, что попадает ей какой-то импульс от АБСки. Либо длинный на фоне коротких, либо наоборот. Поэтому и включает/выключает не вовремя...
Станислав
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
СКАЗОЧНИК писал(а):Так и есть... Это все меня не тревожит. Меня тревожит, что попадает ей какой-то импульс от АБСки. Либо длинный на фоне коротких, либо наоборот. Поэтому и включает/выключает не вовремя...
И как импульс от ABS попадает? Делайте, значит, несколько замеров, потом вычисляйте среднеарифметическое.
Последний раз редактировалось Demiurg Чт мар 31, 2016 20:59:20, всего редактировалось 2 раза.
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Там на приборку идет провод, который отвечает за спидометр. На нем импульсы, которые "прижимают к массе"... Их считываю своим микроконтроллером.
На разных машинах по разному. На одних скорость по датчикам АБС считывает, а на других есть отдельный датчик на коробке...
Вот. ))) Это я и думал.
Но может есть еще варианты...
На разных машинах по разному. На одних скорость по датчикам АБС считывает, а на других есть отдельный датчик на коробке...
Demiurg писал(а):вычисляйте среднеарифметическое.
Вот. ))) Это я и думал.
Но может есть еще варианты...

Станислав