˜o1 dondo {ch; *ptr; ptr=0x0000; ch=*(ptr+adreess); return(ch);} 27...): //----- -----"rm". //-----...

35
PROGRAMACI ´ ON DE PICs CON LENGUAJE C/C++ M. Pe˜ na Guerrero 1 J. J. Negrete Redondo Academia de ac´ ustica, Escuela Superior de Ingenier´ ıa Mec´ anica y El´ ectrica del Instituto Polit´ ecnico Nacional, Unidad Profesional Adolfo L´opez Mat´ eos, Zacatenco, M´ exico Distrito Federal. 1 [lamina1.tex][110111] 1

Transcript of ˜o1 dondo {ch; *ptr; ptr=0x0000; ch=*(ptr+adreess); return(ch);} 27...): //----- -----"rm". //-----...

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

FUNCIONES DE PROGRAMA: dumpmem.c (cont ...):

mputc(’ ’);for(j=0;j<16;j++){

data=peek(dir+j);if (isprint(data))mputc(data);else mputc(’.’);

}crlf();

dir++;}}

35