INHOUDSOPGAWE:

AVR -samestellingstudie 7: 12 -stappe
AVR -samestellingstudie 7: 12 -stappe

Video: AVR -samestellingstudie 7: 12 -stappe

Video: AVR -samestellingstudie 7: 12 -stappe
Video: Особенность подключения AVR (автоматики) на генераторы Matari 7-10 кВт 2024, Julie
Anonim
AVR -samestellingstudie 7
AVR -samestellingstudie 7

Welkom by Tutoriaal 7!

Vandag gaan ons eers wys hoe u 'n toetsbord kan opspoor, en dan wys hoe u die analoog -invoerpoort kan gebruik om met die bedieningspaneel te kommunikeer. Ons sal die bedieningspaneel bedraad sodat elke toetsdruk 'n unieke spanning na die analoog ingang stuur, waardeur ons kan onderskei deur die spanning waarop die toets ingedruk is. Dan sal ons die getal wat na ons registeranaliseerder gedruk word, aflei om aan te toon dat alles gebeur soos dit moet. Daar is 'n aantal slaggate waarmee u kan loop wanneer u die Analog to Digital Converter (ADC) in die ATmega328p gebruik, en daarom sal ons neem dinge in 'n paar fases op pad om te probeer uitvind hoe u dit kan vermy. Ons sal ook sien waarom die gebruik van die analoog na digitale omskakelaar nie die beste manier is om 'n bedieningspaneel te beheer nie, alhoewel dit minder poorte op u mikrobeheerder gebruik.

  1. 'n klavier. U kan een koop, of u kan doen wat ek gedoen het en een opspoor.
  2. 2 vroulike opskrifte vir die klavier (as u een soek)
  3. drade verbind
  4. 'n broodbord
  5. 4 1 Kohm weerstande
  6. 1 15 Kohm weerstand
  7. 1 3.3 Kohm weerstand
  8. 1 180 ohm weerstand
  9. 1 680 ohm weerstand
  10. 'n digitale multimeter
  11. jou ontleder uit Tutoriaal 5

Miskien wil u die eerste paar stappe oorslaan as u reeds 'n bedieningspaneel het en dit nie nodig het nie.

Hier is 'n skakel na die volledige versameling van my tutoriale vir AVR-samestellers:

Stap 1: Ontdek 'n toetsbord 1

Ontdek 'n sleutelbord 1
Ontdek 'n sleutelbord 1
Ontdek 'n sleutelbord 1
Ontdek 'n sleutelbord 1
Ontdek 'n sleutelbord 1
Ontdek 'n sleutelbord 1
Ontdek 'n sleutelbord 1
Ontdek 'n sleutelbord 1

Lank gelede, toe selfs jou grootouers maar net kinders was, het mense hierdie vreemde toestelle met lang kabels in die muur gebruik om met mekaar te kommunikeer. Hulle is "telefone" genoem en was gewoonlik goedkoop plastiekgoed wat 'n irriterende geluid gemaak het as iemand jou bel (nie dat die "Justin Bieber" -beltone van vandag nie ewe irriterend is nie). In elk geval het hierdie toestelle bedieningspanele gehad wat baie eenvoudig bedraad was, en dit is maklik om op te vang, en hulle het 2 ekstra sleutels ("herhaal" en "flits") van die bedieningspanele wat u kan koop, wat u moontlik wil hergebruik as "pyltjie sleutels", "spyskaart sleutels", of iets anders. Ons gaan dus begin deur 'n toetsbord van 'n ou telefoon af te vee. Neem eers die telefoon (ek gebruik 'n GE -een soos op die foto's) en los dit om die bedrading te openbaar. Neem dan 'n beitel en maak die klein plastiekknoppies wat die klavier bevat, los en verwyder die bedieningspaneel.

Stap 2: Ontdek 'n sleutelbord 2

Ontdek 'n sleutelbord 2
Ontdek 'n sleutelbord 2
Ontdek 'n sleutelbord 2
Ontdek 'n sleutelbord 2
Ontdek 'n sleutelbord 2
Ontdek 'n sleutelbord 2

Neem nou 'n PVC -saag en sny die plastiek rondom die sleutelgate, en sny dan om die rand om die diepte reg te kry, en laat 'n dun klavier.

Sit dan weer die bedieningspaneel aan met behulp van die klein penne wat oorgebly het nadat u die bokant in die laaste stap afgesny het en gebruik 'n soldeerbout om die warm yster in elke gaatjie te steek, wat die plastiek sal smelt en versprei onderkant van die bedieningspaneel en vorm nuwe "knoppe" wat die bedieningspaneel soos voorheen op sy plek hou.

