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

Ostroukhov1991

Участник
  • Постов

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

  • Посещение

Репутация

0 Обычный

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

  • Звание
    Участник
    Участник

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

Блок последних пользователей отключён и не показывается другим пользователям.

  1. Нее, мне греет душу код вида, как привел dimka76 обернытый в функцию USART_Init(Mode, Num) - привет CMSIS 🤗. Вы слишком плохо обо мне подумали 😁. Я во всех проектах вне зависимости от архитектуры камня, завожу только головные структуры в main файле, для хранения рабочих конфигов, отдельно данных, отдельно флагов, отдельно событий, отдельно временных счетчиков - некие удобные хабы данных. То бишь по определению вложенность структур не предусмотрена. Объем оперативки мне больше важен, для того чтобы сразу выгрузить максимальное число G-кода из стойки, так как когда горит дуга, лаги и сбои в коммуникации, будь то по вине ЭБУ или ПК - недопустимы. Да и в целом, до запуска УП, намного проще осуществить корректность полученных ЭБУ команд. Планомерно все передавать с контролем коммуникации, crc и тд. Меня главное порадовало, что бесплатный CubeIDE нормально работает в отладке и в прошивке с китайским свистком ST-Link V2, большего от нее не требуется)
  2. Кубик в кубе) Все бы может и проканывало с таким порядком вещей если бы была аля бытовая железка, но данный ЭБУ рулит 5ти осевым сварочным станком при этом общаясь плотно со стойкой управления по токовой петле. PIC24HJ в целом справлялся, но во время движения подлагивал, так как очень много математики синхронизации всех осей из которых 2 поворотные. Поэтому я и принял волевое решение сесть на STM32 который в 12 раз быстрее и имеет в 16 раз больше flash и в 64 раза больше оперативки.
  3. В этом и прикол. В том же PIC24H юарт запускается горсткой регистров (про атмел вообще молчу). У HAL колбэк не работает, при чтении по _IT какой-то невменоз. Залез под капот HAL и диву дался, сколько раз там из структуры в структуру перекладывается все. Это видимо хорошо, что в таких простых вещах, CubeMX не очень хорошо на берегу себя продемонстрировал. Уже решил для себя что лучше по старике сформировать свои гарантированно и понятно работающие функции с опорой на голый CMSIS, чем превращать такой мощный камень в ардуиноподобный черный ящик. Штучки как куб конечно расхолаживают, пока по DS не пробежишься разок при написании функций, не поймёшь что из себя представляет камень. Да и загаженность сгенерированного проекта кучей комментов не нравится.
  4. Народ всем привет. Нужда заставила впервые сесть за STM32 и сразу на H743VIT6. Так как сроки сжатые, естественно пришлось заюзать CubeIDE+CubeMX (что мне лично сильно не нравиться, в виду того что и на Атмелах и на микрочипе всегда работал напрямую без мусорных библиотек). Непонятка такая: У меня имеется функция, которая раз в 200мс шлет пакет по usart на ПК через функцию HAL...Transmit(). Пока я считываю входящие байты через HAL_...Receive(), вроде бы все ок, но как только я хочу сделать это по прерываниям функцией ... Receive_IT(), то функция поставленная перед while() просто отрубает даже передачу данных. Кто-то сталкивался с этим багом? Перепробовал уже кучу костылей, но блин в HAL концов не найдешь...
  5. Ну параметр акселя 0х47 изначально был в у меня в формате 0b...., по даташиту, потом просто преобразовал для компактности. Сейчас при чтении регистра по i2c камень возвращает либо не то что я якобы записал, либо при игрании кодом чтения, вообще зависает. Хотелось бы чтобы как минимум подсказали культурный правильный код i2c. Сейчас для настройки частоты шины под 100кГц (при 8МГц МК) использую параметр 0х20, есть ощущение что могу просто не попадать в частоту акселерометра.
  6. Сделал очень урезанную инициализацию акселя: Код: uint8_t CTRL_REG1 = 0x47; ACEL_Write(0x20, CTRL_REG1); И прямую проверку на светодиодах читая регистр OUT_Z: Код: if(ACEL_Read(0x2d)>127){ fLED_Driver(1,3,1); }else{ fLED_Driver(1,1,1); } По логике, вращая плату, в какой-то момент должно происходите переключение светодиодов в одну сторону и соответственно обратно при обратном повороте. Но у меня судя по коду регистр всегда возвращает значение меньше 127. Можно сделать вывод, если я не ошибаюсь, что даже запись регистра запуска CTRL_REG1 не происходит, раз аксель молчит. Сейчас I2C реализовано вот так: Код: uint8_t ACEL_Write(uint8_t addr, uint8_t data){ I2C_Start(I2C_device_w); I2C_Write(addr); I2C_Write(data); I2C_Stop(); } uint8_t ACEL_Read(uint8_t addr){ uint8_t InData; I2C_Start(I2C_device_w); I2C_Write(addr); I2C_Repeated_Start(I2C_device_r); InData = I2C_Read_Ack(); //I2C_Read_Nack(); I2C_Stop(); return InData; } uint8_t I2C_Start(char write_address)/* I2C start function */ { uint8_t status; /* Declare variable */ TWCR=(1<<TWSTA)|(1<<TWEN)|(1<<TWINT); /* Enable TWI, generate START */ while(!(TWCR&(1<<TWINT))); /* Wait until TWI finish its current job */ TWDR=write_address; /* Write SLA+W in TWI data register */ TWCR=(1<<TWEN)|(1<<TWINT); /* Enable TWI & clear interrupt flag */ while(!(TWCR&(1<<TWINT))); /* Wait until TWI finish its current job */ } uint8_t I2C_Repeated_Start(char read_address) /* I2C repeated start function */ { uint8_t status; /* Declare variable */ //TWCR=(1<<TWSTA)|(1<<TWEN)|(1<<TWINT);/* Enable TWI, generate start */ //while(!(TWCR&(1<<TWINT))); /* Wait until TWI finish its current job */ /* Return 0 for repeated start condition fail */ TWDR=read_address; /* Write SLA+R in TWI data register */ TWCR=(1<<TWEN)|(1<<TWINT); /* Enable TWI and clear interrupt flag */ while(!(TWCR&(1<<TWINT))); /* Wait until TWI finish its current job */ } uint8_t I2C_Write(char data) /* I2C write function */ { uint8_t status; /* Declare variable */ TWDR=data; /* Copy data in TWI data register */ TWCR=(1<<TWEN)|(1<<TWINT); /* Enable TWI and clear interrupt flag */ while(!(TWCR&(1<<TWINT))); /* Wait until TWI finish its current job */ } char I2C_Read_Ack(void) /* I2C read ack function */ { TWCR=(1<<TWEN)|(1<<TWINT)|(1<<TWEA); /* Enable TWI, generation of ack */ while(!(TWCR&(1<<TWINT))); /* Wait until TWI finish its current job */ return TWDR; /* Return received data */ } char I2C_Read_Nack(void) /* I2C read nack function */ { TWCR=(1<<TWEN)|(1<<TWINT); /* Enable TWI and clear interrupt flag */ while(!(TWCR&(1<<TWINT))); /* Wait until TWI finish its current job */ return TWDR; /* Return received data */ } void I2C_Stop(void) /* I2C stop function */ { TWCR=(1<<TWSTO)|(1<<TWINT)|(1<<TWEN);/* Enable TWI, generate stop */ while(TWCR&(1<<TWSTO)); /* Wait until stop condition execution */ }
  7. Всем доброго дня. Помогите пожалуйста с акселем LIS302DL. Пишу в AVR Studio. Нацарапал инициализацию и функции работы с I2C, регистр имени читает и возвращает 0x3b как положено. Пробую записывать регистры чипа, но результата не вижу. Задача заключается в том, чтобы по двойному клику (а в идеале, еще и по определенному перевороту акселя) выводить прерывания на ножки INT0 и\или INT1 акселя, с целью пробуждения МК. После запуска, МК полностью настраивается, настраивает аксель и засыпает. В настоящий момент, для упрощения отслеживания наличия изменений на ноге МК, я не завожу его в сон, а просто вывожу состояние на светодиод. Помогите пожалуйста с кодом. Мой фрагмент кода: Инициализация I2C, настройка акселя и выключение I2C в Main() : #define F_CPU 8000000UL #define F_I2C 50000UL #define TWBR_VALUE (((F_CPU)/(F_I2C)-16)/2) #if ((TWBR_VALUE > 255) || (TWBR_VALUE == 0)) #error "TWBR value is not correct" #endif #define I2C_device 0b0011101 I2C_Config(1); ACEL_Config(); I2C_Config(0); Функция инициализации I2C: void I2C_Config(uint8_t Mode){ if(Mode){ TWBR = TWBR_VALUE; TWSR = 0; }else{ TWCR = 0; } } Функция настройки акселя: void ACEL_Config(void){ unsigned int i = 0; uint8_t CTRL_REG1 = 0b01000111; I2C_Work(0x20, CTRL_REG1, 0); uint8_t FF_WU_CFG_1 = 0b01110000; I2C_Work(0x30, FF_WU_CFG_1, 0); /* Настроить регистр управления прерываниями: включить Click interrupt1 */ uint8_t CTRL_REG3 = 0b00111111; I2C_Work(0x22, CTRL_REG3, 0); /* Включить генерацию прерывания по двойному клику по оси Z */ uint8_t CLICK_CFG = 0b01100000; I2C_Work(0x38, CLICK_CFG, 0); uint8_t CLICK_THSXY = 0xAA; I2C_Work(0x3B, CLICK_THSXY, 0); uint8_t CLICK_THSZ = 0x0A; I2C_Work(0x3C, CLICK_THSZ, 0); /* настройка лимита времени */ uint8_t CLICK_TimeLimit = 127; I2C_Work(0x3D, CLICK_TimeLimit, 0); /* настройка задержки */ uint8_t CLICK_Latency = 127; I2C_Work(0x3E, CLICK_Latency, 0); /* настройка окна выборки */ uint8_t CLICK_Window = 255; I2C_Work(0x3F, CLICK_Window, 0); //uint8_t CLICK_SRC = 0b01101010; //I2C_Work(0x39, CLICK_SRC, 0); } Функции работы с I2C: void I2C_Start(void){ TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); while(!(TWCR & (1<<TWINT))); } void I2C_Stop(void){ TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN); } uint8_t I2C_Work(uint8_t adr, uint8_t data, uint8_t setaddr){ uint8_t getdata; I2C_Start(); /*выдаемна шину пакет SLA-W*/ TWDR = (I2C_device<<1)|0; TWCR = (1<<TWINT)|(1<<TWEN); while(!(TWCR & (1<<TWINT))); /*передаем адрес регистра*/ TWDR = adr; TWCR = (1<<TWINT)|(1<<TWEN); while(!(TWCR & (1<<TWINT))); /*передаем данные или пропускаем*/ if (!setaddr){ /*это чтобы привести данные к BCD формату*/ //data = ((data/10)<<4) + data%10; TWDR = data; TWCR = (1<<TWINT)|(1<<TWEN); while(!(TWCR & (1<<TWINT))); }else{ /*выдаем на шину пакет SLA-R*/ TWDR = (I2C_device<<1)|1; TWCR = (1<<TWINT)|(1<<TWEN); while(!(TWCR & (1<<TWINT))); /*считываем данные*/ TWCR = (1<<TWINT)|(1<<TWEN); while(!(TWCR & (1<<TWINT))); getdata = TWDR; } /*формируем состояние СТОП*/ I2C_Stop(); return getdata; } uint8_t I2C_Read(void){ uint8_t data; I2C_Start(); /*выдаем на шину пакет SLA-R*/ TWDR = (I2C_device<<1)|1; TWCR = (1<<TWINT)|(1<<TWEN); while(!(TWCR & (1<<TWINT))); /*считываем данные*/ TWCR = (1<<TWINT)|(1<<TWEN); while(!(TWCR & (1<<TWINT))); data = TWDR; /*формируем состояние СТОП*/ I2C_Stop(); return data; }
  8. До этого работал с PIC, в MPLAB прямое обращение к пинам. Как в AVR Studio это сделать более быстро по тактам?
  9. Подпаял АКБ, глобально ничего не изменилось. Осцилл показывает 1.25 Мгц на ноге МК Код пишу в AVR Studio 5, оптимизация по умолчанию -О1. Шью через PROGISP V1.72 через USBisp v2 #define F_CPU 8000000UL #include <avr/io.h> #include <avr/interrupt.h> int main(void){ asm("cli"); WDTCR = (1<<WDTOE)|(1<<WDE); WDTCR = 0x00; IO_Config(1); asm("sei"); DDRB |= (1<<PB5); while(1){ PORTB |= (1<<PB5); PORTB &= ~(1<<PB5); } }
  10. Так, кажется есть подозренте на tp4056. В общем в схему временно не установлен АКБ и идет внешнее питание через порт заряда. Видимо ТР работает какимито пульсациями не видя встречного напряжения от АКБ
  11. Народ помогите. На плате установлен камушек atmega16a-au запитанный от 3.3в. Фьюзами выставил 8Мгц, вочдог выключил. Делаю в цикле while постоянную дрыготню ногой, осциллограф показывает 1.2...1.3 мгц. Когда запускаю timer1 настроенный на 44кгц, осциллограф выдает 13кгц. В чем прикол? Неужели на 3.3в данный камень не способен выйти на 8Мгц? Если у кого-нибудь есть примеры кода под работу с ним в AVR Studio буду благодарен.
  12. А как компмлятор в проекте основной прошивки понимает накакую функцию он должен перейти по адресу 0х800? Или проект самой прошивки тоже имеет первичную функцию main просто смещенную на 0х800.
  13. Всем доброго дня. Впервые в жизни собираю двухсоставную прошивку: загрузчик, в который включена функция main() и отдельно перетираемая часть прошивки, в которой есть свой аналог main - workmain(). Изначально предполагается что камень должен быть прошит основной прошивкой включающей загрузчик, а уже по SPI (CAN шина) дошит актуальной версией самой перетираемой частью прошивки, которая начинается, условно с адреса 0х1000. Хочется понять, как во втором проекте, в котором пишется непосредственно перетираемая часть прошивки, назначить функции workmain конкретный адрес 0х1000, и правильно ли я понимаю, что если для данного проекта в свойствах указать начальный адрес прошивки 0х1000 компилятор сам правильно проставит адреса всем дочерним функциям и проблем с вызовом в камне не будет? Основной замысел следующий: Изначально контроллер запускается через main(), инициализирует всю требуемую периферию включая SPI. Если рабочая часть прошивки уже на месте и шить не нужно, то перебрасывает управление на 0х1000 (workmain()). Если прошивки нет то висит в штатном while() и общается с сервером. В функции workmain() свой бесконечный цикл (по сути имитация обычного main). Если в процессе работы пришла команда на апдэйт, выставляются флаги и управление снова передается в нулевой адрес (main()).
  14. Ну предположительно архитектура останется как и предлагает Smart_pic, то бишь, в локалке висят с 15...30 однотипных устройств с уникальными SN, долбятся на локальный TCP/IP сервер поднятый на обыкновенном системном блоке с WIN7... 10 в виде программы и получают от нее ответы. А сервер (программа) уже общается с HTTP- сервером, передает данные от устройств, и в ответ получает конфиги для них (устройств), команды и прочую актуальную информацию. Сеть у нас простая, глобальных роутер формирующий подсеть в который входит интернет, далее все уже ветвится свичами без дополнительных подсетей. На PIC18F25K80 остановились по причине обкатанности камня во многих изделиях +, что очень важно, он имеет аппаратный CAN. Как я понимаю, мне необходимо прописать моему серверу (системнтку с Win7) просто какойто фиксированный IP который будет указан в прошивках устройств и выбрать произвольный порт, который никто точно не займет на этом сервере, аля 1234? Вопрос заключается больше в том, что увидеть бы хоть адекватный пример TCP- клиента под PIC 8-битный в среде MPLAB, тьма примеров серверов, но я пока не пойму, можно ли его перековырять в обратную сторону и как. В противном случае придется для TCP- сервера (системного блока) писать сканер IP- адресов и вылавливать все устройства, и наоборот долбиться к ним как к серверам.
  15. Под W5500 гора библиотек которые както елкой собираются, а я еще относительный новичек и плаваю, вот и прошу у бывалых пример. Можно в принципе под любой PIC в среде MPLAB, там уже попроще всяко будет. Главное эту конструкцию из библиотек увидеть. Ну и + чтобы умные люди подсказали как именно стучаться в домен www, я до этого приемущественно сайты только писал и делал совсем простые вещи на МК, 5500 для меня к самостоятельному изучению будет сейчас карой)
×
×
  • Создать...