TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: faypert en 31 de Marzo de 2006, 11:01:00
-
EN ESTE LUGAR PUEDEN PUPLICAR SUS PROYECTOS DEL MICROCONTROLADOR
PIC16F877 QUE ES UNO DE LOS MEJORES MICROS Y DISPOMIBLE EN EL MERCADO
Y DE APLIO USO.
-
PARA EMPESA AQUI TENEMOS UN ELEMPLO SIMPLE PARA COMUNICAR PC-PIC Y PIC-PC
PRONTO SE ADJUNTARA EL CIRCUITO Y YL FUNCIONAMIENTO
#include <16F877.H>
#device *=16
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
void ABM(int16 msg_format[2][3]);
char array[10] = {0x55,1,2,3,4,5,6,7,8,9};
#locate array = 0x190
void main()
{
int16 msg_ptr_array[2][3];
msg_ptr_array[1][2] = array;
ABM(msg_ptr_array);
while(1);
}
void ABM(int16 msg_format[2][3])
{
char *ptr;
ptr = msg_format[1][2];
printf("ptr = %lx, *ptr = %x ", ptr, *ptr);
}
-
INTERRUPCION DE UN LED
//////////////////////////////////////////////
#include<16f877.h>
#use delay(CLOCK=10000000)
#int_timer1
intval() {
int, flag1;
set_timer1(0x8000);// 1sec
if(flag1 == 0) {
output_high(PIN_B7); //LED off
flag1 = 1;
}
else {
output_low(PIN_B7); //LED on
flag1 = 0;
}
}
main() {
int flag;
set_tris_b(0); //all output
output_high(PIN_B7); //LED off
setup_timer_1(T1_EXTERNAL_SYNC | T1_CLK_OUT | T1_DIV_BY_1);
set_timer1(0x8000); //initial set
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
while(1) {
if(flag == 0) {//key input
output_high(PIN_B6); /LED2 on
flag = 1;
}
else {
output_low(PIN_B6); //LED2 off
flag = 0;
}
delay_ms(1000);
}
}
-
ESTE ES UN EJEMPLO MUY COMPLEJO DE MEDIR LA DISTACIO POR REVOTE
umss universit.
//ejemplo:831
// Ultrasonico PIC coddigo
//04/Mar/2006
//medicion de distancia por ultrasonico 1200mm
//modificacion#7
#include <16f877.h>
#fusesXT, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT, NOLVP
#use delay (clock=20000000)
#use RS232 (baud=9600, XMIT=PIN_C6, RCV=PIN_C7)
#define LEDL PIN_D7
#define LEDM PIN_D6
#define LEDR PIN_D5
#define TXRXSEL PIN_E0
#define USSTATE PIN_E1
#byte b_port=0x06
#define usl_driveH 0b00010000
#define usl_driveL 0b00000010
#define usm_driveH 0b00010000
#define usm_driveL 0b00000100
#define usr_driveH 0b00010000
#define usr_driveL 0b00001000
#define usall_short 0b00000000
struct INTCONmap
{
boolean RBIF;
boolean INTF;
boolean T0IF;
boolean RBIE;
boolean INTE;
boolean T0IE;
boolean PEIE;
boolean GIE;
} INTCON;
#byte INTCON=0x0b
byte pulseLeftTX()
{
int i;
byte rx_range,ct;
set_tris_b(0b00000001);
/ output_low(PIN_B0);
for (i=0; i<8; i++)
{
b_port=usl_driveH;
output_high(PIN_B1);
delay_us(12);
b_port=usl_driveL;
output_low(PIN_B1);
delay_us(11);
}
b_port=usall_short;
set_tris_b(0b10000001);
set_rtcc(0);
INTCON.INTF=0;
INTCON.T0IF=0;
rx_range=0xff;
while (INTCON.T0IF==0)
{
if ((rx_range==0xff)&&(INTCON.INTF==1)) rx_range=get_rtcc();
}
for (ct=0;ct<3;ct++) //wait for any echoes to go away...
{
set_rtcc(0);
INTCON.T0IF=0;
while (INTCON.T0IF==0) { }
}
return rx_range;
}
byte pulseMidTX()
{
int i;
byte rx_range,ct;
set_tris_b(0b00000001);
output_low(PIN_B0);
for (i=0; i<8; i++)
{
b_port=usm_driveH;
output_high(PIN_B3);
delay_us(12);
b_port=usm_driveL;
output_low(PIN_B3);
delay_us(11);
}
b_port=usall_short;
set_tris_b(0b00100001);
set_rtcc(0);
INTCON.INTF=0;
INTCON.T0IF=0;
rx_range=0xff;
while (INTCON.T0IF==0)
{
if ((rx_range==0xff)&&(INTCON.INTF==1)) rx_range=get_rtcc();
}
for (ct=0;ct<3;ct++)
{
set_rtcc(0);
INTCON.T0IF=0;
while (INTCON.T0IF==0) { }
}
return rx_range;
}
byte pulseRightTX()
{
int i;
byte rx_range,ct;
set_tris_b(0b00000001);
change time
output_low(PIN_B0);
for (i=0; i<8; i++)
{
b_port=usr_driveH;
output_high(PIN_B3);
delay_us(12);
b_port=usr_driveL;
output_low(PIN_B3);
delay_us(11);
}
b_port=usall_short;
delay_us(400);
set_tris_b(0b01000001);
set_rtcc(0);
INTCON.INTF=0;
INTCON.T0IF=0;
rx_range=0xff;
while (INTCON.T0IF==0)
{
if ((rx_range==0xff)&&(INTCON.INTF==1)) rx_range=get_rtcc();
}
for (ct=0;ct<3;ct++) //wait for any echoes to go away...
{
set_rtcc(0);
INTCON.T0IF=0;
while (INTCON.T0IF==0) { }
}
return rx_range;
}
void serialCheck(byte rangeL, byte rangeM, byte rangeR)
{
char c;
if (kbhit())
{
c = getc();
if (c == "*")
{
output_low(USSTATE);
output_high(TXRXSEL);
delay_ms(5);
delay_us(10);
putc(rangeL);
delay_us(10);
putc(rangeM);
delay_us(10);
putc(rangeR);
delay_us(50);
output_low(TXRXSEL);
}
}
}
void scanSerial()
{
char c;
c = getc();
}
void main(void)
{
byte rangeL, rangeM, rangeR;
#use fast_io(B)
#use fast_io(E)
#use fast_io(D)
#use fast_io(C)
SET_TRIS_B(0x00);
SET_TRIS_D(0x00);
SET_TRIS_E(0x00);
SET_TRIS_C(0b10000000);
output_low(TXRXSEL);
output_high(USSTATE);
output_high(LEDL);
output_high(LEDM);
output_high(LEDR);
setup_counters(RTCC_INTERNAL,RTCC_DIV_64);
rangeL = 0xff;
rangeM = 0xff;
rangeR = 0xff;
while(true)
{
output_high(USSTATE);
serialCheck(66,66,66);
output_low(USSTATE);
serialCheck(66,66,66);
}
while(TRUE)
{
rangeL = pulseLeftTX();
serialCheck(rangeL, rangeM, rangeR);
rangeM = pulseMidTX();
serialCheck(rangeL, rangeM, rangeR);
rangeR = pulseRightTX();
serialCheck(rangeL, rangeM, rangeR);
if (rangeL < 38)
output_high(LEDL);
else
output_low(LEDL);
if (rangeM < 38)
output_high(LEDM);
else
output_low(LEDM);
if (rangeR < 38)
output_high(LEDR);
else
output_low(LEDR);
}
}
-
Buenas!!!me parece magnifico tu aporte mediante ejemplos pero ummmm por ejemplo, en este ultimo programa, el de ultrasonico, porque no realizas una breve explicacion del proyecto e indicas los componentes a usar...es una sugerencia para todos tus programas que postees, lo digo porque sino, me parece, que quien entre y vea tu codigo sin explicacion de su hardware pues va a ver simplemente codigo.....es una sugerencia y a seguir aportando mas al foro!
Suerte!!!
-
Me uno al consejo dado por el maestro vszener. Dale un poco de forma y quedarán
tus ejemplos mucho mas entendibles por nuestros amigos y visitantes.
Con [ c o d e ] (sin espacios) delante del código y [ / c o d e ] (sin espacios) tras él
podras tambien ajustarle la identación y será legible al 100%. Además una buena
práctica es comentar las funciones e incluso las lineas del código, así nuestros amigos
menos puestos en programación saben qué hace cada una de ellas y tienen mucho
mas claro qué es lo que se pretende y cómo se dice eso en C.
Puedes, si quieres, darte una vuelta por nuestros propios post para ver cómo lo
hacemos nosotros mismos.
Ejemplitos en C para 16F648A de vszener
Microcursillo en C de Nocturno ó
Ejemplitos 16F87A de un servidor de ustedes.
Bienvenido al foro y muchas gracias por tus aportes a los amigos Picmaníacos.
-
Bueno, no sabia bien donde hacer esta pregunta, pero ya que estan con ejemplos, tengo una duda del ejemplo que ha dado RedPic, del rs232 buffered, estoy intentando hacerlo pero con rs485, y encuentro el problema que la directiva
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ENABLE=PIN_C5)
No habilita el pin_c5 para la transmision del dato por 485, ya probe habilitando manualmente (forzado a 5v), y el programa anda bien, pero al intentar que el pic lo habilite por el pin_c5, este no funciona.
Uso CCS PCM C Compiler, Version 3.249, 28193
Desde ya gracias...
Saludos.
-
Hola soy nuevo en el foro, me interesa el ejemplo de Rs485, podrias comentarlo mas y explicar el HW que usas.
Muchas gracias por el apote.
Pablo :mrgreen:
-
Lo fundamental de lo que he hecho de RS485 lo puedes encontrar en El RS485, un Relé en la lejanía: Hardware y Software (http://www.todopic.com.ar/foros/index.php?topic=19057.0) y un extracto con lo básico lo tienes en este post del hilo sobe la RRBOARD2 (http://www.todopic.com.ar/foros/index.php?topic=2300.msg74739#msg74739) Tambien te recomiendo el hilo Control para un Malacate - RS485 (http://www.todopic.com.ar/foros/index.php?topic=23175.0) del amigo MLO
-
Hola gran moderador es un honor me respondas, les cuento que ya logré mi red rs485 monitoreada con rs232 en una pc no será gran cosa pero por lo menos se hablan y contestan con algunas colisiones por el momento, cuando pula todo intentaré subir el codigo.GRACIAS.
PD RELE A LA LEJANIA ES UNA MAZA Y SE ENTIENDE BIE!! ANIMENSE CON EL 485.