Está en la página 1de 26

//////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// /// Practica 1 : Parpadeo de LEDS con PIC16F84A /// /// para el foro.elhacker.

net by Marco /// //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////

///////////////////////////// DIRECTIVAS DE PREPROCESADO ////////////////////// /// libreria para el manejo del pic16f84a #include <16F84A.h> /// declara la frecuencia del cristal #use delay(clock=8000000) ///configura los fusibles /// HS es la configuraricion del oscilador la cual indica High speed es decir /// frecuencias altas esto es a partir de 8 Mhz. /// NOWDT deshabilita el Watch Dog Timer /// NOPUT deshabilita le reseteo de power up timer /// NOPROTECT deshabilita la proteccion del codigo del pic. #fuses HS,NOWDT,NOPUT,NOPROTECT /// asignamos a variable port_b el espacio memoria 0x06 que es la dir de port_b #byte port_b=0x06 //////////////////////////GLOBALES////////////////////////////////////////////// /// Estos parmetros son visibles desde todo el cdigo /// /// por eso se les llama globales /// /// Al ser constantes,lo ms prctico es declararlas aqu. /// //////////////////////////////////////////////////////////////////////////////////// int contador; ////////////////////////// Principal ////////////////////////////////////////// void main() { /// declaramos el puerto B como salidas set_tris_b(0); /// lo igualamos con cero para que tengamos un valor inicial de lo contrario /// no sabriamos con que valor iniciaria al comienzo de nuestro programa port_b=0; /// bucle infinito para que las instrucciones que tiene siempre se ejecuten while (true) { /// activa todos los pins del puerto B /// otra instruccion que podemos poner es contador=255 las dos son lo mismo contador=0xff; port_b=contador; /// Retardo de 1000 milisegundos es decir 1 segundo delay_ms(1000); //// apaga todos los pins del puerto B}

contador=0x00; port_b=contador; /// Retardo de 1000 milisegundos es decir 1 segundo delay_ms(1000); } /// fin de bucle while } /// fin de funcion principal main aqui los archivos para PICC y Proteus

http://foro.elhacker.net/electronica/introduccion_a_la_programacion_de_pics_en_lenguaje_c_ccst174021.0.html;msg824964#ixzz1XwqeObLW

///////////////////////////////////////////////////////////////////////////////////////// /////////////////////////// Practica 2 ///////////////////////////////// // Esta practica pasa la informacion que hay en el puerto B y la pasa // // al puerto A // ///////////////////////// By Marco_recargado /////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////// #include <16F877A.h> #use delay(clock=8000000) /// libreria para el manejo del pic16f877a /// declara la frecuencia del cristal

#fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT

#use fast_io(B) #use fast_io(C) #byte portb = 6 #byte portc = 7

/// con esta instruccion evitamos que /// se este configurando cada vez que usamos /// alguna instruccion de entrada o salida // se definen las direcciones de memoria

void main(void) { while(true) { set_tris_b(0xff); set_tris_c(0x00); port_b_pullups(true); portc=portb; } }

// Bucle infinito // se configura el puerto A como entrada // se configura el puerto B como salida // activa las resistencias de pull-up

// fin de programa

http://foro.elhacker.net/electronica/introduccion_a_la_programacion_de_pics_en_lenguaje_c_ccst174021.0.html;msg824964#ixzz1Xwr126MY

//////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////Practica 3 /////////////////////////////////////////// ////////Visualiza un conteo por el PORTB a travez de dos display de 8 seg//////// ////////////////////////// By MARCO_RECARGADO/////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// #include <16F877A.h> /// libreria para el manejo del pic16f877a #use delay(clock=8000000) /// declara la frecuencia del cristal #fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT int conteo=0; #use #use #use #use #use fast_io(A) fast_io(B) fast_io(C) fast_io(D) fast_io(E) porta = 5 portb = 6 portc = 7 portd = 8 porte = 9

/// con esta instruccion evitamos que /// se este configurando cada vez que usamos /// alguna instruccion de entrada o salida

#byte #byte #byte #byte #byte

/// se definen direcciones de memoria

//////////////////////////////////////////////////////////////////////////////////// //////////////////////inicio del programa principal///////////////////////////// /////////////////////////////////////////////////////////////////////////////////// void main(void) { set_tris_b(0x00); while(true) { conteo++; if((conteo&0x0f)>9)

//bucle infinito

{ conteo=conteo+10; // hacemos que los 4 bits mas significativos incrementen conteo=conteo&0xf0; } if(conteo>99) {conteo=0;} // verificamos que la cuenta se haga de 0 a 99 else{ portb=conteo; delay_ms(400);} } //fin de ciclo while } //fin de programa

// aqui observamos si el primer display llego a 10 // para solo comparar los primeros 4 bit hacemos una // operacion and con 0x0f

http://foro.elhacker.net/electronica/introduccion_a_la_programacion_de_pics_en_lenguaje_c_ccst174021.0.html;msg844004#ixzz1XwroZ91m

//////////////////////////////////////////////////////////////////////////////// ////////////// Practica 2 ////////////////////// ////////////// practica que escribe en una LCD ////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////// By MARCO RECARGADO ////////////////////// //////////////////////////////////////////////////////////////////////////////// #include <16F877A.h> /// libreria para el manejo del pic16f877a #use delay(clock=8000000) /// declara la frecuencia del cristal #fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT #include <lcd.c> // Librera para el manejo del lcd para ver las conexiones // abran el archivo C:\Archivos de programa\PICC\Drivers\lcd.c // y ahi les muestra. //////////////////////////////////////////////////////////////////////////////// // D0 enable // D1 rs // D2 rw // D4 D4 // D5 D5 // D6 D6 // D7 D7 ////////////////////////////////////////////////////////////////////////////////

void main(void) { lcd_init(); // Antes de usar el lcd,hay que inicializarlo lcd_putc("HOLA MUNDO"); // Escribes en la lcd } // fin de programa http://foro.elhacker.net/electronica/introduccion_a_la_programacion_de_pics_en_lenguaje_c_ccst174021.0.html;msg857910#msg857910#ixzz1Xws9GKPj

//////////////////////////////////////////////////////////////////////////////// ////////////// Practica 2 ////////////////////// ////////////// practica que escribe en una LCD ////////////////////// //////////////////////////////////////////////////////////////////////////////// ////////////// By MARCO RECARGADO ////////////////////// //////////////////////////////////////////////////////////////////////////////// #include <16F877A.h> /// libreria para el manejo del pic16f877a #use delay(clock=8000000) /// declara la frecuencia del cristal #fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT #include <lcd.c> // Librera para el manejo del lcd para ver las conexiones // abran el archivo C:\Archivos de programa\PICC\Drivers\lcd.c // y ahi les muestra. //////////////////////////////////////////////////////////////////////////////// // D0 enable // D1 rs // D2 rw // D4 D4 // D5 D5 // D6 D6 // D7 D7 //////////////////////////////////////////////////////////////////////////////// int i; void main(void) { lcd_init(); // Antes de usar el lcd,hay que inicializarlo while (1){ lcd_gotoxy(5,1); lcd_putc("Martin"); // Escribes en la lcd delay_ms(50); for(i=0;i<8;++i){ lcd_putc("\fM\n"); delay_ms(30); lcd_putc("\f a\n"); delay_ms(30); lcd_putc("\f t\n"); delay_ms(30); lcd_putc("\f i\n"); delay_ms(30); lcd_putc("\f n\n"); delay_ms(30); }} } // fin de programa http://foro.elhacker.net/electronica/introduccion_a_la_programacion_de_pics_en_lenguaje_c_ccst174021.0.html;msg857910#msg857910#ixzz1XwsLTRQ0

Hola pues en esta ocasion la practica consiste en leer un reloj de tiempo real. con ayuda de una libreria //////////////////////////////////////////////////////////////////////////////// ////////////ESTE PROGRAMA UTILZA EL CIRCUITO DS1307 PARA MOSTRAR LA //////////// //////////HORA EN TIEMPO REAL A TRAVEZ DE UNOS DISPLAYS DE 7 SEGMENTOS///////// //////////EL PROGRAMA PARA SIMULARLO EN PROTEUS SE LLAMA RELOJ TIEMPO REAL////// ////////////////////////BY MARCO RECARGADO////////////////////////////////////// #include <16F877A.h> /// libreria para el manejo del pic16f877a #use delay(clock=8000000) /// declara la frecuencia del cristal #fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT #use i2c(Master, SDA=PIN_C4, SCL=PIN_C3) #include <ds1307.c> int32 tiempo_real=0; long dato_1=0; long dato_2=0; long dato_3=0; long dato_4=0; long dato_5=0; long dato_6=0; #use fast_io(A) #use fast_io(B) //#use fast_io(C) #use fast_io(D) #use fast_io(E) #byte portc = 7 #byte portd = 8 #bit #bit #bit #bit #bit #bit #bit #bit #bit #bit #bit #bit #bit #bit #bit #bit #bit #bit #bit #bit #bit #bit #bit #bit portd0 portd1 portd2 portd3 portd4 portd5 portd6 portd7 portc0 portc1 portc2 portc3 portc4 portc5 portc6 portc7 = = = = = = = = = = = = = = = = 0x08.0 0x08.1 0x08.2 0x08.3 0x08.4 0x08.5 0x08.6 0x08.7 0x07.0 0x07.1 0x07.2 0x07.3 0x07.4 0x07.5 0x07.6 0x07.7

/// con esta instruccion evitamos que /// se este configurando cada vez que usamos /// alguna instruccion de entrada o salida /// se definen direcciones de memoria

dato_6a = dato_6.0 dato_6b = dato_6.1 dato_6c = dato_6.2 dato_6d = dato_6.3 dato_5a = dato_5.0 dato_5b = dato_5.1 dato_5c = dato_5.2 dato_5d = dato_5.3

#bit #bit #bit #bit #bit #bit #bit #bit #bit #bit #bit #bit #bit #bit #bit #bit byte byte byte byte byte byte byte

dato_4a = dato_4.0 dato_4b = dato_4.1 dato_4c = dato_4.2 dato_4d = dato_4.3 dato_3a = dato_3.0 dato_3b = dato_3.1 dato_3c = dato_3.2 dato_3d = dato_3.3 dato_2a = dato_2.0 dato_2b = dato_2.1 dato_2c = dato_2.2 dato_2d = dato_2.3 dato_1a = dato_1.0 dato_1b = dato_1.1 dato_1c = dato_1.2 dato_1d = dato_1.3 sec; min; hrs; day; month; yr; dow;

//////////////////////////////////////////////////////////////////////////////// ////////funcion que manda el a desplagar informacion en los displays//////////// /////Tomese en cuenta que las conexiones de los puertos son las siguientes////// // pc0=a // // pc1=b // // pc6=d // // pc7=c // // pd1=digito 6 // // pd4=digito 5 // // pd0=digito 4 // // pd7=digito 3 // // pd5=digito 2 // // pd6=digito 1 // //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// void desplegar() { portd1=0; portd4=0; portd0=0; portd7=0; portd5=0; portd6=0; portc0=dato_6a; portc7=dato_6b; portc1=dato_6c;

/// se inihiben los displays

portc6=dato_6d;

portd1=1; portd1=0; portc0=dato_5a; portc7=dato_5b; portc1=dato_5c; portc6=dato_5d; portd4=1; portd4=0; portc0=dato_4a; portc7=dato_4b; portc1=dato_4c; portc6=dato_4d; portd0=1; portd0=0; portc0=dato_3a; portc7=dato_3b; portc1=dato_3c; portc6=dato_3d; portd7=1; portd7=0; portc0=dato_2a; portc7=dato_2b; portc1=dato_2c; portc6=dato_2d; portd5=1; portd5=0; portc0=dato_1a; portc7=dato_1b; portc1=dato_1c; portc6=dato_1d; portd6=1; portd6=0; } //////////////////////////////////////////////////////////////////////////////// //////////////////////Comienzo de la funcion principal////////////////////////// //////////////////////////////////////////////////////////////////////////////// void main() { ds1307_init(); set_tris_a(0xff); set_tris_d(0x00); set_tris_b(0x00); set_tris_c(0x04); set_tris_e(0x01); port_b_pullups(true); ///se inicializa el ds1307

dato_1=8; dato_2=8; dato_3=8; dato_4=8; dato_5=8; dato_6=8; desplegar(); // Set date for -> 15 June 2005 Tuesday // Set time for -> 15:20:55 (9:49:00 am) ds1307_set_date_time(24,4,7,2,9,49,00); while(1) { delay_ms(1000); ds1307_get_date(day,month,yr,dow); ds1307_get_time(hrs,min,sec); /// se obtiene la fecha /// se obtiene la hora

/// se escribe ne le displositivo

////////////////////bin2bcd(sec) funcion para pasar de binario(hasta 99) a bcd ////////////////////bcd2bin(sec) funcion para pasar de bcd(hasta 99) a binario sec=bin2bcd(sec); min=bin2bcd(min); hrs=bin2bcd(hrs); dato_1=0x0f&sec; dato_2=swap(0xf0&sec); dato_3=0x0f&min; dato_4=swap(0xf0&min); dato_5=0x0f&hrs; dato_6=swap(0xf0&hrs); desplegar(); } } ///////////////////////////// fin de programa /////////////////////////////////////////////

http://foro.elhacker.net/electronica/introduccion_a_la_programacion_de_pics_en_lenguaje_c_ccst174021.0.html;msg857910#msg857910#ixzz1Xwsc1lTN

Perdon por este enorme receso pero no habia podido entrar al foro, porque mi computadora se me habia quemado y por tanto no podia grabar mis pics y bla bla bla. Citar
1-asignas la dccion del puerto B a tu gusto? o es la dccion qeu la datasheet del pic establece para este modelo?

La direccion del puertoB ya esta dada por la misma arquitectura del micro puedes abrir la el archivo donde se encuentra la libreria del 16f877.h la ruta generalmente es esta C:\Archivos de programa\PICC\Devices ahi veras que el mismo programa ya tiene definidos el nombre de los parametros del pic. y la instruccion Citar
#byte PORTB = 6 //declaramos a la variable PORTB

solo que asocio la variable PORTB a la direccion 0x06 Citar


2-el 6 est en decimal o en hexa? (en este caso, si el nro es 6 en decimal, en hexa es lo mismo, pero quiero ver si la sintaxis obliga a poner 0x06 por ejemplo)

el programa lo asocia por default como decimal sin embargo te da la direccion pero si tu pusieras 54 la direccion a la que te referirias no seria la 0x54 sino a 0x36 Citar
3-eso ya no est definido cuando pones #include<16F84> ?

En efecto tienes razon cuando se pone la libreria ahi ya tienes definido varios parametros, pero no con el mismo nombre que yo les asigno en este caso por ejemplo tiene definido #define #define #define #define #define #define PIN_A0 PIN_A1 PIN_A2 PIN_A3 PIN_A4 PIN_A5 40 41 42 43 44 45

sin embargo para comodidad mia le pongo variables con los que yo lo relaciono mas inmediatamente Citar
4-para acceder al bit 3 del puertoB deberia acceder a la dccion de memoria 6*8+3=51? o hay alguna manera ya optimizada en el CSS (soy nuevo enel CSS )

bueno con lo anterior puedes ver que se tiene acceso a un solo bit en especifico y no tienes que declararlo te recomiendo nuevamente leer la libreria y si te gusta de esa forma pues usarlos asi. por ejemplo para encender el bit 5 del puerto a tendiras que hacer lo sigueinte PIN_A5=1; espero haber resuelto tus dudas. y perdonen nuevamente la demora de mis respuestas las estare contestando en el transcurso de la sigueinte semana En lnea

"Desde muy chico tuve que interrumpir mis estudios para ir a la escuela" Gabriel Garca Mrquez MARCO_RECARGADO Desconectado Mensajes: 75 Citar
Hola Marcos Recargado, estoy estudiando tus post, pero en el ejemplo de 2 displays de 7 segmentos, no entiendo como es la lgica. No puedo ver el Proteus pero como se hace el multiplexado de los displays. Sino, como se haria con CSS? estas usando un conversor de binario a bcd no? no puedo seguir el pedazo de codigo donde suma 10 a count

Re: Introduccion a la programacion de PICS en lenguaje C (CCS) Respuesta #32 en: 16 Noviembre 2007, 20:39

Mas recargado que nunca

mira los displays van a un decodificador bcd las terminales portb0portb3 estan a un decodificador y las terminales portb4-portb7 al otro decodificador vamos viendo paso a paso que se esta haciendo Citar
conteo=conteo+1;

en este segmento obviamente estoy incrementando en uno a la variable contador Citar


if((conteo&0x0f)>9)

en este estoy haciendo una operacion logica AND de la variable conteo con el numero 0x0f y que diablos obtengo de esto? facil que yo seleccione mi parte baja de lo que contiene esta variable es decir si mi variable conteo=0b1111 0101 que es igual a conteo=0xf5 al hacer esta operacion yo tengo como resultado conteo=0x05 es decir anule la parte alta ya una vez hecho esto la compara con si es mayor a 9 si es mayor a 9 significa que estoy en el 10 pero en hexadecimal seria 0x0A y ese no es el valor que quiero sino quiero este 0x10 Citar
{ conteo=conteo+10; conteo=conteo&0xf0; }

por eso a la hora de que es mayor a nuevo yo le sumo 10 para que me de el numero hexadecimal que deseo if(conteo>99) {conteo=0;} por ultimo si ya llego a 99 lo reseteo porque recuerda que esta varialbe como fue declarada de tipo int es una variable que puede llegar hasta 255. Espero haberte ayudado

gracias meta.... pude hacer el programa para el conversor analogo digital del pic 16f877

//programa que usa el conversor analogo digital del pic 16f877// ///// // //// /// //// by EPALE /// /////////////////////////////////////////////////////////////////// #include <16F877a.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=20000000) #use fast_io(B) /// con esta instruccion evitamos que /// se este configurando cada vez que usamos #use fast_io(a) /// alguna instruccion de entrada o salida #use fast_io(c) #byte portb = 6 // se definen las direcciones de memoria #byte porta = 5 #byte portc = 7 #DEFINE LED DELAY_MS(100) // se define el tiempo de retardo para ahorrar memoria

void main() { uno: set_tris_a(0xff); set_tris_c(0x00); set_tris_b(0x00); // se configura el puerto A como entrada // se configura el puerto B como salida // activa las resistencias de pull-up

SETUP_ADC(ADC_CLOCK_INTERNAL); // configuras esto para que el a/d funcione con un reloj interno del micro SETUP_ADC_PORTS(AN0); // aca determianr que el puerto RA0 ser analgico SET_ADC_CHANNEL(0); // con esto fijas el canal con el qeu trabajas, en este caso 0 por el RA0

output_b(READ_ADC()); uestra el en puerto b LED; goto uno;}

// lee el canal analogico seleccionado anteriormente, y lo

http://foro.elhacker.net/electronica/introduccion_a_la_programacion_de_pics_en_lenguaje_c_ccst174021.45.html#ixzz1XwwL3hyB

Cita de: montero2210 en 5 Mayo 2008, 23:32 Hola a todos!!! Tengo un problemilla y no se resolverlo a ver si ustedes que veo que teneis bastante experiencia me podeis ayudar. Estoy intentando hacer que con el pic16f84, se encienda como el coche fantastico una serie de leds. Hasta hay todo correcto y funcionando. Mi problema viene que le he aadido un pulsador para que cuando yo lo pulse el led que este encendido parpadee durante un tiempo, y no se como leer la pulsacion del pulsador. Gracias de antemano!!!!

primero debes de saber que pin quieres yo te recomendaria el portb por tener resistencias de pull up primero tienes que configurar el porb como entrada set_tris_b(0xff); ahora testeas el puerto si es cero o uno dependiendo de lo que desees if(pin_b0==0) { y aqui metes todo lo que desees hacer cuando se pulse el boton } dato

//////////////////////////////////////////////////////////////////////////////// ////////////ESTE PROGRAMA UTILZA EL CIRCUITO DS1307 PARA MOSTRAR LA //////////// //////////HORA EN TIEMPO REAL A TRAVEZ DE UN UNA LCD DE 2 POR 16 CARACTERES///// //////////////////////////PARA FORO ELHACKER.NET//////////////////////////////// #include <16F877A.h> /// libreria para el manejo del pic16f877a #use delay(clock=8000000) /// declara la frecuencia del cristal #fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT #include <ds1307.c> #include <lcd.c> #use #use #use #use #use fast_io(A) fast_io(B) fast_io(C) fast_io(D) fast_io(E)

/// con esta instruccion evitamos que /// se este configurando cada vez que usamos /// alguna instruccion de entrada o salida /// se definen direcciones de memoria

#byte portc = 7 #byte portd = 8 int int int int int int int sec; min; hrs; day; month; yr; dow;

//////////////////////////////////////////////////////////////////////////////// //////////////////////Comienzo de la funcion principal////////////////////////// //////////////////////////////////////////////////////////////////////////////// void main() { ds1307_init(0); set_tris_a(0xff); set_tris_d(0x00); set_tris_b(0x00); set_tris_c(0x04); set_tris_e(0x01); port_b_pullups(true); lcd_init(); /// inicializamos lcd ///se inicializa el ds1307

// Set date for -> 15 June 2005 Tuesday // Set time for -> 15:20:55 (9:49:00 am) ds1307_set_date_time(8,11,7,2,9,49,00); /// se escribe en el displositivo /// el tiempo deseado while(1) { delay_ms(100); ds1307_get_date(day,month,yr,dow); /// se obtiene la fecha

ds1307_get_time(hrs,min,sec); lcd_gotoxy(1,2); printf(lcd_putc,"%02d:%02d:%02d lcd_gotoxy(1,1); lcd_putc("WWW.ELHACKER.NET"); } }

/// se obtiene la hora ",hrs,min,sec); ///se despliegan los datos

Re: Introduccion a la programacion de PICS en lenguaje C (CCS) Respuesta #108 en: 19 Noviembre 2008, 05:48
ha llegado el momento de agregarle una practica mas a nuestro pequeo tutorial esta practica lo que hace es que pasa los datos recibidos por puerto serie a la lcd utilizo la terminal virtual para simular la comunicacion con el pic ///////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////comunicacion RS232 con pic/////////////////////////////// ///////////////by marco_recargado para foro.elhacker.net/////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////// #include <16F877A.h> #fuses HS, NOWDT, NOPROTECT #use delay(clock=8000000) #use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7) /// libreria para el manejo del /// puerto serie se establece /// velocidad de 9600 baudios #include <lcd.c> /// libreria para el manejo de la lcd char dato_recibido[16]; /// aqui va a ir los datos recibidos por rs232 #byte porte=0x09 #int_rda void rda_isr() { gets(dato_recibido); } //// interrupcion por escritura en buffer del puerto //// esta instruccion almacena en la variable los //// datos que se esten enviando hasta que llega //// la tecla enter

void main() { enable_interrupts(int_rda); enable_interrupts(global); //// se habilita la interrupcion por //// escritura del puerto serial

set_tris_d(0b00000000); lcd_init(); lcd_gotoxy(1,1); lcd_putc(" com RS232

");

while(true) { lcd_gotoxy(1,2); printf(lcd_putc,"%s",dato_recibido); } }

/// se manda a lcd lo que se recibio

nuestra gloriosa imagen

Re: Introduccion a la programacion de PICS en lenguaje C (CCS) Respuesta #117 en: 6 Enero 2009, 16:32
pues bien para los nios que se han portado bien los reyes magos nos han dejado un regalito. la practica de un contador por interrupcion bueno un regalo es un regalo la cuenta es ascendiente aprox cada segundo (.98304 seg) //////////////////////////////////////////////////////////////////////////////// /////////// practica 10 : contador por interrupcion ////////////////// ////////// By Marco_recargado para foro.elhacker.net ////////////////// //////////////////////////////////////////////////////////////////////////////// #include <16F877.h> /// libreria para el manejo del pic16f877a #use delay(clock=8000000) /// declara la frecuencia del cristal #fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT,NODEBUG ///configura los fusibles int contador=0; int delay=30; #byte portb = 6 #int_TIMER0 void timer0() { /// Variable que llevara la cuenta total

delay--; if(delay==0){contador++; delay=30;} set_timer0(0); } //////////////////////////////////////////////////////////////////////////////// //////////////////////inicio del programa principal///////////////////////////// //////////////////////////////////////////////////////////////////////////////// void main(void) { set_tris_b(0x00); ///la formula para saber cada cuando se ejecutara nuestra interrupcion con el timer0 /// es T=N*M*(4/FOSC) donde /// T= tiempo /// N= preescalador del timer o divisor /// M= numero de iteracciones /// asi por ejemplo con un preescalador de 256 un numero de iteraciones de 256 y un cristal de 8mhz /// nos da un resultado de 32.7 milisegundos por interrupcion setup_timer_0 ( RTCC_INTERNAL | RTCC_DIV_256 ); /// configura a timer0 con reloj /// interno y un divisor de 256 enable_interrupts(GLOBAL); enable_interrupts(INT_timer0); set_timer0(0); /// permitir interrupciones ///activar interrupcion en timer0

while(true) { portb=contador; } } // fin de programa principal y nuestra imagen

Saludos y feliz ao nuevo

http://foro.elhacker.net/electronica/introduccion_a_la_programacion_de_pics_en_lenguaje_c_ccst174021.105.html#ixzz1Xx2zKz8h

Re: Introduccion a la programacion de PICS en lenguaje C (CCS) Respuesta #118 en: 12 Marzo 2009, 04:30
hola a todos por fortuna e encontrado lo que queria.. un foro para programar en ccs y ojala poder daer mis aportes y que ojala me puedan solucionar muchas dudas que tengo en algunas areas de programacion de este tema a continuacion adjunto un programa para un enlace de radiofrecuencia este codigo repsonde muy bien ya lo probe y lo presente en un proyecto de la universidad este es el codigo del emisor #include<16f877a.h> #fuses XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP #use delay(clock=4000000) #use rs232(baud=2400, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8) #byte PORTD = 0x08 #byte PORTB = 0x06 void main() { set_tris_D(0b11111111); PORTD=0; PORTB=0; while(1) { if(PORTD==0){printf("%d",0);} if(PORTD==1){printf("%d",1);} if(PORTD==2){printf("%d",2);} if(PORTD==4){printf("%d",3);} if(PORTD==8){printf("%d",4);} if(PORTD==64){printf("%d",5);} if(PORTD==128){printf("%d",6);} } }

y este es el codigo del receptor #include<16f877a.h> #fuses XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP #use delay(clock=4000000) #use rs232(baud=2400, parity=N, xmit=PIN_C6, rcv=PIN_C7) #byte PORTD = 0x08 #byte PORTB = 0x06 enable_interrupts(int_rda); enable_interrupts(global); char orden;

#int_rda void serial_isr() { orden=getc()-48; if(orden==0){PORTD=0b00000000;} if(orden==3){PORTD=0b00000101;} if(orden==2){PORTB=0b00000110;} } void main() { set_tris_D(0b00000000); set_tris_B(0b00000000); PORTd=0; PORTB=0; // adelante // giro

while(1) {

} }

los modulos de transmision de seal son tlp 434a y rlp434a y son de transmision serial

En lnea

http://foro.elhacker.net/electronica/introduccion_a_la_programacion_de_pics_en_lenguaje_c_ccst174021.105.html#ixzz1Xx3TXkK2

Re: Introduccion a la programacion de PICS en lenguaje C (CCS) Respuesta #134 en: 5 Mayo 2009, 17:45
buenas amigos del foro navegando por la red encontre este tema esta muy bueno yo tambien estoy iniciandome en Cy estoy usando el ccs compiler el proteus ...mi pregunta es la siguiente.estoy usando el pic 16f84A usando como entradas el puerto A y el puerto b como salidas;en ra0,ra1 y ra2 e colocado un pulsador a cada pin,pulsando cada uno de estos me sale una secuencia por el puerto B...solo me trabaja con la primera secuencia y al apretar el segundo pulsador no funca hasta q termine la secuencia del primero me han dicho que coloque interrupciones alos pulsdores pero no entiendo bien eso aqui va el ejemplo de lo que estoy haciendo. #include <16f84a.h> #use delay(clock=4000000) void main() { set_tris_b(0b11110000); set_tris_a(0xff); output_b(0); while(true) { if(input(pin_a0)) { output_high(pin_b0); output_low(pin_b1); output_low(pin_b2); delay_ms(3000); output_low(pin_b0); } if(input(pin_a1)) { output_low(pin_b0); output_high(pin_b1); output_low(pin_b2); } if(input(pin_a2)) { output_low(pin_b0); output_low(pin_b1); output_high(pin_b2); output_high(pin_b3); } } output_low(pin_b0); output_low(pin_b1); output_high(pin_b2); output_high(pin_b3); } } http://foro.elhacker.net/electronica/introduccion_a_la_programacion_de_pics_en_lenguaje_c_ccst174021.120.html#ixzz1Xx40a78Y

hola,aqui te dejo el codigo corregido,chau y suerte. Cdigo:

#include <16f84a.h> #fuses XT,NOWDT,NOPROTECT, #use delay(clock=4000000) void main() { set_tris_b(0b11110000); set_tris_a(0xff); output_b(0); while(true) { if(!input(pin_a0)) //en esta linea le agregue el signo de admiracion { output_high(pin_b0); output_low(pin_b1); output_low(pin_b2); output_low(pin_b3); //le agregue esta linea delay_ms(500); //aqui le puse medio segundo para visualizarlo output_low(pin_b0); } if(!input(pin_a1)) //en esta linea le agregue el signo de admiracion { output_low(pin_b0); output_high(pin_b1); output_low(pin_b2); output_low(pin_b3);//le agregue esta linea } if(!input(pin_a2)) //en esta linea le agregue el signo de admiracion { output_low(pin_b0); output_low(pin_b1); output_high(pin_b2); output_high(pin_b3); } } } " ! "

mejor " ! "

" ! "

http://foro.elhacker.net/electronica/introduccion_a_la_programacion_de_pics_en_lenguaje_c_ccst174021.135.html#ixzz1Xx47HSOg

//programa que usa el conversor analogo digital del pic 16f877// ///// // //// /// //// by EPALE /// /////////////////////////////////////////////////////////////////// #include <16F877a.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=20000000) #use fast_io(B) /// con esta instruccion evitamos que /// se este configurando cada vez que usamos #use fast_io(a) /// alguna instruccion de entrada o salida #use fast_io(c) #byte portb = 6 // se definen las direcciones de memoria #byte porta = 5 #byte portc = 7 #DEFINE LED DELAY_MS(100) // se define el tiempo de retardo para ahorrar memoria

void main() { uno: set_tris_a(0xff); set_tris_c(0x00); set_tris_b(0x00); // se configura el puerto A como entrada // se configura el puerto B como salida // activa las resistencias de pull-up

SETUP_ADC(ADC_CLOCK_INTERNAL); // configuras esto para que el a/d funcione con un reloj interno del micro SETUP_ADC_PORTS(AN0); // aca determianr que el puerto RA0 ser analgico SET_ADC_CHANNEL(0); // con esto fijas el canal con el qeu trabajas, en este caso 0 por el RA0

output_b(READ_ADC()); puerto b LED; goto uno;}

// lee el canal analogico seleccionado anteriormente, y lo uestra el en

http://foro.elhacker.net/electronica/introduccion_a_la_programacion_de_pics_en_lenguaje_c_ccst174021.0.html;msg934861#ixzz1Xx73DvWF

Practica 5 DAC a displays de 7 segmentos Respuesta #65 en: 18 Marzo 2008, 08:30
despues de mil aos la tierra prometida. #include <16F877A.h> #use delay(clock=8000000) #fuses NOWDT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOPROTECT,HS,NOWRT,NODEBUG

#use #use #use #use #use

fast_io(A) fast_io(B) fast_io(C) fast_io(D) fast_io(E) porta = 5 portb = 6 portc = 7 portd = 8 porte = 9

/// con esta instruccion evitamos que /// se este configurando cada vez que usamos /// alguna instruccion de entrada o salida

#byte #byte #byte #byte #byte

/// se definen direcciones de memoria

#bit porte0 = 0x09.0 int int int int canal0=0; unidades=0; decenas=0; centenas=0;

void main () { set_tris_b(0b00000000); set_tris_c(0b00000000); set_tris_d(0b00000000); set_tris_e(0b11111111); SETUP_ADC(ADC_CLOCK_INTERNAL); setup_adc_ports(all_analog); SET_ADC_CHANNEL(0); DISABLE_INTERRUPTS(global); while(1) { canal0= READ_ADC(); delay_ms(1); // retardo para esperar que el adc termine // conversion fabricante menciona que al // menos 50 microsegundos // declaramos que el reloj del adc sera interno // todos los canales analogicos habilitados // seleccionamos canal 0

centenas=canal0/100; decenas=(canal0 - (centenas*100))/10; unidades=(canal0 - (centenas*100) - (decenas*10)); portb=centenas; portc=decenas; portd=unidades; delay_ms(100); } }

proteus

Instrucciones: Para activar el programa: 1. Ejecutar setup76.exe. 1.1. Cuando pida el origen de la licencia (local o por servidor), clic en la opcin de local. 1.2. Seguir los pasos de instalacin que indique el wizard. 2. Dirigirse a la carpeta de accesos directos del programa recin instalado y abrir el programa Licence Manager, normalmente sera: Inicio > Todos los programas > Proteus 7 Professional > Licence Manager. 2.1. Clic en Browse for a key, encontrar la ruta donde se descomprimi el paquete y seleccionar el archivo Grassington North Yorkshire.lxk. 2.2. En Licence Manager, clic en Install y todas las llaves irn de izquierda al cuadro derecho. 2.3. Salir del programa. 3. Ejecutar el LXK Proteus 7.6 SP0 v2.0.1.exe que viene en el paquete. 3.1. Clic en browse, para encontrar la carpeta de instalacin del programa. 3.2. Clic en Update, la barra de progreso se comenzar a llenar. 3.3. El software ya est listo para usarse.

También podría gustarte