Autor Tema: Tutorial C18  (Leído 57494 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tutorial C18
« Respuesta #45 en: 06 de Septiembre de 2010, 20:41:53 »
Hola a todos;

Tengo una duda con respecto a la comunicación serial..... Es posible enviar y recibir datos por medio de otros pines que no sean RC6 y RC7 del PIC18f4610?

Y si es posible como se hace?

Saludos

Tienes la librería sw_uart. Para seleccionar que pines utilizar en la comunicación debes agregar a tu proyecto todos los archivos fuentes y modificarlos, en el inicio está la definición de cada pin.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Tutorial C18
« Respuesta #46 en: 06 de Septiembre de 2010, 21:46:01 »
Me van a decir que que pregunton soy jejeje pero mas vale preguntar que quedarse con la duda....

Agrege los archivos como me dijiste Suky; pero me marca el siguiente error.....

Make: The target "C:\Micro_c\Objects\Minsa.o" is out of date.
Executing: "C:\MCC18\bin\mcc18.exe" -p=18F4610  /i"C:\MCC18\h" "Minsa.c" -fo="C:\Micro_c\Objects\Minsa.o" -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
C:\Micro_c\MINSA\Minsa.c:23:Warning [2066] type qualifier mismatch in assignment
Make: The target "C:\Micro_c\Objects\getsuart.o" is out of date.
Executing: "C:\MCC18\bin\mcc18.exe" -p=18F4610  /i"C:\MCC18\h" "C:\MCC18\src\pmc_common\SW_UART\getsuart.c" -fo="C:\Micro_c\Objects\getsuart.o" -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
Make: The target "C:\Micro_c\Objects\putsuart.o" is out of date.
Executing: "C:\MCC18\bin\mcc18.exe" -p=18F4610  /i"C:\MCC18\h" "C:\MCC18\src\pmc_common\SW_UART\putsuart.c" -fo="C:\Micro_c\Objects\putsuart.o" -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
Make: The target "C:\Micro_c\Objects\openuart.o" is out of date.
Executing: "C:\MCC18\mpasm\mpasmwin.exe" /q /p18F4610 "C:\MCC18\src\pmc_common\SW_UART\openuart.asm" /l"C:\Micro_c\Outputs\openuart.lst" /e"C:\Micro_c\Objects\openuart.err" /o"C:\Micro_c\Objects\openuart.o"
Make: The target "C:\Micro_c\Objects\readuart.o" is out of date.
Executing: "C:\MCC18\mpasm\mpasmwin.exe" /q /p18F4610 "C:\MCC18\src\pmc_common\SW_UART\readuart.asm" /l"C:\Micro_c\Outputs\readuart.lst" /e"C:\Micro_c\Objects\readuart.err" /o"C:\Micro_c\Objects\readuart.o"
Make: The target "C:\Micro_c\Objects\uartdata.o" is out of date.
Executing: "C:\MCC18\mpasm\mpasmwin.exe" /q /p18F4610 "C:\MCC18\src\pmc_common\SW_UART\uartdata.asm" /l"C:\Micro_c\Outputs\uartdata.lst" /e"C:\Micro_c\Objects\uartdata.err" /o"C:\Micro_c\Objects\uartdata.o"
Make: The target "C:\Micro_c\Objects\writuart.o" is out of date.
Executing: "C:\MCC18\mpasm\mpasmwin.exe" /q /p18F4610 "C:\MCC18\src\pmc_common\SW_UART\writuart.asm" /l"C:\Micro_c\Outputs\writuart.lst" /e"C:\Micro_c\Objects\writuart.err" /o"C:\Micro_c\Objects\writuart.o"
Make: The target "C:\Micro_c\Outputs\MINSA.cof" is out of date.
Executing: "C:\MCC18\bin\mplink.exe" /l"C:\MCC18\lib" /k"C:\MCC18\bin\LKR" "C:\MCC18\lkr\18f4610.lkr" "C:\Micro_c\Objects\Minsa.o" "C:\Micro_c\Objects\getsuart.o" "C:\Micro_c\Objects\putsuart.o" "C:\Micro_c\Objects\openuart.o" "C:\Micro_c\Objects\readuart.o" "C:\Micro_c\Objects\uartdata.o" "C:\Micro_c\Objects\writuart.o" /o"C:\Micro_c\Outputs\MINSA.cof" /M"C:\Micro_c\Outputs\MINSA.map" /W
MPLINK 4.30.01, Linker
Copyright (c) 2009 Microchip Technology Inc.
Error - could not find definition of symbol 'DelayRXHalfBitUART' in file 'C:\Micro_c\Objects\openuart.o'.
Errors    : 1

Link step failed.
BUILD FAILED: Mon Sep 06 18:38:02 2010

Y tengo otra duda.... Como configuro los baudios para con el UART... es igual que el USART?


Me siento muy novato en c18... :(
Saludos
Lo que no me destruye, me fortalece

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tutorial C18
« Respuesta #47 en: 06 de Septiembre de 2010, 21:57:48 »
Como es por software, la espera para fijar el valor de un bit de la trama o leerlo debes generarlo el usuario segun el baudrate elegido. Esto está explicado en los archivos fuentes:
Código: ASM
  1. ;************************************************************************
  2. ;*      Function Name:  ReadUART                                        *
  3. ;*      Return Value:   char: received data                             *
  4. ;*      Parameters:     void                                            *
  5. ;*      Description:    This routine waits for a start bit, and then    *
  6. ;*                      reads all 8-bits.                               *
  7. ;*      Special Note:   The user must provide two routines:             *
  8. ;*                      DelayRXHalfBit():                               *
  9. ;*                        DelayRXHalfBit should have:                   *
  10. ;*                              5 Tcy for overhead                      *
  11. ;*                              2 Tcy call to DelayRXHalfBit            *
  12. ;*                              ? Tcy                                   *
  13. ;*                              2 Tcy for return from DelayRXHalfBit    *
  14. ;*                              = (((2*OSC_FREQ)/(8*BAUDRATE))+1)/2 Tcy *
  15. ;*                      DelayRXBit():                                   *
  16. ;*                        DelayRXBit should have:                       *
  17. ;*                              10 Tcy for overhead                     *
  18. ;*                              2 Tcy call to DelayRXBit                *
  19. ;*                              ? Tcy                                   *
  20. ;*                              2 Tcy for return from DelayRXBit        *
  21. ;*                              = (((2*OSC_FREQ)/(4*BAUDRATE))+1)/2 Tcy *
  22. ;************************************************************************
  23. ;************************************************************************
  24. ;*      Function Name:  WriteUART                                       *
  25. ;*      Return Value:   void                                            *
  26. ;*      Parameters:     data: byte to send out the UART                 *
  27. ;*      Description:    This routine sends a byte out the TXD pin.      *
  28. ;*      Special Note:   The user must provide a routine:                *
  29. ;*                      DelayTXBit():                                   *
  30. ;*                        DelayTXBit should have:                       *
  31. ;*                              8 Tcy for overhead                      *
  32. ;*                              2 Tcy call to DelayTXBit                *
  33. ;*                              ? Tcy                                   *
  34. ;*                              2 Tcy for return from DelayTXBit        *
  35. ;*                      = (((2*OSC_FREQ)/(4*BAUDRATE))+1)/2  Tcy        *
  36. ;************************************************************************


Entonces en el main.c o en el archivo principal, al igual que para la librería de XLCD, tienes que hacer:

Código: C
  1. void DelayTXBit(){
  2.      // Generar delay correspondiente.
  3. }
  4.  
  5. void DelayRXBit(){
  6.      // Generar delay correspondiente.
  7. }
  8.  
  9. void DelayRXHalfBit(){
  10.      // Generar delay correspondiente.
  11. }


Saludos!
« Última modificación: 06 de Septiembre de 2010, 22:00:10 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Tutorial C18
« Respuesta #48 en: 07 de Septiembre de 2010, 10:42:28 »
Genial eso del UART por software.  :-/

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Tutorial C18
« Respuesta #49 en: 07 de Septiembre de 2010, 20:49:33 »
Hola;

Estoy usando las formulas para darle el correspondiente valor al delay para que funcione bien el puerto UART pero me arroja basura......

Estoy usando un cristal de 20 Mhz y los baudios son 9600, pero no logro hecharlo a andar... me arroja basura.... Hay algo mas que tenga que considerar en los calculos?

Saludos
Lo que no me destruye, me fortalece

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tutorial C18
« Respuesta #50 en: 07 de Septiembre de 2010, 22:00:09 »
Hola;

Estoy usando las formulas para darle el correspondiente valor al delay para que funcione bien el puerto UART pero me arroja basura......

Estoy usando un cristal de 20 Mhz y los baudios son 9600, pero no logro hecharlo a andar... me arroja basura.... Hay algo mas que tenga que considerar en los calculos?

Saludos

Puedes simularlo en MPLAB SIM o Proteus para ver que hayas generado correctamente las demoras.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado komun_roji

  • PIC10
  • *
  • Mensajes: 7
Re: Tutorial C18
« Respuesta #51 en: 08 de Septiembre de 2010, 05:01:57 »
Hola a todos!!!

Era para haceros una pregunta sobre las funciones de comunicación del c18 mediante el puerto serie rs-232; la usart.h.

He andao cacharreando con ellas, y mas o menos las domino ya todas, pero me surge un problema con la getUSART, le tienes q pasar una direccion para q guarde el array que va a leer y un numero de caracteres concreto para ella.

Ando detras de un proyecto en el q los datos a leer por el micro dependeran de la respuesta de un modem a un comandos AT, es decir, que el numero de caracteres sera variable, estoy intentando inventarme una función q cuando llegue al fin de linea me delimite el nº pero tengo un problema con el numero de datos no es correcto, como vereis en el programa cuando hago el paso de int a unsigned char me parece q no se correcto. Creo q hay esta uno de los problemas, q seguro q he metido mas la pata,pero eso como lo podria hacer?¿ Ando trabajando con la HPC EXLPLORER BOARD. Aqui os dejo el programa:

//*main*//
void main(void){
char array_main[];
int i;
unsigned char p;
ADCON1=0x0F; 
TRISD = 0;
PORTD=0xFF;
Open1USART( USART_TX_INT_OFF  &    //sin interrupciones de transmision
             USART_RX_INT_OFF  &   //interrupciones on / off   
             USART_ASYNCH_MODE &   //modo asincrono
             USART_EIGHT_BIT   &   //8bit
             USART_CONT_RX     &   //recepcion-envio continuo
             USART_BRGH_HIGH,51 );
// velocidad oscilador 8mhz, baud =9600//
while (1){
if (Busy1USART()==0){
       putrs1USART("\na la espera de datos\n");
         while (Read1USART()!=0x0A){
         i++;
          }
       PORTD = i;  //para q se me iluminen los led con el numero de datos
       p = (unsigned char) i;
       putrs1USART("\nnumero de caracteres recibido\n");
       gets1USART(array_main, p);
       putrs1USART("\nconexion valida\n");
                 puts1USART(array_main);
     
      }
}
}

Gracias por adelantado!!

Desconectado Khronos_Nieto

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 40
Re: Tutorial C18
« Respuesta #52 en: 08 de Septiembre de 2010, 07:38:20 »
Muchas gracias amigo Suky por compartir este valioso manual.. :-/ :-/ :-/!!!

Me he imprimido el libro completo y es una maravilla, estoy aprendiendo perfectamente C18 desde cero gracias a tu ayuda.

Un saludo y enhorabuena....!!

"Camaradas, ni nuestro propio conocimiento conoce nuestro potencial"
- La caza del Octubre Rojo -

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tutorial C18
« Respuesta #53 en: 08 de Septiembre de 2010, 09:58:27 »
komun_roji, el módem como final de transmisión te envía un 0x0A o 0x0D? Puedes quedarte en un while hasta recibir alguno de estos caracteres.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Tutorial C18
« Respuesta #54 en: 08 de Septiembre de 2010, 13:13:38 »
Que tal Suky?

Aqui molestando nuevamente con preguntas, mira ya lo pude hechar a andar la comunicacion serie con las siguientes demoras en Proteus:

void DelayTXBitUART(void)
{
   Delay10TCYx(50);
}
 
void DelayRXHalfBitUART(void)
{
     Delay10TCYx(25);
}

void DelayRXBitUART(void)
{
    Delay10TCYx(50);
}


Pero al momento de correrlo en fisico me arroja basura en el display...

Estoy demasiado acostumbrado a usar PBP y en ese lenguaje si he podido echarlo a andar... Voy a ponder el ejemplo de como lo hago en Basic para ver si alguien puede resolver mi duda...

En Basic:

DIS_SER                VAR PORTB.4           'Pin de comunicacion serial
N9600                    CON 16468               'Velocidad de 9,600 bps para el display serie LCD de 4 X 20.   (En fisico me corre con esta configuración)
'N9600                   CON 84                    ' (En Proteus me corre con esta configuración)

SEROUT2 DIS_SER,N9600,["Hola Mundo"]


Con la constante de  84 se corre perfectamente en proteus y con la constante 16468 se corre perfectamente en fisico...

Saludos
Lo que no me destruye, me fortalece

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tutorial C18
« Respuesta #55 en: 08 de Septiembre de 2010, 14:05:08 »
Que cristal estas usando? Dado que para esto debería de andar tanto en Proteus como en lo real, salvo que configures algo mal, o proteus o el hardware.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Tutorial C18
« Respuesta #56 en: 08 de Septiembre de 2010, 14:32:50 »
Estoy usando un cristal de 20MHz y estoy configurando de esta manera el pic:

#pragma config OSC=HS,FCMEN=OFF,IESO=OFF
#pragma config PWRT=ON,BOREN=OFF,BORV=0,WDT=OFF,WDTPS=32768
#pragma config MCLRE=ON,LPT1OSC=OFF,PBADEN=OFF,CCP2MX=PORTBE
#pragma config STVREN=OFF,LVP=OFF,XINST=OFF,DEBUG=OFF
#pragma config CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF,CPB=OFF
#pragma config WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF,WRTB=OFF,WRTC=OFF
#pragma config EBTR0=OFF,EBTR1=OFF,EBTR2=OFF,EBTR3=OFF,EBTRB=OFF
Lo que no me destruye, me fortalece

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tutorial C18
« Respuesta #57 en: 08 de Septiembre de 2010, 15:41:36 »
En teoría debería ser:

Delay10TCYx(52);

y

Delay10TCYx(26);


Luego como siempre hay que utilizar OpenUart para inicializar los pines y luego enviar/recibir datos.

Más vueltas que esas no hay, quedará revisar hardware o configuración del soft que recibe los datos por parte de la PC.

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Tutorial C18
« Respuesta #58 en: 08 de Septiembre de 2010, 16:41:05 »
Mi codigo queda de la siguiente manera:

#include <p18f4610.h>

#include <delays.h>      //Libreria para los retardos
#include <stdlib.h>      //Libreria para conversiones a string
#include <stdio.h>
#include <sw_uart.h>

#pragma config OSC=HS,FCMEN=OFF,IESO=OFF
#pragma config PWRT=ON,BOREN=OFF,BORV=0,WDT=OFF,WDTPS=32768
#pragma config MCLRE=ON,LPT1OSC=OFF,PBADEN=OFF,CCP2MX=PORTBE
#pragma config STVREN=OFF,LVP=OFF,XINST=OFF,DEBUG=OFF
#pragma config CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF,CPB=OFF
#pragma config WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF,WRTB=OFF,WRTC=OFF
#pragma config EBTR0=OFF,EBTR1=OFF,EBTR2=OFF,EBTR3=OFF,EBTRB=OFF

void DelayTXBitUART(void);
void DelayRXBitUART(void);
void DelayRXHalfBitUART(void);

//char x='a';
char x[20];

void main(void)
{
x[0]='H';x[1]='O';x[2]='L';x[3]='A';x[4]=' ';x[5]='M';x[6]='U';x[7]='N';x[8]='D';x[9]='O';x[10]=' ';
   OpenUART();
   Delay1KTCYx(200);
   putsUART(x);
   //WriteUART(x);
   //putsUSART("Hola Mundo");
   while(1){}
}

void DelayTXBitUART(void)
{
   Delay10TCYx(52);
}
 
void DelayRXHalfBitUART(void)
{
     Delay10TCYx(26);
}

void DelayRXBitUART(void)
{
    Delay10TCYx(52);
}

 

Si lo anterior esta bien...no se entonces que este haciendo mal.... Lo mas seguro es que sea algo que se me este olvidando configurar en el display como dices tu Suky. Cheque cuales son las diferencias en basic entre trabajar con una constante de 84 y 16468 y la diferencia esta entre lo que llaman Bit 14 (Conversion).

Saludos!!

Y gracias Suky por todas las atenciones jejeje siento que te he estado dando mucha lata por aqui. Saludos
Lo que no me destruye, me fortalece

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Tutorial C18
« Respuesta #59 en: 08 de Septiembre de 2010, 19:44:34 »
Hola que tal Suky;

Ya se que esta pasando pero no se como solucionarlo.

He estado checando el programa por Hyperterminal y los datos me llegan perfectamente bien y pues en proteus la simulación ni se diga. Lo que pasa que el display que estoy usando de es comunicación serial pero ocupo que trabaje en modo invertido, con esto te quiero decir que no ocupo MAX232 para que me realice los cambios de estados, el problema es que no se como hacerlo por software.

Saludos
Lo que no me destruye, me fortalece


 

anything