INHOUDSOPGAWE:

AVR -mikrobeheerder. Wissel LED's met 'n drukknopskakelaar. Drukknoppie ontkoppel: 4 stappe
AVR -mikrobeheerder. Wissel LED's met 'n drukknopskakelaar. Drukknoppie ontkoppel: 4 stappe

Video: AVR -mikrobeheerder. Wissel LED's met 'n drukknopskakelaar. Drukknoppie ontkoppel: 4 stappe

Video: AVR -mikrobeheerder. Wissel LED's met 'n drukknopskakelaar. Drukknoppie ontkoppel: 4 stappe
Video: 12v 90 ampère auto-alternator naar zelfopgewonden generator met behulp van DIODE 2024, November
Anonim
Image
Image

In hierdie afdeling leer ons hoe om program C -kode vir ATMega328PU te maak om die status van die drie LED's te verander volgens die insette van 'n knoppieskakelaar. Ons het ook 'n oplossing vir die probleem van 'Switch Bounce' ondersoek. Soos gewoonlik sal ons die elektriese stroombaan op die basis van die AVR ATmega328 monteer om die werking van die programkode na te gaan.

Stap 1: Skryf en bou van AVR -mikrobeheertoepassing in C -kode met behulp van die geïntegreerde ontwikkelingsplatform Atmel Studio 7

Skryf en bou van AVR -mikrobeheertoepassing in C -kode met behulp van die geïntegreerde ontwikkelingsplatform Atmel Studio 7
Skryf en bou van AVR -mikrobeheertoepassing in C -kode met behulp van die geïntegreerde ontwikkelingsplatform Atmel Studio 7
Skryf en bou van AVR -mikrobeheertoepassing in C -kode met behulp van die geïntegreerde ontwikkelingsplatform Atmel Studio 7
Skryf en bou van AVR -mikrobeheertoepassing in C -kode met behulp van die geïntegreerde ontwikkelingsplatform Atmel Studio 7
Skryf en bou van AVR -mikrobeheertoepassing in C -kode met behulp van die geïntegreerde ontwikkelingsplatform Atmel Studio 7
Skryf en bou van AVR -mikrobeheertoepassing in C -kode met behulp van die geïntegreerde ontwikkelingsplatform Atmel Studio 7

As u nie Atmel Studio het nie, moet u dit aflaai en installeer.

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

Die eerste paar reëls bevat 'n paar samesteller definisies.

F_CPU definieer die klokfrekwensie in Hertz en is algemeen in programme wat die avr-libc-biblioteek gebruik. In hierdie geval word dit deur die vertragingsroetines gebruik om te bepaal hoe om tydvertragings te bereken.

#ifndef F_CPU

#definieer F_CPU 16000000UL // vertel die kristalfrekwensie van die beheerder (16 MHz AVR ATMega328P) #endif

#include // header om die datavloeibeheer oor penne moontlik te maak. Definieer penne, poorte, ens.

Die eerste insluit-lêer is deel van avr-libc en sal in feitlik enige AVR-projek waarmee u werk, gebruik word. io.h bepaal die SVE wat u gebruik (daarom spesifiseer u die deel tydens die opstel) en sluit op sy beurt die toepaslike IO -definisie -kop vir die chip wat ons gebruik. Dit definieer eenvoudig die konstantes vir al u penne, hawens, spesiale registers, ens.

#include // header om die vertragingsfunksie in die program moontlik te maak

Die biblioteek util/delay.h bevat 'n paar roetines vir kort vertragings. Die funksie wat ons gaan gebruik, is _delay_ms ().

Ons gebruik definisies om ons knoppie en LED's se poorte en penne te verklaar. Deur die definisies soos hierdie te gebruik, hoef ons slegs 3 lyne wat maklik gevind kan word, aan te pas as ons die LED na 'n ander I/O-pen skuif of 'n ander AVR gebruik.

#define BUTTON1 1 // knoppie skakelaar gekoppel aan poort B pen 1

#definieer LED1 0 // Led1 gekoppel aan poort B pen 0 #definieer LED2 1 // Led2 gekoppel aan poort C pen 1 #definieer LED3 2 // Led3 gekoppel aan poort D pen 2

Die laaste twee definieer die opstellingstye van die stellings, in millisekonde, om die skakelaar te verminder en die tyd om te wag voordat u weer op die knoppie kan druk. Die terugsteltyd moet aangepas word na die tyd wat dit neem om van 'n digitale hoogte na 'n digitale laagtepunt te gaan na al die weerkaatsings. Die weieringgedrag sal verskil van skakelaar tot skakelaar, maar 20-30 millisekondes is gewoonlik redelik voldoende.

