Уважаемые посетители! Форум CQHAM.RU существует исключительно за счет показа рекламы. Мы будем благодарны, если Вы не будете блокировать рекламу на нашем Форуме. Просим внести cqham.ru в список исключений для Вашего блокировщика рекламы.
Страница 1 из 4 1234 ПоследняяПоследняя
Показано с 1 по 10 из 37

Тема: avr работа с энкодером

  1. #1

    Регистрация
    10.09.2017
    Адрес
    Липецк
    Сообщений
    243
    Позывной
    R2GCD
    Всем привет
    Необходимо выводить информации на дисплей, при вращении энкодера, то есть считывать его состояние.
    Но при симуляции в протеус, выводимые цифры на дисплей меняются то в положительную или отрицательную сторону, пропуская чередующию цифру.

    Вот код который у меня получился:

    #define F_CPU 8000000UL
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/pgmspace.h>
    #include <avr/interrupt.h>
    #include "LCD.h" //Хедер для LCD дисплея
    #include "LCD.c"


    int buf, data, input;


    int main(void)
    {



    char angle_antenna, symbol_antenna, lcd_angle_antenna[5];




    angle_antenna = "000"; //
    symbol_antenna = "\xDFY"; // Символ целсия
    data = 0;


    LCDinit(); //Инициализация LCD, эту функцию в первую
    //очередь, потом все остальное.


    while(1)//Главный цикл программы.
    {


    input = PINC & 0x03;


    if(buf != input)
    {
    switch(buf)
    {
    case 0:
    {
    if(input == 2) data++;
    if(input == 1) data--;
    break;
    }
    case 1:
    {
    if(input == 0) data++;
    if(input == 3) data--;
    break;
    }
    case 2:
    {
    if(input == 3) data++;
    if(input == 0) data--;
    break;
    }
    case 3:
    {
    if(input == 1) data++;
    if(input == 2) data--;
    break;
    }
    }

    buf = input;
    itoa(data,lcd_angle_ antenna,10);
    }






    LCDstring(lcd_angle_ antenna,0,0); //Текущий угол антенны
    }
    }

    Добавлено через 23 минут(ы):

    Разобрался)) немного не так подключил протеус
    Вложения Вложения
    Последний раз редактировалось Radio_Ham; 31.05.2019 в 21:27.
    P.S Не сразу, но понял


  2. #2
    Аватар для UZ5DM
    Регистрация
    27.07.2017
    Адрес
    nr Uzhgorod
    Сообщений
    287
    Записей в дневнике
    1
    Позывной
    UZ5DM
    Опрос энкодера нужно делать в прерывании. Зачем это в основном цикле ?

  3. #3
    Аватар для Integral
    Регистрация
    08.02.2007
    Адрес
    г. Снежное
    Сообщений
    2,926
    Записей в дневнике
    1
    Позывной
    UT0IS/D0ISM
    Цитата Сообщение от UZ5DM Посмотреть сообщение
    Опрос энкодера нужно делать в прерывании. Зачем это в основном цикле ?
    Справедливое замечание. В простой программе оно прокатит, но по мере роста основной программы энкодер начнет тормозить.
    Интеграл от человеческих заблуждений - истина, производная - безумие.

  4. #4
    Аватар для UZ5DM
    Регистрация
    27.07.2017
    Адрес
    nr Uzhgorod
    Сообщений
    287
    Записей в дневнике
    1
    Позывной
    UZ5DM
    Цитата Сообщение от Integral Посмотреть сообщение
    ере роста основной программы энкодер начнет тормозить.
    - я о том же

  5. #5

    Регистрация
    10.09.2017
    Адрес
    Липецк
    Сообщений
    243
    Позывной
    R2GCD
    Согласен со всеми! Это пока просто наброски, да и знаю самую малость в программирование си
    P.S Не сразу, но понял

  6. #6

    Регистрация
    10.09.2017
    Адрес
    Липецк
    Сообщений
    243
    Позывной
    R2GCD
    #define F_CPU 8000000UL //Частота генерации
    #include <avr/io.h>
    #include <util/delay.h>
    #include "LCD.h" //Библиотека дисплея
    #include "LCD.c"


    int encod_count_impuls, encod_impuls;
    char lcd_encod_impusl[5], lcd_angle_antena[5];


    int main(void)


    {
    int encod_pin; // Переменная пина энкодера
    int angle_antena = 10;
    encod_impuls = 0; // Переменная количество импульсов энкодера



    LCDinit(); // Инициализация дисплей


    PORTD=0x00;
    DDRD=0x0F;

    while(1)
    {
    encod_pin = PIND & 0x03; // Переменная порта энкодера


    if(encod_impuls != encod_pin)
    {
    switch(encod_impuls)
    {
    case 0:
    {
    if(encod_pin == 2 && encod_count_impuls < 360) encod_count_impuls++ ;
    if(encod_pin == 1 && encod_count_impuls > 0) encod_count_impuls--;
    break;
    }
    case 1:
    {
    if(encod_pin == 0 && encod_count_impuls < 360) encod_count_impuls++ ;
    if(encod_pin == 3 && encod_count_impuls > 0) encod_count_impuls--;
    break;
    }
    case 2:
    {
    if(encod_pin == 3 && encod_count_impuls < 360) encod_count_impuls++ ;
    if(encod_pin == 0 && encod_count_impuls > 0) encod_count_impuls--;
    break;
    }
    case 3:
    {
    if(encod_pin == 1 && encod_count_impuls < 360) encod_count_impuls++ ;
    if(encod_pin == 2 && encod_count_impuls > 0) encod_count_impuls--;
    break;
    }
    }


    encod_impuls = encod_pin;


    itoa(encod_count_imp uls,lcd_encod_impusl ,10); // Преобразуем числовое значение экодера в текст
    LCDstring(lcd_encod_ impusl,0,0);


    }
    }



    while (1)
    {
    PORTD=0b00000011; //+a +b
    _delay_ms(1000);
    PORTD=0b00000110; //+b -a
    _delay_ms(1000);
    PORTD=0b00001100; //-a -b
    _delay_ms(1000);
    PORTD=0b00001001; //-b +a
    _delay_ms(1000);
    angle_antena--;
    itoa(angle_antena,lc d_angle_antena,10);
    LCDstring(lcd_angle_ antena,0,1);
    }

    }


    Вот так все преобразилось
    Только вот теперь не задача, не выполняется второй цикл
    Во втором цикле я хочу вращать шаговый двигатель нужное мне количество раз
    P.S Не сразу, но понял

  7. #7
    Аватар для Tadas
    Регистрация
    12.06.2002
    Адрес
    KO24AV
    Сообщений
    3,356
    Позывной
    LY1CE
    Цитата Сообщение от Radio_Ham Посмотреть сообщение
    Только вот теперь не задача, не выполняется второй цикл
    А как он может выполняться, если выхода из первого цикла нет ?
    Хороша теория, но что ты с ней будешь делать ?
    73 de LY1CE

  8. #8

    Регистрация
    10.09.2017
    Адрес
    Липецк
    Сообщений
    243
    Позывной
    R2GCD
    А цикл внутри другого цикла, не будет работать?
    P.S Не сразу, но понял

  9. #9
    Поскольку и ручной энкодер, и шаговик - "медленные" с точки зрения аврки, логично процедуру их обработки вытащить в прерывания, а в основной программе не делать... ничего :-)
    Пришло изменение состояния выводов порта PCINT, отработали, сохранили.


  10. #10
    Аватар для Tadas
    Регистрация
    12.06.2002
    Адрес
    KO24AV
    Сообщений
    3,356
    Позывной
    LY1CE
    Цитата Сообщение от Radio_Ham Посмотреть сообщение
    А цикл внутри другого цикла, не будет работать?
    Если Вы поместите второй бесконечный цикл внутри первого, то после входа в него, он будет крутиться вечно и перестанет обрабатываться энкодер. В принципе можно внутренности второго цикла поместить прямо в теле первого цикла, но т.к. у Вас там четыре задержки 1000 мс, то энкодер будет обрабатыватся раз в четыре секунды, что вряд ли Вам понравится
    Тут лучше последовать совету коллеги romanetz.
    Хороша теория, но что ты с ней будешь делать ?
    73 de LY1CE

Страница 1 из 4 1234 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Работа в цифре IC-775
    от RX0TX в разделе IC-775, IC-775DSP, IC-775DX2
    Ответов: 23
    Последнее сообщение: 26.03.2024, 06:25
  2. Работа для радиолюбителей
    от 9cj в разделе Работа для радиолюбителя
    Ответов: 19
    Последнее сообщение: 16.02.2017, 12:32
  3. Работа в эфире
    от Irek в разделе Для начинающих
    Ответов: 604
    Последнее сообщение: 12.08.2016, 14:33
  4. Работа с удовольствием
    от Zoer в разделе Работа для радиолюбителя
    Ответов: 21
    Последнее сообщение: 19.11.2015, 13:51
  5. работа для радиоинженера
    от ALEKSEY30 в разделе Работа для радиолюбителя
    Ответов: 0
    Последнее сообщение: 09.03.2010, 16:46

Ваши права

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