Autor Tema: EJEMPLOS PARA PIC16F877 CON CCS  (Leído 29237 veces)

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

Desconectado faypert

  • PIC10
  • *
  • Mensajes: 6
EJEMPLOS PARA PIC16F877 CON CCS
« 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.

Desconectado faypert

  • PIC10
  • *
  • Mensajes: 6
RE: EJEMPLOS PARA PIC16F877 CON CCS
« Respuesta #1 en: 31 de Marzo de 2006, 11:23:00 »
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);
}

Desconectado faypert

  • PIC10
  • *
  • Mensajes: 6
RE: EJEMPLOS PARA PIC16F877 CON CCS
« Respuesta #2 en: 31 de Marzo de 2006, 11:31:00 »
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);
}
}

Desconectado faypert

  • PIC10
  • *
  • Mensajes: 6
RE: EJEMPLOS PARA PIC16F877 CON CCS
« Respuesta #3 en: 31 de Marzo de 2006, 11:56:00 »
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);

  }

}


Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: EJEMPLOS PARA PIC16F877 CON CCS
« Respuesta #4 en: 31 de Marzo de 2006, 12:43:00 »
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!!!Giño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
RE: EJEMPLOS PARA PIC16F877 CON CCS
« Respuesta #5 en: 31 de Marzo de 2006, 14:03:00 »
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.

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado ALE1973

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 229
Re: EJEMPLOS PARA PIC16F877 CON CCS
« Respuesta #6 en: 09 de Abril de 2006, 11:48:39 »
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.

Desconectado totuer

  • PIC10
  • *
  • Mensajes: 31
Re: EJEMPLOS PARA PIC16F877 CON CCS
« Respuesta #7 en: 07 de Enero de 2009, 16:05:08 »
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:

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: EJEMPLOS PARA PIC16F877 CON CCS
« Respuesta #8 en: 07 de Enero de 2009, 19:17:48 »
Lo fundamental de lo que he hecho de RS485 lo puedes encontrar en El RS485, un Relé en la lejanía: Hardware y Software y un extracto con lo básico lo tienes en este post del hilo sobe la RRBOARD2 Tambien te recomiendo el hilo Control para un Malacate - RS485 del amigo MLO


Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado totuer

  • PIC10
  • *
  • Mensajes: 31
Re: EJEMPLOS PARA PIC16F877 CON CCS
« Respuesta #9 en: 12 de Enero de 2009, 10:13:57 »
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.