Програмирование pic на СИ.

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Вам UART что-ли нужен ? Или что ?

PS: По 3 дня отвечаете. Классный диалог получается. :)))
Контактная информация:
Реклама
Грызет канифоль
Аватара пользователя
Сообщения: 279
Зарегистрирован: Вт июн 30, 2009 09:17:54
Откуда: г.Сыктывкар

Сообщение cxem »

Нужен K-Line, он похож на UART, только там напряжение от 0 до 12 вольт
Вот получилось отправить байт 01010101 через ножку 21
Спойлер

Код: Выделить всё

/* Main.c file generated by New Project wizard
 *
 * Created:   Вт янв 18 2022
 * Processor: PIC18F25K80
 * Compiler:  MPLAB XC8
 */

#include <xc.h>
#define _XTAL_FREQ 4000000
#define Bit_out LATBbits.LATB0            //  Bit_out = 21-нога
void main(void)
 {   
   TRISBbits.TRISB0 = 0;   //  21-нога  out
 
    int i;                                        // переменная      i
   char byte =  0x55;      // переменная     byte 

      while (1)
      { 
 	  	  	  Delay10TCYx(1000);        //  Пауза 	 
	 Bit_out   = 0;                                      //  СТАРТ 
 	  	  	  Delay10TCYx(3);        //  СТАРТ  пауза 9600 бод 
              for(char i = 0;  i  <  8; i ++)              // увеличить переменную i на 1  
	{
	  	          Delay10TCYx(12);         //   пауза 9600 бод
 	 Bit_out = (byte  >>  i) & 1;               // вытолкнуть биты на ножку 21 (RB0)      
        }
	  	  	  Delay10TCYx(18);        //  СТОП   пауза 9600 бод 	
	 Bit_out  = 1;                                    //  СТОП

     }
 }
Вложения
21_out_01010101.png
(22.11 КБ) 131 скачивание
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Пфффф. Обычный UART. Зачем ногодрыг, если есть аппаратный ?
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 279
Зарегистрирован: Вт июн 30, 2009 09:17:54
Откуда: г.Сыктывкар

Сообщение cxem »

K-Line однопроводная, в основном применяется в автомобильной промышленности.
Вложения
UART_ЭБУ.GIF
(52.94 КБ) 162 скачивания
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

В это проце есть 2 аппаратных UART'а. Зачем извращение с ногодрыгом ?
Контактная информация:
Реклама
Грызет канифоль
Аватара пользователя
Сообщения: 279
Зарегистрирован: Вт июн 30, 2009 09:17:54
Откуда: г.Сыктывкар

Сообщение cxem »

адаптер-ELM327 - что имеем, то имеем (500 рублей у китайцев)
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Повесить светодиоды на ноги аппаратного UART и вывести UART на левые ноги - это верх мазохизма :facepalm:
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 25399
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

Нее, Алекс... Тут очень глубоко зарытая идея защиты от копирования. Ибо всякий обнаруживший такой мазохизм немедля бросит затею реверса. Быть мазохистом - это крайне обидно для настоящего посона. )))
Поставщик валерьянки для Кота
Сообщения: 1916
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

В CCS для "слабых" PICs uint64_t нет. Есть проверенный метод работы с uint64_t? (Метод может быть не быстрым).

Мне примерно нужно "масштабировать" дроби - целочисленный делитель INT, числитель FRAC и знаменатель MOD. Числа большие и достигают "вершины" uint32_t. Число 4095 может быть для другой случай и 1048575. Разделить напр. 1000/1000 в данном случае быть не должно - теряю точность "внизу" [Hz].

В Arduino для FRAC/MOD использую это, но в CCS нет uint64_t:

Код: Выделить всё

uint32_t scaling_fraction(uint32_t num, uint32_t denum) {
  uint64_t u64 = (uint64_t)num;

  u64 = u64 * 4095 / denum;
  num = (uint32_t)u64;
  return num;
float по нескольким причинам я избегаю использовать :).
А float работает (если не заменю с чем-то другим методом).

Пример:
uint32_t a = 49999374;
uint32_t b = 99998750;
=> a / b = 2047 / 4095
Последний раз редактировалось veso74 Пн янв 24, 2022 17:13:47, всего редактировалось 2 раза.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 25399
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="veso74",url="/forum/viewtopic.php?p=4167182#p4167182"]Есть проверенный метод работы с uint64_t?.[/uquote]
А в чем может быть проблема? Обычная арифметика и извлечение квадратного корня не имеют вообще никаких ограничений по стандартной "школьной" методике.
Вы столбиком арифметику + - и * делать умеете? Это оно и есть. Можете посмотреть как делается 32-разрядная арифметика и воспроизвести ее в 64 разрядах. Деление и извлечение корня я предпочитаю делать итерационным последовательным приближением. Хотя нужно бы посчитать, возможно Ньютон-Рафсон и побыстрее будет для 8 разрядов.
Родился
Сообщения: 2
Зарегистрирован: Сб янв 29, 2022 12:48:27

