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

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

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

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

Очень полезная и хорошая информация, только я бы оформил в отдельную статейку. Можно к обучалке по АВР. Т.к. здесь со временем уйдет все это и найти будет очень сложно... :(
Станислав
12val12
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

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

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

Подскажите решение небольшой задачки кто разбирается а ASM и циклических буферах
со входа 8 бит порта каждый третий такт записывается его состояние A[i]
на другой 8 бит порт выход выводится на 20 тактов задержаннный A[i-20]
подразумевается использование регистиров у которых время доступа 1 такт (32 штв ниличии должно хватить)
так сказать цифровая ЛЗТ .Напомню записывается каждый третий такт
ух ты.... показывает
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

12val12 писал(а):со входа 8 бит порта каждый третий такт записывается его состояние A[i]
на другой 8 бит порт выход выводится на 20 тактов задержаннный A[i-20]
надеюсь, считываются они тоже "каждый третий такт"? вы об этом умолчали...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

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

записывается и выводится каждый третий такт
ух ты.... показывает
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

так в чем проблема у вас? самое простое: заводите буфер на 256 ячеек, в регистровую пару, допустим, X записываете адрес начала этого буфера, а в регистровую пару, допустим, Y - записываете адрес на 20 больше. ну а потом пишите в буфер командой st Y+, R16, а считываете командой ld R17, X+ , после чего регистры XH и YH снова заполняете старшим байтом адреса буфера. вот и все.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

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

Думаю что таким образом темп записи будет гораздо меньше чем каждый третий такт
запись из порта в регистр 1 такт из регистра в озу 2 такта уже три ..
обратно из озу в регистр и из регистра в порт еще три..
таким образом темп записи будет каждый шестой такт это без учета закольцовывния

в общем ОЗУ исключается. только регистры и порты
ух ты.... показывает
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

12val12 писал(а):Думаю что таким образом темп записи будет гораздо меньше чем каждый третий такт
это очевидно
12val12 писал(а):в общем ОЗУ исключается. только регистры и порты
да? :))) ну давайте, продемонстрируйте, как это можно сделать.

чтение из порта в регистр - 1 такт
запись из регистра в порт - 1 такт
чтобы все это зациклить - минимум 2 такта, но чаще 3.
итак, на подготовку (перемещение, задержку) данных уже не остается ничего...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
dgrett
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

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

Сообщение dgrett »

А что, никак-никак не обойти привязку к тактам?
Я всё-всё узнAю и стану профессором.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19046
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

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

Сообщение Starichok51 »

12val12 писал(а):Напомню записывается каждый третий такт

1 такт - чтение из порта.
еще 1 такт - вывод в порт.
остается тебе придумать, как за 1 такт сделать задержку на 20 тактов.
а это возможно только телепортацией, причем в канал телепортации встроить задержку на 20 тактов.

короче, твои желания не реализуемы.
читать порт и выводить в порт можно только с одинаковой скоростью.
1. чтение из порта.
2. задержка на 18 тактов.
3. вывод в порт.
таким образом, читать ты сможешь только через каждые 20 тактов.
делал я подобную "линию задержки" в стародавние времена, еще на "Спектруме" - и получился у меня ревербератор.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

   .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 в вопросах и ответах

Сообщение Starichok51 »

а сколько тактов по твоему коду уйдет, пока адрес передвинется на 20 байт?
а уйдет (10 твоих тактов) умножить на 20 = 200 тактов. а ему нужно задержать всего на 20 тактов.
а для 20 тактов смещение адреса должно быть +2, а не +20.
к тому же, твой цикл - бесконечный.
а программе нужно заниматься еще и своим делом, и только с некоторой периодичностью обращаться к вводу и выводу.
но тут автор вопроса не дал разъяснений. может, у его программы и не будет других дел, как только бегать по такому циклу бесконечно...
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
12val12
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

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

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

вот набросал похожее схематически .(не силен я в программировании)
тут задержка >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 в вопросах и ответах

Сообщение Starichok51 »

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 в вопросах и ответах

Сообщение ARV »

Starichok51 писал(а):а сколько тактов по твоему коду уйдет, пока адрес передвинется на 20 байт?
а уйдет (10 твоих тактов) умножить на 20 = 200 тактов. а ему нужно задержать всего на 20 тактов.
а для 20 тактов смещение адреса должно быть +2, а не +20.
к тому же, твой цикл - бесконечный.
а программе нужно заниматься еще и своим делом, и только с некоторой периодичностью обращаться к вводу и выводу.
но тут автор вопроса не дал разъяснений. может, у его программы и не будет других дел, как только бегать по такому циклу бесконечно...

независимо от того, на сколько и когда сдвинется адрес, мой код будет выдавать данные с строго фиксированным запаздыванием. про такты я не особо парился, смещение можно сделать любым в пределах 0 - 255
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Starichok51
Модератор
Сообщения: 19046
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

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

Сообщение Starichok51 »

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

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

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

Все равно у меня проблема... )))
Написал все. Даже работает. При 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 в вопросах и ответах

Сообщение Demiurg »

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

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

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

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

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

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

Сообщение Demiurg »

СКАЗОЧНИК писал(а):Так и есть... Это все меня не тревожит. Меня тревожит, что попадает ей какой-то импульс от АБСки. Либо длинный на фоне коротких, либо наоборот. Поэтому и включает/выключает не вовремя...

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

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

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

Там на приборку идет провод, который отвечает за спидометр. На нем импульсы, которые "прижимают к массе"... Их считываю своим микроконтроллером.
На разных машинах по разному. На одних скорость по датчикам АБС считывает, а на других есть отдельный датчик на коробке...

Demiurg писал(а):вычисляйте среднеарифметическое.


Вот. ))) Это я и думал.
Но может есть еще варианты... :dont_know:
Станислав
Ответить

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