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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

Ага, а это как говорят в Одессе - "Две большие разницы" :)))
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
elf
Открыл глаза
Сообщения: 60
Зарегистрирован: Чт окт 29, 2009 23:22:03

Сообщение elf »

доброго времени суток.
Объясните пожалуйста что означает этот код:

#ifndef __SLEEP_DEFINED__
#define __SLEEP_DEFINED__
.EQU __se_bit=0x40
.EQU __sm_mask=0xB0
.EQU __sm_powerdown=0x20
.EQU __sm_powersave=0x30
.EQU __sm_standby=0xA0
.EQU __sm_ext_standby=0xB0
.EQU __sm_adc_noise_red=0x10
.SET power_ctrl_reg=mcucr
#endif

как его заменить на Си
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Сообщение SII »

Первые две и последнюю строчку оставить, как есть, а все .EQU заменить на #define имя число, например:

#define __se_bit 0x40
elf
Открыл глаза
Сообщения: 60
Зарегистрирован: Чт окт 29, 2009 23:22:03

Сообщение elf »

SII СПАСИБО
Аватара пользователя
MTF
Нашел транзистор. Понюхал.
Сообщения: 179
Зарегистрирован: Чт янв 07, 2010 11:25:12
Откуда: Москва

Сообщение MTF »

Здравствуйте уважаемые коты , опять возникли проблемы с приёмом кода RC5 , понадобилось различать длительное нажатие одной клавиши , по протоколу, есть такой 3 бит (управляющий бит) , по нему впринципе можно определить , что нажата одна и таже клавиша , он инвертируется всякий раз, когда нажимается клавиша !!!

Паразитирую на коде DATASHEET AVR410 RC5 , вот кусок кода записи 12 битов кода RC5 без 2 стартовых битов.

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

sample:
        cp   timerL,ref1 ;Sample INPUT at 1/4 bit time
        brlo sample
        sbic PIND,RC5
        rjmp bit_is_a_1 ;Jump if line high
bit_is_a_0:
        clc  ;Store a '0'
        rol  command
        rol  system
;Synchronize timing
bit_is_a_0a:
        cp   timerL,ref2 ;If no edge within 3/4 bit time
        brge fault ;exit
        sbis PIND,RC5 ;Wait for rising edge
        rjmp bit_is_a_0a ;in the middle of the bit
        clr  timerL
        rjmp nextbit
bit_is_a_1:
        sec ;Store a '1'
        rol  command
        rol  system
;Synchronize timing
bit_is_a_1a:
        cp   timerL,ref2 ;If no edge within 3/4 bit time
        brge fault ;exit
        sbic PIND,RC5 ;Wait for falling edge
        rjmp bit_is_a_1a ;in the middle of the bit
        clr  timerL
nextbit:
        dec  bitcnt ;If bitcnt > 0
        brne sample ;get next bit
;All bits sucessfully received!
        mov  tmp,command ;Place system bits in "system"
        rol  tmp
        rol  system
        rol  tmp
        rol  system
        bst  system,5 ;Move toggle bit
        bld  command,6 ;to "command"
;Clear remaining bits
        andi command,0b01111111
        andi system,0x1F


в этой части кода

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

        bst  system, 6      ; Move toggle bit
        bld  command, 6  ; to "command"
;Clear remaining bits
        andi command,0b01111111
        andi system,0x3F


я думаю если в system записать 6 бит а не 5 бит , то 6 бит это как раз будет управляющий бит , как можно проверять 6 бит system
на повтор , а если повтор , то выставить 8 бит command в 1 ????
Аватара пользователя
MTF
Нашел транзистор. Понюхал.
Сообщения: 179
Зарегистрирован: Чт янв 07, 2010 11:25:12
Откуда: Москва

Сообщение MTF »

Спецы по ASM , обьясните как начанающему , вот что написал для проверки нажатия кнопки на повтор !!!!

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

   
  bst  system, 6      ; Move toggle bit
  bld  command, 6  ; to "command"
;Clear remaining bits
  andi command,0b01111111
  andi system,0x3F

  mov  r16 , system
  andi  r16 , 0b01000000   ; обнулить все биты кроме 7
  cp     r16 , autorpt          ;   
  mov  autorpt ,  r16         
  brne  no_repeat              ; если не равно то exit
  ori     command , 0b10000000  ; 8 бит в 1
no_repeat:
 


почему то не работает , может кто нибудь подсказать что не так делаю ????
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

Для проверки бита в РОН и ветвления процесса лучше использовать команды SBRC SBRS.
Вот только не понял:
Выставляешь 6-й бит а проверяешь 7-й бит? :shock:

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

  mov  r16 , system 
  andi  r16 , 0b01000000   ; обнулить все биты кроме 7
 
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
MTF
Нашел транзистор. Понюхал.
Сообщения: 179
Зарегистрирован: Чт янв 07, 2010 11:25:12
Откуда: Москва

Сообщение MTF »

GP1 насколько я понял в этом куске записываются последних 11 битов кода RC5 нажатой кнопки , 5 из них номер системы , 6 код кнопки , хотя судя по общему коду AVR410 RC5 считываются все 12 битов , в том числе и интересующий меня (управляющий) бит , но этот бит почему то не учитывается ????

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

        mov  tmp,command ; Place system bits in "system" 
        rol  tmp
        rol  system
        rol  tmp
        rol  system
[code]        bst  system, 5  ;Move toggle bit
        bld  command, 6 ;to "command"
[/code];Clear remaining bits
       andi command,0b01111111
       andi system,0x3F


долгое время разбирался в коде DATASHEET AVR410 , кое что правда не понятно , не пойму как они с помощью этого куска кода записывают 11 битов в system и command , особенно непонятно вот это

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

 
        bst  system, 5  ;Move toggle bit
        bld  command, 6 ;to "command"


GP1
Для проверки бита в РОН и ветвления процесса лучше использовать команды SBRC SBRS.



Ведь интересующий меня (управляющий) бит , нвертируется всякий раз, когда нажимается клавиша. Таким путем приемник может различать клавишу, которая остается нажатой, или периодически нажимается.

все голову сломал куда у них делся 12 (управляющий) бит , как ловить повторяющуюся клавишу я в принципе понял , даже написал доп код но почему то он не работает ???
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

Как я понял в
system - 5 бит код системы
command - 6 бит код команды
прием ведется первые 6 бит в system, вторые 6 бит в command
код:

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

  
        bst  system, 5  ;Move toggle bit
        bld  command, 6 ;to "command"

просто переписывает ст.бит system в 6-й бит command, через бит Т sreg, в результате в system остается 5 бит [4:0] адрес системы, а в command 7 бит кода команды + управляющий бит - [6]-контрольный бит, [5:0] - код комманды
вот от этого commanf[6] бита тебе и надо плясать.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
MTF
Нашел транзистор. Понюхал.
Сообщения: 179
Зарегистрирован: Чт янв 07, 2010 11:25:12
Откуда: Москва

Сообщение MTF »

GP1 Спасибо, после ваших разьяснений по коду

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

        bst  system, 5     ;Move toggle bit 
        bld  command, 6 ;to "command"

теперь все понятно , во я дал :oops: тут даже в коментарии для идеотов написано поместить управляющий бит в 6 бит command

вот так у меня выглядит опрос кнопок пульта

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

main:   основной цикл   программы
   rcall   detect         ;
   cpi     system, 0x00               ;                   
   brne   rc5_end      ;
   andi   command,0x3F      ; без управляющего бита 
   cpi   command,0b00111000   ;Code 1
   breq   CODE11      ;
   cpi   command,0b00111001   ;Code 2
   breq   CODE22      ;
   rjmp   rc5_end         ;
CODE11:      rjmp   CODE1         ;
CODE22:      rjmp   CODE2         ;   
rc5_end:
    ********
    ********
    ********
   rjmp   main         ;


изменил код под длинное нажатие

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

   
main:   основной цикл   программы
   rcall   detect         ;
   cpi     system, 0x00               ;                   
   brne   rc5_end      ;
   lds    tmp ,  rc5_old       
   cp     tmp ,  command
   sts    rc5_old ,  tmp
   andi  command,0x3F  ;
   brne  K1                    ;  если  не равно   
   ori    command , 0b10000000 ;  8бит в 1
K1:
   cpi   command,0b00111000   ;Code 1    для одного нажатия
   breq   CODE11      ;
   cpi   command,0b00111001   ;Code 2
   breq   CODE22      ;
   cpi   command,0b10111000   ;Code 1L    длинное нажатие
   breq   CODE11L      ;
   cpi   command,0b10111001   ;Code 2L
   breq   CODE22L      ;
   rjmp   rc5_end         ;
CODE11:      rjmp   CODE1         ;
CODE22:      rjmp   CODE2         ;   
CODE11L:      rjmp   CODE1L         ;
CODE22L:      rjmp   CODE2L         ;   

rc5_end:
    ********
    ********
    ********
   rjmp   main         ;


Опять не хочет работать , не ловит длинное нажатие , что может быть не так ????
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

Честно говорю - не догнал смысла твоего кода.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
MTF
Нашел транзистор. Понюхал.
Сообщения: 179
Зарегистрирован: Чт янв 07, 2010 11:25:12
Откуда: Москва

Сообщение MTF »

Попробую обьяснить.

В моем устройстве при нажатии на кнопку + или - Vol пульта RC5 ,у меня увеличивается громкость, если нажать один раз на кнопку соответственно увеличивается либо уменьшается громкость как бы на одно деление + BEEP из пьезоизлучателя , если я долго держу кнопку то громкость как то очень быстро регулируется от 0 до 100 около 2 сек , а хотелось бы как у всех медленно и без BEEP , вот и решил различать короткое от длинного нажатия!!!

может есть какие нибуть другие варианты как регулировать громкость медленнее при постоянно нажатой кнопке????
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

Для этого у тебя есть управляющий бит (УБ). Тебе нужно организовать счетчик, который будет увеличиваться при каждой смене значения УБ, и таймер time-out, и как счетчик достигнет определенного значения - выполняешь нужное действие.
Не забывай его обнулять если превышен time-out, или поменялся код клавищи.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Сообщение Meteor »

Мяу, GP1!
То MTF иногда может стоит пересмотреть схему и алгоритм? :roll:
Алгоритм различения проще реализовать прерываниями от таймера 1 и внешнего сигнала (INTi). Запускаете нажатием кнопки таймер, а при отпускании - фиксируете значение ICP... Далее определяете сколько вешать в граммах...
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

Meteor и тебе мяу, пушистый брат!
Если я правильно понял, он пытается решить траблу в приемнике, думаю через ICR вряд ли получится.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Сообщение Meteor »

GP1 писал(а):Если я правильно понял, он пытается решить траблу в приемнике...

Тут народ терпеливый - подождем чего мяфтор скажет:))
А по делу лучше связывать и прогу и схему - сразу прозрачнее становится.
PS. Чем мотивируешь сложность реализации через ICP?
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Аватара пользователя
MTF
Нашел транзистор. Понюхал.
Сообщения: 179
Зарегистрирован: Чт янв 07, 2010 11:25:12
Откуда: Москва

Сообщение MTF »

Ребята вы попали в точку , я не раз на форуме задавал вопрос по поводу приема кода RC5 через INT1, советов по реализации не было, сначала у меня возникли проблемы с просыпанием контроллера Attiny2313 с подключенным TSOP1736 через INT1 , потом решил проблему.
Инфы в инете много , но через int как делать инфы особо нет , либо на Си, разве что товарищь Ридико полуописал как он делал через int на at89с2051, пытался разобратся как делается через INT, но так как еще не очень владею ASM , так и не реализовал свою идею до конца , да еще как назло оба таймера работают с фиксированной частотой T0/CK , T1 (вообще не всегда работает только по требованию) !!!

У меня усилитель на контроллере attiny2313 , имеет пока 3 кнопки (on -off , + , - громкость ), потом решил приладить пульт RC5 , вставил стандартный код detect из datasheet avr410 rc5 , поскольку при нажатии кнопки on - off усилитель входит в режим SLEEP , тут же понадобилось сделать чтобы при нажатии кнопок на пульте он просыпается, просыпание от внешнего прерывание INT с помощью TSOP1736 , поскольку TSOP1736 подключен к INT1 , я почему то решил что раз уж подключен через к INT1 то можно упростить алгоритм приема кода RC5 в отличие от оригинальной процедуры detect datasheet avr410 !!!!

Насчет длительного нажатия , я заморочился потому что очень быстро регулируется громкость усилителя , на стационарных кнопках
у меня есть различие длительного(повтор кода кнопки ~ через каждые 0,5 сек) и короткого нажатия , процедура прибавления звука у меня одна на длинное и короткое нажатие , для кнопок пульта RC5 планирую использовать так же эту процедуру , вот и понадобилось обработка длительного нажатия на одну кнопку пульта RC5

Поскольку от своей идеи принимать код RC5 через INT не отказался , буду очень признателен если вы мне поможите разобратся c этой задачей , зарание спасибо !!!!!

p.s что означает ICP
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Сообщение Meteor »

Виноват, :oops: заморочился уже с NECовскими, подзабыл атмеловские. Не ICP, а ICR-захват состояния таймера 1 по внешнему событию.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Аватара пользователя
MTF
Нашел транзистор. Понюхал.
Сообщения: 179
Зарегистрирован: Чт янв 07, 2010 11:25:12
Откуда: Москва

Сообщение MTF »

а еще есть какие нибуть варианты кроме ICR-захват состояния таймера 1 по внешнему событию , у меня таймеры работают все время с определенной частотой , походу ICR для меня не годится ???
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Сообщение Meteor »

Позволю себе еще раз нескромно намекнуть на схему....
Наверняка есть варианты. Тем более если речь пойдет о порте В (в тини2313)
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Ответить

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