всем добрый день, подскажите кто может, делаю проект в MPLAB IDE v8.92, имеются файлы main.c, SD_FAT.h, SD_FAT.c, SD_WAV.h SD_WAV.c, так вот, было бы очень здорово чтобы глобальные переменные объявленные в SD_FAT.c были видимы в SD_WAV.c, а вот как это замутить что то не знаю, есть ли возможность такового ?
_________________ Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
В первой форме объявляется переменная 1 int q; 2 ....... 3 // всякие действия с переменной
Во второй форме в коде пишем 1#include "Form1.h" //файл h первой формы, разумеется в общей папке должны лежать 2 extern int q; // получаем нашу переменную из первой формы 3 ............... 4 // продолжаем работу с переменной q
_________________ Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
добрый день. Уважаемые проблема примитивная и много всего в гугле нашёл по этой теме, но толку не какого, хочу подцепить PIC18F4550 по USB но, когда не понимаешь, что не работает толи с пиком толи с пк толи дрова корявые или проводок чего, разобраться не получается, что то толкового нет нечего, есть у кого нибудь исходники с прошивкой и терминалом, для этих дел, чтоб вот оп и заработало, ну а дальше яб разобрался.......
_________________ Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Что меня сбивает по сравнению с шиной TWI в AVR, так это обилие всяких флагов и гораздо большее число регистров у PIC.
Код Hi-Tech рабочий, данные выводятся. Но со странным глюком. При выводе одной и той же информации в одну и ту же строчку, без предварительного затирания этой строчки, наблюдается эффект смещения на 1 столбец и появляется мусор. Строчка как бы дергается. Грешу именно на код Hi-Tech, так как в сети для PICC и шины MSSP встречается очень большое число реализации кода. Я многое перепробовал и безуспешно. В слепую методом тыка я подбирать код не намерен, да и бессмысленно это.
Что смущает после шины TWI в AVR. Там вначале выставляются нужные биты в регистре, а затем следует задержка с проверкой флага прерывания TWINT. В коде же Hi-Tech, наоборот, вначале идет проверка готовности, потом устанавливается бит, но нет проверки установки этого бита
Помогите с реализацией правильного драйвера i2c master
PS. Скопирую все же часть используемого мной кода Hi-Tech в данный момент, для упрощения. Кому надо подробнее, то ссылки указаны выше Спойлер
Код:
// Initialise MSSP port. void i2c_Init(void){
// Initialise I2C MSSP // Master 100KHz TRISA1=1; // set SCL and SDA pins as inputs TRISA2=1;
// i2c_Write - Sends one byte of data void i2c_Write(unsigned char data) { i2c_Wait(); SSPBUF = data; }
PS2. Еще о неправильной работе драйвера i2c сужу по сбою при инициализации дисплея, когда вместо чистого экрана получаю на нем мусор
_________________ "Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Спасибо за ответ! Я и использую компилятор ХС8, просто пример попался от компании Hi_Tech более понятный и осмысленный. Code Configurator даёт два варианта драйвера i2c. Один мощный, но избыточный. Он предполагает полную проверку и контроль над шиной i2c, но при этом требует буфера для передачи данных. Памяти в той же ATmega8 на буфер нет. А применять ATmega328 избыточно для проекта. Второй драйвер даёт лишь базовый контроль и там надо самому собирать код работы с шиной. Я с ним так и не разобрался.
Подобный код, что Вы привели в примере, я 100% встречал в сети. Запомнился очень по:
При том, что ZERO нигде не объявлена и зачем ее еще в цикл помещать? Я не программист и вот таких шаманских пассов не понимаю. И чем данный кусок кода отличается от приведенного в примере?
Код:
// i2c_Wait - wait for I2C transfer to finish void i2c_Wait(void){ while ( ( SSP1CON2 & 0x1F ) || ( SSPSTAT & 0x04 ) ); }
Далее, смущает инициализация прерывания
Код:
SSPIE=1;
при отсутствии самого обработчика прерывания. В AVR GCС было обязательным создание обработчика в коде, даже если он пустой.
В общем код ради интереса попробую. Чем черт не шутит. Но пока вижу очень схожий по смыслу код, только с проверкой бОльшего числа флагов, чем в примере Hi-Tech
_________________ "Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
я уже и не помню откуда этот код у меня, очень много времени прошло. Он рабочий 100%
Добавлено after 9 minutes 37 seconds: Ни в одном хидере включенном в xc.h мне не удалось найти ZERO и READ_WRITE, но компилятор хавает их без ругани. Может найдется человек, который сможет пояснить что это такое. У меня весь стаж под windows для пиков пишу года 1,5 только.
Хотел было уже написать, что код откомпилировался, но не заработал... Но во-всяком случае в Протеус он работает. В железе смогу только в понедельник проверить. Расскажу про мои вечерние приключениям по-порядку...
serg_svd писал(а):
но компилятор хавает их без ругани
У меня без ругани скушал только ZERO но так как я не нашел её(переменной) ни в одном из хидеров, то тупо присвоил ей тип переменной. Стало так
Что касается READ_WRITE, то пришлось объявить макросом, иначе компилятор матерился
Код:
#define READ_WRITE (SSP1STAT & 0x04)
После этих изменений код прошел компиляцию, выдав по дороге три варнинга на функции Start, Stop и Write, так как они возвращают значение, а в коде это не используется. Но в симуляторе не заработал. Ситуацию сдвинуло с мертвой точки последнее сообщение. После указания вектора прерывания все заработало. Но! Повторюсь. Надо проверить в железе.
Надо поискать в сети, откуда у этого кода растут ноги и разобраться с функциями Start, Stop и Write. Ну и напоследок, код
Код:
// i2c_Wait - wait for I2C transfer to finish void i2c_Wait(void){ while ( ( SSP1CON2 & 0x1F ) || ( SSPSTAT & 0x04 ) ); }
тоже работает.
PS. SSP1IF - это не ошибка. Я использую в качестве подопытного контроллер PIC16F1825 и в регистрах mssp присутствует в названии 1
_________________ "Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Этот код без изменений работает у меня на 18F4550 [img] [/img]
Добавлено after 5 minutes 1 second: xc8 v2.05 который я использую собирает его без ругани, v2.09 дал целую кучу варнингов и 2 ошибки в разных файлах касающихся usb и ацп. v2.10 не пробывал
Добавлено after 5 minutes 1 second: 16F1825 у меня есть но я не делал отладочную плату для него
Специально глянул версию компилятора. У меня 2.05. Надо посмотреть, как обновляется. Но дело, думаю, не в версии компилятора. Некоторые авторы специально не публикуют дополнительные хидеры и файлы. Но я вспомнил, где я видел этот код и обязательно загляну туда. Но я совсем не надеюсь получить там какие-либо пояснения. Поэтому далее надо самому разбираться. Ну и по версии компилятора и типу микроконтроллера тут разницы не вижу. Код от Hi-Tech тоже прекрасно компилировался и работал в симуляторе. Но в реальном железе давал непонятный глюк. Так что надо и этот код проверять будет.
PS Обновил ХС8 до версии 2.10. Причем версия 2.05 тоже осталась установленной. Интересно, для чего?
_________________ "Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
XoXoJI, в общем не работает в железе у меня Ваш пример кода. Замучался уже. Я не применял указанный Вами драйвер дисплея, работал со своим. Ваш, во-первых, требует буфера, а у меня памяти под него нет. Во-вторых, считаю, не в нем дело. Вот либо я неправильно что-то в контроллере настроил в конфигурации, либо ошибка в другом. Кстати, инициализация дисплея в Вашем примере отличается по некоторым пунктам от рекомендуемой китайцами. Но опять же, с контроллерами AVR проблем с кодом не было.
Что сейчас происходит у меня. Информация начинает выводится на дисплей, но в какой-то момент вывод прекращается. И, при чем, всегда в разных местах
PS. при этом Proteus прожевывает любую инициализацию нормально, и в отличии от реального дисплея все достоверно выводит на дисплей
_________________ "Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Я его спер с какогото сайта. Сейчас на работе, не могу проверить но инициализация эта вроде для дисплея 128х32 а не 128х64 как у маня и как у вас. Перенос строки по Y вроде неправильный. Приеду домой проверю.
но инициализация эта вроде для дисплея 128х32 а не 128х64 как у маня и как у вас. Перенос строки по Y вроде неправильный.
Кстати да! Я заметил, что вывод пошел через строчку , что характерно для 128х32. Так что это верно Такое получается при
Код:
OLED_command(OLED_SETCOMPINS); // 0xDA OLED_command(0x02); // у китайцев 0х12
В общем вернул работу с драйвером Hi-Tech и вывод на дисплей заработал. Компилятор 2.10. Вот уж не знаю, в компиляторе ли дело или нет
_________________ "Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Если информация выводится значит i2c работает. Надо ковырять драйвер ssd1306
Нет! Я поторопился с выводами. По-прежнему, если делать вывод одной и той же строчки в оду и ту же позицию с некоторым интервалом по времени, то происходит смещение отдельных символов на ±1 столбец. Для защиты своего драйвера ssd1306 скажу, что с AVR микроконтроллерами подобной проблемы нет, что с twi, что с usi версией интерфейса. Надо продолжать бороться с i2c драйвером.
Насколько я помню, для 128х64 после OLED_SETCOMPINS должно идти 0х12 а после OLED_SETMULTIPLEX 0x3F
Ну то же самое я привел с китайского даташита на дисплей
_________________ "Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
_________________ "Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
XoXoJI, похоже заработал нормально Ваш драйвер для i2c. Я долго искал причину, пока не вспомнил, что в драйвере от Hi-Tech при инициализации регистр SSPSTAT устанавливалось значение не 0х80, а
Код:
SSPSTAT = 0b11000000; // Slew rate disabled
Полез в даташит. В моем вольном переводе значится:
Код:
CKE (SPI Clock Select bit) — Выбор фронта передачи сигнала Ведущий или ведомый режим I2C: 1 — Входные данные соответствуют спецификации SMBus 0 — Входные данные не соответствуют спецификации SMBus (соответствуют спецификации I2C).
Полез в инет искать описание протокола SMBus и вот, что обнаружил в Вики:
SMBus (англ. System Management Bus) — последовательный протокол обмена данными для устройств питания. Основан на шине I²C, но использует более низкое сигнальное напряжение (3,3 В)...
И, похоже, что в этом то и состоял глюк. Если посмотреть модуль дисплея ssd1306, то у него питание подается через стабилизатор 3,3 В, при этом контроллер питается от 5 В. Но на сигнальных шинах уровень лог 1 равен 3,3 В, так как они подтянуты резисторами именно на уровень 3,3 В. Прав я или нет - не знаю, но по крайней мере код заработал нормально
Добавлено after 1 hour 1 minute 43 seconds: С этим же значением регистра SSPSTAT Нормально заработал и драйвер от Hi-Tech, так как я изначально записывал туда значение 0x80, а не как в статье 0хС0
_________________ "Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения