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

0 Usuarios y 5 Visitantes están viendo este tema.

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re:Mini curso "Programación en XC8"
« Respuesta #390 en: 25 de Diciembre de 2015, 17:14:11 »
hola miguel:

prueba esto:

Código: [Seleccionar]
#define _XTAL_FREQ 20000000
#include <xc.h>
#include "config.h"
#include <delays.h>
 
#define pulsador_ini   PORTAbits.RA2  //pulsador_ini conectado en RA2
#define motor_izq   LATAbits.LA3  //motor izquierdo conectado en RA3
#define motor_dcho  LATAbits.LA4  //motor derecho conectado en RA4
 
/* DECLARACION DE FUNCIONES */
void pausa_5seg(void);
 
/* ENUMERAMOS LOS TIPOS DE ESTADOS */
enum eEstados{
    Detenido,Inicio,Espera
}estado;
 
/* FUNCION PRINCIPAL */
void main(void)
{
/* CONFIGURACION DE PINES */
    estado = Detenido;  //Empezamos con el robot parado
    ADCON1bits.PCFG3 = 1;   //Configuramos
    ADCON1bits.PCFG2 = 1;   //RA0:RA1 analogicos
    ADCON1bits.PCFG1 = 0;   //el resto de pines
    ADCON1bits.PCFG0 = 1;   //digitales
    TRISAbits.RA2 = 1;  //Configuramos RA2 como entrada
    TRISAbits.RA3 = 0;  //Configuramos RA3 como salida
    TRISAbits.RA4 = 0;  //Configuramos RA4 como salida
   
    while(1)
    {
        switch(estado)
        {
            case Detenido:
            {
                motor_izq = 0;
                motor_dcho = 0;
                if(pulsador_ini == 1)
                {
                    estado = Espera;
                }
            }
            break;
            case Espera:
            {
                pausa_5seg();
                estado=Inicio;
            }
            break;
            case Inicio:
            {
                motor_izq = 1;
                motor_dcho = 1;
            }
            break;
        }
    }
}
 
void pausa_5seg(void){
    unsigned char i = 0;
    for(i=0; i<=10; i++){
        Delay10KTCYx(226);
    }
}


no se te encienden los led por que estabas utilizando porta y no lata, ademas, el compilador si no la inicializacion del estado al principio hace cosas raras.A ver si asi te funciona

un saludo
« Última modificación: 25 de Diciembre de 2015, 17:27:26 por juaperser1 »
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Mini curso "Programación en XC8"
« Respuesta #391 en: 25 de Diciembre de 2015, 18:15:45 »
Gracias Juan José me has abierto los ojos, ahora tengo mas claro como implementar la maquina de estados. Perdón una pregunta ¿Si usamos la instrucción switch debemos seguir el mismo orden que seguiríamos en el diagrama de la maquina de estados, o sea un estado detrás de otro?
« Última modificación: 25 de Diciembre de 2015, 18:21:00 por Miquel_S »
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re:Mini curso "Programación en XC8"
« Respuesta #392 en: 25 de Diciembre de 2015, 18:24:39 »
Gracias Juan José me has abierto los ojos, ahora tengo mas claro como implementar la maquina de estados. Perdón una pregunta ¿Si usamos la instrucción switch debemos seguir el mismo orden que seguiríamos en el diagrama de la maquina de estados, o sea un estado detrás de otro?

no ni mucho menos, al igual que si lo implementaras con if, el código entrará en el case que corresponda. por lo tanto puedes poner el primer case el "inicio", el segundo "Detenido" y el tercero "Espera" por ejemplo, lo importante es que no haya incongruencia en las condiciones, ni posibilidad de que ejecute dos estados "al mismo tiempo".

esta es solo una manera de hacer una maquina de estados puedes implementarla de otras maneras como por ejemplo usando if-else.

ya lo que a ti te venga mejor.

un saludo
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado lmtreser

  • PIC16
  • ***
  • Mensajes: 131
    • Automatismos Mar del Plata
