Taula de continguts:

Microcontrolador AVR. Commuta els LED mitjançant un interruptor de botó. Comprovació de botons: 4 passos
Microcontrolador AVR. Commuta els LED mitjançant un interruptor de botó. Comprovació de botons: 4 passos

Vídeo: Microcontrolador AVR. Commuta els LED mitjançant un interruptor de botó. Comprovació de botons: 4 passos

Vídeo: Microcontrolador AVR. Commuta els LED mitjançant un interruptor de botó. Comprovació de botons: 4 passos
Vídeo: Efecte amb 8 LEDS mitjançant mini-AVR. 2024, Juliol
Anonim
Image
Image

En aquesta secció, aprendrem a fer el codi C del programa per a ATMega328PU per canviar l’estat dels tres LED segons l’entrada d’un interruptor de botó. A més, hem explorat una solució al problema de "Switch Bounce". Com és habitual, muntarem el circuit elèctric a la base de l’AVR ATmega328 per comprovar el funcionament del codi del programa.

Pas 1: escriptura i creació d'aplicacions de microcontroladors AVR en codi C mitjançant la plataforma de desenvolupament integrada Atmel Studio 7

Escriptura i creació d'aplicacions de microcontroladors AVR en codi C mitjançant la plataforma de desenvolupament integrada Atmel Studio 7
Escriptura i creació d'aplicacions de microcontroladors AVR en codi C mitjançant la plataforma de desenvolupament integrada Atmel Studio 7
Escriptura i creació d'aplicacions de microcontroladors AVR en codi C mitjançant la plataforma de desenvolupament integrada Atmel Studio 7
Escriptura i creació d'aplicacions de microcontroladors AVR en codi C mitjançant la plataforma de desenvolupament integrada Atmel Studio 7
Escriptura i creació d'aplicacions de microcontroladors AVR en codi C mitjançant la plataforma de desenvolupament integrada Atmel Studio 7
Escriptura i creació d'aplicacions de microcontroladors AVR en codi C mitjançant la plataforma de desenvolupament integrada Atmel Studio 7

Si no teniu Atmel Studio, haureu de descarregar-lo i instal·lar-lo.

www.microchip.com/mplab/avr-support/atmel-studio-7

Les primeres línies que definim alguns compiladors.

F_CPU defineix la freqüència de rellotge en Hz i és comú en els programes que utilitzen la biblioteca avr-libc. En aquest cas, les rutines de retard l’utilitzen per determinar com calcular els retards.

#ifndef F_CPU

#define F_CPU 16000000UL // indicador de freqüència de cristall (16 MHz AVR ATMega328P) #endif

#include // header per habilitar el control de flux de dades sobre pins. Defineix pins, ports, etc.

El primer fitxer d’inclusió forma part d’avr-libc i s’utilitzarà en pràcticament qualsevol projecte AVR en què treballeu. io.h determinarà la CPU que utilitzeu (és per això que especifiqueu la peça en compilar-la) i, al seu torn, inclourà la capçalera de definició IO adequada per al xip que estem utilitzant. Simplement defineix les constants de tots els pins, ports, registres especials, etc.

#include // header per habilitar la funció de retard al programa

La biblioteca util / delay.h conté algunes rutines per a retards breus. La funció que farem servir és _delay_ms ().

Utilitzem define per declarar els nostres ports i pins del botó i del LED. L'ús d'aquestes afirmacions permet definir només tres línies fàcils de trobar si movem el LED a un altre pin d'E / S o si fem servir un AVR diferent.

#define BUTTON1 1 // commutador de botó connectat al port B del pin 1

#define LED1 0 // Led1 connectat al port B pin 0 #define LED2 1 // Led2 connectat al port C pin 1 #define LED3 2 // Led3 connectat al port D pin 2

Els dos últims defineixen els temps de configuració de les sentències, en mil·lisegons, per rebutjar l’interruptor i el temps d’espera abans de permetre una altra premuda del botó. El temps de rebuda s’ha d’ajustar al temps que triga a passar d’un màxim digital a un mínim digital després de tots els rebots. El comportament del rebot serà diferent d’un canvi a l’altre, però 20-30 mil·lisegons sol ser suficient.

#define DEBOUNCE_TIME 25 // temps per esperar mentre es desactiva el botó

#define LOCK_INPUT_TIME 300 // temps d'espera després de prémer un botó

void init_ports_mcu ()

{

Aquesta funció s’anomena només una vegada al principi del nostre programa per inicialitzar els pins de sortida d’entrada que farem servir.

Per al botó, utilitzarem els registres PORT i PIN per escriure i llegir. Amb els AVR, llegim un pin mitjançant el registre PINx i escrivim a un pin mitjançant el registre PORTx. Hem d’escriure al registre de botons per habilitar les desplegables.

Per al LED només necessitem utilitzar el registre PORT per escriure, però també necessitem el registre de direcció de dades (DDR), ja que els pins d'E / S estan configurats com a entrades per defecte.

En primer lloc, configurem els pins d'E / S dels LED com a sortida mitjançant el registre de direcció de dades.

DDRB = 0xFFu; // Estableix tots els pins del PORTB com a sortida.

A continuació, configureu explícitament el pin del botó com a entrada.

DDRB & = ~ (1 <

A continuació, els pins PORTB es posen a l'alt (+5 volts) per engegar-lo. Els pins de sortida són inicialment alts i, ja que el nostre LED està activat per cable, s’encendrà tret que l’apaguem explícitament.

I, finalment, habilitem la resistència d’extracció interna del pin d’entrada que fem servir per al nostre botó. Això es fa simplement enviant-ne un al port. Quan es configura com a entrada, fer-ho resulta en habilitar els pull-ups i, quan es configura com a sortida, fer-ho simplement produiria una alta tensió.

PORTB = 0xFF; // Estableix tots els pins del PORTB com a ALT. El led està encès, // també està habilitada la resistència interna Pull Up del primer pin PORTB. DDRC = 0xFFu; // Estableix tots els pins del PORTC com a sortida. PORTC = 0x00u; // Estableix tots els pins de PORTC que el desactivi. DDRD = 0xFFu; // Estableix tots els pins del PORTD com a sortida. PORTD = 0x00u; // Estableix tots els pins de PORTD que el desactivi. }

char sense signar button_state ()

{

Aquesta funció retorna un valor booleà que indica si s'ha premut o no el botó. Aquest és el bloc de codi que s’executa contínuament en el bucle infinit i, per tant, sondeja l’estat del botó. Aquí també és on rebutgem el canvi.

Ara, recordeu que quan premem l’interruptor, el pin de sortida d’entrada es tira a terra. Per tant, estem esperant que el passador baixi.

/ * es prem el botó quan el bit BUTTON1 bit és buit * /

if (! (PINB & (1 <

Ho fem comprovant si el bit està clar. Si el bit està clar, indicant que el botó està premut, primer retardem la quantitat de temps definida per DEBOUNCE_TIME que és de 25 ms i després comprovem de nou l'estat del botó. Si es prem el botó després dels 25 ms, es considera que el commutador està rebutjat i està a punt per activar un esdeveniment, de manera que tornem 1 a la nostra rutina de trucades. Si no es prem el botó, retornem 0 a la nostra rutina de trucades.

_delay_ms (DEBOUNCE_TIME);

if (! (PINB & (1 <

int main (buit)

{

La nostra rutina principal. La funció principal és única i es diferencia de la resta de funcions. Cada programa C ha de tenir exactament una funció main (). principal és on l'AVR comença a executar el vostre codi quan s'encén per primera vegada, de manera que és el punt d'entrada del programa.

unsigned char n_led = 1; // inicialment el número LED està encès

Crida de la funció per inicialitzar els pins d'E / S que s'utilitzen:

init_ports_mcu ();

bucle infinit on s'executa el nostre programa:

mentre que (1)

{

Quan button_state en retorna un que indica que el botó s'ha premut i rebutjat, es commuta l'estat actual dels LED al seu torn segons el paràmetre n_led.

if (button_state ()) // Si es prem el botó, canvieu l'estat i el retard del LED durant 300 ms (#define LOCK_INPUT_TIME)

{commutador (n_led) {cas 1: PORTB ^ = (1 << LED1); PORTC ^ = (1 << LED2); trencar;

Aquestes declaracions utilitzen operadors de bits C. Aquesta vegada utilitza l’operador OR exclusiu. Quan XOR el PORT amb el valor de bit del bit que voleu canviar, aquest bit es canvia sense afectar els altres bits.

cas 2:

PORTC ^ = (1 << LED2); PORTD ^ = (1 << LED3); trencar; cas 3: PORTD ^ = (1 << LED3); PORTB ^ = (1 << LED1); n_led = 0; // restableix la ruptura de número de LED; } n_led ++; // el següent LED s'encén _delay_ms (LOCK_INPUT_TIME); }} retorn (0); }

Ara, quan executeu aquest programa, hauríeu de ser capaç de prémer el botó perquè els LED es commutin. A causa del nostre retard definit per LOCK_INPUT_TIME, podeu mantenir premut el botó que farà que els LED s’apaguin i s’encengui a una velocitat constant (poc més de cada 275 ms).

La programació s'ha completat.

El següent pas és construir el projecte i programar el fitxer hexadecimal al microcontrolador mitjançant el programa avrdude.

Podeu descarregar el fitxer main.c amb el programa en codi c:

Pas 2: transferir el fitxer HEX del programa a la memòria flash del xip

Transferència del fitxer HEX del programa a la memòria flash del xip
Transferència del fitxer HEX del programa a la memòria flash del xip
Transferència del fitxer HEX del programa a la memòria flash del xip
Transferència del fitxer HEX del programa a la memòria flash del xip

Descarregueu i instal·leu AVRDUDE. L’última versió disponible és la 6.3: descarregueu el fitxer zip

Primer, copieu el fitxer hexadecimal del programa al directori AVRDUDE. En el meu cas es tracta de ButtonAVR.hex

A continuació, escriviu a la finestra d'indicador DOS l'ordre: avrdude –c [nom del programador] –p m328p –u –U flash: w: [nom del fitxer hexadecimal].

En el meu cas és: avrdude –c ISPProgv1 –p m328p –u –U flash: w: ButtonAVR.hex

Aquesta ordre escriu un fitxer hexadecimal a la memòria del microcontrolador.

Mireu el vídeo amb una descripció detallada de la gravació de memòria flash del microcontrolador:

La memòria flash del microcontrolador està gravant …

D'acord! Ara, el microcontrolador funciona d’acord amb les instruccions del nostre programa. Ho comprovem!

Pas 3: eliminació del commutador de maquinari

Debouncing de commutadors de maquinari
Debouncing de commutadors de maquinari

A més de la descàrrega de commutadors de programari, podem utilitzar la tècnica de desconnexió de commutadors de maquinari. La idea bàsica d’aquest tipus de tècnica és utilitzar un condensador per filtrar canvis ràpids en el senyal del commutador.

Quin valor s'ha de seleccionar? En última instància, això dependrà del rendiment del botó en relació amb aquest problema en particular. Alguns botons poden mostrar un comportament de rebot enorme, però d’altres en tindran molt poc. Un valor baix del condensador, com ara 1,0 nanofarads, reaccionarà molt ràpidament, amb poc o cap efecte en el rebot. Per contra, un valor més alt del condensador, com ara 220 nanofarades (que encara és força petit en termes de condensadors) proporcionarà una transició lenta des del voltatge inicial fins al final (5 volts a 0 volts). La transició vista amb una capacitat de 220 nanofarades encara és bastant ràpida en el sentit del món real, i per tant es pot utilitzar en botons amb un rendiment baix.

Pas 4: Circuit elèctric

Circuit elèctric
Circuit elèctric
Circuit elèctric
Circuit elèctric
Circuit elèctric
Circuit elèctric

Connecteu els components segons el diagrama esquemàtic.

Recomanat: