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

mappy89

Members
  • Постов

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

  • Посещение

Сообщения, опубликованные mappy89

  1. Идентификаторы нужны, так как переменные могут приходить в разной последовательности.

    BerZerKku, обработчик приёма переменных я вставил выше в надежде, что кто то укажет на ошибку/недоработку, там вроде всё четко, однако код не рабочий =)

  2. Доброго времени суток, не могу решить простую проблему - передать несколько переменных одновременно через UART на мк. Данные на контроллер приходят в виде [aaa]<bbb>(ccc), где aaa bbb ccc - значения переменных, а различные скобки - их идентификаторы.

    обработчик этих переменных следующий (контроллер -мега16)

    struct us
    {
    int freaqready; ..флаги готовности приёма переменных
    int duratready;
    int delayready;
    
    int chcounter; //счётчик символов
    }
    
    us us1;
    
    volatile char sym[2];
    volatile text1[20], text2[20], text3[20];
    
    while(1)
    {
    sym[0]=USART_GetChar(); //принимаем символ
    sym[1]=0;
    if (sym[0])
    {
    
    switch (sym[0])
    {
    case '[': us1.freaqready=1; break;
    
    case '(': us1.duratready=1; break;
    
    case '<': us1.delayready=1; break;
    
    case ']': //по окончанию приёма 1 переменной
    timerValue=atoi(text);
    us1.freaqready=0;
    us1.chcounter=0;
    USART_FlushRxBuf();
    break;
    
    case ')': //по окончанию приёма 2 переменной
    widthValue=atoi(text2);
    us1.duratready=0;
    us1.chcounter=0;
    USART_FlushRxBuf();
    break;
    
    case '>': //по окончанию приёма 3 переменной
    tempdelay=atoi(text3);
    us1.delayready=0;
    us1.chcounter=0;
    USART_FlushRxBuf();
    break;
    
    default:
    if (us1.freaqready)
    text1[us1.chcounter++]=sym[0];
    else if (us1.duratready)
    text2[us1.chcounter++]=sym[0];
    else if (us1.delayready)
    text3[us1.chcounter++]=sym[0];
    break;
    }
    

    Однако контроллер стабильно принимает только 1 переменную, остальные он игнорирует. В чём может быть проблема?

  3. Проблема в том, что само разрабатываемое устройство - коммутатор, т е реле будут постоянно коммутировать (например если будет задано время проверки реле - час, соответственно коммутаций будет over 9000) и время срабатывания каждого реле должно укладываться в определённые жесткие временные рамки, если не уложится - значит реле бракованное, соотвественно и нужно минимизировать потери времени на регистрах

  4. Доброго времени суток.

    Имеется задача - регистрировать срабатывания 50 электромагнитных реле. Регистрация осущ-ся следующим образом: на обмотки всех реле реле подается напряжение, и у всех реле через какие то доли секунды замыкаются нормально разомкнутые контакты. От такого контакта каждого реле импульсы идут на параллельные регистры (SN74HC165 в моем случае), а уже с эти регистров импульсы идут на контроллер mega16, который эти регистры тактирует. Соответственно за каждый такт контроллера приходит (или не приходит) импульс с регистра и контроллер регистрирует время и номер сработавшего реле.

    Проблема как раз во времени тактирования параллельных регистров - даже если все реле сработают одновременно, тратится ещё какое то время на то, чтобы контроллер оттактировал параллельный регистр и уже после этого зарегистрировал время срабатывания, т.е. к самому искомому времени срабатывания реле прибавляется еще и время тактирования. Напрямую отнимать время = кол-во тактов x время такта я не могу, так как реле срабатывают с разным разбросом времени (несколько мсек/мксек, т.е. соразмерно с временем тактирования). Какие могут быть способы точно узнать время срабатывания множества реле без погрешности на тактирование дополнительных элементов? .

  5. Доброго времени суток. Никак не могу понять, как настроить 8-битный таймер на прерывание раз в 1 мсек. Контроллер - мега16, внешний кварц 8 МГц.

    Раз таймер 8-битный, значит счётчик считает макс до 256. Используя предделитель 256 получаю частоту: 8000000/256 = 31250Гц, значит время одного тика - 1/31250 = 32 мкс.

    Для получения прерывания раз в мсек: 1/0.032 = 31,25 тика, т.е. нецелое число. При использовании других предделителей кол-во тиков переваливает за 256, т.е. нужно каким то образом корректировать счётчик, чтобы не допускать погрешности в долгосрочной перспективе. Каким образом нужно это сделать, либо как нужно грамотно настроить таймер?

  6. Проблема решилась благодаря "склейке" символа, обзначающего номер элемента и времени срабатывания реле, используя функцию strcat:

    main()
    {
    volatile int optime=0; //время срабатывания
    volatile char mass[10]; //для хранения optime в char
    
    volatile char buf[32]; //для хранения склеенных строк
    memset(buf,0,sizeof(buf)); //на всякий случай очищаем буфер
    
    DDRB|=(0<<0)|(0<<1)|(0<<2)|(0<<3); //пины, ловящие импульс от реле
    while(1)
    {
    for (int ii=0; ii<4;ii++)
    {
    if (PINB & (1<<(ii+4))  //если реле сработало то
    US_cl();
    USART_FlushTxBuf(); //очищаем передающий буфер
    itoa(mass, optime,10);  //перевод optime в char
    switch (ii)											
    {
    case 0: strcat(buf,"a"); break;  //1 реле
    case 1: strcat(buf,"b"); break;   //2 реле и т д
    case 2: strcat(buf,"c"); break;
    case 3: strcat(buf,"d"); break;
    }
    strcat(buf,optime);  //склеиваем символ-номер реле и время срабатывания
    USART_SendStr(buf);
    memset(buf,0,sizeof(buf)); //очищаем буфер
    }
    }
    }
    

    Выложил полностью работающий код, без потерь отправляющие данные, авось кому пригодится =)

  7. Доброго времени суток, проблема следующая: имеются 4 реле времени, которые срабатывают практически одновременно, посылая импульсы на ноги контроллера, после попадания на него импульсов он формирует строку типа "a1256", где a - 1-й номер сработавшего реле, 1256 - 1,256 сек - время срабатывания. Если представить ситуацию, что все 4 реле времени сработали одновременно (т. е. самая распространённая ситуация), то вместо строки "aXXXXbXXXXcXXXXdXXXX" (где xxxx-времена срабатывания) по ком порту отправляется строка "abcdXXXX", т.е. передаётся только последнее время срабатывания реле

    main()
    {
    volatile int optime=0; //время срабатывания
    volatile char mass[10]; //для хранения optime в char
    
    DDRB|=(0<<0)|(0<<1)|(0<<2)|(0<<3); //пины, ловящие импульс от реле
    
    while(1)
    {
    for (int ii=0; ii<4;ii++)
    {
    if (PINB & (1<<(ii+4))  //если реле сработало то
    
    US_cl();
    USART_FlushTxBuf(); //очищаем передающий буфер
    
    itoa(mass, optime,10);  //перевод optime в char
    
    switch (ii)						
    {
    case 0: USART_SendStr("a"); break;  //1 реле
    case 1: USART_SendStr("b");break;   //2 реле и т д 
    case 2: lUSART_SendStr("c"); break;
    case 3: USART_SendStr("d"); break;
    }
    USART_SendStr(optime);
    }
    }
    }
    

    Код библиотеки usart прикрепил в файле.

    usart.zip

  8. В общем решение следующее: нужно зайти в свойства проекта -> toolchain -> Libraries и добавить в список библиотек линковки libprintf_flt.a

    а в папке general (linker'a) поставить галочку use vprintf library

  9. hd44780, это урезанный кусок из моего проекта, дабл там стоит, потому что нужен )

    а что плохого в том, что в прерывании осуществляется вывод на жк? работао всегда без проблем

    пысы: проблему обошёл обходным путём, всем спасибо )

  10. Есть микруха ft232rl и контроллер, фт232 запитывается от usb (т.е. земля и +5V от юсб), у контроллера свой источник питания (соответственно свои +5V и земля). Вопрос в том, нужно ли 2 эти земли объединять или нет?

  11. Доброго времени суток, ситуация следующая : имеется контроллер mega64, дисплей, клавиатура (12 кн) и кнопка: с клавы вводим число с отображением на дисплее, по нажатию на кнопке срабатывает прерывание и дальше что то делаем с числом. Проблема в том, что значение переменной с вводимым числом не передаётся в обработчик прерывания, вот код:

    volatile double cislo=0; //само число
    volatile double temp=0;
    volatile unsigned char dd1[7]; //для хранения символа с клавы
    
    void vvod(); //функция ввода данных с клавы
    
    main()
    {
    lcd_init(); //инициализируем дисплей и клаву
    keyb_init();
    
    EIMSK|=(1<<INT5); //иниц прерывания
    EICRA|= (1<<ISC01)|(1<<ISC00);
    
    while(1)
    {
    KEYB_ScanKeyboard();
    vvod();
    }
    }
    
    void vvod()
    {
    dd1[0]=KEYB_GetKey();
    
    lcd_puts(&dd1[0]); //вывод на дисплей
    
    temp=(double)dd1[0]; //преобраз unsigned char в double
    cislo=cislo*10+temp;
    }
    
    SIGNAL(SIG_INTERRUPT5)
    {
    if (cislo) lcdputs("OK!");
    else lcdputs("Fail");
    }
    

    Значение при вводе числа каким то образом теряется, в чём тут может быть косяк?

  12. вообще говоря волнует, схема идет как часть измерительного прибора, метрологи не очень радуются искажениям источника+ цифровой амперметр начинает врать, похоже именно из за этого искажения, так как на резисторе он показывает верно.

    Если Вы говорите при индуктивной нагрузке так и будет, можно ли как то нейтрализовать это? и еще такой вопрос, индуктивная нагрузка влияет на трансформатор так? если да, то на чем еще можно построить усилитель?

  13. Нужен источник для питания обмотки реле переменного тока, источник 400гц, регулируемый до 120-130 В, доступно силовые 220 для питания

    реле похоже на вот это: http://relays.ru/fil...log/rpk101u.pdf

    на мосте Винна реализована генерация 400гц, после него идет на пару транзисторов, 825-827, затем через трансформатор на обмотку реле. сигнал на обмотке искажается, появляется площадка итд, как выше описывал, при подключении просто активной нагрузки такого не происходит

  14. Перед входом второй обмотки трансформатора стоят комплементарные транзисторы 827а и 825г, то есть по мощности должно хватать? или я чего не понимаю? ток они дают большой. пробовал с сигналом частотой 50гц, то же самое.

    диодный мост и конденсатор, паралельно выходу? какие подобрать? выходное напряжение в районе 130в

    post-138727-0-76309100-1372060685.jpg

  15. В схеме я уже использую трансформатор ТН60-127/220-50. При подключении синусоидаьного сигнала на вторичную обмтку на первичной достигается искомое усиление, но при подключении ИНДУКТИВНОЙ нагрузки (катушка э/м реле сопротивлением 6 кОм через диодный мост) проседает синусоида при переходе через ноль, появляются нежелательные искажения сигнала, нулевая площадка длительностью примерно 100-200мкс, как с этим бороться?

  16. Имеется сигнал переменного напряжения величной 8-10 В, 400 Гц, его нужно усилить до 120-130 В, также 400 Гц. К усилителю будет подключена индуктивная нагрузка.

    Помогите с выбором схемы либо уже с готовыми решениями, заранее спасибо!

  17. hd44780, компараторы включаются поочереди сигналом сдвигового регистра, т.к. выходы всех компараторов объединены и подаются на ногу контроллера, получается тактируя регистр он включает определённый компаратор, и сигнал на выход (0 или 1) идёт на контроллер, т . зная номер счёта мы знаем с какого компаратора (а т.е и реле) идёт сигнал

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

×
×
  • Создать...