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

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

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Tutorial C18
« Respuesta #105 en: 09 de Noviembre de 2010, 17:11:53 »
Bueno lo probe asi y me funciono jejejej

Código: [Seleccionar]
while(!DataRdyUSART());
Dato[0]=getcUSART();
while(!DataRdyUSART());
Dato[1]=getcUSART();
while(!DataRdyUSART());
Dato[2]=getcUSART();
while(!DataRdyUSART());
Dato[3]=getcUSART();
return (Dato[2]);
Lo que no me destruye, me fortalece

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Tutorial C18
« Respuesta #106 en: 09 de Noviembre de 2010, 23:27:39 »
Creo que no es la forma correcta... se me esta trabando la impresora...
Lo que no me destruye, me fortalece

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Tutorial C18
« Respuesta #107 en: 09 de Noviembre de 2010, 23:58:45 »
O ya supe cual es el problema, mi problema se corrigio abriendo y cerrando el puerto solamente cuando lo necesito utilizar jejejeej

Saludos
Lo que no me destruye, me fortalece

Desconectado falflores

  • PIC16
  • ***
  • Mensajes: 173
    • Control, electrónica y programación en español
Re: Tutorial C18
« Respuesta #108 en: 17 de Enero de 2011, 05:23:04 »
Hola amigos de TodoPIC, hola suki, muchas gracias por el tutorial de C18, pero tengo una duda que por más que busco no logro responder:

Hace tiempo que quiero incursionar con los PICs 18FXXX, y he investigado sobre las diferencias en el compilador, y todos concuerdan que para seguir usando CCS se debe pasar al C18, pero estoy viendo que mi compilador que he usado de toda la vida para programar mis PICs 16FXXX tambien soporta los PICs 18:

En la lista de dispositivos figuran los 18FXXX

Al abrir un nuevo proyecto con un 18 y mirar el archivo header de dicho pic, se anexa normalmente con #include<18F2550.h>
y no con #include<P18F2550.h> como dice en el manual de C18

Los fuses se configurarían de la misma forma y no con #pragma


Y también al seleccionar el compilador, dice que soporta los 12/16/18/24........


Asi que en conclusión que diferencia hay entre programar los PICs 18 con las instrucciones normales que usan los 16, claro con la diferencia que estos traen más instrucciones y módulos; a programarlos usando el compilador especial de C18 que trae las instrucciones diferentes?.
Los invito a mi blog "Control, electrónica y programación en español" www.robotnias.blogspot.com

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tutorial C18
« Respuesta #109 en: 17 de Enero de 2011, 09:17:10 »
Yo creo la respuesta es depende... Un usuario que es hobbysta CCS (con sus bug y limitaciones) es más que suficiente. Pero si se quiere trabajar con varias arquitecturas o marcas, lo mejor es usar un lenguaje portable, o sea Ansi C, y CCS no lo es. Así siempre se trabaja con una misma estructura y las librerias sirven para el caso general, con pequeñas modificaciones.

Y bueno, luego vienen los detalles entre cada compilador, y para ello hay que usarlos y decidir uno mismo  ;-)


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

Desconectado jorgab_spt

  • PIC10
  • *
  • Mensajes: 15
Re: Tutorial C18
« Respuesta #110 en: 27 de Junio de 2012, 17:46:52 »
Hola a todos, por favor si me pueden ayudar tengo un problema con el texto de mi comunicación serial, al momento de enviar un mensaje o un dato, en la simulación en proteus con el virtual terminal me sale los mensajes uno a continuación del otro, asi:

Comunicación serial    El valor es= 573

y yo quisiera asi:

Comunicación serial   
El valor es= 573
 

y no se que instruccion o como configurar para que me salga el mensaje en cada línea, por favor q

Desconectado jorgab_spt

  • PIC10
  • *
  • Mensajes: 15
Re: Tutorial C18
« Respuesta #111 en: 27 de Junio de 2012, 17:48:48 »
Hola a todos, por favor si me pueden ayudar tengo un problema con el texto de mi comunicación serial, al momento de enviar un mensaje o un dato, en la simulación en proteus con el virtual terminal me sale los mensajes uno a continuación del otro, asi:

Comunicación serial    El valor es= 573

y yo quisiera asi:

Comunicación serial   
El valor es= 573
 

y no se que instruccion o como configurar para que me salga el mensaje en cada línea, por favor si alguien me puede ayudar con este problema, gracias

Mi programa es:

#include <p18f25k20.h>
#include <delays.h>
#include "lcd.h"
#include <stdlib.h>
#include <stdio.h>
#include <usart.h>

//**********Declaración de funciones**********
void low_isr(void);
void high_isr(void);
void interrupcion_timer(void);
void interrupcion_externa1(void);
void interrupcion_1(void);

//**********Declaración de variables***********
unsigned int contador2;
unsigned int var;
unsigned int contador;
int varia;
char str[7];            //para pasar de entero a string
volatile char Data;         //para almacenar la tecla que presiono del computador
//*********************************************

#pragma romdata CONFIG1H = 0x300001
            const rom unsigned char config1H = 0b00001000;      // interno oscillator
#pragma romdata CONFIG2L = 0x300002
        const rom unsigned char config2L = 0b00011111;      // Brown-out Reset Enabled in hardware @ 2.0V, PWRTEN disabled
#pragma romdata CONFIG2H = 0x300003
const rom unsigned char config2H = 0b00000000; // HABILITADO EL WATCH DOG
#pragma romdata CONFIG3H = 0x300005
        const rom unsigned char config3H = 0b00000000;      //MCLRE_ON & espera sistema hasta estabilizar HFINTOSC & TMR1 a potencia superior & PORTB digital & CCP2 en RB3

//********Configuración de baja prioridad************

#pragma code low_vector=0x18
void interrupt_at_low_vector(void)
{
_asm GOTO low_isr _endasm
}
#pragma code
#pragma interruptlow low_isr
void low_isr (void)

{
if(PIR1bits.RCIF=1)           // si es por recepción de datos
   {
      interrupcion_1();
    }
}

//*************Configuración para alta prioridad***********
#pragma code high_vector=0x08
void interrupt_at_high_vector(void)
{
_asm GOTO high_isr _endasm
}
#pragma code
#pragma interrupt high_isr
void high_isr (void)
{

if (PIR1bits.TMR1IF==1)            //se se levanta la bandera de desbordamiento del TIMER1
{
   interrupcion_timer();
}   


}

//*********************lcd**************************
char buf[15];

void DelayFor18TCY(void)
{
Delay10TCYx (2);
}

void DelayPORXLCD (void)
{
Delay1KTCYx(15); // Delay of 15ms
// Cycles = (TimeDelay * Fosc) / 4
// Cycles = (15ms * 16MHz) / 4
// Cycles = 60,000

}
void DelayXLCD (void)
{
Delay1KTCYx(2); // Delay of 5ms
// Cycles = (TimeDelay * Fosc) / 4
// Cycles = (5ms * 16MHz) / 4
// Cycles = 20,000
}

void comandXLCD(unsigned char a) // Envia comando al LCD
{
   BusyXLCD();      
   WriteCmdXLCD(a);
}



// Ubica cursor en (x = Posicion en linea, y = nº de linea)
void gotoxyXLCD(unsigned char x, unsigned char y)
{
   unsigned char direccion;
   if(y != 1)
      direccion = 0x40;
   else
      direccion=0;   
   direccion += x-1;
   comandXLCD(0x80 | direccion);
}

//*********************************************************

void main()
{
   ANSEL=0;                  //deshabilita las entradas analogas en puerto A
   //ANSELH=0b00000001;
   OSCCON=0b01110111;            //frecuencia interna  a 16 MHrz
   OSCTUNEbits.PLLEN=0 ;         //desactivo el multiplicador *4 del oscilador
   
   //***********Configuración de puertos******************
   
   TRISB=0b00000110;         //Entrada de la INT1 y de el ADC
   PORTB=0;
   //*************ADC**********************
   ANSELH=0b00000001;      //Solo RB2 como entrada análoga
   ADCON2=0b10101001;      //Selecciono A/D conversion clock, 12 TAD,result format
   ADCON0=0b00100001;      //Selecciono AN8 como mi entrada análoga, habilito el ADC
   ADCON1=0b00000000;      //Referencia interna Vss, Referencia externa positiva Vdd
   
   //**************************************

   //********configuracion del timer 1 interrupcion cada 10 ms********************
   T1CON=0b11110101;   //habilitado TMR1 / formato de 16 bit/interna (FOSC/4)/prescaler 8 /oscilador apagado
   PIE1bits.TMR1IE=1; //habilitada interrupcion de sobreflujo
             
   //************63035=1111011000111011=2^16*************************
   TMR1H=0b11110110;            //byte más significativo
   TMR1L=0b00111011;            //byte menos significativo   

   //****************************************************************

   INTCONbits.GIEH = 1;       //Habilita todas las interrupciones
   INTCONbits.GIEL = 1;       //Habilita interrupciones de baja prioridad
   
   //************Comunicacion serial******************************

   TRISCbits.TRISC6=0;             // salida de transmisión
   TRISCbits.TRISC7=1;   

   RCSTAbits.SPEN=1;            // puerto serial (EUSART) habilitado
   TXSTAbits.SYNC=0;            // modo asincronico
   TXSTAbits.TXEN=1;            // habilitar transmisor
   TXSTAbits.TX9=0;            // transmision para 8 bits

   RCSTAbits.CREN=1;            //habilita recepcion continua
   RCSTAbits.RX9=0;            //recepcion para 8 bits


   TXSTAbits.BRGH=0;            // baja velocidad del generador de bauds
   SPBRG=12;                  // generador a 9600 bauds con osc de 16MHz

   
   //************CONFIGURACION DE INTERRUPCIONES********************

   //TCONbits.INT0IE = 1;         //habilito interrupcion externa INT0
   //INTCON3bits.INT1IE = 1;       //habilito interrupcion externa INT1
   //TCON2bits.INTEDG0 = 0;      //por flanco de bajada INT0
   //INTCON2bits.INTEDG1 = 0;      //por flanco de bajada INT1
   //INTCON2bits.RBPU = 1;         //activo Pull-up del puerto B
   //INTCON3bits.INT1IP= 0;        //Habilito la INT1 como baja prioridad
   RCONbits.IPEN=1;            //Habilito las interrupciones por prioridad
   INTCONbits.GIEL = 1;          //Habilita interrupciones de baja prioridad
   INTCONbits.GIEH = 1;          //Habilita todas las interrupciones
   IPR1bits.TMR1IP=1;            //Pongo en alta prioridad al timer1 por desbordamiento
   IPR1bits.RCIP=0;            //Interrupcion de recepción del EUSART con prioridad baja
   IPR1bits.TXIP=0;            //Interrupcion de transmisión del EUSART con prioridad baja
   PIE1bits.RCIE=1;            // habilita interrupcion por recepcion
   
   OpenXLCD( FOUR_BIT & LINES_5X7 );

   
    comandXLCD(0x06);             // Nos aseguramos incremento de direccion, display fijo
   comandXLCD(0x0C);            // Encendemos LCD


putrsUSART("COMUNICACION SERIAL   ");      // Escribo un texto en la pantalla
putrsUSART("EL VALOR DE LA VARIABLE ES:   ");
varia=10;
ultoa( varia, str );                // convierto a string la variable "var"
putsUSART( str );

   
contador=0;

while(1)
   {
   
   _asm CLRWDT   _endasm         //resetear WDT
   if(PIR1bits.ADIF)
   {
      
      if(ADRES>=600)
      {
         PORTBbits.RB6=1;
      }   
      
      else
      {
      PORTBbits.RB6=0;
      }
         
         
      PIR1bits.ADIF=0;      //Encero la bandera que me indica si la conversión está lista
      var=ADRES;            //En ADRES se encuentran los 10 bits de la conversión
   }   
       
   sprintf(buf, "el valor=   %d", var);      //Guardo los caracteres en la variable buf
               
   

if(contador>=100)
{   
   ADCON0bits.GO_DONE=1;      //Mando a hacer la conversión
   contador=0;               //Encero el contador
   comandXLCD(0x01);         // Borra pantalla y vuelve al origen.-
   gotoxyXLCD(1,1);
   putrsXLCD("CONVERSION ADC");   
   gotoxyXLCD(1,2);
   putsXLCD(buf);            //Muestro la variable "buf" (contiene los 10bits de la conversión) por al LCD
   putsUSART( buf );
}   

}         

}

void interrupcion_timer()
{
   contador++;               
   PIR1bits.TMR1IF=0;
   TMR1H=0b11110110;
   TMR1L=0b00111011;
   
}   



void interrupcion_1()
{

   Data=getcUSART();             // leemos dato recibido
   
   while(1){
      Data=getcUSART();
   
    switch(Data){
       case 'a':               // tambien se puede poner en ASCII 0x61 hexadecimal o se puede escribir en decimal 97
         PORTBbits.RB5=1;      // prendo led
         break;
       case 'b':                
         PORTBbits.RB5=0;      // apago led
         break;
   PIR1bits.RCIF=0;            // Ensero la bandera de interrupción del EUSART
            }
         }
}


Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Tutorial C18
« Respuesta #112 en: 27 de Junio de 2012, 18:05:06 »
Hola jorgab_spt:
       Para comprender tu inquietud debés estudiar "secuencias de escape en c".

\n               0x0A         LF           Saltar una línea (linefeed)

 \r                0x0D         CR           Retorno de carro (carriage return)

agregalas en tu código así:

putrsUSART("EL VALOR DE LA VARIABLE ES:   \r\n");
   
            Saludos.
               Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado jorgab_spt

  • PIC10
  • *
  • Mensajes: 15
Re: Tutorial C18
« Respuesta #113 en: 27 de Junio de 2012, 18:08:34 »
Muchas gracias Jukinch, y si la verdad estoy recien iniciando la programación en c y me falta mucho por aprender.
Saludos y gracias de nuevo

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Tutorial C18
« Respuesta #114 en: 27 de Junio de 2012, 18:30:25 »
Podés ver estos links:
            http://www.zator.com/Cpp/E3_2_3e.htm
            http://es.wikiversity.org/wiki/Fundamentos_de_C_-_Lecci%C3%B3n_2
              Leelos y generá dudas. Es la mejor forma de aprender.
                Saludos desde Argentina
                            Jukinch ;-)
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado jorgab_spt

  • PIC10
  • *
  • Mensajes: 15
Re: Tutorial C18
« Respuesta #115 en: 28 de Junio de 2012, 13:58:04 »
Gracias jukinch me ayudaron mucho esas páginas, ya he aprendido un poco mas de c.
Ahora me encuentro en otro problema, me gustaria enviar un vector por comunicación serial y ya no solo un dato como estaba haciendo en mi programa pero la verdad no se como puedo hacer eso. Si me podrian ayudar con eso por favor si alguien sabe que me de una manito. Gracias

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Tutorial C18
« Respuesta #116 en: 28 de Junio de 2012, 14:06:33 »
Puedes realizar un for enviando cada uno de los datos del vector:

Código: [Seleccionar]
char Buffer[10];
for(k=0;k<10;k++){
   putc(Buffer[k]);
}
No contesto mensajes privados, las consultas en el foro

Desconectado jorgab_spt

  • PIC10
  • *
  • Mensajes: 15
Re: Tutorial C18
« Respuesta #117 en: 28 de Junio de 2012, 14:16:06 »
A ya listo gracias Suky, me ayudaste mucho porque no tenia idea de como trabajar con eso, ya voy a probarle lo que me dices.

Desconectado jorgab_spt

  • PIC10
  • *
  • Mensajes: 15
Re: Tutorial C18
« Respuesta #118 en: 04 de Julio de 2012, 13:24:30 »
Hola amigos, por favor si alguien me podria ayudar con el comando para poder borrar ya sea la segunda o primera línea del lcd, no se si habra eso si alguien me ayuda por favor y si pueden decirme mas comandos del lcd me ayudaría mucho gracias.

Saludos!!!!

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Tutorial C18
« Respuesta #119 en: 04 de Julio de 2012, 13:41:04 »
Lo que se me ocurre es que hagas una rutina que rellene con espacios en blanco tal linea. Se que hay comandos de borrado pero por lo menos a lo que yo se, te borran toda la pantalla

Saludos
Lo que no me destruye, me fortalece


 

anything