#define DEBOUNCE_TIME 25 // tyd om te wag terwyl die knoppie "de-bons"

#definieer LOCK_INPUT_TIME 300 // tyd om te wag nadat 'n knoppie gedruk is

ongeldig init_ports_mcu ()

{

Hierdie funksie word net een keer in die begin van ons program genoem om die invoeruitsetpenne wat ons gaan gebruik, te initialiseer.

Vir die knoppie gebruik ons die PORT- en PIN -registers vir skryf en lees. Met AVR's lees ons 'n speld met behulp van sy PINx -register en skryf ons aan 'n speld met behulp van sy PORTx -register. Ons moet aan die knoppiesregister skryf om die optelwerk moontlik te maak.

Vir die LED hoef ons slegs die PORT -register te gebruik om na te skryf, maar ons het ook die data direction register (DDR) nodig, aangesien die I/O -penne standaard as insette opgestel is.

Eerstens stel ons die LED se I/O -penne as 'n uitset in met die datarigtingregister.

DDRB = 0xFFu; // Stel alle penne van die PORTB as uitvoer.

Stel dan die knoppiespen eksplisiet as 'n invoer.

DDRB & = ~ (1 <

Vervolgens word die PORTB -penne hoog (+5 volt) gestel om dit aan te skakel. Die uitsetpenne is aanvanklik hoog, en aangesien ons LED aktief-hoog bedraad is, sal dit aangeskakel word tensy ons dit uitdruklik uitskakel.

En laastens aktiveer ons die interne optrekweerstand op die invoerpen wat ons vir ons knoppie gebruik. Dit word eenvoudig gedoen deur een na die poort te stuur. As dit as 'n inset gekonfigureer is, lei dit tot pull-ups, en as dit as 'n uitset is ingestel, lei dit bloot tot 'n hoë spanning.

PORTB = 0xFF; // Stel alle penne van die PORTB as HOOG. Led is aan, // ook die interne optrekweerstand van die eerste pen PORTB is moontlik. DDRC = 0xFFu; // Stel alle penne van die PORTC as uitvoer. PORTC = 0x00u; // Stel alle penne van PORTC laag, wat dit uitskakel. DDRD = 0xFFu; // Stel alle penne van die PORTD as uitvoer. PORTD = 0x00u; // Stel alle penne van PORTD laag, wat dit uitskakel. }

ongetekende char button_state ()

{

Hierdie funksie gee 'n booleaanse waarde terug wat aandui of die knoppie al dan nie ingedruk is. Dit is die kodeblok waarmee dit voortdurend in die oneindige lus uitgevoer word, en daarom word die toestand van die knoppie ondersoek. Dit is ook hier waar ons die skakelaar afbreek.

Onthou nou dat as ons op die skakelaar druk, die invoerpen na die grond getrek word. Ons wag dus totdat die pen laag word.

/ * die knoppie word ingedruk as BUTTON1 bit duidelik is */

as (! (PINB & (1 <

Ons doen dit deur te kyk of die bietjie duidelik is. As die bietjie duidelik is, wat aandui dat die knoppie ingedruk is, vertraag ons eers vir die tydsduur wat gedefinieer is deur DEBOUNCE_TIME, wat 25 ms is, en kyk dan weer na die toestand van die knoppie. As die knoppie na die 25 ms ingedruk word, word die skakelaar beskou as afgeskakel en gereed om 'n gebeurtenis te veroorsaak, en dan keer ons terug na ons roetine. As die knoppie nie ingedruk is nie, keer ons terug na ons roepingroetine.

_vertraag_ms (DEBOUNCE_TIME);

as (! (PINB & (1 <

int main (leeg)

{

Ons belangrikste roetine. Die hooffunksie is uniek en onderskei van alle ander funksies. Elke C -program moet presies een hooffunksie hê (). Die belangrikste is waar die AVR u kode begin uitvoer wanneer die krag eers aangaan, dus dit is die ingangspunt van die program.

ongetekende char n_led = 1; // Aanvanklik is die LED -nommer aan

Oproep van die funksie om I/O -penne wat gebruik word te initialiseer:

init_ports_mcu ();

oneindige lus waar ons program loop:

terwyl (1)

{

As button_state een terugbring wat aandui dat die knoppie ingedruk en ontkoppel is, verander dan die huidige status van LED's om die beurt volgens die n_led -parameter.

if (button_state ()) // As die knoppie ingedruk word, verander die toestand van die LED en vertraag dit vir 300ms (#define LOCK_INPUT_TIME)

{switch (n_led) {case 1: PORTB ^= (1 << LED1); PORTC ^= (1 << LED2); breek;

Hierdie stellings gebruik C bitwise -operateurs. Hierdie keer gebruik hy die eksklusiewe OF -operateur. As u die poort XOR met die bitwaarde van die bietjie wat u wil omskakel, word die een bis verander sonder om die ander bisse te beïnvloed.

geval 2:

PORTC ^= (1 << LED2); PORTD ^= (1 << LED3); breek; geval 3: PORTD ^= (1 << LED3); PORTB ^= (1 << LED1); n_led = 0; // Stel LED -nommerbreuk terug; } n_led ++; // die volgende LED is _delay_ms (LOCK_INPUT_TIME) aan; }} terugkeer (0); }

Dus, as u hierdie program uitvoer, moet u op die drukknoppie kan druk om LED's aan te skakel. As gevolg van ons vertraging gedefinieer deur LOCK_INPUT_TIME, kan u die knoppie ingedruk hou, wat veroorsaak dat die LED's met 'n konstante tempo afskakel en aanskakel (bietjie meer as elke 275 ms).

Die programmering is voltooi.

Die volgende stap is die bou van die projek en die programmering van hex -lêers in die mikrobeheerder met behulp van die avrdude -program.

U kan die main.c -lêer met die program in c -kode aflaai:

Stap 2: Die oordrag van die HEX -lêer van die program in die flash -geheue van die chip

Die oordrag van die HEX -lêer van die program in die flash -geheue van die chip
Die oordrag van die HEX -lêer van die program in die flash -geheue van die chip
Die oordrag van die HEX -lêer van die program in die flash -geheue van die chip
Die oordrag van die HEX -lêer van die program in die flash -geheue van die chip

Laai AVRDUDE af en installeer dit. Die nuutste weergawe wat beskikbaar is, is 6.3: Laai die zip -lêer af

Kopieer eers die hex -lêer van die program na die AVRDUDE -gids. In my geval is dit ButtonAVR.hex

Tik dan die opdrag: avrdude –c [naam van programmeerder] –p m328p –u –U flits: w: [naam van u hex -lêer] in.

In my geval is dit: avrdude –c ISPProgv1 –p m328p –u –U flits: w: ButtonAVR.hex

Hierdie opdrag skryf heks -lêer na die geheue van die mikrobeheerder.

Kyk na die video met 'n gedetailleerde beskrywing van die verbranding van die flitsgeheue van die mikrobeheerder:

Mikrokontroleerder flitsgeheue brand …

Ok! Die mikrobeheerder werk nou volgens die instruksies van ons program. Kom ons kyk!

Stap 3: Ontbinding van hardeware -skakelaars

Ontbinding van hardeware -skakelaars
Ontbinding van hardeware -skakelaars

Benewens die ontbinding van sagtewareskakelaars, kan ons die tegniek vir die ontbinding van hardeware -skakelaars gebruik. Die basiese idee agter hierdie tegniek is om 'n kapasitor te gebruik om vinnige veranderinge in die skakelaarsignaal uit te filter.

Watter waarde kapasitor moet gekies word? Dit hang uiteindelik af van die swak prestasie van die knoppie ten opsigte van hierdie spesifieke probleem. Sommige knoppies kan 'n geweldige weerkaatsing vertoon, maar ander sal baie min hê. 'N Lae kapasitorwaarde soos 1.0 nanofarads reageer baie vinnig, met min of geen uitwerking op die weerkaatsing nie. Omgekeerd bied 'n hoër kapasitorwaarde soos 220 nanofarads (wat nog redelik klein is in terme van kapasitors) 'n stadige oorgang van die begin- tot die eindspanning (5 volt tot 0 volt). Die oorgang met 'n 220 nanofarad-kapasiteit is egter nog steeds redelik vinnig in die werklike sin, en kan dus gebruik word op knoppies wat swak presteer.

Stap 4: Elektriese stroombaan

Elektriese stroombaan
Elektriese stroombaan
Elektriese stroombaan
Elektriese stroombaan
Elektriese stroombaan
Elektriese stroombaan

Verbind komponente volgens die skematiese diagram.

Aanbeveel: