Programas hechos en MPLAB

La idea es encender un led que lo ubico en el pin 4 (RA4) del puerto A, al presionar un botón ubicado en el pin0 (RA0) del mismo puerto. He leido que configurando el ADCON1 pongo los pines ya sea en entrada o salida digital. y modificando el registro TRISA especifico que pines con entrada y cuales salida. Esto es lo que hago en la primera parte.
No entiendo que esta mal? porque igual tengo entendido que si es posible poner los pines tanto en entrada como en salida. Eso es lo que se me complica. :eek:
 
La idea es encender un led que lo ubico en el pin 4 (RA4) del puerto A, al presionar un botón ubicado en el pin0 (RA0) del mismo puerto. He leido que configurando el ADCON1 pongo los pines ya sea en entrada o salida digital. y modificando el registro TRISA especifico que pines con entrada y cuales salida. Esto es lo que hago en la primera parte.
No entiendo que esta mal? porque igual tengo entendido que si es posible poner los pines tanto en entrada como en salida. Eso es lo que se me complica. :eek:
Saludos. No soy cosmico pero el tiene razón en cuanto a lo que estas haciendo mal
con el código que estas implementando, y como te comente en tu post que subieras
el código para entonces poder ayudarte pues ok.
En tu primer post dijiste que querias encender un LED en RA5
por medio de un Pushbutton en RA0 hasta ahí todo OK la cosa es facil.
Pero en tu código jamas usaste RA4 ni RA5, querias prender un LED sobre un botón presionado.
El problema radica en que si tratas de encender un LED por RA4 directamente
no se podra, ya que RA4 es Open Drain (Drenador Abierto)
resulta tendrias que hacer uso de un transistor que lo controle y usando una R Pull Up en RA4
Para mantener los dos estados "Eso pasa por no leer los datasheets"
Hay varios problemas relacionados con este detalle de los PIC y mas con la configuración del ADC
Bien, aqui dejo el código para encender un LED normalmente y otro usando Pull Up y un TR NPN
Nota: El LED dara un destello inicial cuando se usa Pull Up
Eso es debido a la configuración del transistor y a la inicialización del PIC. :apreton:
 

Adjuntos

  • RA4 en PIC'S con Open Drain.rar
    19.8 KB · Visitas: 60
Última edición:
control de un servo y comunicacion con la pc, este circuito lo que hace es esperar una senal de la cumputadora, para poder girar 45 grados, 90 grados, 135 grados o 180 grados, al girar a cualquier grados elegidoesperara un cierto tiempo en esa posiscion al termino de 3 segundos! regresara a su posicion original osea a 0 grados.

Código:
///////////////////////////////////////
//AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ
//TITLE;SERVO SIMPLE
//DATE:23/ABRIL/2009
///////////////////////////////////////
 
//CONFIGURACION///////////////////
#include<16f628a.h>
#include <STRING.H>
#fuses [B][COLOR=red]INTRC_IO[/COLOR][/B],NOWDT,NOLVP,MCLR,NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=2400,xmit=PIN_A1,rcv=PIN_A0)
 
void config(void);
 
void main(void){
        long i,a;
        char POSICION;
        config();
INICIO:
        output_b(0x00);
        printf("POSICIONANDO EL MOTOR\r\n");
        for(i=a;i>=500;i=i-10){
            output_high(PIN_B0);
            delay_us(i);
            output_low(PIN_B0);
            delay_ms(10);
        }
        printf("\f");
        printf("POSICION --> 0 GRADOS\r\n");
 
        printf("ESCRIBA LA POSICION QUE QUIERE:\r\n");
        printf("45 GRADOS -->(Q)\r\n");
        printf("90 GRADOS -->(W)\r\n");
        printf("135 GRADOS -->(E)\r\n");
        printf("180 GRADOS -->(R)\r\n");
 
        do{
            POSICION=getch();
        }while(POSICION!='Q' && POSICION!='W' && POSICION!='E' && POSICION!='R');
 
        if (POSICION=='Q'){
            a=1000;
        }
        else if (POSICION=='W'){
            a=1500;
        }
        else if (POSICION=='E'){
            a=2000;
        }
        else if (POSICION=='R'){
            a=2500;
        }
 
        output_high(PIN_B0);
        delay_us(a);
        output_low(PIN_B0);
        delay_ms(5000);
        goto INICIO;
 
}
 
void config(void){
        set_tris_a(0x21);
        set_tris_b(0x00);
        setup_comparator(NC_NC_NC_NC);
}

Una Pregunta:

#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT

He resaltado el oscilador interno en la palabra de configuración, pues luego el reloj interno no trabaja maximo a 4MHz?

#fuses HS,NOWDT,NOLVP,MCLR,NOPROTECT

No quedaria mejor asi Para que el PIC corra a 20MHz con cristal externo? Si estoy mal corrijame.

Será que también se puede programar el cristal interno a 20 MHz?

Gracias.

Lo compile en CCS y lo simule en ISIS Proteus de esta forma y me salio.

Gracias.
 
Última edición:
Una Pregunta:

#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT

He resaltado el oscilador interno en la palabra de configuración, pues luego el reloj interno no trabaja maximo a 4MHz?

#fuses HS,NOWDT,NOLVP,MCLR,NOPROTECT

No quedaria mejor asi Para que el PIC corra a 20MHz con cristal externo? Si estoy mal corrijame.

Será que también se puede programar el cristal interno a 20 MHz?

Gracias.

Lo compile en CCS y lo simule en ISIS Proteus de esta forma y me salio.

Gracias.
Cuando se usa la configuración de Oscilador interno siempre correra a 4Mhz.
Esa es la maxima velocidad del 16F628 para oscilador interno. :apreton:
 
hola gcgiron como muchos compañeros lo han dicho es muy importante que revises la hoja de datos del pic que utilizas, en este pic al configurar el oscilador interno, el pic correra a 4 MHz, el cual es suficiente creo yo para manejar 2400 bauts, de igual ten mucho cuidado cuando simules en proteus ya que pasa muchas cosas por alto vale saludos,
 
Hola a todos,

Estoy interesado en empezar con C y este foro es ideal para el objetivo, solo que tengo algunas dudas respecto al mplab ide... estuve probando algunos ejemplos básicos que, supongo están probados ya, pero no logré que funcionara ninguno de ellos, siempre me presenta el error de que no existe el archivo referido al pic, sea el 16f628 o 16f877, probé con la version 8.84 y obtengo el mismo resultado, acaso existen limitaciones en las mismas o hay que instalar más librerías... no sé, espero que alguien pueda orientarme al respecto pues si no logro hacer funcionar lo más básico, cómo avanzo?

Como siempre, gracias a mil y felicitaciones por los programas.
 
que onda DEPREDADORX1

para poderte ayudar necesito saber si utilizas CCS o que "C" utilizas, ahora para mas fácil copia los archivos 16f628.h en tu proyecto; si puedes dar mas información tal vez podríamos apoyarte mas
suerte
 
Gracias por contestar,

Acabo de instalar Mplab ide 8.30, la idea es trabajar en c pues quiero guiarme también por los tutos de Cesar Cansino que parecen muy buenos. Quisiera comentar que revisando la carpeta include me he dado cuenta que no existe referencia al pic 16f628 ni tampoco al 16f877, supongo que debe haber restricciones de algun tipo pero no lo tengo claro, gracias por responder.

Ah, por cierto, para una muestra del problema:
Error [141] E:\PROGRAMACION DE MICROCONTROLADORES EN C++\PROYECTOS 1\parpadeo led.c; 1.19 can't open include file "16f628a.h": No such file or directory
 
Última edición:
hola!
El error que pones no me dice nada lo siento, si podrías poner que compilador de C utilizas, ya que recuerda que Microchip no tiene un compilador de C para los pic16fxxxx, sin embargo existe CCS el cual es un compilador compatible con MPLAB.

Otra sugerencia es que pongas el código de tu programa para tener una mejor idea de lo que pasa,

tambien porque no intentas con Micro C de mikroelectronika es muy buena la versión gratuita y sirve bien para los pic16fxxxx
suerte
 
Hola y gracias nuevamente,

Pues uso el Hitec c pro, supongo que es una versión con limitaciones, pero me parece raro para un código tan básico como los planteados aquí en la primera página. Respecto al micro C, pues todo dependería que tantas variaciones tenga con respecto a lo que se trata aquí y en los tutos del señor Cancino, de cualquier forma, googlearé a ver que tal me va.
 
Buenas, buenas!
Soy nuevo en el foro, y sé que ustedes me podrán ayudar con esto

Es respecto al uso de algunos tipos de terminos a la hora de programar
Necesito que me expliquen como se llaman, para que sirven, cuando y porqque los utilizamos los siguientes comandos:


TMRO
PCL
Status
FSR
TRIS (a....e)
Port (a.....e)

y que se refiere cuando hablan de BCS y BCF

PD: en mi materia a cursar, usaremos el PIC16f887 y para compilar el programa Assembler
gracias por su atención y sigan ayudandonos y motivandonos en esta materia =]
 
hola a todos necesito ayuda con mi proyecto de grado

necesito dllar un programa para un pic 16f876a con el cual debo controlar dos servo motores hobby yo lo hice uno en mikcroC el cual me simula muy bien a la hora de montarlo en proteus pero lo necesito en MPLAB Y mejor si es MPLABX lo he intentando y no me da a continuación dejo el codigo les agradesco mucho en lo que me pudieses colaboraras ya que esto es para mi proyecto de grado de antemano muchas grasias
 

Adjuntos

  • evide.rar
    14.3 KB · Visitas: 25
#byte TRISB=0x86
#byte PORTB=0x06

La primera, declara la posición del reg trisb en el banco de memoria uno
la segunda hace los mismo con el reg portb pero en el banco de memoria cero

El trisb, sirve para configurar en que modo trabajara el port, entradas o salidas o combinadas, unas entradas otras salidas
Puedes ver esto en el mapa de memoria en el datasheet.

El portb se refiere al puerto físico o los pines del PIC, con este nombre. Es por donde saldrá o entrara la
información que manejes en el PIC, según configuración del trisb.

Se declaran, para que el compilador los reconozca, cuando sean nombrados en alguna parte del programa, y no cause error de compilación
 
por decir vi este ejemplo:



////////////////////////////////////////////////////////////////////////////////////
// VsZeNeR"05
// 6/Agosto/05
//
//Programa: Parpadeo de un led cada 0.5s
//Version: 0.0
//
//Dispositivo: PIC 16F648A Compilador: CCS vs3.227
//Entorno IDE: MPLAB IDE v7.20 Simulador: Proteus 6.7sp3
//
//Notas: Parpadeo de un led cada 0.5s por el pin RB0 del puerto B
//////////////////////////////////////////////////////////////////////////////////

#include <16f648a.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#use fast_io(b)

///PROGRAMA
void main(void)
{
set_tris_b(0xFE); //portb como salida(RB0,las demas desactivadas)
disable_interrupts(GLOBAL); //todas las interrupciones desactivadas

do{
output_low(PIN_B0); //led off
delay_ms(500);
output_high(PIN_B0); //led on
delay_ms(500);
}while(TRUE); //bucle infinito
}



por que no se declara el puerto b como entrada y salidas y simplemente se pone:

set_tris_b(0xFE);

y no:

#byte TRISB=0x86
#byte PORTB=0x06

lo que no entiendo es cuando utilizar estos comandos o son equivalentes?
 
no no no.
set_tris_b(0xFE); esta confuigurando el registro como RB0=salida
RB1...RB7, como entradas, esta usando notacion hexadecimal, 0xFE
el binario es asi,B'11111110' es donde se ve claro como queda configurado este registro de 8 bits
#BYTE, es una directiva.
set_tris, es una instrucción
Para mayor claridad ve al principio del este tema, alli podras aclarar tus dudas
Todo esta muy bien explicado.
 
eso si lo entiendo es que lo que pasa es de que me tope con un tutorial y de ahí fui haciendo un programa
que es este:

Código:
#include <16f76.h>
#use delay (clock=4000000)
#fuses XT,NOWDT,NOPUT,NOPROTECT

#byte PORTB=0x06       
#byte PORTC=0x07

int dato;

void main(void)
  
  
    {
    
      set_tris_b(0x00);
      set_tris_c(0xff);
      portb=0x00;
      
         while (true)
            {
              dato= portc;
              switch(dato)
                     {
              case 1: PORTB =0xff;
              break;
              
              case 2: portb=0b00001111;
              break;
              
              
              case 3: portb=0b00111100;
              break;
              
              default: portb=0x00;
              break;
              
                          
                     }
              
            }
    
    }

es que no se que función tiene :

#byte PORTB=0x06
#byte PORTC=0x07

por lo que me dices se que es un variable de tipo byte
pero a la hora de modificar la direccion de donde quero que se guarde el dato me marca error :S
 
Última edición por un moderador:
Atrás
Arriba