Про пики и их программирование

Тут недавно был чей-то пост относительно программирования 24-х пиков.
Некоторых не устроило то, как автор преподнес материал.

Мне, в частности, не понравилось, что конфигурация всей периферии происходила путем записи некоторых неоднозначных чисел в конфигурационные регистры. Но шанса развить дискуссию не дали. Поэтому тем, кому интересно, как это относительно просто и красиво сделать в MPLAB с компилятором C30, например, прошу под кат.


Итак, я программирую DSPIC33. В частности делаю на них управление двигателями постоянного тока.
Вообще, 33-и пики не сильно отличаются от 30 серии. Правда, в лучшую сторону. Они меньше греются на максимальной частоте, у них можно переконфигурировать пины переферии. Однако некоторый геморой прибавляется. Но всё это решаемо.

Не знаю как другие, но я считаю хорошим тоном задавать конфигурацию процессора прямо в коде, ибо тогда сразу глядя на исходник становится понятно как и что работает. Например:
/*Настраиваем фьюзы процессора*/
_FOSC(CSW_FSCM_OFF & XT_PLL8); //Настройка тактирования 
_FWDT(WDT_ON & WDTPSA_512 & WDTPSB_16); //Включаем вотчдог
_FBORPOR(PBOR_ON & BORV_20 & PWRT_64 & MCLR_EN);


О том, что данные конкретные макросы значат можно почитать в документации на процессор (правда сейчас с ходу не нашел, если кто подскажет где это лежит — буду признателен).

Далее. Допустим, мы хотим работать с уартом. Можно почитать доку, посмотреть в какой регистр что надо записывать и выписав себе на бумажку конфигурацию забить её в код. Но проблема в том, что возвращаясь к проекту через некоторое время, даже имея комментарии к коду где и на какой странице даташита смотреть, становится очень лениво лезть и перечитывать документацию, чтобы понять, какой бит надо поменять, чтобы уарт работал только на приём, например. В установке MPLAB C30 есть чудесная папочка с доками. У меня она лежит по адресу «Диск:\Папка...\Microchip\MPLAB C30\docs\». Там есть масса полезной информации. В частности, если меня интересует периферия, то я иду в подпапку periph_lib и читаю там нужную страничку.
Пример того, что там можно найти:
OpenUARTx [dsPIC30F]

Function Prototype
void OpenUART1(unsigned int config1,

unsigned int config2, unsigned int ubrg);

void OpenUART2(unsigned int config1,

unsigned int config2, unsigned int ubrg);

Include
uart.h

Description
This function configures the UART module.

Arguments
config1 — This contains the parameters to be configured in the UxMODE register as defined below.

UART Enable/Disable

UART_EN

UART_DIS

UART Idle mode operation

UART_IDLE_CON

UART_IDLE_STOP

UART communication with alternate TX/RX pins*

UART_ALTRX_ALTTX

UART_RX_TX

* UART communication with alternate pins is available only for certain devices and the suitable data sheet should be referred to.

UART Wake-up on Start

UART_EN_WAKE

UART_DIS_WAKE

UART Loopback mode enable/disable

UART_EN_LOOPBACK

UART_DIS_LOOPBACK

Input to Capture module

UART_EN_ABAUD

UART_DIS_ABAUD

Parity and data bits select

UART_NO_PAR_9BIT

UART_ODD_PAR_8BIT

UART_EVEN_PAR_8BIT

UART_NO_PAR_8BIT

Number of Stop bits

UART_2STOPBITS

UART_1STOPBIT

config2 — This contains the parameters to be configured in the

UxSTA register as defined below.

UART Transmission Interrupt Mode select

UART_INT_TX_BUF_EMPTY

UART_INT_TX

UART Transmit Break bit

UART_TX_PIN_NORMAL

UART_TX_PIN_LOW

UART Transmit Enable/Disable

UART_TX_ENABLE

UART_TX_DISABLE

UART Receive Interrupt Mode select

UART_INT_RX_BUF_FUL

UART_INT_RX_3_4_FUL

UART_INT_RX_CHAR

UART Address Detect Enable/Disable

UART_ADR_DETECT_EN

UART_ADR_DETECT_DIS

UART Overrun Bit Clear

UART_RX_OVERRUN_CLEAR

ubrg — This is the value to be written into UxBRG register to set the baud rate.

Return Value
None

Remarks:
This functions configures the UART transmit and receive sections and sets the communication baud rate.

Source File:
OpenUART1.c

OpenUART2.c

Code Example
baud = 5;

UMODEvalue = UART_EN & UART_IDLE_CON &

UART_DIS_WAKE & UART_EN_LOOPBACK &

UART_EN_ABAUD & UART_NO_PAR_8BIT &

UART_1STOPBIT;

U1STAvalue = UART_INT_TX_BUF_EMPTY &

UART_TX_PIN_NORMAL &

UART_TX_ENABLE &

UART_INT_RX_3_4_FUL &

UART_ADR_DETECT_DIS &

UART_RX_OVERRUN_CLEAR;

OpenUART1 (U1MODEvalue, U1STAvalue, baud);
Как видите, всё достаточно прозрачно. Желающие убедиться, что функция записывает что нужно куда нужно могут пройти в папку \Microchip\MPLAB C30\src\peripheral_30F_24H_33F\ и там в архивированном файле посмотреть на реализацию библиотечных функций.
Естественно, если Вы пользуетесь библиотечной функцией, библиотеку надо подключить к проекту.

Неужели вот такой код:
/*Подключаем библиотеки*/
#include <p30fxxxx.h>
#include <p30f3011.h>
#include <uart.h>
#include <string.h>

/*---------------------------------*/

/*Настраиваем фьюзы процессора*/
_FOSC(CSW_FSCM_OFF & XT_PLL8); //Настройка тактирования 
_FWDT(WDT_ON & WDTPSA_512 & WDTPSB_16); //Включаем вотчдог
_FBORPOR(PBOR_ON & BORV_20 & PWRT_64 & MCLR_EN);
/*---------------------------------*/

/*Объявляем глобальные переменные*/
#define FCY 14745600ULL //unsigned long long
#include <libpic30.h>

#define BAUD_RATE 57600

void Init_UART_TX_EN();
void Init_UART_TX_DIS();

/*Настройка UART*/
void Init_UART_TX_EN() {
	unsigned int baudvalue;
	unsigned int U1MODEvalue;
	unsigned int U1STAvalue;

	CloseUART1();

	ConfigIntUART1(UART_RX_INT_DIS & UART_RX_INT_PR7 & UART_TX_INT_DIS
			& UART_TX_INT_PR2);

	baudvalue = (FCY / (BAUD_RATE * 16)) - 1;

	U1MODEvalue = UART_EN & /*UART_ALTRX_ALTTX &*/UART_IDLE_CON & UART_DIS_WAKE
			& UART_DIS_LOOPBACK & UART_EN_ABAUD & UART_NO_PAR_8BIT
			& UART_1STOPBIT;

	U1STAvalue = UART_INT_TX_BUF_EMPTY & UART_TX_PIN_NORMAL & UART_TX_ENABLE
			& UART_INT_RX_CHAR & UART_ADR_DETECT_DIS & UART_RX_OVERRUN_CLEAR;

	OpenUART1(U1MODEvalue, U1STAvalue, baudvalue);
}

void Init_UART_TX_DIS() {
	unsigned int baudvalue;
	unsigned int U1MODEvalue;
	unsigned int U1STAvalue;

	CloseUART1();

	ConfigIntUART1(UART_RX_INT_DIS & UART_RX_INT_PR7 & UART_TX_INT_DIS
			& UART_TX_INT_PR2);

	baudvalue = (FCY / (BAUD_RATE * 16)) - 1;

	U1MODEvalue = UART_EN & /*UART_ALTRX_ALTTX &*/UART_IDLE_CON & UART_DIS_WAKE
			& UART_DIS_LOOPBACK & UART_EN_ABAUD & UART_NO_PAR_8BIT
			& UART_1STOPBIT;

	U1STAvalue = UART_INT_TX_BUF_EMPTY & UART_TX_PIN_NORMAL & UART_TX_DISABLE
			& UART_INT_RX_CHAR & UART_ADR_DETECT_DIS & UART_RX_OVERRUN_CLEAR;

	OpenUART1(U1MODEvalue, U1STAvalue, baudvalue);
}
/*---------------------------------*/

/*Главная функция*/
int main() {
	Init_UART_TX_EN();


	while (1) {
            	putsUART1((unsigned int*) "Hello, world!");
		while (BusyUART1())
			;
	}
	return 0;
}
/*---------------------------------*/

не красив?
Да, есть немного не понятные сначала места. Но почитав один раз документацию, можно не задумываться в дальнейшем, какие именно биты куда записываются. Надо всего лишь понять какой режим работы нам необходим.
  • +2
  • 19 марта 2012, 01:45
  • Karlson

Комментарии (20)

RSS свернуть / развернуть
Выдержку из доки ИМХО лучше не в код завернуть, а в блокквот.
Да, этот код намного лучше и вполне понятен даже без комментариев.
0
  • avatar
  • Vga
  • 19 марта 2012, 03:30
Приехали… ))))))))))))
О том, что данные конкретные макросы значат можно почитать в документации на процессор (правда сейчас с ходу не нашел, если кто подскажет где это лежит — буду признателен).
Какие нах макросы??? Это биты конфигурации… )))))))))))))
И их написание частенько отличается от написания в даташите… Искать их нужно в папке компилятора ...\Microchip\MPLAB C30\support\PIC24F\h в h-файле к МК… ))))))))))))

Ужоснах… Один не знает где, что и как, но «что-то» пишет… Другой тупо поддакивает «всё пучком», «правильной дорогой идёте, товарищи»… ))))))))))

Два клоуна!!! Песшите ысчо!!! ))))))))))))
-2
Если ты такой умный, сядь и напиши как надо.
+1
Ну нихренасебе сколько конфигов. И это только для UART!
В армках и то попроще было.
0
  • avatar
  • a9d
  • 19 марта 2012, 06:12
тоже с dsPIC33 работаю. По поводу длинных инициализаций — да, Микрочип даёт очень широкие возможности для периферии и в них иногда можно заблудиться. Но с УАРТ трудностей не вижу. И мне показалось, что легче разобраться с datasheet'ом, чем с той библиотекой =)

#define FCY 40000000
#define BAUDRATE 38400
#define BRGVAL (((FCY/BAUDRATE)/16)-1)

void initUART()
{
U1MODEbits.STSEL = 0;			//1 Stop bit
U1MODEbits.PDSEL = 0;			//No parity, 8 data
U1MODEbits.ABAUD = 0;			//Auto-Baud Disabled
U1MODEbits.BRGH = 0;			//Low speed mode
U1BRG = BRGVAL;				//Baud 

U1STAbits.URXISEL = 0;			//Interrupt after one Rx char is received
IEC0bits.U1RXIE = 1;			//Enable UART RX interrupt
IPC2bits.U1RXIP=4;			//Interrupt priority =4 (7-highest)
U1MODEbits.UARTEN = 1;			//Enable UART
U1STAbits.UTXEN = 1;			//Enable UART TX
}

Из библиотеки использую только BusyUART1()
ps Продолжайте писать в том же духе. Если время появится, к вам присоединюсь
0
Спасибо за статью! Вы шьете их Пиккитом 3?
0
  • avatar
  • Dmi
  • 19 марта 2012, 17:23
Да. Раньше у меня был ICD2, но я его неудачно спалил и пришлось на пиккит перейти.
0
А почему именно DS пики… разве обычные общего назначения МК типа 18F не подходят для Ваших задач?
0
Потому что когда выбирали камень для задачи то решили, что проще взять что-то по мощнее, чтобы наверняка хватило с учетом любых последующих модификаций. Хотели делать токовый контур управления, но пока что нигде его не реализовали.
А сейчас уже привык их ставить для двигателей — софт то весь написанный и оттестированный есть.
0
что верно, то верно. а цена какова по сравнению с 18f. они стоят в пределак 100-150р. недавно нашел контору
www.trt.ru/Stock.php?Part=460. Цены на Пики вполне себе!
0
18f с dsPIC даже и сравнивать нече, это как мопед с байком… 18f вообще дорогие, дешевле и выше по параметрам PIC24.
Я понимаю что там товарищь Карабейников или кто там щас, жует 18f до посинения… только смысл?
0
Кстати да, регулярно удивляюсь — даже в новые личные самоделки народ упорно тащит дорогущие (в сравнении с аналогичными PIC24) контроллеры 18F семейства. А у 24-х один PPS чего стоит, удивительно удобная штука, жаль что у STM32 подобного не нашел.
0
А разок… не удивиться, а в прайс посмотреть не пробовал??? ))))))))))))))
А заоодно и в даташиты!!! ))))))))))))))
Это новые PIC18 серии J или серии K дорогущие??? )))))))))))))
И PPS в новых PIC18 есть… и XLP… )))))))
А народ… а что народ??? Он и старые Меги юзает… и ничего… все живые… ))))))))))
0
для разных задач берем соответствующий контроллер
у серии 18F есть достойные чипы
pic18F14K50 — пока самый дешевый USB контроллер
pic18F45J50 — ну тут наварочено USB,PPS,CTMU… (100руб)

и новые чипы pic16F1XXX по соотношению цена/возможности
очень даже!!!

и вот будут pic16F1455 c USB по ~50р soic14
а pic16F1454 c USB по ~40р soic14
(хотелось бы такие цены)
0
Вотблин :) Для дотошных уточняю — под 18F в посте выше подразумевались некогда отличные, а сейчас крайне дорогие 18F252, 18F2520, 18F2550 — которые почему-то массово еще используются в новых поделках, судя по форумам и т.п.
В прайс пробовал смотреть, и про 18FK, 18FJ в курсе и такие контроллеры в баночках тоже дома лежат.
Только вот заглянул в очередной раз в Microchip Product Selector, вбил свою хотелку (ничего особенного, 2UART, 2SPI, RTC, 8KB RAM, корпус от 44ног) — упс, в списке только PIC24 и выше…
И заглянул в прайс космодрома — мой любимый и старый PIC24FJ64GA004 (33грн), единственный 18-й на эти же деньги PIC18F46K20: ОЗУ в два раза меньше, 1 SPI, 1USART, RTC нет. Как-то вот так :)

А про старые меги/пики — есть разве что подозрение, что многим не нравится 3,3в питания и ниже у поновее контроллеров. Сам бы предпочел пятивольтовые, часто удобнее.
Ну и про живые — пользовать надо что есть и что подходит. У меня вон и 16F84 трудится, и как-то зачем переделывать.А на него цена вообще фантастиш, раритет! :)
0
Космодром???!!! )))))))))))))))
Для непонятливых тыкаю пальцем… ))))))
За эти деньги… PIC18F46J50… в днепровской Гамме… «2UART, 2SPI, RTC»… RAM, правда, в ней поскромнее…
Дык… 4К RAM у младших STM32… аднака… ))))
Никто не говорит, что PIC24 плохие… они очень даже хороши… самому очень нравятся… но… Микрочип опоздал с ними… лет на десять… жаль…
А старые чипы Микрочип не бросает из-за поддержки старых проектов в крупносерийном производстве… Любители же их юзают из-за наличия поделок в инете…
Много поделок в инете на PIC24??? То-то…
0
Да, и про гамму в курсе. Но меня бесит, что для выяснения ассортимента и цены им нужно только звонить и терроризировать менеджеров по телефону. Я не так много контроллеров беру, чтобы пару грн разницы туда сюда перевесили удобство выбора.
PIC18F46J50 — уговорили. но — памяти таки меньше :) Зато USB. Неплохая железяка. Но… с ними тоже микрочип опоздал. Там уже кортексы есть. с PDP и прочей лабудой…
В общем, всему свое место и цена. Так пойдет? :)
0
В общем, всему свое место и цена.
Адназначна!!! )))))
0
в гамме, возят в харьков через ХАГ, 002 23 грн а 004 25грн
0
У меня еще старые запасы 004/002 не закончились (с перепугу накупил, когда одно время у гаммы они дефицит были)… А потом будут уже STM32, для почти всего что делаю хватит и мелочи типа STM32100C4 по десятке, да и отладка мне больше на стм-ка нравится.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.