Чт янв 20, 2022 13:28:56
Сб янв 22, 2022 10:44:03
Нужен K-Line, он похож на UART, только там напряжение от 0 до 12 вольт
/* 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; // СТОП
}
}
Сб янв 22, 2022 17:52:22
Сб янв 22, 2022 21:45:00
Вс янв 23, 2022 12:57:51
Вс янв 23, 2022 21:06:42
Пн янв 24, 2022 00:03:09
Пн янв 24, 2022 05:03:31
Пн янв 24, 2022 16:49:20
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;
Пн янв 24, 2022 17:09:28
Сб янв 29, 2022 13:32:20
Вс янв 30, 2022 13:42:26
Ср фев 02, 2022 10:12:36
//----------
#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; // СТОП
}
}
Ср фев 02, 2022 11:30:19
Он в этих процах элементарнейший. Там изучать то нечего.cxem писал(а):Придётся изучать таймер TMR2
Ср фев 02, 2022 13:46:55
Ср фев 02, 2022 14:03:23
Ср фев 02, 2022 14:50:06
может, потому, что на 2 транзисторах сигнал RX инвертируется транзистором, а в варианте "пик" - вопрос? возможно, я что-то упустил из предыдущего, но верно ли я понял, что вы хотите один аппаратный USART использовать для связи с компьютером, а софтовый - для К-линии, причем с возможностью трансляции в К-линию как "своих" данных из МК, так и тех, что присылает комп? ну и в обратную сторону тоже? типа аппаратного сниффера К-линии изобретаете что-то?cxem писал(а):Почему на 2 транзисторах работает, как автомат Калашников
А на PIC18F25K80 не хочет.
Ср фев 02, 2022 21:31:41
один аппаратный USART использовать для связи с компьютером, а софтовый - для К-линии, причем с возможностью трансляции в К-линию как "своих" данных из МК, так и тех, что присылает комп?
Ср фев 02, 2022 23:20:00
Ср фев 02, 2022 23:43:32
формировать программно сигналы K-Line на скорости чуть больше, чем 9600 - имхо, это не может быть проблемой. похуже с приёмом, но, предполагаю, и тут не принципиально. я в PIC-ах вообще ни ухом ни рылом, не могу утверждать, что все получится... только предполагаю по аналогии с AVR, что проблем быть не должно никаких серьёзных.cxem писал(а):1. Скорость связи своя(обычно 10400 бод)
2. Пробуждение ЭБУ(обычно импульс 25/25мс)