Programas hechos en MPLAB

No seas malo ayudame a aprender a programar en c los microcontroladores...

mplab....ya lo descarge

se que no tiene compilador en c, tambien ya lo descarge.

ahora ya los instale en mi compu...pero...eso es suficiente...?

como escribo? como programo??

he hecho pruebas con programas cortos, como el tuyo por ejemplo, pero y despues que hago??

gracias por tu ayuda!!


La pregunta no es que hago despues? la pregunta es que quiero hacer?...primero has como dice moyano, empieza sobre lo mas basico, instrucciones como funcionan, las bases , si nunca has porgramado un microcontrolador en algun lenguaje se te va hacer tan complejo, que te aburriras de intentar entener lo que estas haciendo, te recomiendo empezar a programar micros desde cero, usando MPLAB con el lenguaje de bajo nivel que es el ensamblador que tiene por defauilt MPLAB...te recomiendo a que programes primero por hay, para que empiecez a entender mucho mejor las cosas...te lo recomiendo al 100%. pero deplano si quieres aprender directamente C te recomiendo a que busque info en google sobre intrucciones en C, como funcionan? configuraciones de modulos internos del micro, como funcionan? y asi...Los porgramas que subo en este espacio son directos, en pocas palabras es bajar, probar, hacer y entender...Solo es lo que pretendo en este tema programas hechos en CCS C no es nada un curso completo de como porgramar un micro....

Saludos...y Suerte...aqui andaremos....
 
que tal amigos, por fin logre entender como hacer el programa que queria, aunque no use interrupciones se los pongo para que lo vean y espero les ayude a entender como a mi me ayudo a conocer mas del lenguaje c

este programa es un contador de pulsos cada vez que oprimas el push tendras un numero y sera impreso en un lcd


#include <16f876a.h>//se determina con el pic a trabajar
#fuses HS,NOWDT,NOPROTECT,PUT,NOLVP//se configura el pic
#use delay (clock=20000000)//se configura la velocidad de frecuencia
#define use_portb_lcd TRUE //definimos el portb paa usar el lcd
#include <lcd.c> //se manda a traer la libreria del lcd

void main() //comienza el programa
{
int i=0,j=0,h=0,g=0,z=0;//e definen las variables para hacer el conteo
lcd_init();//se inicializa el lcd
printf(lcd_putc," contador de\n pulsos"); //ponemos una introduccion

do//se eliminan los rebotes mientras es pulsado el boton
{

}while(input(PIN_A0)==1);
printf(lcd_putc,"\f");//borra lo que tenga el lcd
lcd_gotoxy(7,1); //nos dirigimos al centro del lcd
for(;;)//ciclo infinito
{
if(!input(PIN_A0))//checamos si el boton a sido pulsado
{
do
{

}while(!input(PIN_A0));//se eliminan rebotes
if(i>9)//si i es mayor a nueve
{ //entonces ponemos a i a cero de nuevo
i=0;
j++; //incrementamos j
if(j>9)//si j es mayor a 9
{
J=0;//mandamos a j a cero
h++;//incrementamos h
}
if(h>9)//si h es mayor a 9
{
h=0;//mandamos a cero
g++;//incrementamos g
}
if(g>9)//si g mayor a 9
{
g=0;//igualamos g a cero
z++;//incrementamos z
}
if(z>9)//si z mayor a 9
{
z=0;//igualamos a cero a z
delay_ms(100);
}

}
printf(lcd_putc,"%u%u%u%u%u",z,g,h,j,i); //mandamos a imprimir los datos al lcd
printf(lcd_putc,"\b\b\b\b\b"); //retrasa el cursor una posicion(escribe encima)
i++; //incremento contador indice tabNum
}
} //...infinito
}

espero con ansias puedas subir el codigo del reloj einner saludos y seguire subiendo lo que vallla realizando
 
me gustaria saber cual sentencia es mejor para eiminar los rebotes
for(;;)
{ //bucle...
if(!input(PIN_A0)) //¿se ha pulsado el boton?
{
delay_ms(151); //SI -> retardo para evitar los rebotes
i++; //incremento contador indice tabBCD
if(i>9) //¿se ha mostrado digito 9?
i=0; //SI -> restaura valor indice(para mostrar digito 0)
output_b(tabBCD); //muestra por portb digito 7 segmentos
}
while(!input(PIN_A0));
delay_ms(151);
} //...infinito


o esta
do//se eliminan los rebotes mientras es pulsado el boton
{

}while(input(PIN_A0)==1);
printf(lcd_putc,"\f");//borra lo que tenga el lcd
lcd_gotoxy(7,1); //nos dirigimos al centro del lcd
for(;//ciclo infinito
{
if(!input(PIN_A0))//checamos si el boton a sido pulsado
{
do
{

}while(!input(PIN_A0));//se eliminan rebotes
 
Hola Amigos, he querido comenzar por hacer encender un led, al parecer el programa esta bien, pero cuando hago la simulación en proteus me dan errores. Les dejo los archivos por si me regalan su ayuda, GRACIAS:)

Saludos!!!!!!!
 

Adjuntos

  • ENCIENDE_LED.rar
    68.2 KB · Visitas: 134
que tal samaelsys, si solo quieres encender un led no es necesario tantas lineas en tu codigo, para mi solo seria esto
#include <16f877.h>
#fuses HS,NOWDT,NOLVP,NOPROTECT
#use delay(clock=20000000)
#byte TRISB=0x86
#byte PORTB=0x06


void main(void){
TRISB=0x00;
PORTB=0x00;
do{
output_high(PIN_B0);
delay_ms(1000);
}while(TRUE);

}

o a la mejor quieres hacer otra cosa, si es asi dimeloo y me gustaria poder ayudarte
 
Gracias robotec, te agradesco tu aporte, probe el programa así y me dio error, no se si le hechaste un viztaso al diseño del circuito, ya q tampoco se mucho acerca de diseños de circuito, a lo mejor algo esta mal conectado.

contestando a tu pregunta y gracias nuevamente por tu ayuda ofrecida, por ahora solo quiero poder encender leds y comenzar a progresar poco a poco, hasta poder controlar un motor paso a paso. espero me ayudes amigo, se te agradece muchiiisimo

Saludos!!!:)
 
hola robotec

habia abandonado un poco el foro pues estaba algo ocupado, pero a mas tardar manana subo el cronometro e c, por el momento lo dejo en asembler

cualquier duda aqui estoy.......

saludos

nota: para establecer una hora cuando esta en 000000 se da up/down. 00 00 00 d y sttart, hay se borra el display y va digitando la hora y cuando termines le da start..
 

Adjuntos

  • CRONO.rar
    19.7 KB · Visitas: 170
samaelsys.
El problema que tienes, es que el proteus no esta cargando el codigo en el pic
si pinchas sobre [pic16] program property not especified, que esta diciendo
propiedad del programa no especificada para el pic 16. encontraras que en el menu desplegable
aparece la forma de cargar el hex cof etc en el pic; esto es por que no lo reconoce..
Debe ser algun tipo de problema en la instalacion de tu proteus, o si es un demo puede ser por ahy..
Te regreso un archivo en mi proteus exactamente igual al tuyo; debe funcionar;en el mio lo hace
pero no el que tu subiste..
Ojo. Estas configurando oscilador Rc en el programa, y estas usando cristal en la simulacion
En la simulacion no importa, pero si lo armas puede causar problemas..
Suerte
Ver el archivo adjunto ENCIENDE_LED.rar
 
samaelsys.

la verdad no pude abrir tu dns, pero arme uno, para hacer lo que pides y no me marca error; lo mas seguro como comenta cosmico sea error de instalcion del proteus, te recomiendo lo vuelvas a instalar, y si el problema sigue comentalo para ver la manera de solucionarlo.

einner gracias por tu ayuda, yo sigo en la lucha de poder lograrlo, una ayudadita no me caeria mal saludos
 
Saludos, la verdad es que este foro esta muy completo y quiero felicitar a todas las personas que contribuyen al conocimiento de las demas personas por medio de ejemplos didacticos

Bueno quisiera ver si me pueden ayudar a mi problema, estoy tratando de usar el puerto serial de la PC conectado a un pic, bueno el programa del pic ya lo tengo, pero el problema es la interfaz de la computadora, e visto los ejemplos expuestos por george.manson.69 y quisiera pedirles aver si me pueden facilitar un tutorial sencillo de c#, no quiero algo muy complejo, simplemente con que viniera como crear un codigo sencillo y controlar el puerto serial se los agradeceria mucho
 
Saludos, la verdad es que este foro esta muy completo y quiero felicitar a todas las personas que contribuyen al conocimiento de las demas personas por medio de ejemplos didacticos

Bueno quisiera ver si me pueden ayudar a mi problema, estoy tratando de usar el puerto serial de la PC conectado a un pic, bueno el programa del pic ya lo tengo, pero el problema es la interfaz de la computadora, e visto los ejemplos expuestos por george.manson.69 y quisiera pedirles aver si me pueden facilitar un tutorial sencillo de c#, no quiero algo muy complejo, simplemente con que viniera como crear un codigo sencillo y controlar el puerto serial se los agradeceria mucho

He subido un pequeño ejemplo en este tema
de programas hechos en C18
y utiliza un software hecho en c#express 2010, para que te des una idea como se hace un enlace serial. Espero que sea de ayuda...Saludos
 
hola a todos mis amigos les escribo el dia de hoy por q necesito hacer que el 16F84A o el 16F628, sean capaces de recibir un voltaje analogico dado por un termopar que se encuentra conectado a los PIN_A0 y PIN_A1. verdaderamente soy un novato con respecto a la programacion de este estilo y estoy usando el lenguaje C atravez del programa llamado CCS C pero no conosco el set de instrucciones que pueden recivir los PIC.

ahora la cuestion es q e leido q los 16f84A y el 16f628 no son capaces de hacer la convercion A/D que necesito q realicen ya q una ves obtenido el valor del termopar en voltaje se supone que voy a dar 8 salidas digitales que van 4 a un 7 segmento y los otros 4 a otro 7 segmento con sus display apropiado.

pero igual me interesa conocer como realizar el codigo si porfavor me pueden ayudar se lo agradeceria muchisimo saludos a todos.
 
cosmico y robotec mil gracias por su ayuda...:aplauso:

cosmico con el diseño q me eniviaste funciona a la perfección, quite lo del oscilador RC y sigue funcionando bien, ahora le he instalado un motor paso a paso, pero todavia no me gira por completo, estoy investigando para eso!! por ahora lo conecto directamente al pic, pero en el futuro kiero hacerlo con el ULN2803.

gracias amigos, espero me puedan ayudar siempre!!

saludos!!!!
 
hola!..como veran soy nuevo en el foro y la verdad este tema esta muy interesante con muchisimos ejemplos didacticos...me interesa mucho introducirme en el mundo de la programacion de pics con C, pero tengo uan duda....estuve viendo el ccs pero vi que es solamente de pago, o existe para bajarselo gratis?? de antemano gracias por la respuesta.
 
No , es de pago su licencia vale creo que U$S 100. Para programar gratis en C podés optar por el C18 lite que lo ofrece microchip pero solo sirve para PIC's 18F ahora también creo que está el HI - TEC lite para PIC16 pero no lo he probado.
 
hola como estan todos les pido su ayuda para q me ayuden en un codigo aqui les adjunto un archivo q tengo donde solo es un contador de dos digitos multiplexado.
pero ahora me piden que en vez de usar los display use leds para que se vea como codigo binario ademas de mostrar segundos minutos y horas y que me de 10 tonos audibles cada 10 segundos si uds tienen una idea para terminar este codigo y modificarle les agradezco

adjunto va el documento en word del multiplexado el otro doc es el dsn en proteus del resultado final como debe quedar solo habria q cargarle el coigo que les pido q me ayuden
gracias

;*********************************************************************
; CONTADOR DE DOS DIGITOS MULTIPLEXADO CON DISPLAY DE
; SIETE SEGMENTOS USANDO EL TMR0 COMO BASE DE TIEMPO
; DE 10ms (10x100) PARA INCREMENTAR SU VALOR CADA
; SEGUNDO DE 00-99
;*********************************************************************
; NOMBRE: p5c_2dm.asm
; FECHA: 21/06/2010
; VERSION: 1.00
; PROGRAMADOR: Juan Ruiz
;*********************************************************************
; DESCRIPCION:
;Se trata de incrementar un contador cada segundo y mostrar
;su valor en dos displays colocados en el puerto B usando la
;técnica de multiplexación. Uno para unidades y otro para
;decenas. Los displays se refrescan cada 20ms. El tmr0 se
;programa para que genere una interrupción cada 0.01 seg.
; (10 mS) que se repetirá 100 veces con el objeto de activar
;el conteo cada 1000 mS. Use un reloj de 4MHz.
;*********************************************************************
;DIRECTIVAS

LIST p=16F887 ;Tipo de microcontrolador
INCLUDE P16F887.INC ;Define los SFRs y bits del
;P16F887

__CONFIG _CONFIG1, _CP_OFF&_WDT_OFF&_XT_OSC
;Setea parámetros de
configuración

errorlevel -302 ;Deshabilita mensajes de
;advertencia por cambio
;bancos
UDATA
contador RES 1 ;Cuenta 100 interrupciones
unidades RES 1
uni_cod RES 1
decenas RES 1
dec_cod RES 1
sel RES 1
;*********************************************************************
;PROGRAMA
ORG 0x00 ;Vector de RESET
GOTO MAIN
ORG 0x04 ;Vector de interrupción
GOTO Interrupcion ;Va a rutina de interrupción

;DURANTE LA INTERRUPCION SE CUENTAN 100 INTERRUPCIONES
;PARA COMPLETAR 10x100=1000ms.
Interrupcion
movf sel,w ;Se mueve a si mismo para afectar bandera
btfss STATUS,2 ;sel=0 refresca dig1; sel=1 refresca dig2
goto dig2
dig1
movf unidades,w
call tabla
movwf uni_cod
movf uni_cod,w
bsf PORTA,0
bsf PORTA,1
movwf PORTB
bcf PORTA,0
comf sel,f
goto dec
dig2
movf decenas,w
call tabla
movwf dec_cod
movf dec_cod,w
bsf PORTA,0
bsf PORTA,1
movwf PORTB
bcf PORTA,1
comf sel,f
dec

decfsz contador,f ;cuenta espacios de 10ms
goto Seguir ;Aún, no son 100 interrupciones
INCF unidades,f ;Ahora sí 10x100=1000ms=1seg
movlw .10
subwf unidades,w
btfss STATUS,2
goto cont
clrf unidades
incf decenas
movlw .10
subwf decenas,w
btfss STATUS,2
goto cont
clrf decenas

cont
movlw .100
movwf contador ;Carga contador con 100

Seguir
bcf INTCON,T0IF ;Repone flag del TMR0
movlw ~.39
movwf TMR0 ;Repone el TMR0 con ~.39
retfie ;Retorno de interrupción

MAIN
;SETEO DE PUERTOS
BANKSEL ANSEL ;Selecciona el Bank3
CLRF ANSEL
CLRF ANSELH
BANKSEL TRISA ;Selecciona el Bank1
CLRF TRISA ;PORTA configurado como salida
CLRF TRISB ;PORTB configurado como salida

;INICIALIZACION
BANKSEL PORTA ;Selecciona el Bank0
CLRF PORTA ;Borra latch de salida de PORTB
CLRF PORTB ;Borra latch de salida de PORTC
clrf unidades
clrf decenas
clrf sel

;PROGRAMACION DEL TMR0
banksel OPTION_REG ;Selecciona el Bank1
movlw b'00000111' ;TMR0 como temporizador
movwf OPTION_REG ;con preescaler de 256
BANKSEL TMR0 ;Selecciona el Bank0
movlw .217 ;Valor decimal 217
movwf TMR0 ;Carga el TMR0 con 217

;PROGRAMACION DE INTERRUPCION
movlw b'10100000'
movwf INTCON ;Activa la interrupción del TMR0
movlw .100 ;Cantidad de interrupciones a contar
movwf contador ;Nº de veces a repetir la interrupción

Loop
nop
goto Loop

; TABLA DE CONVERSION---------------------------------------------------------

tabla
ADDWF PCL,F ; PCL + W -> W
; El PCL se incrementa con el
; valor de W proporcionando un
; salto
RETLW 0x3F ; Retorna con el código del 0
RETLW 0x06 ; Retorna con el código del 1
RETLW 0x5B ; Retorna con el código del 2
RETLW 0x4F ; Retorna con el código del 3
RETLW 0x66 ; Retorna con el código del 4
RETLW 0x6D ; Retorna con el código del 5
RETLW 0x7D ; Retorna con el código del 6
RETLW 0x07 ; Retorna con el código del 7
RETLW 0x7F ; Retorna con el código del 8
RETLW 0x67 ; Retorna con el código del 9
END ; Fin del programa fuente

;CALCULO DEL VALOR A CARGAR EN TMR0 A 4MHz
;PARA OBTENER TEMPORIZACION DE 10 MILISEGUNDOS
;CON PREESCALADOR DE 1:256
;Temporización=(4Tosc)(256-ValorTMR0)(preescalador)
;0.010=(4Tosc)(256-ValorTMR0)(256)
;ValorTMR0=217
 
Atrás
Arriba