Сообщение узнать »

https://yandex.ru/video/preview/?text=% ... 5369862835
Помогите кто сможет
Делаю все полностью одинаково , без ошибок , там часы идут у меня
00:00:01`и все ! Не получается что то
Спасибо !
Родился
Сообщения: 2
Зарегистрирован: Сб янв 29, 2022 12:48:27

Сообщение узнать »

Всем спасибо , вопрос закрыт !
Грызет канифоль
Аватара пользователя
Сообщения: 279
Зарегистрирован: Вт июн 30, 2009 09:17:54
Откуда: г.Сыктывкар

Сообщение cxem »

Вот сигнал от UART и от "ногадрыга"
Видно, что "ногадрыга" не точно делает паузы в бите
Придётся изучать таймер TMR2, чтобы получить стандарт 104мкс
Спойлер

Код: Выделить всё

//------------------------------------------------------------------------------
#include <p18F25K80.h>                             // для настройки под выбранный контроллер

void init(void)
{
// настройка генератора
// в регистре конфигурации выбран внешний тактовый генератор XT,  умножитель выключен
// в OSCCON выбираем 4 мГц  основной генератор
OSCTUNE = 0b00000000;
         //	            ||++++++---TUN<5:0>: 000000 = Центральная частота; Быстрый Осциллятор RC работает на калиброванной частоте
       //	            |+---------PLLEN: Frequency Multiplier 4xPLL     0 = PLL выключен
    //	            +----------: Internal Oscillator Low-Frequency

 OSCCON = 0b01010000;             // 101 = HF-INTOSC/4 output frequency is used (4 MHz)
           //           ||||||++---SCS<1:0>: тактовая частота берется с основного модуля. основной генератор (работа через PLL  должен быть 00) 
         //	           |||||+-----HFIOFS: бит - Частота стабильна
       //	           ||||+------OSTS: бит статуса (какой выбран генератор)
      //	           |+++-------IRCF<2:0>: выбор частоты тактового генератора
     //	           +----------: функция генератора в режиме сна. SPLLEN умножитель 1-включен
OSCCON2 = 0b00000000;
         //	            |||||||+---LFIOFS:бит стабильной частоты LFINTOSC режима
        //	            ||||||+----MFIOFS:бит стабильной частоты MFINTOSC режима
       //	            |||||+-----PRISD:бит отключения главного (внешнего) генератора
      //	            ||||+------SOSCGO: бит контроля запуска вторичного (внешнего) генератора
      //	            |||+-------MFIOSEL: бит переключения источника чатоты для MFINTOSC режима
     //	            ||+--------Unimplemented: Read as ‘0’.
    //	             |+---------SOSCRUN: бит статуса источника частоты от вторичного генератора
    //	             +----------: бит статуса получения частоты от умножителя тактовой чатоты

//---------------------------------------
                   // настройка портов
     ADCON1=1;                                                    //  Отключаем все аналоговые буфера
     ADCON1=0b01111111;                                 //  Отключаем все аналоговые буфера  
   TRISBbits.TRISB0 = 0;                   // 21-нога  out
 //   LATBbits.LATB0 = 1;                  // установить на B0 плюс
                  // UART
      TRISCbits.TRISC6 = 0;   // TX output
      TRISCbits.TRISC7 = 1;   // RX input

                                    // настройка Open1USART
  Open1USART ( USART_TX_INT_OFF &               // Прерывание передачи OFF
	                  USART_RX_INT_ON &                // Получать прерывание ON
	                  USART_ASYNCH_MODE &        // Асинхронный режим
	                  USART_EIGHT_BIT &                 // 8-bit Передача / прием
	                  USART_CONT_RX &                 // Непрерывный прием
	                  USART_BRGH_HIGH,               // Высокая скорость передачи бода
                                         SPBRG = 25 );           //  ((4000000 : 16) : 9600)  - 1 = 25,04 Погрешность скорости обмена  9600 

}


#define Bit_out LATBbits.LATB0             // Bit_out = 21-нога
void main(void)
 {
    init();         //  Инициализировать функцию  void init(void)
   TRISBbits.TRISB0 = 0;                   // 21-нога  out
   int i;                                               // переменная      i
   char byte =   0x55;                      // переменная     byte    0b01010101;  
   char    txbyte = 0x55;

    
   while (1)
   
  if (TXSTAbits.TRMT == 1)           //  проверит UART занят передачей или нет
    { 
     
 
       while(Busy1USART());          //  Ждем пока освободится модуль иначе будут прострелы
  
       {
       Write1USART(txbyte);            //  Пишем наш байт
       }
       Delay10TCYx(10);
    }
  else
    { 
                Delay10TCYx(50);                //  Пауза    
    Bit_out   = 0;                                      //  СТАРТ
               Delay10TCYx(4);                   //  СТАРТ  пауза 9600 бод
              for(char i = 0;  i  <  8; i ++)              // увеличить переменную i на 1 
   {
                 Delay10TCYx(4);                        // пауза 9600 бод
     Bit_out = (byte  >>  i) & 1;                       // вытолкнуть биты на ножку 21 (RB0)     
        }
               Delay10TCYx(10);                         //  СТОП   пауза 9600 бод    
    Bit_out  = 1;                                               //  СТОП

     }
	 
 }
Вложения
bit_UART-out_21pin-out_.png
(46.58 КБ) 135 скачиваний
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

cxem писал(а):Придётся изучать таймер TMR2
Он в этих процах элементарнейший. Там изучать то нечего.
Стоит только взглянуть на картинку :
СпойлерИзображение
2022-02-02_11-27-03.png
(20.73 КБ) 139 скачиваний
и всё станет понятно.
Вся его настройка сводится к конфигурировании одного регистра T2CON.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

я, конечно, не знаток PIC-ов, но сдается мне, софтовый UART не стоит того, чтобы мусолить его столько времени... более того, таймер для временных интервалов битов там не нужен, т.е. не требуется какая-то "особая" точность. проблема явно где-то в другой области кроется...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 279
Зарегистрирован: Вт июн 30, 2009 09:17:54
Откуда: г.Сыктывкар

Сообщение cxem »

В интернете нахожу только примеры заточенные на курсовые: арифметика и алгебра.
Примеров по K-Line нет.
Почему на 2 транзисторах работает, как автомат Калашников
А на PIC18F25K80 не хочет.
Вложения
K-Line_Rx_Tx__1.GIF
(48.84 КБ) 126 скачиваний
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

cxem писал(а):Почему на 2 транзисторах работает, как автомат Калашников
А на PIC18F25K80 не хочет.
может, потому, что на 2 транзисторах сигнал RX инвертируется транзистором, а в варианте "пик" - вопрос? возможно, я что-то упустил из предыдущего, но верно ли я понял, что вы хотите один аппаратный USART использовать для связи с компьютером, а софтовый - для К-линии, причем с возможностью трансляции в К-линию как "своих" данных из МК, так и тех, что присылает комп? ну и в обратную сторону тоже? типа аппаратного сниффера К-линии изобретаете что-то?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 279
Зарегистрирован: Вт июн 30, 2009 09:17:54
Откуда: г.Сыктывкар

Сообщение cxem »

Изучаю K-Line:
1.Протокол связи с ЭБУ
2.Протокол данных
Обидно за PIC18F25K80, который проигрывает 2 транзисторам
1.Скорость связи с ЭБУ слабая: Если даже UART поднять до 115200 бод
2.Почему-то говорят, что он не умеет отправлять в ЭБУ байты длиннее 8 байт
один аппаратный USART использовать для связи с компьютером, а софтовый - для К-линии, причем с возможностью трансляции в К-линию как "своих" данных из МК, так и тех, что присылает комп?
- Да
Специфика работы с ЭБУ:
1. Скорость связи своя(обычно 10400 бод)
2. Пробуждение ЭБУ(обычно импульс 25/25мс)
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 162
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы

Сообщение Родэрик »

:facepalm:
Спойлер
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

cxem писал(а):1. Скорость связи своя(обычно 10400 бод)
2. Пробуждение ЭБУ(обычно импульс 25/25мс)
формировать программно сигналы K-Line на скорости чуть больше, чем 9600 - имхо, это не может быть проблемой. похуже с приёмом, но, предполагаю, и тут не принципиально. я в PIC-ах вообще ни ухом ни рылом, не могу утверждать, что все получится... только предполагаю по аналогии с AVR, что проблем быть не должно никаких серьёзных.

но на вашем месте я не стал бы заморачиваться с PIC-ом вообще, а просто сниффил бы на компьютере обмен через СОМ-порт, и видел бы то же самое.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Ответить

Вернуться в «PIC»