Autor Tema: Mini curso "Programación en XC8"  (Leído 588217 veces)

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

Desconectado Limbo

  • PIC10
  • *
  • Mensajes: 44
Re: Mini curso "Programación en XC8"
« Respuesta #120 en: 09 de Julio de 2013, 18:22:19 »
Yo uso el 886 y si no configuras ANSELH date por jodido  :lol: Si no lo defines los programas dan fallos. No he leido  esa parte del datasheet, pero siempre me han dicho que es necesario configurarlo..

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Mini curso "Programación en XC8"
« Respuesta #121 en: 09 de Julio de 2013, 21:32:22 »
Claro, la pregunta sería porque?

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Mini curso "Programación en XC8"
« Respuesta #122 en: 09 de Julio de 2013, 22:12:22 »
  Hablando de simulación, con ISIS 7.8 sólo es necesario configurar el registro ANSELH si se va a utilizar el puerto como entrada. Siempre que lo utilicé como salida no me fue necesario configurarlo.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado fabytodo

  • PIC10
  • *
  • Mensajes: 3
Re: Mini curso "Programación en XC8"
« Respuesta #123 en: 10 de Julio de 2013, 11:44:38 »
Excelente curso lmtreser PIC12, 1ro. muchas gracias  ((:-)), ya hice titilar el led, pwm y ADC, sin utilizar xtal. alguien conoce  algún demo sencillo como estos para mostrar la comunicación usb con el 18F2550 o 18F4550 por vitual com o como sea utilizando MPlabX y XC8
Gracias de antemano Fabián

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Mini curso "Programación en XC8"
« Respuesta #124 en: 12 de Julio de 2013, 06:57:12 »
Quiero hacer esto:
unsigned char pines[3] = {RD0, RB1, RC2};

Pero no me deja. Dice que solo admite constantes. Bueno mi idea es controlar varios pines de una forma mas didactica. Entonces pense en punteros, pero como no soy muy bueno en este tema, no logro dar que me compile:

unsigned char *pines;

pines = &RD0;

Y me da ilegal operation on bit variable y ilegal conversion

Alguien sabe como hacerle?

Gracias.
« Última modificación: 12 de Julio de 2013, 07:03:07 por jeremylf »

Desconectado alvaro2043

  • PIC10
  • *
  • Mensajes: 41
Re: Mini curso "Programación en XC8"
« Respuesta #125 en: 17 de Julio de 2013, 12:15:46 »
Buenos días.. saludos a todos. La verdad soy nuevo en el mundo de los microcontroladores actualmente ando trabajando con el 18F4550 he realizado ejercicios sencillos, como encender y apagar led, leer ADC y generar PWM, utilizo MPLAB y el compilador C18 y quiero unirme a este subforo. Tengo un reto el cual llevo casi una semana leyendo y leyendo pero no doy, ya ando saturado.
Necesito generar 4 señales a las cuales se le debe variar el ciclo de trabajo todas a la vez, la caracteristica de estas señales es que deben de estar desfasadas. Se que por el modulo CCP no se puede por que el PIC18F4550 trae solo 2 CCP y los dos modulos dependen del timer2.
He pensado hacer esta señales por interrupciones utilizando los timer. Pero antes de pasar al pez gordo (generar las 4 señales pwm) Quiero arrancar generando una señal PWM por interrupciones ya sea utilizando el timer0 o timer1,timer2,timer3. La verdad no se si hay otra forma de realizar, yo creeria que si, pero no se cual.

Esta es la imagen de las señales.. Bueno no quiero que me escriban un codigo. Me gustaria que a medida que vaya haciendo lo mio, me puedan orientar y darme a conocer en donde estoy fallando.. Digamos que como unos tutores jejejeje  A penas tenga algo de codigo lo subiré.. Lo que si quiere es que me ayuden hacerme una idea de como enfrentar este problemas.

Gracias.. Exitos a todos


Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Mini curso "Programación en XC8"
« Respuesta #126 en: 17 de Julio de 2013, 12:39:40 »
Hola alvaro2043. Por aquí hay algo sobre el tema. No está en xc8 pero se podrá migrar el concepto.
http://personales.alumno.upv.es/mapedgi/pfc/simulacionespwm.html
http://www.ucontrol.com.ar/forosmf/proyectos-con-pic/pwm-por-software/
Andá dándole forma al código.
       Saludos.
           Jukinch


       
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado alvaro2043

  • PIC10
  • *
  • Mensajes: 41
