lunes, 16 de diciembre de 2013

Documentación PIC 16F877A - Diseño de placa + programa comunicación serie

DOCUMENTACIÓN - 
PIC 16F877A

Listado de componentes:
 



Características de la placa: 
La placa del PIC 16F877A está diseñada sobre una placa simple de cobre, empleando la técnica del ácido para hacer las pistas.

Las dimensiones de la placa son 7,9 cm. de ancho y 7,5 cm. de largo.



Este es nuestro diseño de la PCB:

Para descargar a tamaño original, listo para imprimir, hacer click en este enlace.



Esta es nuestra serigrafía:

Para descargar a tamaño original, listo para imprimir, hacer click en este enlace (la imagen ya lleva el mirror X).


Y así quedaría la placa final:



Programa y explicación: 
Para crear el programa usamos PICC Compiler, una herramienta para programar gran variedad de PICs usando el lenguaje C. 


#include "D:\Modulo Electronica\segundo año\16f877A\programa luces rs232\luces.h"
// Primero tenemos que usar el PIC Wizard para que el programa nos genere el fichero ***.h. 
// En PIC Wizard indicamos el PIC indicado (16F877A), la velocidad del cristal que hemos 
// puesto, en nuestro caso 4MHz, también comprobamos que la opción de RS232 esta activa 
// y el Watchdog desactivado.


void setup() // Función de configuración
{
  SET_TRIS_B(0x00); // Configuramos todo el puerto B como salida
  OUTPUT_LOW(PIN_B0); // Ponemos todas las salidas a nivel bajo por seguridad ya
  OUTPUT_LOW(PIN_B1); // que podríamos tener un estado indeterminado
  OUTPUT_LOW(PIN_B2);
  OUTPUT_LOW(PIN_B3);
  OUTPUT_LOW(PIN_B4);
  OUTPUT_LOW(PIN_B5);
  OUTPUT_LOW(PIN_B6);
  OUTPUT_LOW(PIN_B7);
  delay_ms(800); // Pausa de 800 ms antes de empezar
}



void loop() // Función repetitiva
{
 char tecla; // Creamos la variable "tecla"
  WHILE(1) // Bucle infinito
  {
     printf("tecla = %c \n",tecla); // Sacamos por pantalla el contenido de "tecla"
     if(kbhit()) // Solo entra si se detecta que se pulsa una tecla
     {
         tecla = getc(); // Guarda el valor de la tecla pulsada en la variable "tecla"
         if(tecla=='p')OUTPUT_LOW(PIN_B0); // Si se pulsa "p", se apaga el led
if (tecla=='o')OUTPUT_HIGH(PIN_B0); // Si se pulsa "o", se enciende el led
      }  
      delay_ms(200);       // Pausa de 200 ms
   }
}


void main() // Función main generada por el Wizard. Tenemos que
{ // llamar a setup() y loop() desde aquí.
  setup_adc_ports(NO_ANALOGS);
  setup_adc(ADC_OFF);
  setup_psp(PSP_DISABLED);
  setup_spi(FALSE);
  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  setup_timer_1(T1_DISABLED);
  setup_timer_2(T2_DISABLED,0,1);
  setup_comparator(NC_NC_NC_NC);
  setup_vref(FALSE);
  setup(); // Llamada a la función de configuración
  loop(); // Llamada a la función de bucle
}
                     

En este enlace podemos ver el programa original sin modificar (no se muestran los comentarios) por si por algún error este no funcionara.

Con este programa queremos controlar un led en la patilla RB0 pulsando la tecla "o" para encenderlo y la "p" para apagarlo. Para ello, una vez configurado el puerto B como salida, creamos la función de bucle en la cual hacemos varias comprobaciones.

Lo primero es detectar que se ha pulsado una tecla cualquiera desde nuestro ordenador y si no es así, el programa salta ese paso, pero si en efecto detecta que se ha pulsado una tecla, pasamos a la siguiente comprobación, que consiste en detectar si esa tecla pulsada es una "o" (para encenderlo) o una "p" (para apagarlo). Si no se pulsa ninguna de estas teclas, la variable "tecla" guardará igualmente esa tecla pero el led mantendrá su estado anterior y el programa seguirá su curso.

