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

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 321
Зарегистрирован: Вт июн 30, 2009 09:17:54
Откуда: г.Сыктывкар

Сообщение cxem »

17 и 18 ножки - это UART
21 ножка - вЫход K-Line
12 ножка - вход K-Line
какие тут ножки замкнуть?

пока только такой код на шёл, но на 21 ножке выскакивают одиночные импульсы не похожие на биты, что я посылаю на 18 ножку

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

int i;                        // переменная i
    for(i=0;i<7;i++)             // увеличить переменную i на 1
  {
     while(!DataRdy1USART());                // ждать, пока данные будут получены 
	 char byte_outKline = Read1USART();      // присвойть содержимое регистра  USART в однобайтовую переменную  byte_outKline
	 KLINE_OUT = (byte_outKline  << i) & 1 ;       // вытолкнуть биты на ножку 21 (RB0) 
  }
Реклама
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

У вас в коде чепуха написана.
Трудно понять, что вы пытаетесь куда-то там послать, что получаете на ноге, и что значит "вытолкнуть биты".
Вы бы хоть описали подробнее задачу, что делаете, что пытаетесь получить, что конкретно в вашем результате не нравится и почему, и т.д... Какими-то отрывками разговариваете, как старый дедушка, бормочащий себе что-то под нос ...
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 321
Зарегистрирован: Вт июн 30, 2009 09:17:54
Откуда: г.Сыктывкар

Сообщение cxem »

отправляю байт 0b01010101 на 21-ножку
хочу увидеть в терминале, что нибудь из этого: 85 125 0x55 01010101 U
как это сделать?
Спойлер

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

/* 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 =  0b01010101;      // переменная     byte 

      while (1)
      { 
 	  	  	  Delay10TCYx(1000);        //  Пауза 	 
	 Bit_out   = 0;                                      //  СТАРТ
  	  	          Delay10TCYx(10);          //  пауза 9600 бод    
              for(char i = 0; i < 8; i++)              // увеличить переменную i на 1  
	{
	  	          Delay10TCYx(10);         // пауза 9600 бод
 	 Bit_out = (byte  >> i) & 1;               // вытолкнуть биты на ножку 21 (RB0)      
        }
	  	  	  Delay10TCYx(10);        //  пауза 9600 бод 	
	 Bit_out  = 1;                                    //  СТОП
	  	  	  Delay10TCYx(10);        //  пауза 9600 бод 
     }
 }
 
Вложения
0b01010101.png
(27.86 КБ) 122 скачивания
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

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

PS: По 3 дня отвечаете. Классный диалог получается. :)))
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 321
Зарегистрирован: Вт июн 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 КБ) 148 скачиваний
Реклама
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

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

Сообщение cxem »

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

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

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

Сообщение cxem »

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

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

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

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

Нее, Алекс... Тут очень глубоко зарытая идея защиты от копирования. Ибо всякий обнаруживший такой мазохизм немедля бросит затею реверса. Быть мазохистом - это крайне обидно для настоящего посона. )))
Поставщик валерьянки для Кота
Сообщения: 1990
Зарегистрирован: Сб май 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 раза.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 26121
Зарегистрирован: Чт янв 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

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

Всем спасибо , вопрос закрыт !
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 321
Зарегистрирован: Вт июн 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 КБ) 151 скачивание
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

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

Сообщение ARV »

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

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

Сообщение cxem »

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

Сообщение ARV »

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

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

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