Seriell programmering av PIC 16F628.
Seriell programmering mot en PC er i utgangspunktet en enkel affære. LItt avhengig av hva du vil skal skje. Det følgende programmet viser en enkel meny på PC'n, og du skrur noen LED av og på. Ikke noe superhightech, men det er en liten indikasjon på hvordan PIC <> PC kommunikasjon kan skje.
Utviklingsmiljøet er MPLAB 8.63, og kompilatoren er Hi-Tech C 9.80. I programlistingen skal stdio.h, htc.h og conio.h stå i hakeparenteser. Filen usart.h må ligge i prosjektkatalogen. Den er det mulig du må redigere litt. Dette er avhengig av hvilken PIC du bruker.
Hovedprogrammet:
/*
Program: main.c
Description: Demonstrate interface between PIC and computer
PIC: PIC 16F628
IDE: MPLAB 8.63
Compiler: Hi - Tech C
Date: Okt 2011
Author: Jens Christoffersen
WEB: www.nerdegutta.org
*/
// inlude and definitions
#include "< stio.h >"
#include "< htc.h >"
#include "< conio.h >"
#include "usart.h"
#define _XTAL_FREQ 4000000
/* Configuration */ __CONFIG (WDTDIS & PWRTEN & MCLREN & BOREN & LVPDIS & UNPROTECT & INTIO);
// Prototyping the functions
void menu();
void RED_LED_on();
void RED_LED_off();
void Green_LED_on();
void Green_LED_off();
void Yellow_LED_on();
void Yellow_LED_off();
// Global variables
// Functions
void menu()
{
// Shows a menu to the user
printf("\r**************************************************\n\r");
printf("\r* *\n\r");
printf("\r* Program to test and learn PIC <> PC interface *\n\r");
printf("\r* *\n\r");
printf("\r* A - Red LED on *\n\r");
printf("\r* B - Red LED off *\n\r");
printf("\r* C - Green LED on *\n\r");
printf("\r* D - Green LED off *\n\r");
printf("\r* E - Yellow LED on *\n\r");
printf("\r* F - Yellow LED off *\n\r");
printf("\r* *\n\r");
printf("\r**************************************************\n\r");
printf("\rYour choice: ");
}
void RED_LED_on()
{
PORTB = 0b00001001; // sets RB0 and RB3 HIGH
menu();
}
void RED_LED_off()
{
PORTB = 0b00000001; // sets RB7-RB1 LOW,and RB0 high
menu();
}
void Green_LED_on()
{
PORTB = 0b00010001; // sets RB4, RB0 HIGH, rest LOW
menu();
}
void Green_LED_off()
{
PORTB = 0b00000001; // set RB0 HIGH, rest LOW
menu();
}
void Yellow_LED_on()
{
PORTB = 0b00100001; // sets RB4, RB0 HIGH, rest LOW
menu();
}
void Yellow_LED_off()
{
PORTB = 0b00000001; // set RB0 HIGH, rest LOW
menu();
}
// Main program
void main(void)
{
TRISA = 0b11111111; // All set to input
TRISB = 0b00000110; // RB7-RB3 is output,RB2 & 1is input, RB0 is output
PORTA = 0b00000000; // All set to LOW
PORTB = 0b00000001; // RB7-RB1 set LOW, RB0 set HIGH
INTCON= 0; // purpose of disabling the interrupts.
CMCON = 0x07; // Turn coparators off
init_comms(); // set up the USART - settings defined in usart.h
menu();
while(1)
{
input = getchar(); // read a response from the user
if (input == 'a'){
RED_LED_on();
}
if (input == 'b') {
RED_LED_off();
}
if (input == 'c') {
Green_LED_on();
}
if (input == 'd') {
Green_LED_off();
}
if (input == 'e') {
Yellow_LED_on();
}
if (input == 'f') {
Yellow_LED_off();
}
} // end while
} // end main
"Min" usart-h fil, som ligger i prosjektkatalogen ser slik ut:
USART.H
#ifndef _SERIAL_H_
#define _SERIAL_H_
#define BAUD 9600
#define FOSC 4000000L
#define NINE 0 /* Use 9bit communication? FALSE=8bit */
#define DIVIDER ((int)(FOSC/(16UL * BAUD) -1))
#define HIGH_SPEED 1
#if NINE == 1
#define NINE_BITS 0x40
#else
#define NINE_BITS 0
#endif
#if HIGH_SPEED == 1
#define SPEED 0x4
#else
#define SPEED 0
#endif
#if defined(_16F628) || defined(_16F88)
#define RX_PIN TRISB1 // TRISB2
#define TX_PIN TRISB2 // TRISB5
#else
#define RX_PIN TRISC7
#define TX_PIN TRISC6
#endif
/* Serial initialization */
#define init_comms()\
RX_PIN = 1; \
TX_PIN = 1; \
SPBRG = DIVIDER; \
RCSTA = (NINE_BITS|0x90); \
TXSTA = (SPEED|NINE_BITS|0x20)
void putch(unsigned char);
unsigned char getch(void);
unsigned char getche(void);
#endif
Her har jeg redigert linje 23, 24 og 25, til å passe min PIC, som er 16F628.
For at programmet skal kompileres, må du legget til en source-file. Det er usart.c-filen. Den finner du i sample katalogen i Hi Tech C installasjonkatalogen. Denne filen trenger ingen redigering, men den ser slik ut:
USART.C
#include ""
#include ""
#include "usart.h"
void
putch(unsigned char byte)
{
/* output one byte */
while(!TXIF) /* set when register is empty */
continue;
TXREG = byte;
}
unsigned char
getch() {
/* retrieve one byte */
while(!RCIF) /* set when register is not empty */
continue;
return RCREG;
}
unsigned char
getche(void)
{
unsigned char c;
putch(c = getch());
return c;
}
Datasheets er et must når du sitter og programmerer PIC, and andre componenter for den saks skyld. Viktige datasheets her er PIC16F628 og MAX232. (Link åpner i nytt vindu)
Dette er "a work in progress", og det vil komme et printkort som viser hva som skjer.
|