Constantemente mostramos en pantalla el contenido de la variable "tecla" para hacer saber al usuario cual es su último estado, así como para comprobar que el programa no se ha quedado bloqueado.


Descripción:
Este es un programa de prueba para comprobar que funciona la comunicación serie.
El programa consiste en un led en la patilla RB0 que se encenderá cuando pulsemos la tecla “o”, se apagará cuando pulsemos la tecla “p”, y mantendrá su anterior estado cuando se pulse otra tecla cualquiera.

El contenido de la variable "tecla" se muestra por pantalla cada 1/5 segundos para comprobar que el PIC no se haya quedado bloqueado.

Como vemos que la comunicación serie ha sido un éxito, podemos ver actuar los Leds que se han  puesto en las patillas Tx y Rx, los cuales se iluminarán en función de la cantidad de datos que se están transmitiendo.


Fotos del proyecto:



Diseñado, construido y programado por:

Jorge Fuentes Celdrán
Jose Antonio Victoria Francés

Documentación Atmega 328-P - Diseño de placa + programa PWM

DOCUMENTACIÓN - 
Atmega 328-P

El diseño y construcción de la placa no son originales, la información está toda sacada de este enlace, pero nosotros haremos un breve resumen para la explicación.


Listado de componentes:
El listado de componentes se encuentra en la página 9 este PDF.


Características de la placa:
La placa del Atmega 328-P está diseñada sobre una placa simple de cobre, empleando la técnica del ácido para hacer las pistas.

Las dimensiones de la placa son 9 cm. de ancho y 7 cm. de largo.





Este sería el diseño de la PCB:
Diseño.


Este es el esquemático, pero no lo vamos a necesitar:
Esquemático.


 Programa y explicación:
Para crear el programa usamos el software de arduino, basado en processing, el cual se puede descargar desde la siguiente dirección, así como encontrar instrucciones de uso y ejemplos.
Página oficial de arduino.


#include <arduino.h> // Incluye la libreria del arduino
int analogPin=1; // Entrada del valor del potenciómetro
int sal=11; // La salida del PWM se realiza por la patilla 11
int val=0; // Creamos la variable "val" para su posterior uso


void setup() { // Funcion de configuración
 Serial.begin(9600 // La comunicación se realizará a 9600 baudios
 pinMode(sal,OUTPUT); // Declaramos la patilla 11 como salida
}


void loop() { // Función repetitiva
 val= analogRead(an gPin); // Metemos en "val" el valor actual del potenciómetro
 analogWrite(sal,val); // Sacamos ese valor por la patilla del PWM
 Serial.println(val) // Sacamos el valor del potenciómetro por pantalla por si nos interesa
 delay(20); // Detención de 20ms del programa
}

En este enlace está el programa original (sin comentarios).

Con este programa le indicamos al Atmega que la entrada del potenciómetro sea en la patilla "A1" y la salida del PWM la realice por la patilla "11". Tras configurar la velocidad de la comunicación (9600 baudios) creamos la función repetitiva (loop) la cual estará recibiendo constantemente información del potenciómetro y a su vez sacándola por la patilla del PWM.


Descripción:
Este programa se ha hecho para controlar la velocidad de un motor de hasta 25 V. Consistiría en la regulación de un potenciómetro colocado en el PWM, el cual regula el voltaje que le entra al motor, a través de una operación hecha por el Atmega 328-P. La potencia varía del 0% al 100%.

Este proyecto cuenta con un circuito auxiliar, donde va conectado el motor y en el que usamos el MOSFET IRF540.

Hemos comprobado que la comunicación Rx y Tx funciona, ya que lo hemos programado directamente con el ordenador usando el conversor TTL USB.


Fotos del proyecto:


Diseñado, construido y programado por:

Jorge Fuentes Celdrán
Jose Antonio Victoria Francés