Уроки программирования.

Применяемое оборудование:

  1. программатор-отладчик PICKIT2
  2. бесплатная среда разработки MPLAB IDE
  3. бесплатная версия Си компилятора HI-TECH PICC. Можно использовать бесплатную версию PICC-Lite™ или HI-TECH C PRO for the PIC10/12/16 MCU Family (Lite mode). см.http://www.htsoft.com

Данные уроки – переработка ассемблерных уроков, предоставляемых компанией Microchip вместе с комплектом pickit2.

Уроки адаптированы под 3 типа демо-плат из разных комплектов поставки pickit2 для контроллеров PIC16F690, PIC16F876, PIC16F887.

Создание проекта практически ничем не отличается от создания проекта на ассемблере (см. п.4.5.3 - Создание нового проекта в MPLAB IDE), единственное, что в качестве инструмента нужно выбрать не Microchip MPASM Toolsuite, а HI TECH Toolsuite.

Урок 1. "Hello World". Зажигаем светодиод!

// *******************************************************************
// PICkit 2 Lesson 1 - "Hello World"
//
// This turns on LED 0 on the Demo Board.
//
// *******************************************************************
// *    See Demo Board User's Guide for Lesson Information    *
// *******************************************************************

#include <htc.h> // включаем заголовочный файл описания

//*******************************************************************
// в зависимости от применяемой демо-платы комплекта PICkit2
// конфигурируем контроллер, определяем периферию
//*******************************************************************
#if     defined(_16F887) 
    __CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & LVPDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS & DEBUGDIS);
	#define TRIS_LED0 	TRISD0
	#define LED0 		RD0

#elif   (_16F886)
    __CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & LVPDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS & DEBUGDIS);
	#define TRIS_LED0 	TRISB0
	#define LED0 		RB0

#elif   defined(_16F690)
    __CONFIG (INTIO & WDTDIS & PWRTEN & MCLRDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS);
	#define TRIS_LED0 	TRISC0
	#define LED0 		RC0

#endif
//*******************************************************************


void main(void) {

   TRIS_LED0 = 0;	//     ; настраиваем вывод порта как выход
   LED0 = 1;		//     ; зажигаем светодиод LED0
   while(1);  	//     ; бесконечный цикл
}

Для того чтобы выбрать для работы ту или иную демо-плату, нужно лишь выбрать в MPLAB IDE применяемый микроконтроллер PIC16F690, PIC16F876 или PIC16F887.

Урок 2. Мигаем светодиодом

// *******************************************************************
// PICkit 2 Lesson 2 - "Blink"
//
// Первый урок показывал как зажечь светодиод LED,
// Сейчас мы посмотрим как заставить его мигать.  Для этого необходимы циклы задержки
// для включения и выключения светодиода с частотой, заметной глазу.
//
// *******************************************************************
// *    See Demo Board User's Guide for Lesson Information    *
// *******************************************************************

#include <htc.h> // включаем заголовочный файл описания

//*******************************************************************
// в зависимости от применяемой демо-платы комплекта PICkit2
// конфигурируем контроллер, определяем периферию
//*******************************************************************
#if     defined(_16F887) 
    __CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & LVPDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS & DEBUGDIS);
	#define TRIS_LED0 	TRISD0
	#define LED0 		RD0

#elif   (_16F886)
    __CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & LVPDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS & DEBUGDIS);
	#define TRIS_LED0 	TRISB0
	#define LED0 		RB0

#elif   defined(_16F690)
    __CONFIG (INTIO & WDTDIS & PWRTEN & MCLRDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS);
	#define TRIS_LED0 	TRISC0
	#define LED0 		RC0

#endif
//*******************************************************************


unsigned char Delay1,  Delay2              ; //Определение переменных для циклов задержки

void main(void) {
TRIS_LED0 = 0;

while(1) {
	LED0=1; // Зажигаем светодиод
	for(Delay2=0xFF; Delay2 != 0; Delay2--) {
		for(Delay1=0xFF; Delay1 != 0; Delay1--);
	}
	LED0=0; // Гасим светодиод
	for(Delay2=0xFF; Delay2 != 0; Delay2--) {
		for(Delay1=0xFF; Delay1 != 0; Delay1--);
	}
}
}

Урок 3. Бегущий огонь

// *******************************************************************
// PICkit 2 Lesson 3 - "Rotate"
//
// Расширение урока 2 - последовательное зажигание светодиодов.
//
//
// *******************************************************************
// *    See Demo Board User's Guide for Lesson Information    *
// *******************************************************************

#include <htc.h> // включаем заголовочный файл описания
  
//*******************************************************************
// в зависимости от применяемой демо-платы комплекта PICkit2
// конфигурируем контроллер, определяем периферию
//*******************************************************************
#if     defined(_16F887) 
    __CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & LVPDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS & DEBUGDIS);
	#define TRIS_LED 	TRISD
	#define LED 		PORTD
	#define DISPLAY 	0x80

#elif   (_16F886)
    __CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & LVPDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS & DEBUGDIS);
	#define TRIS_LED 	TRISB
	#define LED 		PORTB
	#define DISPLAY 	0x08

#elif   defined(_16F690)
    __CONFIG (INTIO & WDTDIS & PWRTEN & MCLRDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS);
	#define TRIS_LED 	TRISC
	#define LED 		PORTC
	#define DISPLAY 	0x08

#endif
//*******************************************************************


unsigned char Delay1, Delay2, Display; //Определение переменных для циклов задержки и индикации

void main(void) {
 TRIS_LED = 0;
 Display = DISPLAY;

 while(1) {
	LED = Display; // Зажигаем светодиод
	for(Delay2=0xFF; Delay2 != 0; Delay2--) { // Вложенный цикл задержки
		for(Delay1=0xFF; Delay1 != 0; Delay1--);
	}
	Display = Display >> 1; // Сдвигаем светодиод
	if (Display == 0) // Если досдвигались что Display = 0
		 Display = DISPLAY; // инициализируем в начальное состояние
 }
}   

Урок 4. АЦП (Аналого-Цифровой Преобразователь)

// *******************************************************************
// PICkit 2 Lesson 4 - "АЦП"
//
// Этот урок показывает как считать значение с АЦП и показать 
// значения старших разрядов на светодиодах.
// АЦП измеряет напряжение на потенциометре, подключенному к 
// выводу A0.
//
// *******************************************************************
// *    See Demo Board User's Guide for Lesson Information    *
// *******************************************************************

#include <htc.h> // включаем заголовочный файл описания

//*******************************************************************
// в зависимости от применяемой демо-платы комплекта PICkit2
// конфигурируем контроллер, определяем периферию
//*******************************************************************
#if     defined(_16F887) 
    __CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & LVPDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS & DEBUGDIS);
	#define TRIS_LED 	TRISD
	#define LED 		PORTD

#elif   (_16F886)
    __CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & LVPDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS & DEBUGDIS);
	#define TRIS_LED 	TRISB
	#define LED 		PORTB

#elif   defined(_16F690)
    __CONFIG (INTIO & WDTDIS & PWRTEN & MCLRDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS);
	#define TRIS_LED 	TRISC
	#define LED 		PORTC

#endif
//*******************************************************************

void main(void) {
 TRISA = 0xFF;  // Делаем у PortA все входы
 TRIS_LED = 0;

 #if defined(_16F690)
    ADCON0 = 0x01;
    ADCON1 = 0x30; // Левое выравнивание, опорное напряжение для АЦП Vdd-Vss
 #else
    ADCON0 = 0x41; // configure A2D for Fosc/8, Channel 0 (RA0), and turn on the A2D module
    ADCON1 = 0;   // Левое выравнивание, опорное напряжение для АЦП Vdd-Vss
 #endif

 while(1) {
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();
	GODONE = 1;
	while(GODONE);
	LED = ADRESH; // Зажигаем светодиоды в соответствии с положением потенциометра
 }
}     

Дискуссия

Дмитри, 05/01/2010.21:38

Здравствуйте. Я в этом деле ещё чайник, объясните,пожалуйста, как отследить нажатие кнопки?

Stepan, 30/01/2011.11:34

Дмитрий, очень просто. Вешаем кнопку на цифровой порт, который назначен на вход, второй конец на VDD. И смотрим, что у нас на цифровом порту 1 или 0.

lessons.txt · Последние изменения: 14/01/2010.11:34 — илья
CC Attribution-Noncommercial-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0