Перейти к содержанию

    

Stolbov

Участник
  • Публикаций

    16
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о Stolbov

  • Звание
    Участник
  • День рождения 28.06.1992

Контакты

  • Сайт
    http://
  • ICQ
    0

Информация

  • Город
    Санкт-Петербург

Посетители профиля

192 просмотра профиля
  1. haker_fox, я просто не верно выразился по поводу "быстродействия". Я же не собираюсь засекать время между нажатием кнопки и выполнением некоего действия. 10 -50 мс для подавления дребезга - это нормально. У меня проблема сейчас какая: я пока использую свою схему, всё же пытаюсь её "добить", но так как у меня между состояниями опроса кнопок нет никаких пауз + дребезг, моя клавиатура превратилась в генератор случайных чисел. Я пока пытаюсь привести всё в "человеческий" вид, но пока не выходит.
  2. haker_fox, мне нужна быстрая реакция на нажатие. Нажал кнопку - произошло некоторое действие. Скорее всего, сделаю так, как Вы и сказали. Я сейчас пробовал делать по совету @Ark'а (он писал про то, что ножки, по которым у меня происходит опрос кнопок, должны быть настроены как входы), но у меня выходит что-то невразумительное, но тут уже, наверное, дело в моих навыках программиста.
  3. Всем добрый вечер! Вообщем, я делаю небольшую поделку на основе микроконтроллера AVR, но так как мне нужно было 6 кнопок, а выводов осталось мало, я решил попробовать "выкрутиться" из этой ситуации таким образом, как это показано на рисунке. PA0 и PA1 - ножки микроконтроллера, на которых постоянно находится высокий уровень. В первый момент времени я устанавливаю на PB0 низкий уровень, и, получается, что когда мы нажимаем кнопку S1 или S4, на одном из входов МК так же установится низкий уровень напряжения. Таким образом, можно отследить, какая кнопка нажата в момент времени. Остальные кнопки опрашиваются по этому же алгоритму (подаём 0 на PB1, а потом на PB2). За сим вопрос: правильно ли я вообще делаю? Когда я проводил эксперимент с одной кнопкой, всё работало, и я с лёгкостью мог отследить её нажатие, но когда я собрал эту схему на макетке, всё пошло крахом: ни одна кнопка не отзывается. Если кто-нибудь сможет разобраться, есть ли у этой схемы шанс заработать, буду премного благодарен. Код опроса этой конструкции так же прилагаю (может быть, его можно было бы сделать изящнее, но получилось вот так). #define STEP1 1 //Метки для атомата #define STEP2 2 #define STEP3 3 //... DDRA |= (0<<PORTA0)|(0<<PORTA1); //Настройка ножек порта А на вход DDRB |= (1<<PORTB0)|(1<<PORTB1)|(1<<PORTB2); //Настройка ножек порта B на выход //.. int button_flag; //Флаг для цикла int button_state; //Для хренения состояния автомата //.. void key_polling() { button_state = STEP1; //Первое состояние button_flag = 1; //Устанавливаем флаг while(button_flag == 1) { switch(button_state) { case STEP1: //Опрашиваем кнопки 1 и 4 PORTB |= (0<<PORTB0)|(1<<PORTB1)|(1<<PORTB2); //На ножке PB0 устанавливаем низкий уровень if((PINA & (1<<PORTA0) == 0)) //Если на PA0 - 0, то... { //Некое действие button_state = STEP2; //Переходим к опрос следующей двойки } else if((PINA & (1<<PORTA1) == 0)) //Если на PA1 - 0, то... { //Что-то делаем button_state = STEP2; } else //Если не получили низкий уровень ни на одной из ножек { button_state = STEP2; } break; case STEP1: //Опрашиваем кнопки 2 и 5 PORTB |= (1<<PORTB0)|(0<<PORTB1)|(1<<PORTB2); //На PB1 устанавливаем низкий уровень //Код, аналогичный блоку STEP1 break; case STEP3: //Опрашиваем кнопки 3 и 6 PORTB |= (1<<PORTB0)|(1<<PORTB1)|(0<<PORTB2); //На PB2 устанавливаем низкий уровень //Код, аналогичный блоку STEP1 button_flag = 0; //Так как все кнопки опросили, обнуляем флаг для выхода из цикла break; } } }
  4. AVR и W5500

    Ещё одно дополнение. Чип работает, отвечает на пинг. Нужно было соблюсти несколько условий: 1) Чип и ПК соединяются через кросс-кабель. 2) Чип и ПК должны находится в одной подсети. 3) Обязательно нужно открыть порт. Всем спасибо за участие! :yeah:
  5. AVR и W5500

    Думаю, что всё записывается правильно. Каждый байт записывается по своему собственному адресу. 192 пишется в 0x0001, 168 в 0x0002 и т.д. Я попробовал прочитать все адреса и получил правильный порядок байтов.
  6. AVR и W5500

    Вот так выглядит "кадр" передачи данных SPI: Функцию записи я немного переписал: void w5500_write(uint16_t addr, uint8_t op, uint8_t data) //Функция записи данных в регистр { char MSB = (addr>>8); char LSB = (addr); char opcode = op; char sdata = data; SPDR = MSB; while(!(SPSR&(1<<SPIF))); SPDR = LSB; while(!(SPSR&(1<<SPIF))); SPDR = opcode; while(!(SPSR&(1<<SPIF))); SPDR = sdata; while(!(SPSR&(1<<SPIF))); } Так как сперва надо передать старший байт адреса, я его двигаю, и потом в след за ним передаю младшую часть, потом сформированный "опкод", а затем непосредственно сами данные. В чём может быть причина неудачи, я не знаю. Само собой, перед записью данных я делаю два сброса, как это сказано в даташите: хард и софт.
  7. AVR и W5500

    Если кому-нибудь интересно: все данные в чип пишутся, и читаются (настройки mac, ip и прочее). Даже считал версию чипа (0x04), но он упорно не хочет пинговаться, и выдаёт свои стандартные настройки. Буду разбираться дальше.
  8. AVR и W5500

    Цитата(aiwa @ May 14 2018, 18:35) opcode должен быть первым в последовательности, затем адрес , потом данные. Большое спасибо за ответ! Завтра я обязательно попробую так сделать. Скажите, пожалуйста, а откуда у Вас такая информация? Просто в даташите SPI Frame начинается с адреса, и я руководствовался именно этой схемой.
  9. AVR и W5500

    Всем добрый день! Я продолжаю изучать программирование микроконтроллеров, и в качестве следующей цели выбрал организацию простого web-сервера на AVR. Я изучил основные моменты инициализации в официальной документации, плюс нашёл в интернете несколько примеров (правда, все они под STM32), но у меня всё равно не получается его инициализировать даже на обычный пинг. Вот как выглядит сам девайс: Общаюсь я с ним по SPI. В документации сказано, что сначала передаётся старший байт адреса назначения, потом младший, затем контрольная фаза и, на конец, сами данные. Сейчас я приведу небольшой пример, как я всё это реализовываю: Кодuint8_t opcode = 0; //Переменная для хранения опкода uint8_t ip[4] = {192,168,1,197}; //ip адрес //Данные, необходимые для формирования контрольной фазы #define BSB_COMMON 0x0000     //bsb блок #define WRITE 1                         //бит записи #define READ 0                           //бит чтения #define OM_FDM0 0x00 //Режим передачи данных переменной длинны #define SIPR0 0x000F //Адреса регистров w5500, в которых хранится ip адрес #define SIPR1 0x0010 #define SIPR2 0x0011 #define SIPR3 0x0012 //Провожу инициализацию SPI void spi_init()                     {     DDRB = (1<<PORTB7)|(1<<PORTB5)|(1<<PORTB4); //Clock - 7, MOSI - 5, Chip Select - 4. Всё на выход. MISO (6) - на вход.     SPCR = (1<<MSTR)|(1<<SPE)|(1<<SPR0); //Мастер, SPI включен. } //Функция записи данных в чип void w5500_write(uint16_t addr, uint8_t opcode, uint8_t data) //Функция записи данных в регистр {         selectW5500();        //Выбрать чип     unsigned char i;       //счётчик                       uint8_t buf[4];         //буфер для данных     buf[0] = (uint8_t)(addr >> 8);   //передаём старшую часть адреса     buf[1] = (uint8_t)(addr);            //передаём младшуя часть адреса     buf[2] = opcode;                        //передаём контрольную фазу     buf[3] = (uint8_t)(data);            //передаём данные          for(i=0;i<4;i++)                       //цикл передачи данных     {         SPDR = buf[i];         while(!(SPSR&(1<<SPIF)));     }             deselectW5500(); } Не знаю, почему, но мне кажется, что я что-то делаю не так с передачей данных. Я привёл пример записи одного байта данных в регистр, отвечающий за хранение ip адреса. Формирование контрольной фазы выглядит так: Кодopcode = (BSB_COMMON<<3)|(WRITE<<2)|OM_FDM0; Функции выбора чипа в этом посте я писать не стал, так как там происходит просто "притягивание" линии к 0, а потом "отпускание". Я постарался как можно короче изложить свою проблему, но, тем не менее, указав важные детали. Буду рад любой помощи или совету. Заранее спасибо.
  10. Благодарю Вас за ответ!
  11. Спасибо! А Вы не могли бы подсказать, как именно подавать питание на указанную ножку JTAG? У меня, например, есть на отладочной плате выводы заземления и питания для нехитрой периферии, но как произвести такое соединение?
  12. Всем добрый день! Я новичок в программировании микроконтроллеров (ну как новичок. в университете был опыт, конечно, но не более того), и недавно у меня получилась следующая ситуация: имеется китайская отладочная плата YL-34 с ATmega32 на борту, и фирменный программатор AVR Dragon, соединённый с этой платой через JTAG. Так вышло, что AVR Dragon эту плату "не тянет". AVR Studio 4.19 выдаёт сообщение о том, что "целевое напряжение очень низкое, минимум нужно 1.8V" (скриншот на всякий случай прилагаю). Скажите, пожалуйста, можно ли в таком случае запитывать эту плату отдельно, не причиняя вред программатору? Купить, грубо говоря, блок питания на 5V, и воткнуть его в соответствующий разъём отладочной платы? Понимаю, что вопрос, скорее всего "сверхнубский", но, тем не менее, я буду рад любым ответам по теме.
  13. Всем добрый день! Сегодня я в первый раз решил самостоятельно "прошить" микроконтроллер используя PicKit3, адаптер для него и MPLAB X. Написав "тестовую" программу, я попытался загрузить её в микроконтроллер, но получил ошибку, которая гласила, что "целевое устройство не найдено (отсутствует напряжение)", и что мне следует его подключить. Немного поискав в интернете, я вроде нашёл решение этой проблемы: нужно зайти Mplab IPE, войти в Advanced Mode, подключить программатор, сменить напряжение питание с 5V на то, которое требуется микроконтроллеру, и "прошивка" проходит так, как нужно, но в MPLAB X микроконтроллер прошиваться всё равно не хочет. Поэтому я хочу у Вас поинтересоваться, можно ли как-нибудь настроить это питание в самом MPLAB X, не заходя каждый раз для прошивки в IPE и Advanced mode? Просто хотелось бы настроить это один раз, и работать как все нормальные люди. Благодарю заранее за ответы.
  14. Всем спасибо за ответы! В действительности я нашёл ответ на одном из зарубежных сайтов с примером простого кода на Verilog. Разобравшись в нём, я его испытал и убедился, что дребезг успешно "гасится"!
  15. Цитата(iosifk @ Aug 5 2017, 22:09) Могу рассказать как надо делать проекты... По скайпу... Благодарю. Если у меня не получится исправить это самостоятельно, то я обязательно к Вам обращусь.