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

MicroC (Pro)


panther1

Рекомендуемые сообщения

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

не знаю правильно ли, но работает другой вариант:

void myGreatFunction(char par1, char *par2, char par3)

{
	myVeryImportantVariable = par2;    
	if (par1 =6) {myVeryImportantVariable = (char)&(*par2)};
	.......

}

void myGreatFunction(6, 0x72, 2);

это больше мне нравиться

Ссылка на комментарий
Поделиться на другие сайты

Места жалко. А для функций можно написать подсказки, что бы высвечивались при записи аргументов (за что этот аргумент отвечает и какие значения может принимать). Или описание функций в комментариях самой функции писать?

Изменено пользователем Bugrim
Ссылка на комментарий
Поделиться на другие сайты

40 минут назад, Bugrim сказал:

А для функций можно написать подсказки, что бы высвечивались при записи аргументов

Гуглите doxygen и ищите IDE, которая поддерживает такой стиль комментов.

40 минут назад, Bugrim сказал:

Места жалко

Какого места?! Трех-четырех байт жалко?

void myGreatFunction(char par1, char *par2); // это есть - получает УКАЗАТЕЛЬ на выводимую переменную

void myGreatFunctionVar(char par1, char par2){ // а это вы хотите - чтобы получала просто ЧИСЛО, а не указатель
  myGreatFunction(par1, &par2);
}

Много ли надо места потратить на такую "оберточную" функцию?!

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, Bugrim сказал:

почему то по душе иметь одну функцию с "расширенными" параметрами

Было бы интересно выяснить, сколько места вы потеряли на этом желании :) Неужели меньше, чем с двумя функциями?!

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Действительно. Тем более, что компилятор это дело соптимизирует и две функции  будут занимать меньше программного пространства чем одна с выкрутасами.

Поскольку вы не очень опытный программист, дам вам совет - пишите как можно проще и понятнее, так вы будете иметь больше прока от своих усилий. А перфекционизм в вашем понимании может приводить к трудно обнаруживаемым ошибкам.

Пока ты жив, надежда есть.

Ссылка на комментарий
Поделиться на другие сайты

04.10.2020 в 19:07, ARV сказал:

Много ли надо места потратить на такую "оберточную" функцию?!

Убедили.

7 часов назад, mazzi сказал:

пишите как можно проще и понятнее

 Это потому что я не опытный или этот совет всем полезен?

 

 

Ссылка на комментарий
Поделиться на другие сайты

  • 1 год спустя...

Привет всем! Написал одну программку на MikroC for PIC (для PIC16F676)для системы радиоуправления, в ней ввёл глобальную переменную:

unsigned char txbyte2;

Далее она передается на приемник. В Протеусе всё работает как надо: программа приёмника декодирует её как 0b00000000. В железе (макетная панель) младшие 4-6 разрядов (точно не помню) - единицы. Тогда взял и перед входом в бесконечный цикл  прописал txbyte2 = 0b00000000, и после этого в железе всё заработало как надо. Так что получается, если вводишь какую-то переменную, она не равна 0? Какое она принимает значение? МК, правда, китайские, с Алишника, может, еще в этом дело

Изменено пользователем Aleksandr1111
Ссылка на комментарий
Поделиться на другие сайты

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

Похоже вы объявили свою переменную в функции main, а это уже локальная переменная, и она имеет неопределенное значение.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Доброго времени суток!
Пытаюсь инициализировать аппаратный SPI в PIC16F1619 по средствам библиотек Mikroc pro for pic.

Согласно датасшиту на МК, за линиями SDI, SCK, SS зарезервированы выводы RB4, RB6, RC6. SDO необходимо назначить.

Назначаю с помощью Peripheral_Pin_Select:

   

Unlock_IOLOCK();
PPS_Mapping(10, _OUTPUT, _SDO);    //На выход SPI
Lock_IOLOCK();

Далее пытаюсь инициализировать SPI со стандартными настройками из библиотеки SPI_Remappable:

SPI1_Init();                           // Initialize SPI module

 Пытаюсь, что-нибудь отправить, на всех задействованных выводах ничего не происходит.

void main() {
   Unlock_IOLOCK();
   PPS_Mapping(10, _OUTPUT, _SDO);    //Íà âûõîä SPI
   Lock_IOLOCK();
   SPI1_Init();                       // Initialize SPI module

  while(1){
           SPI1_Write(0x73);
           Delay_ms(500);
  }
}

