Одесса: 5°С (вода 9°С)
Киев: 4°С
Львов: 5°С

Тема: Кто Atmel на с програмировать умеет?

Ответить в теме
Показано с 1 по 14 из 14
  1. Вверх #1
    Модератор
    Мистер Одесский Форум
    Аватар для maxx™
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    38
    Сообщений
    23,354
    Репутация
    6088

    По умолчанию Кто Atmel на с програмировать умеет?

    Есть вот такой кусок кода (опрос клавиатуры):
    unsigned char LookKey()
    {
    unsigned char i,j;

    for (i=0;i<4;i++)
    {
    if (i == 0) KEYPORT = (unsigned char)~ROW1;
    if (i == 1) KEYPORT = (unsigned char)~ROW2;
    if (i == 2) KEYPORT = (unsigned char)~ROW3;
    if (i == 3) KEYPORT = (unsigned char)~ROW4;

    for (j=0;j<255;j++); // Delay

    if (i == 3){iDebug = (KEYPIN & (COL1+COL2+COL3+COL4)); }

    if ( (KEYPIN & (COL1+COL2+COL3+COL4)) != (COL1+COL2+COL3+COL4))
    {
    i = i * 4;
    if ((KEYPIN & COL1) != COL1) i = i + 1;
    if ((KEYPIN & COL2) != COL2) i = i + 2;
    if ((KEYPIN & COL3) != COL3) i = i + 3;
    if ((KEYPIN & COL4) != COL4) i = i + 4;
    return Table[i-1];
    }
    }
    return 0;
    }

    Если закоментировать строчку if (i == 3){iDebug = (KEYPIN & (COL1+COL2+COL3+COL4)); } то не работает, с ней работает. Переменная iDebug нигде больше не используется. Не работает - это не опрашивается клавиатура при нажатии клавиш на линии ROW4. Остальные клавиши работают при любом раскладе. В чем проблема, есть идеи?


  2. Вверх #2
    Постоялец форума Аватар для Newton
    Пол
    Мужской
    Адрес
    Calgary, Alberta
    Сообщений
    1,080
    Репутация
    775
    Может Delay короткий? обычно для такой ерунды что-то типа sleep используется.
    Моя хата з найкращого краю в світі.

  3. Вверх #3
    User banned
    Пол
    Мужской
    Сообщений
    2,434
    Репутация
    1159
    Забавно.
    Я бы, в порядке эксперимента,
    сперва сделал j volatile, а потом бы еще дважды цикл прокрутил, для верности(если тактовая частота не настолько низка).
    Последний раз редактировалось Hose; 11.02.2010 в 08:08.

  4. Вверх #4
    Частый гость Аватар для CrazySquirrel
    Пол
    Мужской
    Возраст
    30
    Сообщений
    900
    Репутация
    95
    Может _delay_ms поставить?
    Какой МК?
    Еврейский SQL сервер отвечает запросом на запрос.

  5. Вверх #5
    Модератор
    Мистер Одесский Форум
    Аватар для maxx™
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    38
    Сообщений
    23,354
    Репутация
    6088
    Цитата Сообщение от CrazySquirrel Посмотреть сообщение
    Может _delay_ms поставить?
    Какой МК?
    at90s8515 8 МГц. Оно-то конешно хорошо, но весь прикол в том что остальные 9 кнопок опрашиваются нормально. Но увеличить цикл или сделать delay попробую.

  6. Вверх #6
    Не покидает форум Аватар для {Totoro}
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    40
    Сообщений
    5,259
    Репутация
    1865
    Видно помогла задержка
    In Mickey Mouse we Trust

  7. Вверх #7
    Модератор
    Мистер Одесский Форум
    Аватар для maxx™
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    38
    Сообщений
    23,354
    Репутация
    6088
    Цитата Сообщение от {Totoro} Посмотреть сообщение
    Видно помогла задержка
    К сожалению не помогла. Пока так и оставил.

  8. Вверх #8
    Не покидает форум Аватар для {Totoro}
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    40
    Сообщений
    5,259
    Репутация
    1865
    Стряяяннно.... а если убрать if (i == 3) и оставить iDebug = (KEYPIN & (COL1+COL2+COL3+COL4));?

    или можно попробовать убрать всю строку if (i == 3){iDebug = (KEYPIN & (COL1+COL2+COL3+COL4)); } и поменять местами строки
    if (i == 3) KEYPORT = (unsigned char)~ROW4;
    и
    if (i == 0) KEYPORT = (unsigned char)~ROW1;
    ...
    если не будет реакции теперь на первую строку кнопок - должно быть дело всё-таки в задержке
    Последний раз редактировалось {Totoro}; 19.02.2010 в 14:40.
    In Mickey Mouse we Trust

  9. Вверх #9
    Модератор
    Мистер Одесский Форум
    Аватар для maxx™
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    38
    Сообщений
    23,354
    Репутация
    6088
    Цитата Сообщение от {Totoro} Посмотреть сообщение
    Стряяяннно.... а если убрать if (i == 3) и оставить iDebug = (KEYPIN & (COL1+COL2+COL3+COL4));?
    А смысл? Тогда клавиатура точно опрашиваться не будет, кто тогда значение в порт правильное пропишет?

  10. Вверх #10
    Не покидает форум Аватар для {Totoro}
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    40
    Сообщений
    5,259
    Репутация
    1865
    Цитата Сообщение от maxx™ Посмотреть сообщение
    А смысл? Тогда клавиатура точно опрашиваться не будет, кто тогда значение в порт правильное пропишет?
    С какого перепугу? ты в порт пишешь KEYPORT = ... а опрашиваешь KEYPIN
    Эта строка выполняется только тогда, когда у тебя в самом большом цикле i==3
    In Mickey Mouse we Trust

  11. Вверх #11
    Не покидает форум Аватар для {Totoro}
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    40
    Сообщений
    5,259
    Репутация
    1865
    если не используешь _delay_ms твой пустой цикл компилятор похерит если включена оптимизация кода. Лист смотрел?
    Нарисуй на всякий for (j=0;j<255;j++) {_NOP;}; // Delay
    In Mickey Mouse we Trust

  12. Вверх #12
    Модератор
    Мистер Одесский Форум
    Аватар для maxx™
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    38
    Сообщений
    23,354
    Репутация
    6088
    Цитата Сообщение от {Totoro} Посмотреть сообщение
    если не используешь _delay_ms твой пустой цикл компилятор похерит если включена оптимизация кода. Лист смотрел?
    Нарисуй на всякий for (j=0;j<255;j++) {_NOP;}; // Delay
    Я даже просто delay_ms делал. Это или какой-то глюк компилятора или еще что-то. Впрочем клавиатура это третье дело, работает пока и ладно. Вот когда все заработает тогда может и вернуть к этому вопросу.

  13. Вверх #13
    User banned
    Пол
    Мужской
    Сообщений
    2,434
    Репутация
    1159
    Цитата Сообщение от maxx™ Посмотреть сообщение
    К сожалению не помогла. Пока так и оставил.
    Прикольно!
    С интересом посмотрел бы ассемблерный листинг данного чуда.
    Может оптимизатор. Еще, для подобного случая, есть крайне маловероятный, почти сказочный вариант - что-то с порчей данных в ОЗУ. В последнем случае, данный эффект достигается за счет сдвига адресов(стека), при неиспользовании переменной iDebug.

  14. Вверх #14
    Модератор
    Мистер Одесский Форум
    Аватар для maxx™
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    38
    Сообщений
    23,354
    Репутация
    6088
    Цитата Сообщение от Hose Посмотреть сообщение
    Прикольно!
    С интересом посмотрел бы ассемблерный листинг данного чуда.
    Может оптимизатор. Еще, для подобного случая, есть крайне маловероятный, почти сказочный вариант - что-то с порчей данных в ОЗУ. В последнем случае, данный эффект достигается за счет сдвига адресов(стека), при неиспользовании переменной iDebug.
    Ну компилятор в этом очевидно и виноват. Потому как в оригинале это было написано на IAR, а я переделываю под WinAVR.


Ответить в теме

Похожие темы

  1. Ответов: 8
    Последнее сообщение: 03.08.2012, 20:37
  2. Микроконтроллер Atmel
    от al.ya в разделе Железо
    Ответов: 5
    Последнее сообщение: 04.01.2010, 10:44
  3. Atmel
    от Ney в разделе Программирование
    Ответов: 4
    Последнее сообщение: 12.03.2009, 13:58

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения