Cronógrafo de AVR desde el concepto de PCB (7 / 13 paso)

Paso 7: Construcción de la solución; cargar el programa.

Una vez que todo el código está escrito (en realidad haría esto mucho antes durante el desarrollo) lo necesario para construir la solución.  Esto es cuando el compilador traduce todo el código en un archivo HEX.  El archivo HEX es lo que realmente se cargados en el chip y el chip lo único que puede entender.  Si alguna vez has visto un archivo HEX, sabes que es totalmente no-legible por los seres humanos, así que gracias al compilador.  La primera foto muestra el elemento de menú hacer clic en: construir >> generar solución.

En este punto, verás un montón de cosas pasan en la ventana de salida en la parte inferior, y si hay algún error de compilador te ves aquí también.  Si escribió el código exactamente como en el ultimo paso no debería tener ningún error.  Por si acaso, voy copiar y pegar el código en su totalidad directamente desde mi archivo al final de este paso.  Sólo representé fuera que puedo subir archivos también, así que incluí un archivo ZIP con todos los archivos de estudio de ATMEL.

En este punto debe conectar el dragón para el puerto USB de su ordenador.

En la foto 2, en la parte superior derecha, verás destacados "ISP en AVR Dragon".  Haga clic aquí para abrir una ventana para configurar las opciones de la herramienta al igual que cuando fijamos el bits del fusible.  Hacer que su dragón del AVR es seleccionado y ISP para la interfaz y reloj de control del ISP.  Debajo de eso, ajustes de programación debe ya han "borrar chip todo" seleccionado y "preservar la EEPROM" desactivada.  Su circuito de protoboard de potencia, conecte el cable de cinta de 6 pin del dragón, y somos buenos ir.

Ahora a cargar el programa al chip.  Puede haga clic en herramientas >> Programación de dispositivo >> archivo de producción y luego busque el archivo y el programa.  ¡ Pero! Es mucho más fácil simplemente haga clic en Debug >> iniciar sin depuración (Foto 3).  Automáticamente Recompila el programa y lo carga al chip sin otra palabra como no hay rerrors compilación.

Eso es él! Si trabaja debe tener un funcionamiento cronógrafo en un protoboard!  Puedes jugar con él tocando 12VDC a las entradas de sensor (los circuitos de transistor; no los pines de entrada) con un cable puente.  Además, juega con los interruptores DIP y probar el botón 'Mostrar distancia'.  Una vez que un número como resultado, usted puede probar los DIP switches de selección de unidades de salida y verificar los cálculos.

Ahora sería un buen momento para asegurarse de que sus sensores funcionan correctamente con el circuito.  Estoy suponiendo que probablemente nadie va a utilizar los mismos sensores que tengo, prueba lo tuyo ahora antes de empezar a pensar en un Consejo Permanente de la aguafuerte... mejor hacer cambios ahora mientras el circuito está libre de soldadura.

A continuación, tenemos un vistazo a crear el diseño esquemático y la placa con el ExpressPCB...

CÓDIGO EMPIEZA POR DEBAJO DE ESTA LÍNEA ***

/*
* Speed_measurement.c
*
* Creado: 15/09/2012 20:50:23
* Autor: Thomas L
*/

#define F_CPU 14.7456E6

#include < avr/io.h >
#include < util/delay.h >
#include < avr/interrupt.h >

/************************************************************************/
/ * declarar variables globales * /
/************************************************************************/
unsigned int resultado = 0;
int interruptcount = 0;
int largo = 0;
resetcount int largo = 0;

int Main
{

DDRD = 0 X 00;       PORTD entrada de interrupciones externas
DDR = 0XDF;       PORTC salida de 7 segmentos multiplexado y 1 entrada para la visualización de la distancia
DDRB = 0XFF;       PORTB salida fot 7 datos de segmento en bcd
PORTD | = 0XFF;       permiten portd levantan resistencias
(int0 y int1 requieren externo levantan resistencias o 1 interrupciones se activará en reset)

EICRA | = (1 << ISC11) | (1 << ISC01);   configurar interrupciones externas
EIMSK | = (1 << INT1) | (1 << INT0);   //
TCCR1B | = (1 << CS12);     establece escala para timer1 256

/************************************************************************/
/ * declaramos las variables para el cálculo y la presentación * /
/************************************************************************/

unsigned int unos = 0;
unsigned int decenas = 0;
unsigned int cientos = 0;
unsigned int x = 0;
doble ticsfoot = 0;
doble fps = 0;
doble fph = 0;
doble mph = 0;
doble h = 0;
doble mps = 0;
int distancia = 0;

SEI();        activar interrupciones globales

while(1)
{



/************************************************************************/
/ * obtener sensor distancia en pies de pind 0,1,4,5 * /
/************************************************************************/

int distanceinput = (~ PIND & 0x33);
hibits int = (distanceinput >> 2);      tomando pind bits 0,1 y 4,5 para ser
lobits int = (distanceinput & 0 x 03);     valor de distancia en BCD.  Brocas de 2, 3 son los
distancia = (hibits lobits);       pines de interrupción ext ya en usan.

Si (distancia == 0) distancia = 16;



/************************************************************************/
/ * 'listo' indicador LED * /
/************************************************************************/

Si (interruptcount == 0)
{
PORTC | = (1 << 3);
}
otra cosa
{
PORTC & = (0 << 3);
}

/************************************************************************/
/ * cálculos para encontrar la velocidad en unidades de 4 * /
/************************************************************************/

Si (interruptcount == 2) //only calcular cuando han ocurrido dos interrupciones
{
CLI();               deshabilitar las interrupciones globales

ticsfoot = (tiempo / distancia);      distancia distancia entre sensores en pies - ticsfoot es contador tics/pie
FPS = (57600 / ticsfoot);       57600 es contador tics/seg (cpu clk/prescaler)
FPH = (fps * 60 * 60);
mph = (fph / 5280);
km/h = (mph * 1.609344);
MPS = (fps * 0.3048);

EIMSK | = (1 << INT1) | (1 << INT0);      //
SEI();            volver a habilitar las interrupciones externas y las interrupciones globales
}

/************************************************************************/
/ * elegir opciones de salida * /
/************************************************************************/

Si (! () PIND & (1 << PIND6)) & & (PIND & (1 << PIND7))) //choose pies/seg.
{
Round(FPS);
resultado = fps;
}
else if (PIND & (1 << PIND6) & &! () PIND & (1 << PIND7))) //choose metros/seg.
{
Round(MPS);
resultado = mps;
}
else if (PIND & (1 << PIND6) & & (PIND & (1 << PIND7))) //choose kilómetros/hora
{
Round(kph);
resultado = kph;
}
otra cosa //default millas/hr
{
Round(mph);
resultado = mph;
}

Si (resultado > = 999) resultado = 999;







/************************************************************************/
/ * retardo detener múltiples "2ª interrupción" activa * /
/ * sin retrasar la ejecución de código principal * /
/************************************************************************/

resetcount ++;

Si ((resetcount > = 0x00FF) & & (interruptcount > = 2)) //resetcount límite determina el retardo de
{reset //before. 0x00FF aprox. 3 segundos
interruptcount = 0;
resetcount = 0;
}








/************************************************************************/
/ * Mostrar int resultado en pantalla de 3 dígitos siete segmentos * /
/ * retardo da siete segmento decodificador tiempo para decodificar y mostrar los dígitos * /
/************************************************************************/

Si (! () PINC & (1 << PINC5))) //to configuración de distancia de visualización en pantalla
{//only mientras se presiona el botón
resultado = distancia;
}
otra cosa

cientos = (resultado / 100);      Haz 100 lugar dígito
x = (resultado de 100%);
PORTB = (0x00|hundreds);
PORTC | = (1 << 2);        Escriba el dígito
_delay_ms(1);
PORTC & = (0 << 2);

decenas = (x / 10);        conseguir lugar de 10 dígitos
x = x % 10;
PORTB = (0x00|tens);
PORTC | = (1 << 1);        Escriba el dígito
_delay_ms(1);
PORTC & = (0 << 1);

unos = x;          obtener de 1 lugar dígito
PORTB = (0x00|ones);
PORTC | = (1 << 0);        Escriba el dígito
_delay_ms(1);
PORTC & = (0 << 0);

}
}

/************************************************************************/
/ * interrupción sensor 1 * /
/************************************************************************/
ISR(INT0_vect)
{
Si (interruptcount == 0)
{
TCNT1 = 0 X 0000;          reiniciar el contador a 0
interruptcount ++;         incremento interrupción cuenta
EIMSK & = (1 << INT1) | (0 << INT0);      desactivar INT0

}
else if (interruptcount == 1)
{
tiempo = TCNT1;          capturar el valor del contador
interruptcount ++;         incremento interrupción cuenta

}
Else resetcount = 0;

}

/************************************************************************/
/ * interrupción sensor 2 * /
/************************************************************************/
ISR(INT1_vect)
{
Si (interruptcount == 0)
{
TCNT1 = 0 X 0000;         reiniciar el contador a 0
interruptcount ++;        incremento interrupción cuenta
EIMSK & = (0 << INT1) | (1 << INT0);     desactivar la INT1

}
else if (interruptcount == 1)
{
tiempo = TCNT1;         capturar el valor del contador
interruptcount ++;        incremento interrupción cuenta

}
Else resetcount = 0;
}

Artículos Relacionados

Estación de Audio y cronógrafo Steampunk

Estación de Audio y cronógrafo Steampunk

gracias a todos de sus diseños muy creativos y proyectos, todos ustedes me han inspirado a crear mi propio Steampunk Audio y estación de cronógrafo.  Este proyecto me llevó WAAAY más tiempo del previsto y pasó a manera de presupuesto, pero una vez ca
Cronógrafo para cañón de aire

Cronógrafo para cañón de aire

Cronógrafo consiste de un sensor montaje y temporizador de caja que puede utilizarse para medir la velocidad del bozal de un proyectil disparado desde un cañón de aire.Había construido esta configuración para el uso con un cañón de aire grande con un
Paintball/balísticos Cronógrafo

Paintball/balísticos Cronógrafo

crear un cronógrafo de Paintball bajo costo menos de $ 40!Un cronógrafo balístico es un dispositivo que registra la velocidad de un proyectil. Este cronógrafo particular que he hecho ha sido probado solamente con una pistola de paintball y es relativ
Airsoft o pistola de aire (u otro proyectil lanza dispositivo) Cronógrafo utilizando un micrófono

Airsoft o pistola de aire (u otro proyectil lanza dispositivo) Cronógrafo utilizando un micrófono

mi primera crítica Instructable, constructivo Bienvenido.Si tienes un rifle o cualquier otro dispositivo de disparo del proyectil que usted necesita o quiere Cronógrafo las opciones son bastante limitadas. Puede encontrar una persona que tiene un cro
ATtiny Cronógrafo

ATtiny Cronógrafo

Hice un cañón de aire el verano pasado, y aunque 's diversión para disparar dardos nerf a velocidades inane durante horas, es un poco difícil de cuantificar exactamente a qué velocidad "realmente maldita ' rápido" sin una cámara de alta velocida
Cómo utilizar mi método de cronógrafo a ROF

Cómo utilizar mi método de cronógrafo a ROF

si no lees mi método chronographing leerla { antes de continuar.En este instructable mostrará usted cómo adaptar el método de chronographing para dar aproximado velocidad de disparo de un rifle automático.Se necesita:1. una pistola de airsoft2. una c
Pobre hombre Cronógrafo airsoft.

Pobre hombre Cronógrafo airsoft.

Si usted cada airsoft jugado en un campo, o incluso con cuidado amigos saben la importancia de tener una pistola que dispara a un nivel adecuado de FPS (pies por segundo). Hoy voy a mostrar cómo hacer un FPS áspero de la lectura de una lata de soda.P
Perfiles de forma de cuchillo, desde el concepto hasta la ejecución.

Perfiles de forma de cuchillo, desde el concepto hasta la ejecución.

Un knifemaker, tanto si eres un primero temporizador o un veterano, una de las habilidades más básicas que necesita para desarrollar es hoja de perfiles. Esencialmente, que cantidades para el desarrollo de la hoja básica forma eventualmente será su c
Cacatúa loro Tutorial de máscara de cuero: Desde concepto hasta finalización

Cacatúa loro Tutorial de máscara de cuero: Desde concepto hasta finalización

Hola, mi nombre es Chelsea y este es mi segundo Instructable publicado.En este Instructable, yo se ser caminando a través de los pasos de hacer una máscara de cuero de calidad premium; desde el concepto del diseño y la compra inicial de la piel hasta
¿Una guía completa de arranque AVRs

¿Una guía completa de arranque AVRs

has jugado con Arduino y ahora tienen un gusto por microcontroladores?¿Han intentado ir más allá de Arduino pero tiene parada por la pajina densa?Este es el instructivo para usted!Estaba trabajando en un instructivo para el concurso de epilog que vin
Desde la IDEA hasta la producción - Cryptex

Desde la IDEA hasta la producción - Cryptex

Este Instructable es ilustrar el proceso de tomar un concepto a través de diseño y prototipos hasta producción Inicio en pequeña escala. Hemos elegido un Cryptex para ilustrar este proceso. Ya hay varios diseños de Cryptex en este sitio, pero queremo
Programador universal para de AVR y S51 y ZIF socket!

Programador universal para de AVR y S51 y ZIF socket!

Este programador ha sido diseñado por la empresa y se ha producido al menos 2500PCS de esto y es absolutamente probado y normas y ahora no fabricar más esta versión, aquí es el producto de enlace (lo siento persa sólo estaba disponible)Programador un
Montando el jinete de dragón 500 para uso con el dragón del AVR

Montando el jinete de dragón 500 para uso con el dragón del AVR

no hace mucho tiempo la empresa Atmel salió con una gran herramienta para el uso con la línea AVR de microcontroladores llamado el dragón del AVR. Este pequeño dispositivo USB proporciona a profesionales y aficionados por igual la capacidad para util
Cómo empezar con Eclipse y AVR

Cómo empezar con Eclipse y AVR

programación de AVRs es divertido, pero a veces los entornos de desarrollo de fabricantes hacen mantenimiento de código una tarea. Si buscas un gratis, cruz plataforma, pieza de alta calidad de software para la programación de AVRs Eclipse es una bue