roboforum.ru

Технический форум по робототехнике.

серж. "А ТЫ... ХОЧЕШЬ СТАТЬ АСМАТИКОМ?"

Блоги посетителей.
Правила форума
В данном разделе каждый может иметь не более одной темы. Тема должна начинаться с логина (ника) робофорума.

Re: серж. "А ТЫ... ХОЧЕШЬ СТАТЬ АСМАТИКОМ?"

Сообщение серж » 18 авг 2012, 20:15

legion писал(а):Неправильно:
.def temp r=16 ;назначение рабочего регистра
.def tempH r=17
.def tempL r=18

не врубаюсь в чем здесь косяк... :oops:
Аватара пользователя
серж
 
Сообщения: 589
Зарегистрирован: 27 янв 2011, 17:38
Откуда: россия, череповец

Re: серж. "А ТЫ... ХОЧЕШЬ СТАТЬ АСМАТИКОМ?"

Сообщение legion » 18 авг 2012, 20:25

Надо так:
.def temp = r16 ;назначение рабочего регистра
legion
 
Сообщения: 736
Зарегистрирован: 24 апр 2010, 14:47
Откуда: Уфа
прог. языки: avr asm

Re: серж. "А ТЫ... ХОЧЕШЬ СТАТЬ АСМАТИКОМ?"

Сообщение серж » 18 авг 2012, 21:02

вкурил!

Добавлено спустя 1 минуту 47 секунд:
Код: Выделить всёРазвернуть
    .include "m8def.inc" ;определение мк
    .org $0000
    .def temp = r16  ;назначение рабочего регистра
    .def tempH = r17
    .def tempL = r18
    .cseg
    .eseg
    .equ led = pb0                   ;присвоение имени
    .equ but = pd0                   присвоение имени кнопки на порт д (посаена на +)
      reset:                               ;
                   ldi tempH,$04                 ;тут пока не знаю,
                   out SPH,tempH                 ;но думаю, это
                   ldi tempL,$5F                 ;определение режима работы
                   out SPL,tempL                 ;регистра - рыба
            ;nastroyka portov
      ldi temp, 0b00000001        ;пин1, выход
      out ddrb, temp              ; запись в рег
     ldi temp, 0b00000000        ; подт нет
     out portb, temp             ; вывод порта Б
     
     ldi temp, 0b00000000        ; пин1 порта д вход
     out ddrd, temp             ;запись в рег
     ldi temp, 0b00000001       ;подт на пин1
     out portd, temp            ; вывод порта

    init:
      sbis portd, but       ; считывание + с кнопки
      sbi portb, led        ;если на кнопке +, то вкл сд
      rjmp init


Добавлено спустя 13 минут 35 секунд:
чет у меня авр4 все по 5 байт скачивает...

Добавлено спустя 17 минут 38 секунд:
legion, поставь какую-нибудь простую задачку?
Аватара пользователя
серж
 
Сообщения: 589
Зарегистрирован: 27 янв 2011, 17:38
Откуда: россия, череповец

Re: серж. "А ТЫ... ХОЧЕШЬ СТАТЬ АСМАТИКОМ?"

Сообщение legion » 18 авг 2012, 22:05

Работает на протеусе-то?

Добавь еще один диод, и пусть по нажатию кнопки гаснет текущий и зажигается соседний.
legion
 
Сообщения: 736
Зарегистрирован: 24 апр 2010, 14:47
Откуда: Уфа
прог. языки: avr asm

Re: серж. "А ТЫ... ХОЧЕШЬ СТАТЬ АСМАТИКОМ?"

Сообщение серж » 18 авг 2012, 22:18