Re: Mini curso "Programación en XC8"
« Respuesta #127 en: 17 de Julio de 2013, 12:56:49 »
Gracias Jukinch.. Voy a estar quemando neurona haciendo este codigo.. y poco a poco lo ire subiendo... Gracias..
Estas respuestas son mas rápidas que la justicia aquí en colombia jejejejej

Exitos a todos..

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Mini curso "Programación en XC8"
« Respuesta #128 en: 17 de Julio de 2013, 13:02:42 »
Gracias Jukinch.. Voy a estar quemando neurona haciendo este codigo.. y poco a poco lo ire subiendo... Gracias..
Estas respuestas son mas rápidas que la justicia aquí en colombia jejejejej

Exitos a todos..

  No te preocupes, que también fue mucho más rápida que la justicia en Argentina  :D
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado alvaro2043

  • PIC10
  • *
  • Mensajes: 41
Re: Mini curso "Programación en XC8"
« Respuesta #129 en: 18 de Julio de 2013, 03:01:10 »
Bueno.. estaba intentado generar una señal cuadrada de frecuencia de 10khz.. por medio del timer0, con el fin de familiarizarme con los timer.. La verdad pense que lo que estaba haciendo estaba bien, ya que me lei la hoja de datos  la parte de las interrupciones y el timer0 .. pero Pufff no se generaa nada.. solo un cambio de estado en el PINB1.. Dejo el codigo a ver que ayuda me pueden pegar.. Nota: Apenas esto arrancando con este cuento de programar.

Código: [Seleccionar]
///Generacion de onda cuadrada 10Khz con duty-cycle 50%

//Cofiguración de Bits

#pragma config PLLDIV = 1 //No importa por que vamos a trabajar con el oscilador interno
#pragma config CPUDIV = OSC1_PLL2  //No importa por que vamos a trabajar con el oscilador interno
#pragma config USBDIV = 1
#pragma config FOSC = INTOSC_EC  //Configurado para trabajar oscilador interno, si se deja por default trabajará a 1MHZ de clock
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config PWRT = ON
#pragma config BOR = OFF
#pragma config BORV = 0
#pragma config VREGEN = OFF
#pragma config WDT = OFF
#pragma config WDTPS = 8192
#pragma config MCLRE = OFF
#pragma config LPT1OSC = OFF
#pragma config PBADEN = OFF
#pragma config CCP2MX = OFF
#pragma config STVREN = OFF
#pragma config LVP = OFF
#pragma config ICPRT = OFF
#pragma config XINST = OFF
#pragma config DEBUG = OFF
#pragma config CP0 = OFF,CP1 = OFF,CP2 = OFF,CP3 = OFF
#pragma config CPB = OFF,CPD = OFF
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
#pragma config WRT2 = OFF
#pragma config WRT3 = OFF
#pragma config EBTRB = OFF
#pragma config EBTR3 = OFF
#pragma config EBTR2 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTR0 = OFF

#include <p18f4550.h>
//Declarando funciones de interrupciones



void Interrupt_isr_Tmr0(void);

void main(void){

    //Configuracion
    INTCON = 0b00100000;  //Habilito el TMR0 overflow Interrupt
    INTCON2 = 0b10000100; //Resistencia pull-up son off
    RCONbits.IPEN = 1; //Habilito interrupciones por prioridad
    TMR0H=0xFF;
    TMR0L=0XFA;         //Cargo el timer0 para trabajar a 16bits para que se me desborde cada 50us para obtener una frecuencia de  10KHz
    T0CON=0b10000011;                     //Los calculos son realizado de la siguiente manera:
    INTCONbits.GIEH=1;                   //Timer_Frecuencia = Fos/4 ==> 8Mhz/4 = 2Mhz.
    TRISB = 0X00;                         //utilizando un prescales de 16 2Mhz/16 = 125Khz
    PORTB = 0X00;                         //(125Khz)(50us) = 6, como estoy trabajando a 16bits
                                          //la cuenta va desde 0x0000-0xFFFF (0-65535)
     while(1);                            //65535-6 = 65530 Ó 0xFFFA, que es lo que cargo en el timer

}

#pragma code Interrupt_vector_TMR0 = 0x08
void Interrupt_vector_TMR0(void)
{
    _asm goto Interrupt_isr_Tmr0
            _endasm
}
//Rutina de interrupción

#pragma code
#pragma  interrupt Interrupt_isr_Tmr0

void Interrupt_isr_Tmr0(void)
{
    if(INTCONbits.TMR0IF ==1){  //Preguntamos por la bandera

        INTCONbits.TMR0IF=0;  //Borramos la bandera

        LATBbits.LATB1=!LATBbits.LATB1;


    }
}



 Buenos me ire a dormir.. ya son la 1:33am jejje esto es algo vicioso.. el querer hacer cosas con esas arañas de silicio ejejeje
Éxitos a todos.
« Última modificación: 18 de Julio de 2013, 03:33:57 por alvaro2043 »

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Mini curso "Programación en XC8"
« Respuesta #130 en: 18 de Julio de 2013, 12:50:38 »
Hola alvaro2043. El código que has subido está en c18 y si lo que quieres es pasarlo a xc8 podés darle una mirada a estos post:

http://www.todopic.com.ar/foros/index.php?topic=40649.msg340202#msg340202
http://www.todopic.com.ar/foros/index.php?topic=40649.msg338221#msg338221

Allí verás como se programan las interruciones en xc8.
       Saludos.
            Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Mini curso "Programación en XC8"
« Respuesta #131 en: 20 de Julio de 2013, 01:58:10 »
Quiero hacer esto:
unsigned char pines[3] = {RD0, RB1, RC2};

Pero no me deja. Dice que solo admite constantes. Bueno mi idea es controlar varios pines de una forma mas didactica. Entonces pense en punteros, pero como no soy muy bueno en este tema, no logro dar que me compile:

unsigned char *pines;

pines = &RD0;

Y me da ilegal operation on bit variable y ilegal conversion

Alguien sabe como hacerle?

Gracias.
No saben tampoco como?  :mrgreen:

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Mini curso "Programación en XC8"
« Respuesta #132 en: 20 de Julio de 2013, 04:03:41 »
Hola jeremylf. No entiendo bien que es lo que quieres hacer.
Explica un poco más la duda que tienes.

Igualmente ten presente que los punteros a variables de tipo bit son ilegales.
Mira la página 145 del manual del compilador xc8 ds52053B-page 145.
"It not possible to declare a pointer to bit." No es posible declarar un puntero a bit.
Por eso el compilador te esta dando esos errores.

Dale una mirada a estos link
http://www.microchip.com/forums/m701812.aspx
Allí verás varios ejemplos sobre como acceder a bits individuales de un puerto.
http://www.gooligum.com.au/tutorials/baseline/PIC_Base_C_5.pdf

http://programandopics.blogspot.com.ar/2012/09/primer-proyecto-en-xc8-parte-2-codigo.html?m=1



"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Mini curso "Programación en XC8"
« Respuesta #133 en: 20 de Julio de 2013, 13:26:48 »
Lo que intento hacer es poder controlar el estado de varios pines de diferentes puertos del PIC.

Lo mejor que se me ocurre es un array de los pines que quiero controlar: unsigned char pines_a_controlar[5] = {RA0, RB3, RC4, RD4, RD6};
De esta forma, setearia al pin RA0 poniendo: pines_a_controlar[0] = 1;

Pero esto no compila.

Estoy mirando los links que has propuesto, estan interesantes. Graias por tu tiempo.

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re: Mini curso "Programación en XC8"
« Respuesta #134 en: 20 de Julio de 2013, 18:33:25 »
Lo que intento hacer es poder controlar el estado de varios pines de diferentes puertos del PIC.

Lo mejor que se me ocurre es un array de los pines que quiero controlar: unsigned char pines_a_controlar[5] = {RA0, RB3, RC4, RD4, RD6};
De esta forma, setearia al pin RA0 poniendo: pines_a_controlar[0] = 1;

Pero esto no compila.

Estoy mirando los links que has propuesto, estan interesantes. Graias por tu tiempo.


Y porque no lo haces de esta forma :


         #define ledpin1 TRISBbits.TRISB1
         #define ledtxpin1 PORTBbits.RB1
         #define ledpin2 TRISBbits.TRISB2
         #define ledtxpin2 PORTBbits.TRISB2

y despues cuando lo queres usar

ledpin2 = 0;     // pin 2 como salida
ledpin1 = 0;     // pin 1 como salida
 
ledtxpin1 = 1;  // prendo el led

ledtxpin1 = 0;  // apago el led

ledpin1 = 1 ;   // pin 1 como entrada

if (ledtxpin1 == 1) then ledtxpin2 = 1;  // si 1 en pin 1 enciendo pin2


Saludos espero te sirva
« Última modificación: 20 de Julio de 2013, 18:36:04 por Rseliman »
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!