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

artos5

Moderators
  • Постов

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

  • Посещение

  • Победитель дней

    7

Весь контент artos5

  1. Добрый вечер! Нужна помощь очень сильно. Слил дампы с маркиратора DiGi HI3600. На него сейчас уже ничего нет. Есть потребность русифицировать его клавиатуру , чтобы вводить кириллицу . Кто может подсказать где могут храниться символы и их шрифты? Символы я уже нашел. А с шрифтами пока засада. Кстати символы представлены так: По вертикали 10 бит. по горизонтали 6 бит. То есть шрифты 10х6. За реальную помощь с удовольствием отблагодарю на карту. К примеру 1000-4000руб./500-2000грн. за помощь / подсказку.Фото текста и найденных полезных участков чуть позже выложу. Дампы публикую сейчас: HI3600.rar Забыл написать. Микросхемы памяти стоят М27С4002 , 3шт. Довольно древние . Для издевательств заказал с Китая десяток .
  2. Добрался до ноута, вот мой тестовый код: #include <xc.h> #define _XTAL_FREQ 100000 // CONFIG2 #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off) #pragma config PLLEN = OFF // PLL Enable (4x PLL disabled) #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset) #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.) #pragma config LVP = ON // Low-Voltage Programming Enable (Low-voltage programming enabled) void SetPWM (unsigned char nm, unsigned int dc) { switch(nm) { case 1: CCPR1L = dc>>2; CCP1CON &= 0xCF; CCP1CON |= 0x30&(dc<<4); break; case 2: CCPR2L = dc>>2; CCP2CON &= 0xCF; CCP2CON |= 0x30&(dc<<4); break; } } void main(void) { int fl=0, i=0; TRISC=0x01; TRISA=0x00; CCP1CON = 0x02; //PWM mode CCP CCP2CON = 0x02; CCP3CON = 0x02; CCP4CON = 0x02; OPTION_REG|=0x05; CCPTMRS0=0x81; //PR1=255; PR2=255; PR4=255; PR6=255; // T2CKPS1 = 1; //TIMER2 prescaler 1:16 // T2CKPS0 = 1; // T4CKPS1 = 1; //TIMER4 prescaler 1:16 // T4CKPS0 = 1; // T6CKPS1 = 1; //TIMER6 prescaler 1:16 // T6CKPS0 = 1; T2CON=0x0E; T4CON=0x0E; T6CON=0x0E; TMR2ON=1; TMR4ON=1; TMR6ON=1; while(1) { SetPWM(1, i); SetPWM(2, i+100); //SetPWM(2, 1023-i); //SetPWM(2, 1023-i); //if(fl==0) i++; //else i--; //if(i>1023) fl=1; //else if(i<=0) fl=0; i=1; } return; } Частоту специально понизил чтобы протеус меньше напрягался. В дальнейшем буду использовать частоту тактирования 20мГц от кварца.
  3. Все же я связываю проблемы с плохой оптимизацией протеус под микроконтроллеры PIC . Потому как поведение при отладке значительно отличается от описания в документации . И в придачу не работает два выхода . Хотя по конфигурации должны работать все 4 выхода CCPx
  4. Добрый день уважаемые! Кто решал подобную задачу? Нужно сформировать меандр на двух выходах и двигать фазу. Я это понимаю так: 1) Нужно настроить предделитель таймера . TxCKPS 2) нужно настроить срабатывание CCPx на инвертирование при совпадении. CCPxM=0b0010; 3) Нужно настроить период счётчика PRx и настроить срабатывание CCPx от какого таймера . CxTSEL 4) И нужно включить таймер . Пока что тестирую в протеус, так как в командировке. В отладке ведёт себя странно выходной сигнал. По идее если изменять регистр совпадения CCPR1L , то должна двигаться фаза . А по факту просто генерится меандр с частотой Fosc/4 , или Fosc/8. Кто в пиках хорошо разбирается , подскажите что делаю не так? К вечеру могу код инициализации скинуть (когда ноут включу).
  5. Можно я свои 5 копеек вставлю? Я бы сделал классический кольцевой буфер . По указателям отслеживал бы наполнение . И парсил бы потом его по заранее известным признакам . По таймауту можно ожидать полной загрузки в буфер сообщения . Если не догрузилось за n время , значит ошибка .
  6. Ну за сотку зелёных может Вам и помогут . И то , так , чисто для спортивного интереса ! Если интересно - пишите , помогу Вам.
  7. Я и не посмотрел что в колбеке творится. printf в колбеке приведет к зависанию камня . В HAL_delay переменная у меня когда-то приводило к зависанию МК .
  8. Я решал похожую задачу. Рекомендую переписать код так чтобы использовалось не вычисление значение задержки и помещалось в HAL_delay() , а вычислялось количество секунд и уже в цикле for() например , выполнялась задержка HAL_delay(1000); К примеру если получили 5 секунд , то выполняем for() 5 раз а в нем помещена задержка в секунду . Так работать будет 100%.
  9. Сделал версию прошивки с функцией самокалибровки при старте . Стало работать гораздо лучше и чувствительность выросла. Недостаток такого датчика только один. Нельзя помещать в область датчика объект пока не произойдет самокалибровка. В схему нужно добавить подтягивающий резистор 470к на РB0 и другой конец на +5В. Так как в этой версии прошивки внутренняя подтяжка выключена и по-другому реализован алгоритм определения объекта. 1) Прошивка t13.hex , прошивка для тини13А схема как в статье , за исключением подтяжки. 2) Прошивка Sensors_PIC12F628.X.production.hex . Прошивка для PIC . Тоже с функцией самокалибровки . Реле на GPIO4 Сенсорная площадка на GPIO2 GPIO2 подтянуть резистором 1м0 на +5В. Код на обеих МК практически один в один . На пике пришлось добавлять аппаратный таймер , так как мк медленный. На тини таймер софтовый , и сенсор на нем лучше работает , так как выше чувствительность . t13.hex
  10. artos5

    stm32f ADC >PWM

    Запустите АЦП в инжектированном режиме . Там два регистра независимых . Можно данные забирать в любое время .
  11. char Str[20]; // объявить глобально , если будет использоваться во многих участках . void format_str(int value) // объявить функцию в начале . { Str[0]=value/10+48; Str[1]=value%10+48; Str[2]=','; Str[3]=value%100+48; // значение после запятой } // Получаем число = 10.6 Пс: можно сделать ещё так: В одной переменной хранить значение 106 , а в строку помещать уже как 10.6. Таким образом будет использована одна переменная для хранения числа . format_str(read_adc(1)); // чтение АЦП print(Str); // вывод на дисплей
  12. artos5

    stm32f ADC >PWM

    Посмотри отладчиком . Или подними уарт, пропиши отладочный вывод , и посмотри что там творится .
  13. artos5

    stm32f ADC >PWM

    Если по отдельности работает и то и другое , то должно и так работать . Может ещё быть из-за типов данных. Приведи явно к uint32_t. Вот так: TIM2->CCR1=(uint32_t)adc_data*16;
  14. artos5

    stm32f ADC >PWM

    Так как ШИМ настроен ?
  15. artos5

    stm32f ADC >PWM

    Что именно не работает ? Как себя ведёт? И где копирование выполняешь в регистр ШИМ ? Как ШИМ настроен?
  16. artos5

    stm32f ADC >PWM

    Да , так будет работать . Переменная одна только. Читаем с АЦП в переменную , потом с нее копируем в ШИМ предварительно промасштабировав полученные значения с АЦП .
  17. artos5

    stm32f ADC >PWM

    АЦП умножить на 16 . И если нужно инвертировано выводить в ШИМ , то : PWM_data=65535-ADC_data*16; PWM_data=ADC_data*16; // без инверсии
  18. artos5

    stm32f ADC >PWM

    Сколько бит АЦП и сколько бит ШИМ будет? И как вывод в ШИМ должен работать?
  19. artos5

    stm32f ADC >PWM

    Ну так иногда нужно масштабировать АЦП , чтобы поместить данные в регистр ШИМ . Например , если АЦП 12бит , а ШИМ используется 16бит.
  20. artos5

    stm32f ADC >PWM

    PWM_data = ADC_data; //Скопировать прочитанные данные с АЦП в регистр ШИМ
  21. В моем примере используется переменная int. Пример хорош тем , что он вообще не использует sprintf стандартной библиотеки. И соответственно быстро работает и мало использует памяти . Чтобы отобразить данные на дисплее , нужно просто выполнить отправку данных на дисплей: print(Str);
  22. char Str[20]; int value=10, value1=6; Str[0]=value/10+48; Str[1]=value%10+48; Str[2]=','; Str[3]=value1+48; // значение после запятой // Получаем число = 10.6 Пс: можно сделать ещё так: В одной переменной хранить значение 106 , а в строку помещать уже как 10.6. Таким образом будет использована одна переменная для хранения числа .
×
×
  • Создать...