Прошу помощи в инициализации SPI.

П.С. Симулирую все это дело в протеусе. Учусь работать с SPI (пока с помощью библиотек)для последующего запуска LCD на SS7735/SS7789. 

Ссылка на комментарий
Поделиться на другие сайты

Попробуйте без библиотек.
Если Вы добрались до даташита и до информации в нём, касаемой ремапа, то Вам, скорее всего, не составит труда проинициализировать этот простой модуль без всяких библиотек.

Ссылка на комментарий
Поделиться на другие сайты

20 часов назад, Alex сказал:

Попробуйте без библиотек.
Если Вы добрались до даташита и до информации в нём, касаемой ремапа, то Вам, скорее всего, не составит труда проинициализировать этот простой модуль без всяких библиотек.

Пробовал уже по разному. Недели полторы бъюсь, а воз и ныне там. У енгельском я неразумны, датасшит читаю с переводчиком. Может чего недоходит.
Вот пример, без библиотек, который тоже никак не проходит:

Спойлер

 

sbit CS_EN at RC6_bit;
sbit CS_EN_Dir at TRISC6_bit;
//sbit RST at RC1_bit;
//sbit RST_Dir at TRISC1_bit;
sbit DC_ at RC7_bit;
sbit DC_Dir at TRISC7_bit;
sbit SCK_Dir at TRISB6_bit;                 //SCK Master cleared
sbit MOSI_Dir at TRISB7_bit;                 //MOSI output
// Master SPI mode only
#define   SMPEND        0x80           // Input data sample at end of data out
#define   SMPMID        0x00           // Input data sample at middle of data out

/* SSPCON1 REGISTER */
#define   SSPENB        0x20           // Enable serial port and configures SCK, SDO, SDI
#define   SPI_FOSC_4    0              // SPI Master mode, clock = Fosc/4     clockcycle 0.5 uS
#define   SPI_FOSC_16   1              // SPI Master mode, clock = Fosc/16
#define   SPI_FOSC_64   2              // SPI Master mode, clock = Fosc/64    clockcycle 8 uS
#define   SPI_FOSC_TMR2 3              // SPI Master mode, clock = TMR2 output/2
#define   SLV_SSON      4              // SPI Slave mode, /SS pin control enabled
#define   SLV_SSOFF     5              // SPI Slave mode, /SS pin control disabled
void SPI_Init_(){
  CS_EN_Dir = 0;
  SCK_Dir=0;                   //SCK Master output
  MOSI_Dir=0;                  //MOSI output
  //RST_Dir=0;                   //Reset output
  DC_Dir=0;                    //Данные/Команда

  SSPSTAT = 0b00000000;
  SSPCON1 = 0b00000000;
  SSPCON1 |= SPI_FOSC_4;
  SSPSTAT |= SMPMID;           // выбор фазы
  SSPSTAT.CKE = 1;             // передача по переднему фронту
  SSPCON1.CKP = 0;             // по низкому уровню
  RB7PPS = 0b00010001;         // RB7 SDA на output
  RB6PPS = 0b00010000;         // RB6 SCL на output
  SSPCON1 |= SSPENB;           // Включить SPI

  CS_EN = 1;
}
void SPI_SendByte(char _data){
  SSPBUF=_data;
  while(!SSPCON1.WCOL) ;       //Ждем передачи отправленных байт
  SSPBUF = 0x00;				//Очищаем буфер
  SSPCON1.WCOL=0;              //Сбрасываем флаг
}
void main(){
  SPI_Init_();
  while(1){
           SPI_SendByte(0x77);
           Delay_ms(500);
           }
}

 

Добавлено:
Закомментировал "

while(!SSPCON1.WCOL) ;

" и пошли данные. Что то я с флагом накосячил. Пойду датасшит докуривать.


Еще ДОБАВИЛ:
Действительно накосячил с флагом. Код ниже подправил. Работает. Дебагер SPI протеуса ловит отправляемые данные. Сейчас буду подгонять сигналы, для начала, под ST7735.

Спойлер

 