ок. прот надо старый ставить, вечером займусь. пока с кодом поиграем.
Код: Выделить всёРазвернуть
 .include "m8def.inc" ;определение мк
    .org $0000
    .def temp = r16  ;назначение рабочего регистра
    .def tempH = r17
    .def tempL = r18
    .cseg
    .eseg
    .equ led = pb0                   ;присвоение имени
    .equ led1 = pb1                  ;второй сд
    .equ but = pd0                  ; присвоение имени кнопки на порт д (посаена на +)
      reset:                               ;
                   ldi tempH,$04                 ;тут пока не знаю,
                   out SPH,tempH                 ;но думаю, это
                   ldi tempL,$5F                 ;определение режима работы
                   out SPL,tempL                 ;регистра - рыба
            ;nastroyka portov
      ldi temp, 0b00000011        ;пин1,2 выход
      out ddrb, temp              ; запись в рег
     ldi temp, 0b00000000        ; подт нет
     out portb, temp             ; вывод порта Б
     
     ldi temp, 0b00000000        ; пин1 порта д вход
     out ddrd, temp             ;запись в рег
     ldi temp, 0b00000001       ;подт на пин1
     out portd, temp            ; вывод порта

    init:
      sbis portd, but       ; считывание + с кнопки
      sbi portb, led        ;если на кнопке +, то вкл сд
      sbis portd, but       ;счит кнопки
      cbi portb, led        ;если +, то гасим сд1
      sbi portb, led1       ;и включаем сд2
      rjmp init          ;возврат

думаю так...
Аватара пользователя
серж
 
Сообщения: 589
Зарегистрирован: 27 янв 2011, 17:38
Откуда: россия, череповец

Re: серж. "А ТЫ... ХОЧЕШЬ СТАТЬ АСМАТИКОМ?"

Сообщение legion » 18 авг 2012, 22:23

У тебя сд2 будет всегда гореть, а сд1 включится только если ты очень удачно отпустишь кнопку между первой проверкой и второй. =)

И да, проверять состояние входа надо читая PINn, а не PORTn. Иначе ты читаешь параметр инициализации порта - подтянут он к + или в Z-состоянии.
Последний раз редактировалось legion 18 авг 2012, 22:26, всего редактировалось 1 раз.
legion
 
Сообщения: 736
Зарегистрирован: 24 апр 2010, 14:47
Откуда: Уфа
прог. языки: avr asm

Re: серж. "А ТЫ... ХОЧЕШЬ СТАТЬ АСМАТИКОМ?"

Сообщение серж » 18 авг 2012, 22:25

дребезг контактов?
ща подумаем, как избавиться...
Аватара пользователя
серж
 
Сообщения: 589
Зарегистрирован: 27 янв 2011, 17:38
Откуда: россия, череповец

Re: серж. "А ТЫ... ХОЧЕШЬ СТАТЬ АСМАТИКОМ?"

Сообщение legion » 18 авг 2012, 22:28

Нет, не дребезг, ошибка в логике программы. Для наглядности распиши пошагово что будет происходить при выполнении тела цикла при замкнутой кнопке и при разомкнутой.
legion
 
Сообщения: 736
Зарегистрирован: 24 апр 2010, 14:47
Откуда: Уфа
прог. языки: avr asm

Re: серж. "А ТЫ... ХОЧЕШЬ СТАТЬ АСМАТИКОМ?"

Сообщение серж » 18 авг 2012, 23:01

все писать не стал, ток сам код
Код: Выделить всёРазвернуть
        
        init:
       
          sbis pind, but       ; считывание + с кнопки
          sbi portb, led        ;если на кнопке +, то вкл сд
           sbic pind, but       ;если нет + - переход на а
          rjmp a
      a:
          sbis pind, but       ;счит кнопки
         
          cbi portb, led        ;если +, то гасим сд1
          sbi portb, led1       ;и включаем сд2
          sbic pind, but       ;если нет + - возврат
          rjmp init          ;возврат


