09.07.2017, 20:21
|
#1821
|
Почётный гражданин KAZUS.RU
Регистрация: 11.06.2006
Адрес: 51° 46′ 0″ N, 55° 6′ 0″ E
Сообщений: 1,975
Сказал спасибо: 370
Сказали Спасибо 1,726 раз(а) в 707 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
[HTML]#INT_RDA
void serial_isr()
{
int8 i;
for (i = 0; i ‹ 3; i++)
{
buffer[i] = getc(); //прием байта от ЦП
}
DATA_MANAGEMENT = buffer[0];
DATA_CODE = buffer[1];
return;
}[/HTML]
Последний раз редактировалось welcome61; 09.07.2017 в 20:38.
|
|
|
|
09.07.2017, 21:12
|
#1822
|
Прописка
Регистрация: 07.05.2008
Адрес: Москва
Сообщений: 231
Сказал спасибо: 26
Сказали Спасибо 54 раз(а) в 19 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Лыжи не едут... или я уже ....
Вот: https://kazus.ru/forums/attachment.p...1&d=1499620328
Виноват немного- buffer идентифицировать забыл.
Извините за невежество, всё-таки в таком примере информация читается из потока или из аппаратного буфера, обозначенного в программе выше как RECEIVE_BUFFER=12,?
Последний раз редактировалось Prototup; 09.07.2017 в 21:18.
|
|
|
|
09.07.2017, 21:26
|
#1823
|
Прописка
Регистрация: 07.05.2008
Адрес: Москва
Сообщений: 231
Сказал спасибо: 26
Сказали Спасибо 54 раз(а) в 19 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
И каким размером обозначить массив данных buffer[i] , если он должен принять поток из
unsigned int16 Numbe_Pulse;
unsigned int16 Duty;
unsigned int16 Cycle;
следующим без разделителей, типа как 12Byte переменную?
|
|
|
|
10.07.2017, 16:13
|
#1824
|
Почётный гражданин KAZUS.RU
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Объявляете buffer как глобальный массив int16 из 3-х элементов. Если не хватает памяти данных - используйте union.
__________________
misterdi<@>i.ua
|
|
|
|
10.07.2017, 22:05
|
#1825
|
Прописка
Регистрация: 07.05.2008
Адрес: Москва
Сообщений: 231
Сказал спасибо: 26
Сказали Спасибо 54 раз(а) в 19 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
MisterDi ! Спасибо за участие! В полусыром виде пока оставил, в буфере всё появляется, надо только массив увеличить в два раза и изменить глубину до одного Byte и потом опять эти данные склеить по двое до 16Bit, далее пока сделаю паузу - надо съездить к тёще, за одно - поменять масло, фильтра и тормозные диски с колодками. Пока Вот, особо не заморачивался:
void main()
{
setup_oscillator(OSC_500KHZ); // Установливает внутренний осциллятор в 500кHZ МГц,
//для корректной установки скорости обмена
// Опции варьируются в зависимости от микросхемы и перечислены в заголовочных файлах устройства.
enable_interrupts(GLOBAL);//разрешение глобального прерывания
enable_interrupts(INT_RDA);
while(TRUE)
{
static unsigned int16 Numbe_Pulse=0;
static unsigned int16 Duty=0;
static unsigned int16 Cycle=0;
if(rcv_buffer_full())//функция теста на заполнения буфера
{
int16 buffer[3];
int8 i;
for (i = 0; i ‹= 3; i++)
{
buffer[i] = getc(); //приём 8 bit и растаскивание с индексацией массива
}
Numbe_Pulse = buffer[0];
Duty = buffer[1];
Cycle = buffer[2];
}
}
}
https://kazus.ru/forums/attachment.p...1&d=1499709111 https://kazus.ru/forums/attachment.p...1&d=1499709132
ЗЫ: если что придёт в голову - черкни, твоя критика тож очень пригодилась!
Сообщение от MisterDi
|
Объявляете buffer как глобальный массив int16 из 3-х элементов. Если не хватает памяти данных - используйте union.
|
Маленькие замечания:
- функция getc() больше байта за одну итерацию не воспринимает - из апноута: Returns: An 8 bit character, что вполне логично.
Последний раз редактировалось Prototup; 10.07.2017 в 22:16.
|
|
|
|
17.07.2017, 15:01
|
#1826
|
Прописка
Регистрация: 07.05.2008
Адрес: Москва
Сообщений: 231
Сказал спасибо: 26
Сказали Спасибо 54 раз(а) в 19 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Всего несколько строчек кода, а нервы не к чёрту! Заблудился в трёх соснах...
Кто знает как вернуть из форматированного потока строчных цифр их unsigned int16 значения?
Или ещё проще: из форматированного потока строчных цифр их unsigned int8 значения?
Проц есс-но 8 битный, соответствующие библиотеки подключены.
Вот кусочек кода:
unsigned int8 bufer[18];// массив по количеству символов, хранящихся в буффере USART
int8 i=0;
for (i = 0; i ‹= 17;i++)
{
bufer[i] = atoi( getc());// чтение и преобразование принятых данных из буффера USART
} // и распределение цифр уже в сформированном массиве.
Вот сама форматированная строка: https://kazus.ru/forums/attachment.p...1&d=1500289084
А вот что при этом получается: https://kazus.ru/forums/attachment.p...7&d=1500289065
Перечитал и перегуглил всё по этому вопросу, всё должно работать...
Чё за хрень...
Функция atol32(); - возвращает правда, два первых 16bit значения, а мне нужно 3 раза по 16bit...
Последний раз редактировалось Prototup; 17.07.2017 в 15:35.
|
|
|
|
17.07.2017, 23:34
|
#1827
|
Почётный гражданин KAZUS.RU
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Если у Вас на входе ASCII-строка, то сначала нужно выделить подстроки с числами (от пробела до пробела), затем в полученных подстроках брать по 1 байту, преобразовывать в число от 0 до 9, если конец подстроки строки не достигнут, результат умножать на 10.
__________________
misterdi<@>i.ua
|
|
|
|
18.07.2017, 18:28
|
#1828
|
Прохожий
Регистрация: 18.07.2017
Сообщений: 2
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Добрый день! Уважаемые знатоки может кто подскажет в чем дело, есть проблемы с обменом по SPI.
1) Использую микроконтроллер PIC24EP256GP202.
2) При использовании SPI1 запись по SPI проходит, устройство отвечает (проверено осцилографом), но чтение данных выдает на входе всегда 0, при использовании SPI2 (использую с переназначаемыми выводами) все работает и запись и чтение.
2) Инициализирую SPI1 следующей строкой:
#use spi(MASTER, FORCE_HW, SPI1, MODE=0, SAMPLE_RISE ,BITS=8,BAUD=3000000, stream=SPI_PORT1)
3) Инициализация SPI2:
#PIN_SELECT SCK2OUT =PIN_B7
#PIN_SELECT SDI2 =PIN_B12
#PIN_SELECT SDO2 =PIN_B8
#use spi(MASTER, FORCE_HW, SPI2, MODE=0, SAMPLE_RISE ,BITS=8,BAUD=3000000, stream=SPI_PORT1)
3) Функция записи spi_xfer(SPI_PORT1, data);
4) Функция чтения dataInput = spi_xfer(SPI_PORT1, 0x00);
5) Версия компилятора 5.071
|
|
|
|
24.07.2017, 20:14
|
#1829
|
Прописка
Регистрация: 07.05.2008
Адрес: Москва
Сообщений: 231
Сказал спасибо: 26
Сказали Спасибо 54 раз(а) в 19 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Сообщение от MisterDi
|
преобразовывать в число от 0 до 9, если конец подстроки строки не достигнут
|
Типичное описалово функции getc.
Сообщение от MisterDi
|
результат умножать на 10.
|
Умножать и прибавлять к произведению пробовал... оперативку жрёт... только на эту функцию с трудом и хватает!
Уж так устроены функции передачи-приёма, что работают только с данными типа "символ". Жаль что у CCS нет функций прямого ввода-вывода, типа fread и fwrite, как у взрослых "С" компиляторов.
Однако, если перечитать устройство функций ввода-вывода и их связь с символьными указателями и функциями, то можно найти решение о передаче из ранее созданного массива, данных по их указателям. В конце концов все символы всё равно "набираются" из "0" и "1".
|
|
|
|
24.07.2017, 20:23
|
#1830
|
Прописка
Регистрация: 07.05.2008
Адрес: Москва
Сообщений: 231
Сказал спасибо: 26
Сказали Спасибо 54 раз(а) в 19 сообщении(ях)
|
Re: Изучение PIC C Compiler(CCS C)
Сообщение от Vladislav
|
устройство отвечает (проверено осцилографом)
|
Так трудно что-либо сказать. Симульни в Протеусе пошагово с просмотром содержания соответствующих (буферов) регистров на приём и передачу.
|
|
|
Сказали "Спасибо" Prototup
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:28.
|
|