Ek hou daarvan om die drie luidsprekers op te spoor en miskien die ander dinge soos skakelaars en wat nie op die bord nie. Hierdie keer gaan ek egter nie die skakelaars en so aan soek nie, want ons het tans ander doelwitte. Daar is ook 'n TA31002 lineêre IC, 'n telefoonbel. Die datablad kan maklik aanlyn gevind en afgelaai word, met die kenmerke en kenmerke. Ek sal dit dus vir eers aan die bord laat soldeer en dan later daarmee speel. Ek wil dit graag aan 'n ossilloskoop koppel en kyk watter cool seine ek daaruit kan kry. Miskien selfs 'n deurklokkie daarvan maak. Wie weet.

Hoe dan ook, sodra u die telefoon vernietig het en die onderdele opgevee het, maak ons ons toetsbord klaar.

Stap 3: Ontdek 'n sleutelbord 3

Ontdek 'n sleutelbord 3
Ontdek 'n sleutelbord 3
Ontdek 'n sleutelbord 3
Ontdek 'n sleutelbord 3
Ontdek 'n sleutelbord 3
Ontdek 'n sleutelbord 3

Gebruik 'n ontsoldeer lont en verwyder die lintkabels aan die onderkant van die bedieningspaneel en maak seker dat die gate in die printplaat duidelik is en heg dan twee kopstukke aan die bord waar die gate is. U sal waarskynlik u opskrifte moet afknip sodat dit 'n 4-pen-opskrif is.

Noudat die kopstukke aangeheg is, kan u dit op 'n broodbord dra, 'n multimeter neem en die sleutels toets deur die multimeter oor willekeurige penne te plak en die weerstand te meet. Hiermee kan u die sleutels in kaart bring. Dit is moeilik om te sien hoe die sleutels aan die uitsette gekoppel is deur na die kring te kyk, maar as u 'n multimeter gebruik, kan u dit aan twee penne koppel en dan op die knoppies druk totdat u 'n nommer op die skerm sien in plaas van 'n oop kring. Dit is die sleutel vir die sleutel.

Maak 'n kaart van al die sleutels vir die uitvoerpenne op hierdie manier.

Stap 4: Bedraad die sleutelbord

Bedraad die sleutelbord
Bedraad die sleutelbord
Bedraad die sleutelbord
Bedraad die sleutelbord

Volg nou die bedradingsdiagram en dra die toetsbord na u broodbord.

Hoe dit gaan werk, is dat ons 5V aan die linkerkant plaas en die regterkant na GND. Die eerste pen regs in die diagram gaan in die eerste van ons analoog penne op die Atmega328p mikrokontroller. As daar geen knoppies gedruk word nie, sal die sein 0V wees, en as elkeen van die verskillende knoppies ingedruk word, sal die ingang na die analoogpoort wissel tussen 0V en 5V, met 'n ander hoeveelheid, afhangende van watter toets gedruk is. Ons het die weerstandswaardes gekies sodat elke pad 'n weerstand bevat wat anders was as die res. Die analoogpoort op die mikrobeheerder neem 'n analoog sein en verdeel dit in 1024 verskillende kanale tussen 0V en 5V. Dit beteken dat elke kanaal 'n breedte van 5V/1024 = 0,005 V/kanaal = 5 mV/kanaal het. Die analoogpoort kan dus insetspannings onderskei, solank dit met meer as 5 mV verskil. In ons geval het ons weerstandswaardes gekies, sodat twee drukpunte 'n spanningssein sal stuur wat meer as dit verskil, sodat die mikrobeheerder maklik kan besluit watter sleutel ingedruk is. Die groot probleem is dat die hele stelsel baie raserig is, so ons sal 'n reeks spannings moet kies om aan elke knoppie te druk - maar ons sal 'n bietjie later daarby ingaan.

Let daarop dat ons 'n 14 -knoppie -toetsbord kan beheer met slegs 'n enkele invoerlyn na die beheerder. Dit is een van die nuttige aspekte van analoog insette.

Ons eerste poging om die bedieningspaneel te beheer, is om 'n toets te laat onderbreek, die onderbreekprogram sal die analoog invoerpoort lees en besluit watter sleutel ingedruk is, en dan sal dit die nommer na ons subprogramme van die registeranaliseerder stuur, wat die sleutelwaarde in binêre op ons 8 LED's wat ons in tutoriaal 5 opgestel het.

Stap 5: Verbind die sleutelbord met u analiseerder

Verbind die sleutelbord met u ontleder
Verbind die sleutelbord met u ontleder
Verbind die sleutelbord met u ontleder
Verbind die sleutelbord met u ontleder

Die foto's wys hoe ons die bedieningspaneel na die mikrobeheerder wil stuur, sodat ons die uitset op ons analise -skerm kan sien. In wese stuur ons die uitset van die bedieningspaneel eenvoudig na PortC pin 0, wat ook ADC0 op die ATmega328P genoem word.

Daar is egter 'n paar ekstra dinge. Ons gaan ook 'n knoppie na PD2 dra. D.w.s. neem 'n draad van u 5V -reling na 'n knoppie en van die ander kant van die knoppie na PD2, en laastens wil ons die AREF -pen van ons 5V -reling ontkoppel en dit in plaas daarvan los laat. Ons kan 'n 0.1 microfarad ontkoppelingskondensator insit as ons wil. Dit is 'n keramiek kondensator met 'n 104 daarop. Die eerste twee syfers is die getal en die laaste syfer is die krag van 10 waarmee ons dit vermenigvuldig om 'n antwoord in picofarads te kry (pico beteken 10^-12), dus 104 beteken 10 x 10^4 picofarads, wat dieselfde is as 100 nanofarads (nano beteken 10^-9), wat dieselfde is as 0,1 mikrofarads (mikro beteken 10^-6). In elk geval, dit is net om die AREF -pen te stabiliseer wanneer ons dit as ons verwysingspen kan gebruik.

Ons wil ook 'n 1 Mohm -weerstand tussen PD2 en grond hê. Ons gaan PD2 as 'n uitsetpen op 0V stel, en ons sal 'n positiewe rand by die pen veroorsaak. Ons wil hê dat die rand onmiddellik verdwyn as ons die knoppie los, sodat ons hierdie "aftrek" -weerstand sal plaas.

Die rede waarom ons die knoppie wil hê, is omdat ons ons analoog-na-digitale omskakelaar van pin INT0 op die chip, wat ook PD2 is, wil aktiveer. Uiteindelik wil ons hê dat die druk op die toets die ADC aktiveer en ook die invoer lewer wat omgeskakel moet word sonder 'n aparte knoppie, maar as gevolg van die manier waarop die tydsberekening werk, begin ons met 'n aparte knoppie om die ADC te aktiveer en sodra ons alles stryk die foute uit en is vol vertroue dat alles reg werk, dan sal ons die geraas- en tydsberekeningskwessies wat met die knoppie druk wat ons wil lees, hanteer.

Die manier waarop dit werk, is: ons hou 'n sleutel ingedruk, druk dan op die knoppie om die ADC te aktiveer, en laat dan los en hopelik verskyn die binêre waarde van die knoppie wat ons gedruk het op die ontleder.

Laat ons dus 'n kode skryf wat dit kan bereik.

Stap 6: Watter skakelaars moet ons instel?

Watter skakelaars moet ons instel?
Watter skakelaars moet ons instel?

Laat ons eers nadink oor hoe ons dit gaan kodeer, sodat die beheerder die invoer vanaf die bedieningspaneel kan lees en dit kan verander in 'n numeriese waarde wat ooreenstem met die knoppie wat ingedruk is. Ons gaan die Analog to Digital Converter (ADC) gebruik wat ingebou is in die Atmega328p. Ons sal AREF as ons verwysingspanning gebruik, en ons toetsborduitset sal aan PortC0 of PC0 gekoppel word. Let daarop dat hierdie pen ook ADC0 vir Analog-to-Digital Converter 0. Om die mikrobeheerder op te stel sodat hy weet wat hy met 'n analoog insetsein moet doen en hoe ons met ons program kan reageer, moet ons eers 'n paar van die verskillende ADC instel verwante registerstukke. Dit is in wese gelykstaande aan die ou skakelaars op die eerste rekenaars. U skakel 'n skakelaar AAN of UIT, of selfs verder terug, sal u kabels tussen die een uitgang en die ander aansluit, sodat elektrone wat by die vurk in die pad kom, een hek gesluit en 'n ander oop kry wat dit in 'n doolhof van 'n ander pad dwing. stroombane en voer dus 'n ander logiese taak uit. As ons in die samestellingstaal kodeer, het ons toegang tot hierdie funksies van die mikrobeheerder, wat in die eerste plek een van die aantreklike dinge is om dit te doen. Dit is meer 'hands on' en veel minder 'as' agter die skerms '. Moet dus nie dink dat hierdie registers 'n vervelige taak is nie. Dit is wat die vergaderingstaal interessant maak! Ons kry 'n baie persoonlike verhouding met die innerlike werking en logika van die chip en laat dit presies doen wat ons wil - nie meer en nie minder nie. Geen vermorste kloksiklusse nie. Hier is 'n lys van die skakelaars wat ons moet instel:

  1. Skakel die Power Reduction ADC -bit, PRADC, wat bit 0 van die PRR -register is, uit, want as hierdie bit aan is, sal dit die ADC afskakel. Die kragverminderingsregister is in wese 'n manier om verskillende dinge wat krag gebruik, af te skakel as u dit nie nodig het nie. Aangesien ons die ADC gebruik, wil ons seker maak dat dit nie op hierdie manier uitgeskakel is nie. (Sien PRADC op bladsy 46)
  2. Kies die analoog ingangskanaal wat ADC0 moet wees deur MUX3 … 0 in die ADC Multiplexer Selection (ADMUX) register uit te skakel (sien tabel 24-4 bladsy 249). Ek sluit dit egter in, want as u ooit 'n ander poort as ADC0 gebruik, moet u hierdie skakelaars dienooreenkomstig wissel. Verskeie kombinasies van MUX3, MUX2, MUX1, MUX0 stel u in staat om enige van die analoog -poorte as u invoer te gebruik, en u kan dit ook vinnig verander as u tegelyk na 'n klomp verskillende analoog seine wil kyk.
  3. Skakel REFS0 en REFS1 bisse in die ADMUX register af sodat ons AREF as ons verwysingspanning sal gebruik eerder as 'n interne verwysing (Sien bladsy 248).
  4. Skakel die ADLAR -bit in ADMUX aan, sodat die resultaat 'links aangepas' word; ons sal hierdie keuse in die volgende stap bespreek.
  5. Stel die ADC0D -bit in die Digital Input Disable Register (DIDR0) in om die digitale invoer na PC0 uit te skakel. Ons gebruik die poort vir analoog invoer, sodat ons net sowel die digitale invoer daarvoor kan deaktiveer.
  6. Stel ISC0 en ISC1 in die Externe Interrupt Control Register A (EICRA) in om aan te dui dat ons op die stygende rand van 'n spanningssein na die INT0 -pen (PD2) wil gaan, sien bladsy 71.
  7. Vee stukkies INT0 en INT1 in die register vir eksterne onderbrekingsmasker (EIMSK) uit om aan te dui dat ons nie onderbrekings op hierdie pen gebruik nie. As ons onderbrekings op hierdie pen moontlik maak, benodig ons 'n onderbrekingshanteerder op adres 0x0002, maar ons stel dit so in dat 'n sein op hierdie pen die ADC -omskakeling aktiveer, waarvan die voltooiing deur die ADC -omskakeling hanteer word, volledige onderbreking by adres 0x002A. Sien bladsy 72.
  8. Stel die ADC Enable (ADEN) bit (bit 7) in die ADC control and status register A (ADCSRA) in om die ADC in staat te stel. Sien bladsy 249.
  9. Ons kan 'n enkele omskakeling begin deur die ADC -begin -omskakelingsbit (ADSC) in te stel elke keer as ons die analoog sein wil lees, maar vir eers wil ons dit eerder outomaties laat lees wanneer iemand op die knoppie druk, so ons sal eerder die ADC aktiveer Autotrigger Aktiveer (ADATE) -bit in die ADCSRA -register sodat outomaties geaktiveer word.
  10. Ons stel ook die ADPS2..0 bisse (die AD Prescalar bits) op 111 sodat die ADC klok die CPU klok is gedeel deur 'n faktor van 128.
  11. Ons kies die bron van die ADC -aanskakeling om PD2 te wees, wat ook INT0 (External Interrupt Request 0) genoem word. Ons doen dit deur die verskillende stukkies in die ADCSRB-register te skakel (sien Tabel 24-6 op bladsy 251). Ons sien aan die tabel dat ons ADTS0 af, ADTS1 aan en ADTS2 af wil hê sodat die ADC die pen sal aktiveer. Let op: as ons die analoogpoort deurlopend wil proeweer, soos as ons 'n deurlopende analoog sein lees (soos klankmonsterneming of iets), stel ons dit in die vrylopende modus. Die metode wat ons gebruik om die ontsteking op PD2 in te stel, lei tot 'n ADC -lees van die analoog poort PC0 sonder om 'n onderbreking te veroorsaak. Die onderbreking kom wanneer die omskakeling voltooi is.
  12. Aktiveer die ADC Interrupt Enable (ADIE) -bit in die ADCSRA -register, sodat wanneer die analoog na digitale omskakeling voltooi is, 'n onderbreking sal ontstaan waarvoor ons 'n interrupt -hanteerder kan skryf en dit op.org 0x002A kan plaas.
  13. Stel die I -bietjie in SREG in om onderbrekings moontlik te maak.

Oefening 1: Maak seker dat u die relevante afdelings in die datablad vir elk van die bogenoemde instellings lees, sodat u kan verstaan wat aangaan en wat sou gebeur as ons dit na alternatiewe instellings verander.

Stap 7: Skryf die onderbrekingshanteerder

In die laaste stap het ons gesien dat ons dit opgestel het sodat 'n stygende rand wat op PD2 opgespoor word, 'n analoog na digitale omskakeling op PC0 sal veroorsaak, en as hierdie omskakeling voltooi is, sal dit 'n ADC Conversion Complete -onderbreking veroorsaak. Nou wil ons iets doen met hierdie onderbreking. As u Tabel 12-6 op bladsy 65 ondersoek, sien u 'n lys met moontlike onderbrekings. Ons het reeds die RESET -onderbreking by adres 0x0000 en die timer-/teller0 -oorlooponderbreking by adres 0x0020 in vorige tutoriale gesien. Nou wil ons kyk na die ADC -onderbreking wat ons sien in die tabel op adres 0x002A. Dus, aan die begin van ons monteringstaalkode, benodig ons 'n reël wat lui:

.org 0x002Arjmp ADC_int

wat na ons onderbrekingshanteerder met die naam ADC_int sal spring wanneer die ADC 'n omskakeling voltooi het. Hoe moet ons ons interrupt -hanteerder skryf? Die manier waarop die ADC werk, is deur die volgende berekening uit te voer:

ADC = Vin x 1024 / Vref

Laat ons kyk wat gebeur as ek op die "herhaal" -knoppie op die klavier druk. In daardie geval sal die spanning op PC0 tot 'n sekere waarde verander, sê 1.52V, en aangesien Vref by 5V is, sal ons hê:

ADC = (1.52V) x 1024 / 5V = 311.296

en so sou dit verskyn as 'n 311. As ons dit na 'n spanning wou omskakel, sou ons die berekening net omkeer. Ons hoef dit egter nie te doen nie, want ons is nie geïnteresseerd in die werklike spannings om net tussen hulle te onderskei nie. As die omskakeling klaar is, word die resultaat gestoor in 'n 10-bis-nommer wat in ADCH- en ADCL-registers geplaas is, en ons het veroorsaak dat dit 'links aangepas' is, wat beteken dat die 10-bisse by bit 7 van ADCH begin en afloop na bit 6 van ADCL (daar is 16 bisse in totaal in hierdie twee registers en ons gebruik slegs 10 daarvan, dit wil sê 1024 kanale). Ons kan die resultaat regs laat regstel as ons wil, deur die ADLAR -bit in die ADMUX -register uit te vee. Dit is waarskynlik net 'n geraas, sodat ons die sleutelpersone slegs met die boonste 8 syfers kan onderskei, met ander woorde, ons hoef net na ADCH te kyk om uit te vind watter knoppie ingedruk is. registreer, skakel die getal om in 'n sleutelbordwaarde en stuur die waarde na ons LED's van die registeranaliseerder, sodat ons kan verifieer dat die LED's wat ooreenstem met '00001001' sal brand. alhoewel ons eers moet sien wat in ADCH verskyn as ons op die verskillende knoppies druk. Laat ons dus 'n eenvoudige onderbrekingshanterer skryf wat die inhoud van ADCH net na die analiseerder se skerm stuur. Hier is wat ons nodig het:

ADC_int: lds analyzer, ADCH; laai die waarde van ADCH in ons analysersbi EIFR, 0; maak die eksterne onderbrekingsvlag skoon sodat dit gereed is om weer terug te gaan

Teen hierdie tyd behoort u die kode van ons ontleder in tutoriaal 5 net te kan kopieer en hierdie onderbreking en die skakelinstellings by te voeg en uit te voer. Oefening 2: Skryf die kode en voer dit uit. Kyk dat die ADCH op u analise -skerm verskyn. Probeer dieselfde toets meer as een keer druk. Kry u altyd dieselfde waarde in ADCH?

Stap 8: Maak 'n kaart van die toetsdrukwaardes

Maak 'n kaart van die sleutelpersoonwaardes
Maak 'n kaart van die sleutelpersoonwaardes

Wat ons nou moet doen, is om die waardes in ADCH om te skakel in getalle wat ooreenstem met die sleutel wat ingedruk is. Ons doen dit deur die inhoud van ADCH vir elke toetsdruk op te skryf en dit dan om te skakel in 'n desimale getal soos ek op die foto gedoen het. In ons onderbrekingshanteringsroetine sal ons 'n hele reeks waardes oorweeg wat ooreenstem met elke toetsdruk, sodat die ADC enigiets in die reeks na 'n gegewe sleutel druk.

Oefening 3: Doen hierdie kartering en skryf u ADC-onderbreekroetine weer neer.

Hier is wat ek vir myne gekry het (joune sal heel moontlik anders wees). Let op dat ek dit met 'n reeks waardes vir elke toetsdruk ingestel het.

