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

MicroC (Pro)


panther1

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

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

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

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

}

void myGreatFunction(6, 0x72, 2);

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

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

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

Изменено пользователем 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 пользователей онлайн

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

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