Re:Mini curso "Programación en XC8"
« Respuesta #393 en: 08 de Enero de 2016, 00:02:46 »
Volví !!! Totalmente alejado del XC8 retome un poco el tema. Estuve leyendo y googleando y estoy medio perdido con el tema de librerías. De forma oficial Microchip lanzo algún paquete con LCD, I2C, SPI, 1-Wire, Modbus, USB????

Por el momento estoy jugando con un RTC DS1307 y un sensor DS18B20, y no encuentro mucha información. Estoy buscando mal, o hay que laburar para implementar estos dispositivos?

Saludos y buen año!!!

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re:Mini curso "Programación en XC8"
« Respuesta #394 en: 09 de Enero de 2016, 09:39:15 »
Hola Como estas , no he probado ninguno de los dos , pero googleando me he encontrado con cosas para los dos dispositivos , el 1307 se lee con I2C si mal no recuerdo , tengo unas librerias andando para pic16 de i2c ..con las cuales manejaba un bmp085 , es mas creo que nadan por aca por el foro dando vueltas , y del 18b20 estoy seguro de haber visto info en google , si encuentro algo te lo envio o lo posteo

Saludos



Volví !!! Totalmente alejado del XC8 retome un poco el tema. Estuve leyendo y googleando y estoy medio perdido con el tema de librerías. De forma oficial Microchip lanzo algún paquete con LCD, I2C, SPI, 1-Wire, Modbus, USB????

Por el momento estoy jugando con un RTC DS1307 y un sensor DS18B20, y no encuentro mucha información. Estoy buscando mal, o hay que laburar para implementar estos dispositivos?

Saludos y buen año!!!
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re:Mini curso "Programación en XC8"
« Respuesta #395 en: 09 de Enero de 2016, 09:50:20 »
Citar
De forma oficial Microchip lanzo algún paquete con LCD, I2C, SPI, 1-Wire, Modbus, USB????

De capa física vas a encontrar de todos sus periféricos, es decir, de i2c, usb, spi etc.
pero de modbus y otros protocolos de comunicación no vas a encontrar nada oficial, a no ser que sea propiedad de microchip.

Un saludo
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado lmtreser

  • PIC16
  • ***
  • Mensajes: 131
    • Automatismos Mar del Plata
Re:Mini curso "Programación en XC8"
« Respuesta #396 en: 09 de Enero de 2016, 11:39:18 »
Usando una rutina I2C que encontré ya puse en marcha el DS1307. Cuando depure el código lo comparto. Saludos!

Desconectado c@Lic_0

  • PIC10
  • *
  • Mensajes: 36
    • Una tasita de cafe
Re:Mini curso "Programación en XC8"
« Respuesta #397 en: 20 de Febrero de 2016, 13:58:17 »
Buenos Dias, si alguien me puede ayudar estoy usando la verasion 1.36 del XC8, y al agregar la libreria del SPI:

#include <spi.h>

me aparece marcado como error, entro en el disco C: donde tengo instalado el xc8, especificamente a la carpeta include, y efectivamente no se encuentra el archivo spi.h, buscando en internet, encontre que estas librerias estan en la carpeta >include>plib, ahi deberia de estar el archivo spi.h, pero no tengo la carpeta plib instalada.

No se si el XC8 se instalo mal o cual es el error que estoy cometiendo

De antemano gracias por su ayuda.
 

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Mini curso "Programación en XC8"
« Respuesta #398 en: 20 de Febrero de 2016, 14:13:58 »
Las plib vienen por defecto en XC8. No estoy muy seguro si es que xc.h te las agrega solo, sino intenta agregar plib.h

Desconectado elvisnoria

  • PIC10
  • *
  • Mensajes: 1
Re:Mini curso "Programación en XC8"
« Respuesta #399 en: 21 de Febrero de 2016, 18:26:00 »
Buenas, soy un novato en esto y necesito su ayuda en una práctica simulada en proteus. tengo que hacer que el pic me genere una frecuencia de 25KHz como salida en un pin. Tengo que usar un pic16f887.

Me he informado en paginas web y veo que es un largo proceso y no manejo muy bien lo de los registros del pic y esas cosas. el pic que tengo.

Alguien podria ayudarme?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Mini curso "Programación en XC8"
« Respuesta #400 en: 21 de Febrero de 2016, 20:24:17 »
Buenas, soy un novato en esto y necesito su ayuda en una práctica simulada en proteus. tengo que hacer que el pic me genere una frecuencia de 25KHz como salida en un pin. Tengo que usar un pic16f887.

Me he informado en paginas web y veo que es un largo proceso y no manejo muy bien lo de los registros del pic y esas cosas. el pic que tengo.

Alguien podria ayudarme?

Utiliza el ejemplo de un led pero cambiarle el delay a un valor de 39/40 microsegundos. Y tenes tu programa, darte mas seria hacerte el proyecto por vos.

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

Es decir usa __delay_us(29) , en ves de __delay_ms()

Un PIC16F887 tiene mas registros.. y tenes que configurarlos, te sugiero que leas el datasheet del PIC en el puerto que deseas usar. Y seguro lo tenes funcionando.

Desconectado jorge garcia

  • PIC10
  • *
  • Mensajes: 1
Re:Mini curso "Programación en XC8"
« Respuesta #401 en: 29 de Febrero de 2016, 21:38:53 »
Muy interesante tu minicurso, recién estoy aprendiendo a programar en C y el compilador que tengo es el Mikro C pro for PIC. Cómo puedo saber que instrucciones acepta y cuáles no.
Gracias por tu tiempo y tu respuesta. Saludos amigo
Jorge

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Mini curso "Programación en XC8"
« Respuesta #402 en: 29 de Febrero de 2016, 21:46:20 »
Consejo, si comenzas para mi lo mejor es XC8. Por que vas a aprender a manejar registro por registro lo que es el PIC, y lo demas es aprender C. O mejor dicho, si lees el datasheet, el mismo te indica paso a paso que registros tenes que modificar para activar un modulo y se traduce casi literalmente ese "paso a paso" a XC8.

En cambio mikro C / CCS tienen funciones incluidas dentro del compilador, y tenes que estar con un manual al lado hasta que aprendes cada una. Esto no quita que puedas hacer o tengas las mismas funciones en XC8. Ademas XC8 es gratuito y soporta todos los micros. XC8 usa el IDE: MPLAB X.

Si aun asi quisieras seguir con Mikro C, deberias ir a la pagina del compilador y buscar el manual de las funciones que soporta.
Con respecto a C, es comun a todos, es decir los for/while/if, como declarar varaibles, funciones, etc. Todo eso es comun a C.

Desconectado NIN

  • PIC10
  • *
  • Mensajes: 6
Re:Mini curso "Programación en XC8"
« Respuesta #403 en: 07 de Mayo de 2016, 23:55:44 »
Buenas noches. Soy un novato . Ya realize muchos de los ejemplos que realizaron al principio. Gracias a todos. Ayudan un monton.

Ahora bien. Quiero realizar Un PWM pero no quiero usar las librerias, sino hacerlo desde los registros.

Los datos son los siguientes:

Frecuencia de oscilacion = 4MHz
Periodo de oscilacion = 0.25us
Duty_cicle= 250
Prescale = 16
PR2 = 124

Ya realize los calculos, Es para obtener un PWM : Periodo =2ms; Duty_cicle = 1ms. Algo asi :
   _______
   |           |
   |           |
   |           |
   |           |______
   
   <-DC->
   <----Periodo--->

...

Quiero mostrarles el codigo que realize (despues de mucho esfuerzo, lo tengo que admitir), sin embargo todavia no puedo generar la salida PWM:

Código: [Seleccionar]
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <pic16f88.h>

#pragma config FOSC = HS  // Oscillator Selection bits (INTOSC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
#pragma config BOREN = ON       // Brown-out Detect Enable bit (BOD enabled)
#pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

void main ()
{
   
     while (1)
     {
         TRISB &= ~(1 << 3); /*limpiar bit RB3/CCP1 en TRISB, hacer PORTB3/CCP1 como salida*/
            CCP1CON = 0x2C; /*activar PWM */
            PR2 = 0x7C;    /*124 (DECIMAL)*/
            T2CON = 0X06; /*prescale 16 */
            CCPR1L = 0X3E;
           
     }   
}

Todavia no me sale. Yo se que hay varios ejemplos (incluso en este post hay uno) sin embargo quiero saber porque el mio todavia no sale.

Agradeceria muchisimo alguna ayuda que me puedan dar. Ya no se que hacer.



Sinceramente
NIN.

« Última modificación: 08 de Mayo de 2016, 00:09:05 por NIN »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Mini curso "Programación en XC8"
« Respuesta #404 en: 08 de Mayo de 2016, 02:30:57 »
Empecemos primero por la forma del programa, Voy a escribir masomenos como estan formados todos los main.c:


Código: C
  1. // Aca los #include
  2.  
  3. // Aca los FUSES
  4.  
  5. // Prototipos de funciones y variables
  6.  
  7. void main(void)
  8. {
  9.         // Aca la configuracion de cada modulo que se vaya a usar
  10.  
  11.         while(1)                // Loop infinito, el unico loop infinito que hay en todo el programa.
  12.         {
  13.                 //Aca el programa en cuestion
  14.         }
  15. }
  16.  
  17. // Otras funciones si es que es el caso

Ahora vamos adentro de la funcion main y veamos como quedaria el codigo:

El CCP del PIC16F88 utiliza el timer 2, si observas al final de la parte de PWM ahi estan TODOS los regsotrs y bits que estan involucrados con el PWM, algunos registros solo tiene 1 bit como es PIE1 por ejemplo que corresponde al PWM. Voy a usar valores obtenidos de una calculadora online. Igual lo explico en el comentario, si tenes alguna duda podes ver el diagrama del PWM, observa que solo basta configurar el PWM y darle arranque al TMR2, luego de ahi no tenes que hacer mas nada.


Código: C
  1. void main(void)
  2. {
  3.  
  4.         //Aca configuracion de modulos
  5.  
  6.         // Puertos
  7.  
  8.         TRISB = 0;              // Todas salidas por ahora nomas, la salida PWM puede estar en RB0 o RB3 segun el fuse que se elija.
  9.         PORTB = 0;              // Apagamos todos
  10.  
  11.  
  12.         // CCP
  13.  
  14.         CCP1CON = 0x1C;         // En PWM, y los ultimos 2 bits ( de los 10 del duty ) es 01
  15.         PR2 = 0x7C;             // Periodo va estar dado por PR2, y como este el timer2 configurado, 0x7C = 124, pero se crea virtualmente 2 bits mas, resultado periodo igual a 496
  16.         T2CON = 0x07;           // T2CON, postscaler = 1, prescaler = 16, TMR2 ON. Periodo : (PR2+1)*4*Tosc*(Prescaler) = (124+1)*4*Tosc*16 = 8000 * 0.250us = 2ms
  17.         CCPR1L = 0x3E;          // Valor real de duty que con los 2 bits del CCP1CON es 0xF9 = 249, virtualmente el PWM hace llegar al timer hasta 496, un duty de 50% 496 * 0.5 = 248
  18.  
  19.         while(1)
  20.         {
  21.         }
  22.  
  23. }


2 cosas mas, usa FOSC = XT para 4Mhz o menos y HS para cuando tenes mas de 4Mhz, y... no hace falta que agregues tantos includes, con el de xc.h se agrega el del pic16f88 por si solo. es decir solo necesitas este include:

Código: C
  1. #include <xc.h>

Aunque a veces da problemas igual..

Y el MPLAB X tiene una forma facil de generar codigo para crearte los fuses