ADC_int:; Eksterne interrupt handlerclr analiseerder; berei voor vir nuwe getalle knoppie H, ADCH; ADC werk op wanneer ADCH gelees word clccpi knoppie H, 240brlo PC+3; as ADCH groter is, dan is dit 'n 1ldi -ontleder, 1; laai dus die ontleder met 'n 1rjmp -opbrengs; en terugkeer clccpi knoppie H, 230; as ADCH groter is dan 'n 2brlo PC+3ldi analiseerder, 2rjmp terugkeer clccpi knoppie H, 217brlo PC+3ldi ontleder, 3rjmp terugkeer clccpi knoppie H, 203brlo PC+3ldi ontleder, 4rjmp terugkeer clccpi knoppie, 187brlo PC+3ldi ontleder, 5rjmp terugkeer clccpi knoppie, 155brlo PC+3ldi analyzer, 6rjmp return clccpi buttonH, 127brlo PC+3ldi analyzer, 255; ons sal flits instel soos alle onrjmp terugkeer clccpi knoppie H, 115brlo PC+3ldi analiseerder, 7rjmp terugkeer clccpi knoppie H, 94brlo PC+3ldi ontleder, 8rjmp terugkeer clccpi knoppie H, 62brlo PC+3ldi ontleder, 9rjmp terugkeer clccpi knoppie H, 37brlo PC+3ldi ontleder, 0b11110000; sterretjie is boonste helfte onrjmp terugkeer clccpi knoppie H, 28brlo PC+3ldi analiseerder, 0rjmp terugkeer clccpi knoppie H, 17brlo PC+3ldi ontleder, 0b00001111; hash teken is onderste helfte onrjmp terugkeer clccpi knoppie H, 5brlo PC+3ldi analiseerder, 0b11000011; herbel is bo 2 onder 2rjmp terugkeer ldi ontleder, 0b11011011; anders het 'n fout teruggekom: reti

Stap 9: Kode en video vir weergawe 1

Ek het my kode aangeheg vir hierdie eerste weergawe van die bediener van die klavier. In hierdie een moet u op die sleutel druk en dan op die knoppie druk sodat die ADC die invoer van die bedieningspaneel kan lees. Wat ons liewer wil hê, is geen knoppie nie, maar die sein om die omskakeling te doen, kom van die toetsdruk self. Oefening 3: Versamel en laai hierdie kode op en probeer dit. Miskien moet u die verskillende omskakelingsdrempels verander om aan te pas by u toetsdruk, aangesien dit waarskynlik van myne verskil. Wat gebeur as u probeer om 'n invoer van die bedieningspaneel vir die ADC0 en die eksterne onderbrekingspen te gebruik in plaas van deur 'n knoppie? in my kode is daar 'n afdeling wat die stapelwyser initialiseer. Daar is verskillende registers wat ons moontlik wil stoot en uit die stapel spring wanneer ons veranderlikes en wat nie manipuleer nie, en daar is ook registers wat ons later wil stoor en herstel. SREG is byvoorbeeld 'n register wat nie oor onderbrekings bewaar word nie, dus kan die verskillende vlae wat as gevolg van bewerkings opgestel en skoongemaak word, verander word as 'n onderbreking in die middel van iets plaasvind. Dit is dus die beste as u SREG aan die stapel druk aan die begin van 'n onderbrekingshanteerder en dit dan weer aan die einde van die onderbrekingshanteerder laat val. Ek het dit in die kode geplaas om aan te toon hoe dit geïnisialiseer word en om te voorsien hoe ons dit later nodig sal hê, maar aangesien dit ons nie omgee wat met SREG gebeur tydens onderbrekings in ons kode nie, het ek nie die stapel hiervoor gebruik nie. dat ek die skofbewerking gebruik het om verskillende bisse in registers in te stel tydens die inisialisering. Byvoorbeeld in die reël:

l temp, (1 <> ste EICRA, temp

Die opdrag "<<" in die eerste reël kode hierbo is 'n skuifbewerking. Dit neem in wese die binêre getal 1, wat 0b00000001 is, en verskuif dit na die getal ISC01. Dit is die posisie van die bietjie genaamd ISC01 in die EICRA -register. Aangesien ISC01 bit 1 is, word die getal 1 na die linker 1 posisie verskuif om 0b00000010 te word. Net so is die tweede, ISC00, bit 0 van EICRA en dus is die verskuiwing van die getal 1 nul posisies na links. As u weer kyk, kyk dan na die m328Pdef.inc -lêer wat u in die eerste tutoriaal afgelaai het en sedertdien evrr gebruik het, sal u sien dat dit slegs 'n lang lys van '.equ' -stellings is. U sal vind dat ISC01 gelyk is aan 1. Die samesteller vervang elke geval daarvan met 1 voordat hy eers iets begin monteer. Dit is slegs name vir registerstukke om ons mense te help om kode te lees en te skryf. Die vertikale lyn tussen die twee skofbewerkings hierbo is 'n logiese "of" bewerking. Hier is die vergelyking:

0b00000010 | 0b00000001 = 0b00000011

en dit is wat ons laai (met behulp van "ldi") in temp. Die rede waarom mense hierdie metode gebruik om waardes in 'n register te laai, is dat dit die naam van die bietjie in plaas van slegs 'n getal kan gebruik, en dit maak die kode baie makliker om te lees. Daar is ook twee ander tegnieke wat ons gebruik het. Ons gebruik die instruksies "ori" en "andi". Hiermee kan ons stukkies onderskeidelik SET en CLEAR sonder om enige van die ander bisse in 'n register te verander. Byvoorbeeld, toe ek gebruik het

oortemperatuur, (1

hierdie "of" se temperatuur met 0b00000001 wat 'n 1 in die nulpunt plaas en die res onveranderd laat. Ook toe ons geskryf het

andi temp, 0b11111110

dit verander die nul temperatuur in 0 en laat die res onveranderd.

Oefening 4: U moet deur die kode gaan en seker maak dat u elke reël verstaan. U vind dit moontlik interessant om beter metodes te vind om dinge te doen en 'n beter program te skryf. Daar is honderde maniere om dinge te kodeer, en ek is redelik vol vertroue dat u 'n baie beter manier as myne kan vind. U kan ook (hemel verby!) Foute en weglatings vind. In so 'n geval sal ek beslis van hulle wil hoor sodat dit reggestel kan word.

Goed, laat ons kyk of ons van die oorbodige knoppie ontslae kan raak …

Stap 10: Kode vir weergawe 2

Die eenvoudigste manier om van die knoppie ontslae te raak, is deur dit heeltemal te verwyder, vergeet die invoer na PB2 en skakel die ADC in "Free Running Mode".

Met ander woorde, verander eenvoudig die ADCSRB -register sodat ADTS2, ADTS1 en ADTS0 almal nul is.

Stel dan die ADSC -bit in ADCSRA op 1 wat die eerste omskakeling sal begin.

Laai dit nou op na u mikrobeheerder, en u sal sien dat die korrekte nommer op die skerm verskyn terwyl u op die knoppie druk en slegs terwyl u op die knoppie druk. Dit is omdat die ADC voortdurend die ADC0 -poort bemonster en die waarde vertoon. As u u vinger van die knoppie afhaal, veroorsaak die 'knoppie -weerkaatsing' dat 'n paar ewekansige waardes baie vinnig voorkom, en dan sal dit terugkeer na 0V -invoer. In ons kode verskyn hierdie 0V as 0b11011011 (omdat die sleutel '0' reeds die 0b00000000 vertoonwaarde gebruik)

Dit is egter nie die oplossing wat ons wil hê nie, maar om twee redes. Eerstens wil ons nie die knoppie hou nie. Ons wil dit een keer druk en die nommer vertoon (of gebruik in 'n nuwe kode in 'n latere tutoriaal). Tweedens wil ons nie voortdurend die ADC0 proe nie. Ons wil hê dat dit 'n enkele lesing moet neem, dit omskakel en dan kan slaap totdat 'n nuwe toetsdruk 'n nuwe omskakeling veroorsaak. Die vryloopmodus is die beste as die enigste ding wat u wil hê dat die mikrobeheerder moet doen, deurlopend analoog insette moet lees - soos as u reële tydstemperature of iets wil vertoon.

Laat ons dus nog 'n oplossing vind …

Stap 11: Hoe raak ons van die knoppie ontslae? Weergawe 3

Hoe raak ons van die knoppie ontslae? Weergawe 3
Hoe raak ons van die knoppie ontslae? Weergawe 3

Daar is talle maniere waarop ons te werk kan gaan. Eerstens kon ons hardeware byvoeg om van die knoppie ontslae te raak. Ons kan byvoorbeeld probeer om 'n transistor in die stroombaan by die uitganglyn van die toetsdruk te plaas sodat dit 'n klein stroom van die stroom van die uitset kan neem en 'n 5V -puls na die onderbrekingspen PD2 stuur.

Dit sou egter ten minste te raserig wees en in die ergste tyd sou dit nie genoeg tyd toelaat vir 'n akkurate druk op die toets nie, aangesien die spanningsuitset van die bedieningspaneel nie tyd het om te stabiliseer voordat die ADC -lesing vasgelê word nie.

Ons sou dus eerder 'n sagteware -oplossing bedink. Wat ons wil doen, is om 'n onderbreking op die PD2 -pen by te voeg en 'n onderbrekingshanteerder daarvoor te skryf wat 'n enkele lesing van die sleutelbordpen vereis. Met ander woorde, ons raak ontslae van die outotrigger -onderbreking van die ADC en voeg 'n eksterne onderbreking by wat die ADC daarin noem. Op hierdie manier kom die sein om die ADC te lees nadat die PD2 -sein reeds plaasgevind het, en dit kan dinge genoeg tyd gee om tot 'n akkurate spanning te stabiliseer voordat die PC0 -pen gelees en omgeskakel word. Ons sou nog steeds 'n ADC -voltooiingsonderbreking hê, wat die resultaat aan die einde van die analiseerder stuur.

Maak sin? Wel, laat ons dit doen …

Kyk na die aangehegte nuwe kode.

U sien die volgende veranderinge:

  1. Ons het 'n rjmp by adres.org 0x0002 bygevoeg om die INT0 eksterne onderbreking te hanteer
  2. Ons het die EIMSK -register verander om aan te dui dat ons die INT0 -pen wil onderbreek
  3. Ons het die ADATE -pen in die ADCSRA -register verander om outotrigging uit te skakel
  4. Ons het ontslae geraak van die ADCSRB -instellings, aangesien dit irrelevant is as ADATE af is
  5. Ons hoef nie meer die eksterne snellervlag terug te stel nie, aangesien die INT0 -onderbrekingsroetine dit outomaties doen wanneer dit voltooi is - voorheen het ons nie 'n onderbrekingsroetine gehad nie; ons het net die ADC van 'n sein by die pen afgeskakel, so ons moes maak die vlag met die hand skoon.

In die interrupt -hanteerder noem ons eenvoudig 'n enkele omskakeling van die ADC.

Oefening 5: Begin hierdie weergawe en kyk wat gebeur.

Stap 12: Kode en video vir die werkweergawe

Soos ons in die laaste weergawe gesien het, werk die onderbreking van die knoppie nie baie goed nie, want die onderbreking word op 'n stygende rand veroorsaak om PD2 vas te maak en dan bel die onderbrekingshanteerder die ADC -omskakeling. Die ADC kry egter dan die spanningslesing voordat dit gestabiliseer is, en dit lees dus onsin.

Wat ons nodig het, is om 'n vertraging in te stel tussen die onderbreking op PD2 en die ADC -lesing op PC0. Ons sal dit doen deur 'n timer/teller, 'n telleroorlooponderbreking en 'n vertragingsroetine by te voeg. Gelukkig weet ons reeds hoe om dit te doen vanuit tutoriaal 3! Ons kopieer en plak die relevante kode van daar af.

Ek het die gevolglike kode en 'n video gegee wat dit in werking stel.

U sal sien dat die lesings nie so akkuraat is as wat 'n mens sou hoop nie. Dit is waarskynlik as gevolg van 'n aantal bronne:

  1. ons tik vanaf die spanningsuitset van die toetsbord om op PD2 te aktiveer, wat die lesing in PC0 beïnvloed.
  2. ons weet nie regtig hoe lank ons moet vertraag na die sneller om die beste lesing te kry nie.
  3. dit neem 'n paar siklusse voordat die ADC -omskakeling voltooi is, wat beteken dat ons nie vinnig op die bedieningspaneel kan brand nie.
  4. daar is waarskynlik geraas in die klavier self.
  5. ens …

Alhoewel ons daarin geslaag het om die bedieningspaneel aan die werk te kry, en ons dit nou in toepassings kon gebruik deur die toetsdrukwaardes op 'n ander manier te gebruik, in plaas daarvan om dit net na die analise -skerm te stuur, is dit nie baie akkuraat nie en is dit baie irriterend. Daarom dink ek dat die beste manier om bedieningspanele te bedraad, eenvoudig is om elke uitset van die bedieningspaneel in 'n ander poort te plaas en te besluit watter sleutel deur watter poort 'n spanning ingedruk word. Dit is maklik, baie vinnig en baie akkuraat.

In werklikheid is daar slegs twee redes waarom 'n mens met 'n toetsbord wil bestuur soos ons hier gedoen het:

  1. Dit gebruik slegs 2 van die penne op ons mikrobeheerder in plaas van 8.
  2. Dit is 'n wonderlike projek om verskillende aspekte van die ADC op die mikrobeheerder te wys, wat verskil van die standaard dinge wat u daar kan vind, soos temperatuurmetings, draai-potensiometers, ens. eerder as om net die CPU-gobbling-modus vry te laat loop.

In elk geval, hier is 'n laaste paar oefeninge vir u:

Oefening 6: Skryf die ADC-omskakeling-volledige onderbrekingshanteerder weer neer om 'n opsoektabel te gebruik. D.w.s. Sodat dit die analoogwaarde met die eerste item in die tabel toets, en as dit groter is, keer dit terug van die onderbreking, as dit nie die geval is nie, verhoog dit Z na die volgende item in die tabel en vertrek weer na die toets. Dit sal die kode verkort en die onderbreekroetine opruim en dit mooier laat lyk. (Ek sal as 'n volgende stap 'n moontlike oplossing gee) Oefening 7: Sluit u sleutelbord aan op 8 penne op die mikrobeheerder en skryf die eenvoudige bestuurder daarvoor en ervaar hoeveel lekkerder dit is. Kan u aan 'n paar maniere dink om ons metode beter te laat werk?

Dit is alles vir hierdie tutoriaal. Ek het die finale weergawe aangeheg met wenke. Terwyl ons nader aan ons einddoel kom, gebruik ons die sleutelbord in Tutoriaal 9 nogmaals om te wys hoe u sewe segmentskerms daarmee kan beheer (en om iets interessants te bou wat die ekstra sleutels op die telefoonklavier gebruik) en dan sal ons Skakel eerder oor om dinge met knoppies in te druk (aangesien hierdie metode beter pas by die eindproduk waarna ons met hierdie tutoriale bou), en ons sal net die toetsbord wegsteek.

Sien jou volgende keer!