sbit CS_EN at RC6_bit;
sbit CS_EN_Dir at TRISC6_bit;
//sbit RST at RC1_bit;
//sbit RST_Dir at TRISC1_bit;
sbit DC_ at RC7_bit;
sbit DC_Dir at TRISC7_bit;
sbit SCK_Dir at TRISB6_bit;                 //SCK Master cleared
sbit MOSI_Dir at TRISB7_bit;                 //MOSI output
// Master SPI mode only
#define   SMPEND        0x80           // Input data sample at end of data out
#define   SMPMID        0x00           // Input data sample at middle of data out

/* SSPCON1 REGISTER */
#define   SSPENB        0x20           // Enable serial port and configures SCK, SDO, SDI
#define   SPI_FOSC_4    0              // SPI Master mode, clock = Fosc/4     clockcycle 0.5 uS
#define   SPI_FOSC_16   1              // SPI Master mode, clock = Fosc/16
#define   SPI_FOSC_64   2              // SPI Master mode, clock = Fosc/64    clockcycle 8 uS
#define   SPI_FOSC_TMR2 3              // SPI Master mode, clock = TMR2 output/2
#define   SLV_SSON      4              // SPI Slave mode, /SS pin control enabled
#define   SLV_SSOFF     5              // SPI Slave mode, /SS pin control disabled
void SPI_Init_(){
  CS_EN_Dir = 0;
  SCK_Dir=0;                   //SCK Master output
  MOSI_Dir=0;                  //MOSI output
  //RST_Dir=0;                   //Reset output
  DC_Dir=0;                    //Данные/Команда

  SSPSTAT = 0b00000000;
  SSPCON1 = 0b00000000;
  SSPCON1 |= SPI_FOSC_4;
  SSPSTAT |= SMPMID;           // выбор фазы
  SSPSTAT.CKE = 1;             // передача по переднему фронту
  SSPCON1.CKP = 0;             // по низкому уровню
  RB7PPS = 0b00010001;         // RB7 SDA на output
  RB6PPS = 0b00010000;         // RB6 SCL на output
  SSPCON1 |= SSPENB;           // Включить SPI

  CS_EN = 1;
}
void SPI_SendByte(char _data){
  SSPBUF=_data;
  while(!SSP1STAT.BF) ;       //Ждем передачи отправленных байт
  SSP1STAT.BF=0;              //Сбрасываем флаг отправки data
}
void main(){
  TRISC=0b00000000;;
  PORTC=0b00000000;
  SPI_Init_();
  while(1){
           SPI_SendByte(0x45);
           Delay_ms(500);
           PORTC.F0 =~ PORTC.F0;
           }
}

 

 

Изменено пользователем teapot
Включил мозг=)
Ссылка на комментарий
Поделиться на другие сайты

Еще раз обращаюсь к знающим людям.

Настроенным SPI (выше) отправляю 1, с контролера выходит 2 (смотрю дебагером spi в proteuse), отправляю 2 получаю 4. отправляю 3 - получаю 6.

Если смотреть на это дело в двоичном коде, происходит сдвиг битов. Кроме того, к контроллеру в протеусе подключен LCD на ST7755 и он выкидывает в лог ошибку:
 

[LCD] CS released, data transfer breaks on bit (rx 8, tx 8) [LCD1]

В чем может быть проблема?

Спойлер

Screenshot_3.png.2807f42b1de666dd2539ee2c0eff27f5.png

 

Ссылка на комментарий
Поделиться на другие сайты

Что за Send_CMD ? Покажите её.
А лучше все, вниз сходящие до регистров, по иерархии.
А лучше весь код :D

PS: Возможно, Вы 0-вым битом где-то передаёте C/D.

Ссылка на комментарий
Поделиться на другие сайты

Да тут и кода то почти нет=)

Инициализация SPI и функции отправки:

Спойлер
/***********************Аппаратный SPI на передачу для PIC16F1619***************

Заметка от 27.01.2022
*******************************************************************************/
// Установка линий SPI
sbit SCK_Dir at TRISB6_bit;                 //SCK Master cleared
sbit MOSI_Dir at TRISB7_bit;                 //MOSI output
// Master SPI mode only
#define   SMPEND        0x80           // Input data sample at end of data out
#define   SMPMID        0x00           // Input data sample at middle of data out

/* SSPCON1 REGISTER */
#define   SSPENB        0x20           // Enable serial port and configures SCK, SDO, SDI
#define   SPI_FOSC_4    0              // SPI Master mode, clock = Fosc/4     clockcycle 0.5 uS
#define   SPI_FOSC_16   1              // SPI Master mode, clock = Fosc/16
#define   SPI_FOSC_64   2              // SPI Master mode, clock = Fosc/64    clockcycle 8 uS
#define   SPI_FOSC_TMR2 3              // SPI Master mode, clock = TMR2 output/2
#define   SLV_SSON      4              // SPI Slave mode, /SS pin control enabled
#define   SLV_SSOFF     5              // SPI Slave mode, /SS pin control disabled
// Инициализация аппартного SPI
void SPI_Init_SPI_PIC16F1619(){
  SCK_Dir=0;                   //SCK Master output
  MOSI_Dir=0;                  //MOSI output

  SSP1STAT &= 0x3F;
  SSP1CON1 = 0x00;
  SSP1CON1 |= SPI_FOSC_4        ;
  SSP1STAT |= SMPMID;           // выбор фазы
  SSP1STAT.CKE = 1;             // фронт
  SSP1CON1.CKP = 1;             // уровень
  RB7PPS = 0b00010001;         // RB7 SDA на output
  RB6PPS = 0b00010000;         // RB6 SCL на output
  SSP1CON1 |= SSPENB;           // Включить SPI
}
// Функция отправки данных
void SPI_SendByte(unsigned char _data){
  SSPBUF = _data;
  while(!SSP1STAT.BF) ;       //Ждем передачи отправленных байт
  SSP1STAT.BF=0;              //Сбрасываем флаг отправки data
}
void SPI_SendByte16(unsigned int _data){
  char Low = _data & 0x00ff;
  char Hig = _data>>8;
  SSPBUF=Low;
  while(!SSP1STAT.BF) ;       //Ждем передачи отправленных байт
  SSP1STAT.BF=0;              //Сбрасываем флаг отправки data
  SSPBUF=Hig;
  while(!SSP1STAT.BF) ;       //Ждем передачи отправленных байт
  SSP1STAT.BF=0;              //Сбрасываем флаг отправки data
}

 

и в отдельном файле пытаюсь инициализировать ST7735:

Спойлер
#define _DC PORTC.F7
#define CS_EN PORTC.F6
// Color definitions                    //BRG  RGB?
#define BLACK   0x0000
#define BLUE    0x0F01
#define RED     0x00F0
#define GREEN   0x0007
#define CYAN    0x0703
#define PURPLE  0x0F81
#define YELLOW  0x00FE
#define WHITE   0xFFFF
//#define RST PORTC.F5
void send_CMD(char data_out){
    CS_EN = 0;
    _DC=0;
    SPI_SendByte(data_out);
    CS_EN = 1;
}
void send_DAT(char data_out){
    CS_EN = 0;
    _DC=1;
    SPI_SendByte(data_out);
    CS_EN = 1;
}
void send_DAT16(unsigned int data_out){
    CS_EN = 0;
    _DC=1;
    SPI_SendByte16(data_out);
    CS_EN = 1;
}
void init_ST7735(){

Send_CMD(0x01);
Delay_ms(12);
/*
Send_CMD(0x11);
Delay_ms(12);

Send_CMD(0x3A);
Send_DAT(0x05);

Send_CMD(0x36);
Send_DAT(0xA0);

Send_CMD(0xB1);
Send_DAT16(0x000F);
Send_DAT16(0x000F);
Send_DAT16(0x000F);

Send_CMD(0x29);    */
//CS_EN = 1;
}

 

Ну и main:

Спойлер
#include "SPI_PIC16F1619.h"
#include "MY_ST7735.h"

void main(){
  TRISB = 0b00000000;
  TRISC = 0b00000000;
  PORTC = 0b00000000;
  SPI_Init_SPI_PIC16F1619();
  init_ST7735();

  while(1){
           
           Delay_ms(1000);
           }
}

 

 

Изменено пользователем teapot
Ссылка на комментарий
Поделиться на другие сайты

Инвертировал CLK. Ничего не поменялось.

Спойлер

Screenshot_4.png.ae76368ad56ed28f6e962d88d8553d98.png

Добавил:

Изменил SSP1CON1.CKP = 1; на SSP1CON1.CKP = 0; - данные пошли как надо: получаю на дебагере то, что отправляю. Но ошибки остались от LCD. Я так понимаю здесь уже будет проблема не в SPI, а в самом коде инициализации дисплея?