Добавлено спустя 15 минут 3 секунды:
вот так, думаю, будет правильней:
Код: Выделить всёРазвернуть
 init:
          sbic pind, but       ;если нет + - возврат
          rjmp init  ;
          sbis pind, but       ; считывание + с кнопки
          sbi portb, led        ;если на кнопке +, то вкл сд
          rjmp a             ;и переходим к а
      a:
          sbic pind, but       ;если нет + , то возврат
          rjmp a               ;нет +, переход в а
          sbis pind, but       ;счит кнопки
          cbi portb, led        ;если +, то гасим сд1
          sbi portb, led1       ;и включаем сд2
          rjmp init          ;возврат к началу проги


Добавлено спустя 7 минут 29 секунд:
а если после 5ой строки добавить стоку:
cbi portb, led1 ;
то получим выкл сд2,вкл сд1, при 3ем нажатие кнопки. и по кругу, т.д.
Аватара пользователя
серж
 
Сообщения: 589
Зарегистрирован: 27 янв 2011, 17:38
Откуда: россия, череповец

Re: серж. "А ТЫ... ХОЧЕШЬ СТАТЬ АСМАТИКОМ?"

Сообщение legion » 18 авг 2012, 23:58

Если коротко, то не сработает. Настоятельно советую скорее знакомиться со студией и смотреть пошаговое выполнение программы, тогда все встанет на свои места.

Код: Выделить всёРазвернуть
          rjmp a             ;и переходим к а
      a:

Такая последовательность лишена смысла: метка на которую прыгаем указывает на следующую после команды ветвления инструкцию, но программа и так пошла бы на следующую инструкцию, и без rjmp. Еще один момент, SBIC и SBIS пропускают только 1 следущую команду, не больше. Поэтому идея использовать RJMP после таких команд правильная, если надо выполнить больше одной команды по условию.

Еще о кнопках. Ты используешь правильные команды, но приписка "+" в комментариях заставляет думать, что ты делаешь это неосознанно. Если + означает нажатие кнопки, а не + питания на ноге, тогда все верно, потому что кнопка в твоей схеме замыкает ногу на землю. И это правильно, так обычно и подключают кнопки.

Давай распишем алгоритм на словах:

Начальные условия: на кнопке + от подтяжки, сд1 горит (зажечь в инициализации), сд2 не горит.

Начало:
Если кнопка не нажата, то прыжок на начало. ; здесь ждем пока кнопку нажмут

Если сейчас горит светодиод 1, то прыжок на Гасим1Жгем2 ; сюда попадаем только при нажатии кнопки.

;Если светодиод 1 не горит, значит не прыгаем, а спокойно продолжаем программу и зажигаем сд1 и гасим сд2.
Выкл. сд2
Вкл. сд1
Прыгаем на Цикл1 ; сделали дело, надо ждать, пока кнопку отпустят.
; Если не прыгнуть, то мы выполним ненужный код, расположенный сразу за этим


Гасим1Жгем2:
Выключить сд1
Включить сд2 ; отсюда на Цикл1 попадем своим ходом, прыгать не надо

Цикл1:
Если кнопка нажата, то прыжок на Цикл1 ; в этом цикле ждем, пока кнопку отпустят

Прыгаем на Начало ; попадем сюда если кнопку отпустили


Теперь запиши это на ассемблере.
legion
 
Сообщения: 736
Зарегистрирован: 24 апр 2010, 14:47
Откуда: Уфа
прог. языки: avr asm

Re: серж. "А ТЫ... ХОЧЕШЬ СТАТЬ АСМАТИКОМ?"

Сообщение серж » 19 авг 2012, 00:10

вобщето у меня условие того что кнопка посажена к плюсу питания и отсюда я исхожу...
пробую на твоих усл.
Аватара пользователя
серж
 
Сообщения: 589
Зарегистрирован: 27 янв 2011, 17:38
Откуда: россия, череповец

Re: серж. "А ТЫ... ХОЧЕШЬ СТАТЬ АСМАТИКОМ?"

Сообщение legion » 19 авг 2012, 00:12

Значит ты понимаешь работу SBIC и SBIS неправильно, наоборот.
legion
 
Сообщения: 736
Зарегистрирован: 24 апр 2010, 14:47
Откуда: Уфа
прог. языки: avr asm

