˜o1 dondo {ch; *ptr; ptr=0x0000; ch=*(ptr+adreess); return(ch);} 27...): //-----...
Post on 14-May-2018
214 Views
Preview:
TRANSCRIPT
PROGRAMACION DE PICs CON LENGUAJE C/C++
M. Pena Guerrero1
J. J. Negrete Redondo
Academia de acustica, Escuela Superior de Ingenierıa Mecanicay Electrica del Instituto Politecnico Nacional, Unidad ProfesionalAdolfo Lopez Mateos, Zacatenco, Mexico Distrito Federal.
1[lamina1.tex][110111]
1
ENCABEZADO:
//--------------------------------------// NAME// main4.c -monitor para PIC18F452// DATE// MPG040511// REM// Uso de PICDEM 2 PLUS y de// MPLAB ICD2, MCC18, MPLAB//--------------------------------------//#include<p18cxxx.h>#include<usart.h>#include<string.h>#include<stdlib.h>#include <ctype.h>
#define PCHAR const far rom char *2
TABLA DE MENSAJES:
#pragma idata bigdatachar pres1[]= " KLM: Acoustic Laboratory Monitor\n\r\0";char pres2[]= " For PIC18F452\n\r\0";char pres3[]= " main4.c\n\r\0";char pres4[]= " ESIME-IPN\n\r\0";char pres5[]= " 01-05-011\n\r\0";char pres6[]= " Dr. Maximino Pena Guerrero\n\r\0";char man0[]="\n\r help -this help\n\r\0";char man1[]=" wm <hexdir> <hexdata> --write memory\n\r\0";char man2[]=" rm <hexdir> --read memory\n\r\0";char man3[]=" wp <hexdir> <hexdata> --write port\n\r\0";char man4[]=" rp <hexdir> --read port\n\r\0";char man5[]=" dm <hexdir> <ndata> --dump memory\n\r\0";
#pragma idata
3
DEFINICION DE PROTOTIPOS:
#pragma code
void crlf(void);void prompt(void);void openRS232(void);void closeRS232(void);void welcome(void);void chkin(void);void chkout(void);char mputc(char);char mgetc(void);void mputstr(char *);int mgetstr(char *);int comand(char *);
4
DEFINICION DE PROTOTIPOS (cont ...):
void poke(int,char);unsigned char peek(int);void itonha(int, int, char*);void itonbit(int, int, char *);void readmem(int);void mihelp(void);void dumpmem(int,int);unsigned int htoi (char *);
5
DEFINICION DE VARIABLES GLOBALES:
char *pstr1;char *plims;char *tok;char *tok2;char *tok3;char *ptok;char string[80];
6
FUNCION PRINCIPAL:
void main (void){
char c;int index;plims=del;ptoken=token;TRISB = 0;openRS232();welcome();
7
FUNCION PRINCIPAL (cont...):
for(;;){
prompt();mgetstr(string);token=strtok(string,plims);if(token){
crlf();comand(token);crlf();token=NULL;
}else crlf();}closeRS232();
}
8
SELECTOR DE COMANDOS:
//--------------------------------// command() -seleccionar comando.//--------------------------------int comand(char *str){
unsigned int direc;
if(strcmp(help,str)==0){
mihelp();return(0);
}
9
SELECTOR DE COMANDOS (cont ...):
if(strcmp(dm,str)==0){
token2=strtok(’\0’,del);token3=strtok(’\0’,del);dumpmem(htoi(token2),atoi(token3));return(0);
}
if(strcmp(wm,str)==0){
token2=strtok(’\0’,del);token3=strtok(’\0’,del);poke(htoi(token2),htoi(token3));return(0);
}
10
SELECTOR DE COMANDOS (cont ...):
if(strcmp(rm,str)==0){
token2=strtok(’\0’,del);direc=htoi(token2);readmem(direc);return(0);
}
if(strcmp(wp,str)==0){
token2=strtok(’\0’,del);token3=strtok(’\0’,del);poke(htoi(token2),htoi(token3));return(0);
}
11
SELECTOR DE COMANDOS (cont ...):
if(strcmp(rp,str)==0){
token2=strtok(’\0’,del);direc=htoi(token2);readport(direc);return(0);
}
mputstr(badcomand);return(1);
}
12
FUNCIONES DE PROGRAMA:
//---------------------------// crlf() -escribir return.//---------------------------void crlf(void){
mputc(0x0A);mputc(0x0D);
}
13
FUNCIONES DE PROGRAMA (Cont ...):
//---------------------------// prompt() -escribir prompt.//---------------------------void prompt(void){
mputc(’>’);mputc(’>’);
}
14
FUNCIONES DE PROGRAMA (cont ...):
//----------------------------// mputstr() -escribir cadena.//----------------------------void mputstr(char *pstr){
while(*pstr){
mputc(*pstr);pstr++;
}}
15
FUNCIONES DE PROGRAMA (cont ...):
//----------------------------// mputc() -escribir caracter.//----------------------------char mputc(char ch){
chkout();WriteUSART(ch);return(ch);
}
16
FUNCIONES DE PROGRAMA (cont ...):
//------------------------// mgetc() -leer caracter.//------------------------char mgetc(void){
char ch;
chkin();ch=ReadUSART();return(ch);
}
17
FUNCIONES DE PROGRAMA (cont ...):
//------------------------------------// chkin() -¿puedo recibir?.//------------------------------------void chkin(void){
for(;;)if (DataRdyUSART()==1) break;}
18
FUNCIONES DE PROGRAMA (cont ...):
//-----------------------------------// chkout() -¿puedo transmitir?.//-----------------------------------void chkout(void){
for(;;)if (BusyUSART()==0) break;}
19
FUNCIONES DE PROGRAMA (cont ...):
//-------------------------------// openRS23() -inicializar USART.//-------------------------------void openRS232(void){
OpenUSART (USART_TX_INT_OFF &USART_RX_INT_ON &
USART_ASYNCH_MODE &USART_EIGHT_BIT &
USART_CONT_RX &USART_BRGH_HIGH, 103);
}
20
FUNCIONES DE PROGRAMA (cont ...):
//---------------------------// closeRS23() -cierra USART.//---------------------------void closeRS232(void){
CloseUSART();}
21
FUNCIONES DE PROGRAMA (cont ...)://--------------------------------------
// welcome() -mensaje de bienvenida.
//--------------------------------------
void welcome(void)
{
crlf();
mputstr(pres1);
mputstr(pres2);
mputstr(pres3);
mputstr(pres4);
mputstr(pres5);
mputstr(pres6);
crlf();
mputstr(man0);
mputstr(man1);
mputstr(man2);
mputstr(man3);
mputstr(man4);
mputstr(man5);
crlf();
}
22
FUNCIONES DE PROGRAMA (cont ...):
//------------------------------------------------// itonbit() -convertir entero a n caracteres bit.//------------------------------------------------void itonbit(int x, int n, char *s){
int i;for(i=0;i<n;i++){
if (x&1) s[n-1-i]=’1’;elses[n-1-i]=’0’;x=x>>1;s[n]=’\0’;
}}
23
FUNCIONES DE PROGRAMA (cont ...):
//------------------------------------------------// htoi() -convertir caracteres hexa a int.//------------------------------------------------unsigned int htoi(char *s){
unsigned int x=0;char ch =*s;
for (;;){
if (ch >= ’0’ && ch <= ’9’) x=(x*16)+(ch-’0’);else if (ch >= ’A’ && ch <= ’F’) x=(x*16)+(ch-’A’+10);else if (ch >= ’a’ && ch <= ’f’) x=(x*16)+(ch-’a’+10);else return x;ch = *(++s);
}}
24
FUNCIONES DE PROGRAMA (cont ...):
//-----------------------------------------------// itonha() -convertir entero a n caracteres hex.//------------------------------------------------void itonha(unsigned int x, int n, char *s){
int i;unsigned int resto;for (i=0; i<n;i++){
resto=x%16;x=x/16;if (resto<10) s[n-1-i]=resto+0x30;else s[n-1-i]=resto+(0x41-10);s[n]=’\0’;
}}
25
FUNCIONES DE PROGRAMA (cont ...):
//------------------------------------------------// poke(adreess,byte) -escribir un byte en memoria.//-------------------------------------------------void poke(unsigned int adreess, char dat){
far char *ptr;ptr=0x0000;*(ptr+adreess)=dat;
}
26
FUNCIONES DE PROGRAMA (cont ...):
//-------------------------------------------// peek(adreess) -leer un byte de memoria.//-------------------------------------------unsigned char peek(unsigned int adreess){
unsigned char ch;far char *ptr;ptr=0x0000;ch=*(ptr+adreess);return(ch);
}
27
FUNCIONES DE PROGRAMA (cont ...):
//-------------------------------------// readmem() -semantica del comando "rm".//-------------------------------------void readmem(unsigned int dir){
unsigned char data;char str[40];itoa(dir,str);data=peek(dir);// leer memoriaitonha(data,2,str);mputstr(str);dir=0;data=0;
}
28
FUNCIONES DE PROGRAMA (cont ...):
//-----------------------------------------------// mihelp(adreess) -semantica del comando "help".//------------------------------------------------void mihelp(void)
{mputstr(man0);mputstr(man1);mputstr(man2);mputstr(man3);mputstr(man4);mputstr(man5);
}
29
FUNCIONES DE PROGRAMA (cont ...)://----------------------------------------------------------
// mgetstr(s) -leer una cadena de caracteres desde afuera.
// Salida: cadena de caracteres en s.
// Regresa: 0 si fin de linea.
// char s[80];
// mgetstr(s); ver readline(s) en Leo
// printf("%s",s); autobib.c
//----------------------------------------------------------
int mgetstr(char *s)
{
char c;
for(; ;)
{
c=mgetc();
mputc(c);
PORTB=c;
*s++=c; *s=0;
if (c==0x0D) return(*--s=0);
}
return(0);
}
30
FUNCIONES DE PROGRAMA: readport.c:
//----------------------------------------// readport() -semantica del comando "rp".//----------------------------------------void readport(unsigned int dir){
unsigned char data;char str[40];itoa(dir,str);
mputstr(sdir);mputstr(str);data=peek(dir); // leer datomputstr(sdat);itonbit(data,8,str);mputstr(sbin);mputstr(str);crlf();
31
FUNCIONES DE PROGRAMA: readport.c (cont ...):
itonha(data,2,str);mputstr(shex);mputstr(str);
crlf();itoa(data,str);mputstr(sint);mputstr(str);dir=0;data=0;
}
32
FUNCIONES DE PROGRAMA: dumpmem.c:
//---------------------------------------// dumpmem() -semantica del cpmando "dm".//---------------------------------------void dumpmem(unsigned int adreess,unsigned int nbytes){
int i,j,n;int data;unsigned int dir;char str[40];
n=nbytes;
33
FUNCIONES DE PROGRAMA: dumpmem.c (cont ...):
for(i=0; i<n/16;i++){
dir=(i*16)+adreess;itonha(dir,4,str),mputstr(str);mputc(’:’);
for(j=0;j<16;j++){
data=peek(dir+j);itonha(data,2,str);if ((j+1)%2) mputc(’ ’);if (j==8) {mputc(’-’);mputc(’ ’);}mputstr(str);
}
34
top related