Изменено пользователем teapot
Ссылка на комментарий
Поделиться на другие сайты

1 час назад, teapot сказал:

Изменил SSP1CON1.CKP = 1; на SSP1CON1.CKP = 0

Так это и есть полярность CLK :)

1 час назад, teapot сказал:

Я так понимаю здесь уже будет проблема не в SPI, а в самом коде инициализации дисплея?

Не доверяйте Вы до такой степени этому протезу. Соберите в железе и поиграйтесь с настройками SPI.

Ссылка на комментарий
Поделиться на другие сайты

Дело не в доверии, а в том, что с LCD по SPI разбираюсь впервые. В наличии есть только ST7789, но в протеусе его нет. Зато есть ST7735. Протеус хоть и глючный, но можно посмотреть то, что в железе не получиться, так как осциллографа нет. Вот и играюсь, чтоб немного опыта поднабрать и проще было с другим экранчиком. Все ж лучше чем ничего. Да и, к тому же,  на протеусе ST7735 запускали и в сети есть примеры работ. 

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Сообщения

    • Cкорее всего, при 31,5 В на выходе драйвер не выдаст 300 мА.  Хотя, раз заявлено входное от 100 В, то при 230 В может что-то и получится. Но это уже за заявленными пределами работы.  Можно подключить проволочный резистор 100 Ом и померить напряжение, но лучше использовать как заявлено: в диапазоне 12-20 В.  
    • @MisterAnderson , напряжение на выходе светодиодного драйвера зависит от нагрузки, и определяется оно напряжением на светодиодах, а не самим драйвером. Светодиоды имеют характеристику близкую к стабилитрону, напряжение на них от тока зависит мало. Белые светодиоды имеют это напряжение примерно 3...3,4 В. Четыре последовательно включённых - примерно 12...14 В. На подключение таких "трёхвольтовых" белых светодиодов и расчитан ваш драйвер. Драйвер напряжением не управляет, есть только ограничение по максимальному, больше которого он выдать не может. Драйвер светодиодов стабилизирует ток. Ваш драйвер стабилизирует его на уровне 0,3 А. И выдать больше 20 В при этом не может. Измеренные вами 31,5 В на холостом ходу - это напряжение его внутреннего питания. Под нагрузкой 0,3 А напряжение на его выходе тут же "просядет", выше 20 В не поднимется. Мощность на одном трёхвольтовом 300-миллиамперном светодиоде будет (примерно, для светодиодов точность никогда особо не обеспечивают) 0,3 А * 3,3 В = 1 Вт. Трёхвольтовый белый светодиод на ток 300 мА - это и есть одноваттный светодиод. На четырёх будет 4 ватта. Следующие по напряжению в линейке белых осветительных светодиодов - шестивольтовые. У них в одном корпусе последовательно соединённые два светодиодных кристалла. Четыре таких светодиода, включённых последовательно, ваш драйвер не потянет, потому что им нужно минимум 6*4=24 В, а ваш драйвер может выдать не больше 20. Впрочем, можно бы было поставить вместо четырёх трёхвольтовых четыре шестивольтовых на 150 мА, две группы параллельно по два последовательно, но вряд ли справитесь с переделкой платы под светодиоды. Поэтому этот вариант вам и не предлагали. Проще, дешевле и с наименьшими затратами собственного времени, без переделки драйвера, платы и т.п., с которой вы точно не справитесь, поставить четыре одноваттных трёхвольтовых, на которые ваш драйвер расчитан. Тем более, что купить их - проблем нет. Именно этот оптимальнейший совет вам и дали. Всё вам правильно уже много людей много раз разными словами рассказали. Что вас ещё смущает?
    • Предусилители-корректоры на полевых транзисторах. Радио №9,   №10/2010.  А.Гурский.
    • Тоже самое в подсветках фирменных телеках даже 10 летней давности. Ток можно уменьшить на треть без потери качества легко. Потребитель должен потреблять и всё тут.
    • Естественно после 7 вольт то. Или аккум сам по себе хлам и садит в себя или ибп. Тут вариантов не много.
    • Попробуйте зарядить, а потом погонять ее  в полный цикл несколько раз. Это если акум нормальный а у ТС 100% давно не нормальный.
×
×
  • Создать...