Re: серж. "А ТЫ... ХОЧЕШЬ СТАТЬ АСМАТИКОМ?"

Сообщение серж » 19 авг 2012, 01:08

Код: Выделить всёРазвернуть
.include "m8def.inc"
.org $0000
   .def temp = r16  ;назначение рабочего регистра
   .def tempH = r17
   .def tempL = r18
   .cseg
   .eseg
        .equ led = pb0                   ;присвоение имени
        .equ led1 = pb1                  ;второй сд
        .equ but = pd0                  ; присвоение имени кнопки на порт д
          reset:                               ;
                       ldi tempH,$04                 ;тут пока не знаю,
                       out SPH,tempH                 ;но думаю, это
                       ldi tempL,$5F                 ;определение режима работы
                       out SPL,tempL                 ;регистра - рыба
                ;nastroyka portov
  ldi temp, 0b00000011    ;пин1,2 вых
  out ddrb, temp          ;запись в рег
  ldi temp, 0b00000001    ;подт на пин1 - вкл сд1 при инициализации
  out portb, temp         ;вывод порта б
     ldi temp, 0b00000000   ; все вход
     out ddrd, temp         ;запись в рег
     ldi temp, 0b00000001   ; подт на пин1
     out portd, temp        ; вывод порта д

init:
sbic portb, led  ;проверка вкл сд1
rjmp init  ;если не горит переход
sbis portb, led  ;если горит, идем дальше
sbic pind, but  ;проверка кн на не нажатое сост.
rjmp init
sbis pind, but ;проверка кн на нажатие
cbi portb, led  ;если нажата гасим сд1
sbi portb, led1 ; и вкл сд2
sbic pind, but  ;при отпускании кнопки
  rjmp init   ;


Добавлено спустя 9 минут 20 секунд:
проверил в проте - косяк! думаю дальше...
Аватара пользователя
серж
 
Сообщения: 589
Зарегистрирован: 27 янв 2011, 17:38
Откуда: россия, череповец

Re: серж. "А ТЫ... ХОЧЕШЬ СТАТЬ АСМАТИКОМ?"

Сообщение legion » 19 авг 2012, 01:09

Код: Выделить всёРазвернуть
 sbic portb, led  ;проверка вкл сд1
rjmp init  ;если не горит переход
sbis portb, led  ;если горит, идем дальше

sbic portb, led
Команда SBIC означает: Skip if Bit Is Clear, т.е. пропустить следующую инструкцию, если бит равен нулю. То есть, если светодиод не горит (бит равен 0), то инструкцию rjmp init ты пропустишь и не прыгнешь.
Потом, в третьей строчке ты опять проверяешь это же условие. Зачем? Ты на строчку кода после rjmp init можешь попасть только если бит равен 0 и ты пропустил прыжок. Проверять бессмысленно, portb, led определенно равен нулю, если ты на этой строчке.

Ставь студию и учись в ней работать. Срочно. Есть опасение, что мне быстро надоест работать в качестве студии. Прошагав по коду в режиме пошаговой симуляции ты сам сможешь искать у себя ошибки. И проверять работу разных инструкций ассемблера.
Последний раз редактировалось legion 19 авг 2012, 01:14, всего редактировалось 1 раз.
legion
 
Сообщения: 736
Зарегистрирован: 24 апр 2010, 14:47
Откуда: Уфа
прог. языки: avr asm

Re: серж. "А ТЫ... ХОЧЕШЬ СТАТЬ АСМАТИКОМ?"

Сообщение серж » 19 авг 2012, 01:20

я ща по своему попробую решить задачу. ок? тем более что прот настоил...

Добавлено спустя 6 минут 12 секунд:
студию поставил, но с ней тоже еще неделю разбираться... :oops:
Аватара пользователя
серж
 
Сообщения: 589
Зарегистрирован: 27 янв 2011, 17:38
Откуда: россия, череповец

Пред.След.

Вернуться в Блоги

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5