Ein einfaches Experiment wird beschrieben, indem eine Taste an einen AVR-Mikrocontroller angeschlossen wird. Es ist nicht möglich, mit meinem Cі ein Programm zum Drücken einer Taste zu installieren. Werfen wir einen Blick auf die Funktionen zum Anschließen der Taste an die Ports des MK und finden Sie heraus, wie Sie die Taste an mein C lesen.
In den vorherigen Artikeln wurden Experimente mit Leuchtdioden untersucht, die an die Ports des Mikrocontrollers angeschlossen wurden, die mit dem Ausgang (Output) verbunden waren.
In diesem Zustand ist ein Taster mit dem Mikrocontroller verbunden, dessen Kontakte beim Drücken schließen und beim Drücken öffnen (Taster, der schließt).
Damit Sie zusehen können, als würden Sie einen zusätzlichen Knopf suchen, sind zwei weitere Leuchtdioden an den Mikrocontroller angeschlossen. Das Schema ist schon einfach, die Achse ist raus:
Mal. 1. Schematische Darstellung des Experiments mit ATtiny2313 Mikrocontroller und Taster.
Wie bei Bachimo sind bis zu zwei Ports PB0 und PB1 über Widerstände, die verschachtelt sind, zwei Leuchtdioden angeschlossen, und an Port PD2 - ein Taster und es gibt auch einen Zwischenwiderstand. Zum Anschließen des Programmiergeräts an den MK werden die Buchsen Conn 1 (AVR-ISP) angeschlossen, und zum Anschließen der Schaltung an die + 5-V-Stromversorgung werden zwei Kontakte erkannt - P1 und P2.

Mal. 2. Entworfen auf einer lötfreien Steckplatine für ein Experiment mit einem Mikrocontroller und einem Knopf.
Schließen Sie für einen sicheren Wechsel zu einem Port mit einer Taste nacheinander einen Widerstand mit einer Unterstützung von 1 KΩ an (Sie können auch eine Verbindung zu einer anderen Unterstützung von 600 Ohm - 2 KΩ herstellen). Akzeptieren Sie in der Regel einen warmen Ton in einem Roboter mit Stiften, als ob Sie den Port des MK am Ausgang des Bunds zum Zeitpunkt der Entschuldigung schützen würden, wenn Sie den Stift eines hohen Gleichstands geben und wenn der Knopf geschlossen ist.
Die Pins des Mikrocontrollers sind universelle GPIO (General Purpose Input Output), sie können an solche Geräte wie Anzeigen (Anzeigen, Netzschalter) und verschiedene digitale Sensoren (Tasten, Jumper) angeschlossen werden.
Dekіlka-Pins in MK können an ADC / DAC (Analog-Digital-Converter und Navpaki) angeschlossen werden, von denen Sie zusätzlich analoge Signale analysieren und erzeugen können. Die primären GPIOs arbeiten nicht mit analogen Signalen, sie können mehr als 0 (0V) oder 1 (+5V) am Ein-/Ausgang haben.
Vor dem GPIO-Skin-Pin in der Mitte des Mikrocontrollers ist ein Block von Blöcken und elektronischen Komponenten angeschlossen, über die Sie Bescheid wissen sollten:
Für die Softwareverwaltung und Konfiguration des Skin-Ports werden beispielsweise für Port "B" drei spezielle Register benötigt:
Ausführlichere Informationen zu Port-Anhängen für ein bestimmtes Mikrocontroller-Modell finden Sie im Datenblatt im Abschnitt "I / O-Ports". Dort können Sie auch Code in C und Assembler zum Arbeiten mit Ports einfügen.
Es ist wichtig zu wissen, dass der "RESET"-Pin der Mikroschaltung (wir haben eine Pin-Nummer 1 auf dem Schaltplan), der zum Ausschalten des Programms des Mikrocontrollers (Zurücksetzen) verwendet wird, auch zum Einschalten möglich ist Anschließen von Tasten, Leuchtdioden und anderen Anhängen an den Eingang-Ausgang, um Buti-Transformationen zum ursprünglichen GPIO zu gewinnen.
Es kann anders sein, da die Mikroschaltung keine Pins für Ihr Design hat. Wenn ich zum Beispiel gefaltet werde, baue ich auf dem ATtiny13-Chip (8 visnovkіv, 2 Stk. - Live, 5 Stk. - Port-Eingabe-Ausgang, 1 Stk. - für RESET). Sie haben gezeigt, dass Sie keinen Stift für Licht erhalten haben. Hier finden Sie einige Optionen, um das Problem zu lösen:
Welche dieser Optionen ist einfacher und billiger für die Finanzen / Stunde - nach nasser Laune zu beurteilen.
Um den "RESET"-Pin in den I/O-Port umzuwandeln, tauschen Sie die spezielle Sicherung - RSTDISBL (Reset Disable) aus. Und zuallererst müssen Sie daran denken, dass nach diesen Vorgängen eine Neuprogrammierung des Mikrocontrollers nur möglich ist, wenn der Hochspannungsprogrammierer (bei 12 V) blockiert ist, z. B. USB ISP, oder der andere Programmierer nicht ausgeführt werden kann seine eigenen 5V
Außerdem haben wir einen Knopf und zwei Leuchtdioden, die mit dem Mikrocontroller verbunden sind, was kann man damit machen? - und zrobimo mi axis sho (Algorithmus):
Ein Beispiel für die Implementierung eines solchen Algorithmus durch meinen Cі pіd AVR ist unten gezeigt. Lassen Sie uns eine neue Datei für unsere Software und Software zum Bearbeiten erstellen:
Nano /tmp/avr-switch-test.c
Lassen Sie uns den Code in den Hauptteil der Datei verschieben:
/* Experiment mit Taste auf ATtiny2313 * https://website */ #define F_CPU 1000000UL // Kernfrequenz = 1 MHz #include
Wir sind vor uns gefragt F_CPU-Konstante Wenn der Compiler jedoch auf der Frequenz des Mikrocontroller-Kerns arbeitet, ist es notwendig, dass die Unterprogramme und Funktionen korrekt verarbeitet wurden. Die Anwendung hat eine Verzögerungsfunktion für die Stunde – „_delay_ms“ aus der „util/delay.h“-Bibliothek, als Verzögerung für eine Stunde Verzögerung in einem unfreundlichen Zyklus, die spiralförmig zum Wert in der F_CPU-Konstante führt.
Sehen Sie sich den Code der "delay"-Bibliothek an, um die Verzögerung stundenweise zu organisieren und auf welche Weise die F_CPU-Konstante festgelegt wird. Sie können GNU Linux für die Hilfe eines beliebigen Texteditors verwenden. Sie können beispielsweise den folgenden Befehl verwenden:
Nano /usr/lib/avr/include/util/delay.h
Die werkseitig eingestellte Frequenz des internen RC-Oszillators im ATtiny2313-Mikrocontroller beträgt 8000000 Hz (8 MHz), auch für die Standardeinstellungen der Sicherung unter der Frequenz - CKDIV8 (Clock Divide by 8), sodass die tatsächliche Betriebsfrequenz des Quarzes 800000 beträgt.
Sie können sehen, wie die Sicherung im Mikrocontroller mit Hilfe von avrdude oder einer grafischen Shell für die neue namens AVR8 Burn-O-Mat installiert ist.
Dem Programm wurden Makros zur Verwaltung des Portcamps gegeben, an denen Licht angeschlossen ist: LED_BLUE_ON, LED_BLUE_OFF, LED_RED_ON, LED_RED_OFF. Wenn Sie ein ähnliches Makro in einem beliebigen Programm aufrufen, können wir es einfach in Brand setzen oder die Haut von den Lichtern ausschalten, nicht zufällig denselben Code wiederholen, damit Sie das Programm von Ihrer Seite fragen und es zerschlagen können den ersten Platz.
Im Hauptprogramm „void main(void)“ starten wir den Roboter mit Portkonfiguration:
Dali, Vikoristen-Makros, mi, die rotes Licht löschen und blaues entzünden. Jetzt können wir neben einer weiteren ewigen Schleife noch warten, bis der Button angezeigt wird: "while (! (PIND & (1)<< PD2)));".
Wenn die Taste auf Pin 6 gedrückt wird, erscheint ein hoher Wert (um den internen Widerstand zu erhöhen, der verwendet wird, den wir zuvor eingeschaltet haben), und eine logische 1 wird in die PD2-Zeile des PIND-Registers eingefügt.
Danach beginnt das dreimalige Blinken (vmknenny-vimikannya) der blauen Leuchtdiode von der Einblendung in 0,5 Sekunden und der ewige Hauptzyklus beginnt auf neue Weise zu arbeiten - zwei Leuchtdioden werden entsprechend dem Aufruf gezündet.
Das Programm ist noch einfacher;
In früheren Veröffentlichungen habe ich Experimente mit dem Mikrocontroller ATMega8 durchgeführt, hier gibt es weniger „Füllungen“ des MK - ATTiny2313.
Um die Firmware in den MK zu kompilieren, müssen Sie die Befehle zur Auswahl in der integrierten Programmierumgebung von Geany ändern.
Idemo im Menü Build - Set Build Commands. Der Befehl zum Kompilieren (C-Befehle) muss das zu stoppende Chipmodell ändern: "-mmcu=attiny2313". Für den Befehl zum Flashen des MK müssen Sie den Chiptyp für avrdude ändern: "-p t2313".

Mal. 3. Neukonfiguration von Geany für Roboter mit ATTiny2313-Mikrocontroller.
Alle Anleitungsbefehle für GNU Linux OS, wenn Sie Windows haben, dann können Sie verschiedene Pfade zu den Binärdateien "avr-gcc.exe", "avr-objcopy.exe", "avrdude.exe" schreiben.
Weitere Details zum Erstellen von Geany in GNU Linux habe ich mir in einem der vorherigen Artikel der Serie angesehen.
Kompilierung, Faltung und Firmware des Programms können durch Drücken der drei Schaltflächen in der Mitte von Geany heruntergeladen werden: „Compile“, „Build“ und „Run“. Diese Operationen können auch von der Konsole, der Achse des Befehls für diese Operationen, gewickelt werden (sequentiell gewickelt):
Avr-gcc -mmcu=attiny2313 -Os /tmp/avr-switch-test.c -o /tmp/avr-switch-test.o avr-objcopy -j .text -j .data -O ihex /tmp/avr- switch-test.o /tmp/avr-switch-test.hex avrdude -c usbasp -p t2313 -P usb -U flash:w:/tmp/avr-switch-test.hex
Die Moustache-Befehle sind möglicherweise vollständig (mit ein wenig Dateinamen) identisch mit denen, die wir für die Geany-Anpassungen korrigiert haben.
Ungeachtet der Einfachheit des Experiments habe ich auch versucht, einige der wichtigsten technischen Momente der Arbeit mit Ports hervorzuheben. Der Aufbau von Wissen über diese Informationen wird der Weiterbildung von Robotern mit ATMEL-Mikrocontrollern ähneln.
Manchmal kann es sogar ein kleines Zubehör sein, zum Beispiel ein Fahrradcomputer. Aber das Design erlaubt es nicht, viele Tasten zu platzieren. Zagal haben wir einen Knopf für die Einführung und nichts weiter.
Spartanischer Geist, aber hier können Sie das harte funktionale, reichhaltige Menü und andere Lebensaccessoires anfeuern. Zu einer Zeit werde ich eine der Implementierungen eines solchen Steuerelements zeigen.
Otzhe, was ist unser Knopf?
Nicht dick, aber nichts. Für einen Knopf bitte. Der Kopf zatik beim Schreiben ist, nicht viele Systemressourcen (Prozessorstunden, Timer und Ordnungen) für die Produktion einer unglücklichen Schaltfläche zu verschwenden. Aja, wir sehen zufällig die Tatsache des Angriffs, die Tatsache des Angriffs, die Stunde des Angriffs, das Ende des Angriffs in der Morgendämmerung. Ich mag solche Pedale für die Implementierung der Schnittstelle, dass ich einfach erstaunt war, wie es möglich ist, Dummköpfe und Kieselsteine auf einer Kiefer zu stapeln und auch alle Timer zu beobachten :)
Auch TK meldet sich:
Algorithmus
Wir machen alles auf der Terminalmaschine. Das neue wird drei Lager haben:
Und es wird auch eine Serviceprozedur geben, so dass durch mode_time (2c) nach der ersten Aktion mit dem Speichern-Button alle Ergebnisse mit gespeichert werden. Was zählt nicht mehr. Alle Programme legen sich hin.
Und all dieses Rauschen dreht sich in Zyklen und ruft alle 20 ms durch den Dispatcher (oder als wäre es ein Rang) zu sich selbst.
Hoch
Eingeben.
Chi die Taste ist nicht gedrückt? Yakscho nі - anscheinend. Wenn es gedrückt wird, dann wird der Automat an der Position Dn übersetzt
Chi perevіryaєmo vpershe für das Intervall mi hier? Als erstes werden wir dann unsere Serviceprozedur auf den Start des Starts (in 2s) setzen, wir werden die Flagge hissen, dass der Prozess weg ist.
Scheinbar.
DN
Eingeben.
Hast du schon gedrückt? Wenn nicht, dann ist der Knopf bereits losgelassen, fällt in das Lager in Up und sichert einen kurzen Druck, mehr als ein paar kurze Stöße cnt_s. Sobald es gedrückt wird, wird es ein Lichnik zur Stunde der Schüchternheit des Ansturms der Zeit genannt. Die vimiryuvannya-Trivalenz gehen wir in Iterationen der Maschine. Eine Iteration 20 ms. Die Grenze des Langzeitangriffs liegt bei 20 Iterationen, was etwa 400 ms ergibt. Alles, was größer als 0,4 s ist, ist wichtig für einen langen Ansturm. Wenn es mehr als 20 Iterationen trifft, ist ein Tag des Schlagens gesichert und die Maschine wird im Al-Lager umgeworfen. Scheinbar.
Al
Eingeben.
Haben sie dich noch nicht reingelassen? Wenn nicht, dann anscheinend. Sobald die Taste losgelassen wird, bewegen wir uns nach oben und lassen die Zeitänderung fallen.

In einer Stunde, mode_time, in zwei Sekunden kann der Himmel geschoben werden – alles gehört uns. Das Verfahren zur Analyse der gesammelten Daten und zum Rechen des Naticane beginnt. Da ist alles einfach. Banal case'om robimo wir brauchen Maßnahmen. Ich bin zum Beispiel die Achse, ich setze die Fähnchen, als würden sie die Reihenfolge ändern. Golovne blockierte den Befehl mit nichts Wichtigem, um die Angriffskombination nicht ziehen zu lassen.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | #enthalten |
#enthalten
Der Code ist so geschrieben, dass dort buchstäblich ein paar Zeilen auf dem AVR gebunden sind. Akzeptieren Sie die Drucktaste beim Code des Dolmetschers. Alle Bindungen auf dem Fairway gehen in die Nähe des Kopfes, aber dort ist nichts:
| 1 2 3 4 5 6 7 8 9 10 11 | #enthalten |
#enthalten Otzhe, portuvati tse für andere Architektur auf der rechten Seite, zwei Reihen wechseln. Nun, vielleicht müssen Sie den Autorun-Mechanismus und den Start der Finder-Funktion ändern. Wie werden Sie als Dispatcher, Betriebssystem oder sonst als System zur Organisation der Firmware gewinnen? Ale tse zwei Zeilen im Code zu korrigieren. Alles, was im Artikel beschrieben wird, befindet sich in zwei Dateien Taste.cі Taste.h Videos Roboter
Dribnjak Optionen Nun, ich habe herausgefunden, dass dieselbe Endmaschine jederzeit auf einen Rozbіr von etwas gesetzt werden kann. Zum Beispiel bei jedem anderen Fähnrich, in Form einer Matrixtastatur oder als Signalerweiterung. Auf meinen Mikrocontroller-Maschinen habe ich eine permanente Victorist-Taste. Thomas hat geschrieben einfacher Treiber mit ihnen zu arbeiten. In der aktuellen Version wurde der Fahrer unter den Knöpfen eingesperrt, und es ist leicht, es zu übertreiben. In diesem Artikel werde ich die Treiberdateien beschreiben, und in der Offensivanalyse gibt es einen praktischen Hintern. Das Anschlussschema der Tasten ist traditionell, ein Kontakt der Taste ist mit dem Ausgang des Mikrocontrollers verbunden, der andere mit Null. Widerstände intern ziehen. Die Taster sind mit den Hauptschaltern des Mikrocontrollers verbunden, um die Funktionen der externen Schalter nicht zu stören. Header-Datei zum Löschen symbolischer Namen von Registern und Verbindungen zu dem Port, mit dem der Button verbunden ist. Cody, die beim Drücken von Tasten in den Puffer geschrieben wird. Funktionsprototypen. Nalashtovy vysnovki zu einigen Verbindungstasten am Eingang und schalten Sie die Widerstände ein, die ziehen. Call out on the cob main`a. Aktivierung der Viconu-Einmaltaste. Die Funktion der Implementierung des Quetschschutzes besteht darin, dass die Nummer der Taste in den Puffer eingegeben wird, die schuldig ist, um eine bestimmte Anzahl von Iterationszyklen gedrückt zu werden. Die Nummer der Schaltfläche wird einmal in den Puffer eingegeben, sodass die Schaltfläche für lange Zeit gelöscht wird. Diese Funktion wird durch Unterbrechen des Timers aufgerufen. Diese Datei soll die Implementierung aller Funktionen ersetzen. Bei ihnen ist Interesse vielleicht nur eine Funktion der Erziehung. Der Zvichayna-Uhrknopf kann in zwei Lagern geändert werden - dem gedrückten und dem freigegebenen (das dritte Lager ist böse, rufen Sie uns nicht sofort an). In einem idealen Vipadka, der Taste, um von einer Station zur nächsten zu wechseln, in Wirklichkeit flackern und frieren die Kontakte beim Drücken ein, der erste lehnt sich in einer geschlossenen Station zurück. Es wird ein Bryazkale von Kontakten genannt und ist für alle mechanischen Schalter leistungsfähig. Der Mikrocontroller arbeitet mit einer Frequenz von Megahertz, und während er summt, können Sie den Knopf für die Sprotte zurücksetzen. Wenn Sie sich nicht an solche Anrufe gewöhnen, werden Bryazkit-Kontakte vom Mikrocontroller wie ein Bagatar-Angriff „übernommen“. Bei einigen Programmen ist dies beispielsweise nicht kritisch, da die Taste die Lichtlampe einschaltet. Ale zdebіlshgo tse nebazhane. Dribnennya-Kontakte können mit Hilfe eines passiven Tiefpassfilters als Hardware verwendet werden. Aber es ist viel einfacher, Bryazkit zu überwinden, nachdem das Programm des Mikrocontrollers für das Neue inakzeptabel gemacht wurde. Eine Variante der Implementierung ähnlich dem Algorithmus der Funktion BUT_Debrief() #define SCHWELLE 20 volatile unsigned char gedrückteTaste = 0; Leere ABER_Nachbesprechung( Leere
) //was ist der zeitpunkt der zeitlichen änderung? //und auf diese Weise verschwindet der Button für lange Zeit } Auf dem Kolben der Funktion gibt es ein anschließendes Experimentieren von visnovkiv. Sobald die Taste gedrückt wird, wird der Schlüsselcode in den Schlüssel des Timchas eingetragen. Lassen Sie uns noch einmal die Bedeutung des Änderungskomps überdenken, damit Sie wissen, wie lange sich der Knopf im gedrückten Lager befindet. Solange comp nicht irgendeinen THRESHOLD-Schwellenwert erreicht, wird es inkrementiert. Sobald der Wert von comp gleich THRESHOLD wird, wird die Taste in den Puffer der Taste „PressedKey“ kopiert. Mit diesem Comp wird ein neuer Wert weggenommen, sodass der Mikrocontroller beim Drücken der Tasten die Änderung nicht erhöht und nicht in den Puffer schreibt. Solange die Taste lange nicht gedrückt wurde, zeichnet der Mikrocontroller auf diese Weise auf, dass sie nur einmal gedrückt wurde. Zum Abschluss oft, die Tasten sind siegreich für die Einstellung beliebiger linear veränderlicher Werte. Auf diese Weise können Sie einen solchen Algorithmus manuell anpassen - ein kurzer Druck auf die Schaltfläche ändert den Wert korrekt, ein kurzer Druck ist schnell. Übergeben Sie einen Teil der Funktion an das Experiment und nehmen Sie eine einfache Variante der Implementierung des Algorithmus. #define THRESHOLD2 300 wenn(comp == SCHWELLE) Sobald nun die Taste für mehr als 300 Zyklen reduziert wird, schreibt der Mikrocontroller den Code immer wieder in den Puffer. Auf tsimu ist alles still, aber das Thema der Schaltflächen ist nicht abgeschlossen. Dalí sei... Aufgabe: Erweitern wir das Pflegeprogramm um eine Leuchte. Beim Drücken auf die Taste geht das Licht an, wenn es ausgeht, geht es aus. Für den Maiskolben füge ich ein wichtiges Schema hinzu. Für den Anschluss an den Mikrocontroller, unabhängig davon, ob externe Anschlüsse vorhanden sind, gibt es Ports und E / A. Leder aus den Häfen des Gebäudes Pratsyuvati Yak am Eingang und am Ausgang. Wir schalten das Licht an einem der Ports ein und den Knopf am anderen. Für wen werden wir den Controller bestätigen Atmega8. Der Mikrochip hat 3 Ports für I/O, vielleicht 2 Acht-Bit- und 1 Sechzehn-Bit-Timer / Uhr. Ebenfalls an Bord ist eine 3-Kanal-PWM, eine 6-Kanal-10-Bit-Analog-Digital-Wandlung und vieles mehr. Der Mikrocontroller eignet sich meiner Meinung nach wunderbar zum Erlernen der Grundlagen der Programmierung. Um die Leuchtdiode mit einem Vikoristen zu verbinden, verwenden wir die PB0-Leitung, und um Informationen von den Tasten zu lesen, beschleunigen wir die PD0-Leitung. Das Schema ist in Abb. 1 dargestellt. Mal. eins Über den Widerstand R2 wird eine positive Spannung an den Eingang PD0 angelegt, was ein Signal einer logischen Einheit ergibt. Wenn der Knopf geschlossen ist, fällt die Spannung auf Null, was einer logischen Null entspricht. Nadal R2 kann die Schaltkreise ausschalten, durch einen internen Spannungswiderstand ersetzen und die erforderlichen Anpassungen im Programm vornehmen. Leichte Verbindungen zum Ausgangsport PB0 durch den Widerstand R3, der den Strum umgibt. Um das Licht einzuschalten, müssen Sie ein logisches Einheitssignal an die PB0-Leitung senden. Stellen Sie den Taktgenerator so ein, dass er intern auf 4 MHz vibriert, da das Add-On keine hohen Frequenzen hat, bis die Frequenz stabil ist. Jetzt schreiben wir ein Programm. Zum Schreiben von Programmen verwende ich ein vicorist-Softwaremedium AVR-Studioі winavr.Öffnen Sie AVR Studio, führen Sie am Ende des Bades die Schaltfläche "Neues Projekt erstellen" (Neues Projekt) aus, wählen Sie den Projekttyp aus - AVR GCC, schreiben Sie den Namen des Projekts, z. B. "cod1", und legen Sie es ab Aktivieren Sie die Kontrollkästchen "Ordner für das Projekt erstellen" und "Datei "Initialisierung" erstellen", drücken Sie die Schaltfläche "Dalі", wählen Sie "AVR Simulator" im linken Fenster und den Mikrocontrollertyp "Atmega8" im rechten Fenster, klicken Sie auf " Fertigstellen", öffnen Sie den Editor und den Baum der Projektkategorie - die Installation ist abgeschlossen. Fügen Sie zum ersten Mal den Standardtext der Atmega8-Beschreibungen hinzu, um dem Bediener zu helfen, die heruntergeladenen Dateien zu erhalten: #enthalten Anweisungssyntax #enthalten #enthalten<имя_файла.h> Kutovі-Bögen< и >Um dem Compiler mitzuteilen, welche Dateien einzubinden sind, muss im Standard-WinAvr-Ordner nach den Include-Namen gesucht werden. Bewegen Sie die Pfoten und weisen Sie den Compiler an, eine Suche nach dem Verzeichnis zu starten, in dem das Projekt gespeichert wird. Für den Mikrocontroller vom Typ Skin gibt es eine separate Header-Datei. Für ATMega8 heißt diese Datei iom8.h, für ATtiny2313 - iotn2313.h. Verbinden Sie auf dem Kolben des Skin-Programms die Header-Datei des Mikrocontrollers, was irgendwie winky ist. Und dann gibt es noch die große Header-Datei io.h. Der Präprozessor verarbeitet diese Datei und fügt die erforderliche Header-Datei in unser Programm ein. Für uns kann die erste Zeile des Programms wie folgt als Achse betrachtet werden: #enthalten Ob das Programm meines Cі obov'yazkovo Rache einer Kopffunktion schuldig ist. Vaughn maє im'ya main. Die Programmierung wird immer von der Hauptfunktion aus gestartet. Funktion maє Überschrift - int main(void) und body - es ist von geschweiften Bögen umgeben (). int Haupt(leer) Am Hauptteil der Funktion fügen wir unseren Code hinzu. Funktionsnamen wird der zu drehende Werttyp vorangestellt. Wenn die Funktion den Wert nicht dreht - die Taste Leere. int- ganzzahlige 2-Byte-Zahl, Wertebereich - 32768 bis 32767 Nach dem Namen der Funktion bei den Bögen () werden die Parameter angegeben, wie die Funktionen an die Funktion für die Wochenstunde übergeben werden. Wie eine Funktion ohne Parameter - das Schlüsselwort wird gewählt Leere. Funktion hauptsächlich um von Ihrem eigenen Befehlssatz wegzunehmen, um das System und den Hauptzyklus des Programms zu verbessern. Gab uns einen Hafen D am Eingang Der Roboterportmodus wird im lokalen Register eingestellt DDRD(Registrieren Sie sich für die direkte Übermittlung von Informationen). In dieses Register wird die Zahl „0x00“ geschrieben (0b0000000 – für die Doppelansicht), bis auf den Button, an dem nichts angeschlossen ist, dann wird der gesamte Port D dem Eingang zugewiesen. Sie können den Port nach und nach setzen, indem Sie die Zahl 0 oder 1 (0-input, 1-out) in das Lederbit des Registers schreiben, zum Beispiel DDRD = 0x81 (0b10000001) - die erste Zeile des restlichen Ports D wird an den Ausgang angelegt, reshta an den Eingang. Zusätzlich muss ein interner Spannungswiderstand angeschlossen werden. Beachten Sie, dass das Umgehen der internen Widerstände das PORTx-Register löscht, sodass sich der Port im Eingabemodus befindet. Schreiben wir es alleine auf. Richten Sie einen Port ein B im Urlaub. Der Roboterportmodus wird im lokalen Register eingestellt DDRB. Nichts, helles Licht an Backbord B nicht verbunden, dann kann der gesamte Port auf offen gesetzt werden. Tse raubt eine Aufzeichnung an der Kasse DDRB Nummer "0xFF". Wenn das Licht zum ersten Mal eingeschaltet wird, ohne zu brennen, schreiben wir in der Reihenfolge an den Port B logische Nullen. Tse Eile, um aufzunehmen PORTB= 0x00; Für die Zuweisung eines Wertes wird das Symbol "=" verwendet und als Zuweisungsoperator bezeichnet, eine Verwechslung mit dem Zeichen "gleich" ist nicht möglich Die Einstellung der Ports sieht wie folgt aus: DDRD=0x00; Wir schreiben den Hauptzyklus des Programms. während( "Still" aus dem Englischen) - dieses Team organisiert einen Zyklus und wiederholt den Körper des Zyklus wiederholt bis zur letzten Tanne, bis der Verstand gewinnt, dh bis der Viraz an den Armen wahr ist. In der Sprache von Cі wird akzeptiert, dass es wahr ist, als ob Wein nicht gleich Null wäre, und es ist schlecht, als ob es gut wäre. Der Befehl sieht so aus: während (Umova) Unsere Denkweise ist, dass der Hauptzyklus in weniger als einen Befehl gefaltet werden kann. Tsya-Team meldet sich an PORTB Registerwert invertiert werden PORTD. PORTB = ~PIND; // Wert von Port D holen, invertieren und PORTB zuweisen (auf PORTB schreiben) // virazi my Cі von rechts nach links gelesen PIND Register der Eingabeinformationen. Um die Informationen aus der Außenansicht des Controllers zu lesen, ist es notwendig, die erforderliche Entladung des Ports in den Eingabemodus zu schalten. Tobto schreibt in das vіdpovіdny-Bitregister DDRx Null. Nur wenige Tage später ist es möglich, vom Außengebäude ein digitales Signal an die gesamte Visnovok zu senden. Lassen Sie den Mikrocontroller das Byte aus dem Register lesen PINx. Anstelle eines ausgehenden Bits sendet es ein Signal an den Ursprungsport. Unser Programm ist fertig und sieht so aus: #enthalten Movі Сі hat Kommentare weitgehend bestätigt. Es gibt zwei Arten des Schreibens. /*Kommentar*/ Wenn dies der Fall ist, berücksichtigt der Compiler die in den Kommentaren geschriebenen nicht gebührend. Wie man das Programm verwendet und an den Mikrocontroller 8 Tasten und 8 Leuchtdioden anschließt, wie in der kleinen 2 gezeigt, dann werden Sie verstehen, dass der Leder-Bit-Port D Antwort auf Ihren Bitport B. Drücken der Taste SB1 - HL1 leuchtet, Drücken der Taste SB2 - HL2 leuchtet langsam. Maljunok 2 Der Artikel hat Materialien aus dem Buch von Belova A.V. „Der Selbstleser des Nebengebäudehändlers im AVR“ Der ATMega16 MK hat drei Timer/Aufrufer – zwei 8-Bit-Timer (Timer/Counter0, Timer/Counter2) und einen 16-Bit-Timer/Counter1 (Timer/Counter1). Die Haut sollte mit speziellen Registern gefüllt sein, eines davon ist das persönliche Register TCNTn (n ist die ganze Zahl 0, 1 chi 2). Wenn der Prozessor also einen Befehl schlägt, wird er statt dieses Registers um eins erhöht (Skin 8, 64, 256, 1024 Zyklen). Deshalb heißt Wein Rakhunkov. Neu, noch ein OCRn (Output Compare Register) Register, bis zu dem wir selbst eine solche Zahl aufschreiben können. Ein 8-Bit-Lіchilnik hat 8-Bit-Register. In der Welt wachsen die Programme anstelle von TCNTn und irgendwann wird es möglich sein, aus OCRn herauszuwachsen. Todi (sowie das Setzen spezieller Parameter) im TIFR-Flag-Register (Timer/Counter Interrupt Flag Register) Jedes Mal wiederholt sich der Vorgang. Nachfolgend finden Sie das Stundendiagramm für den CTC-Modus (Clear Timer on Compare). In diesem Modus wird das Eröffnungsregister zum Zeitpunkt der Protokollierung anstelle von TCNTn und OCRn gelöscht; Dies ist bei weitem nicht der einzige Modus des automatischen Timers / Chillers. Es ist möglich, das persönliche Register zum Zeitpunkt des Starts nicht zu löschen, das gleiche gilt für die Erzeugungsart der Pulsweitenmodulation, die ein weltlicher Beleidigungsartikel ist. Sie können das Konto direkt ändern, d.h. anstatt das Konto registrieren, ändern Sie das Programm in der Welt. Es ist auch möglich, die Fenster nicht für die Anzahl der vom Prozessor übergebenen Befehle zu bearbeiten, sondern für die Anzahl der Änderungen des Spannungspegels auf dem „niedrigeren“ T0 oder T1 (hellerer Modus) können Sie automatisch, ohne Beteiligung des Prozessor, ändern Sie die OCn-Low-Einstellung im Idle-Timer. Timer/Lichilnik1 beim parallelen Arbeiten mit zwei Kanälen - A chi W. Um den Timer zu starten, müssen Sie das zweite Bit im Registrierungsregister mit dem Timer TCCRn (Timer/Counter Control Register) setzen, danach starten Sie Ihren Roboter sofort. Wir können uns die aktuellen Timer-Robotermodi ansehen. Wenn Sie einen Roboter in einem anderen Modus benötigen, lesen Sie das Datenblatt bis ATMega16 - dort ist alles in Englisch geschrieben, es ist angegeben, Programme in C und Assembler anzuwenden (nicht umsonst dauert es 357 Seiten eines entworfenen Textes! ). Schauen wir uns nun die Schaltflächen an. Wir wählen eine kleine Anzahl von Tasten (bis zu 9 Stück) aus und verbinden sie zwischen der „Erde“ und den Tasten eines beliebigen Anschlusses des Mikrocontrollers. Wenn Sie eine Reihe von Eingängen hinzufügen möchten, müssen Sie die Eingangsbits im DDRx-Register installieren und den internen Widerstand einschalten, um die Installation der Bits im PORTx-Register zu unterstützen. Damit erscheint an diesen "Böden" eine Spannung von 5 V. Wenn die Taste gedrückt wird, wird der Eingang des MK auf GND gesperrt und die Spannung fällt auf einen neuen auf Null (und vielleicht genauso gut - vysnovok MK von Kurzschlüsse zum Boden im Lager Vijatom). Wenn die PINx geändert wird, registrieren Sie, in welchem Port ausgewählt wird (in der PORTx-Ansicht wird der Port für die Frequenz des Verkehrs eingestellt, sodass keine Tasten gedrückt werden müssen). Durch regelmäßiges Lesen von PINx können Sie feststellen, ob die Taste gedrückt wird. UVAGA! Wenn bei deinem Taster das letzte Bit am DDRx-Register auf 1 gesetzt ist, dann kann der Druck auf den Taster zu einem kleinen pyrotechnischen Effekt führen - dimmen am MK. Natürlich ist der MK des nächsten gerade am Wind für den Tod ... Kommen wir zum praktischen Teil. Erstellen Sie einen neuen Arbeitsbereich in IAR und ein neues Projekt mit einem Namen, zum Beispiel TimerButton. Legen Sie die Optionen für das Projekt fest, wie im vorherigen Artikel beschrieben. Und jetzt geben wir einen kleinen Code ein. Mal sehen, wie es funktioniert. In den init_timern-Funktionen werden Bits in den TCCRn-, OCRn- und TIMSK-Registern gesetzt, und dieser Weg kann für jeden fremd oder unbekannt sein. Bitte erklären Sie zu Beginn, was der Eintrag bedeutet "(1 de a ist die Zahl, von der zwei Manifestationen zerstört werden müssen, und b zeigt an, wie viele Schlachten Sie zerstören müssen. Wenn ja, ist es möglich, den in a gespeicherten Wert zu verschwenden (so dass Sie sich nicht immer an die erinnern können, die in a waren). Schauen wir uns das Beispiel an: Was in der nächsten Zeile erscheinen soll C = (22 2 für den 2-Bit-Code sieht aus wie 00010110, und nach dem Wechsel nach links für 3 Bits wird C = 10110000 genommen. In ähnlicher Weise ist іsnuє і zsuv Rechtshänder. Ein anderes Beispiel: Der Hinterkopf ist an den inneren Bögen gebrochen (0xFF - tse 255 im Hexadezimalcode), s 11111111 sieht aus wie 111111100, dann bricht er nach rechts und nimmt C \u003d 00111111. Wie Bachimo gibt es zwei zusammen. zwei Takte. Soogo war weg, yakby wurde durch den Typ int ersetzt, sodass int 16 Bit benötigt. Jetzt können wir uns zwei weitere Bitoperatoren ansehen, die bei der Programmierung von MK weit verbreitet sind. Der gleiche Operator ist "bit by bit" (&) und "by bit by bit" (|). Wie stinkst du, schätze ich, ich werde die Anwendungen kennen: Dia: Ergebnis (bei Doppelcode): С = 0; // C = 00000000 C = (1 // C = 00100101 C | = (1 // C = 00101101 C & = (0xF0 >> 2)); // C = 00101100 C = (C ich 4) | 3; // C = 00000111
Little nicht vergessen! Є sche "bitwise turn off abo" (^). Es stellt sich heraus, dass die Anzahl gleich ist, und selbst wenn sie gleich sind, drehen Sie 0, sonst eins. Kommen wir zu unserem Programm. Es heißt „(1 Beim Kompilieren des Programms wird der WGM01-Eintrag einfach durch die Zahl 3 ersetzt und das Ergebnis ist ein korrekter Eintrag. WGM01 wird als Makro bezeichnet und nimmt keinen Speicherplatz ein (es befindet sich im Speicher des Programmierers :-). Schauen Sie sich jetzt das Datenblatt an, aber es spielt keine Rolle, ob Sie wissen, dass WGM01 das dritte Bit im TCCR0-Register ist. Dieselben stehen für andere Schlachten desselben Registers. Tsej zbіg nicht vypadkovo ist vіdnositsya für alle regіstrіv MK (oder mayzhe für alle). Das heißt, durch das Schreiben "(1 Zusammen, hintereinander bedeutet, dass der STS-Modus eingeschaltet ist, wenn der Timer0 aktiviert ist, wird das "untere" OS0 (Won PB3) -Lager gewechselt, statt des Lichniks wird der Skin 1024-Zyklus erhöht. Ähnlich für Timer2: TCCR2 = (1 Das Register TIMSK (Timer/counter Interrupt MaSK register) wird in den Interrupt-Modus gesetzt. Mi hat geschrieben Was wird Timer2 zurückgesetzt, nachdem TCNT2 und OCR2 zunehmen. Die verbleibende Funktion ist die aktuelle Funktion zum Überschreiben des Timers2. Pererivanya sei fassungslos über den kommenden Rang: de VECTOR - das Makro des Rekursionsvektors (hinter der Änderung steht nur eine Zahl, die die Rekursion kennzeichnet); tsі-Makros in der Reihenfolge der Verringerung der Priorität des erneuten Schutzes in der Datei iom16.h. TYPE - der Typ des Werts, den die Funktion in unseren Typ void (nichts) umwandelt. Ім'я - mehr ім'я цієї Funktionen. Mit Unterbrechungen ist es immer noch möglich, der Zukunft zu entkommen. Im Falle eines Ausfalls unserer Funktion liegt es in unserer Verantwortung, das Licht zu blinken und an PB0 und PB1 anzuschließen. Für alle Absichten und Zwecke beträgt die Frequenz 11059200/(256*1024) = 42 Hz. Tse shvidko, aber ein ungehindertes Auge wird sich daran erinnern. Vor der Rede, zastosuvannya timerіv daє mozhlivіst vіdrahovuvaty genau hrіvі invalі, scho nicht in der Komplexität Ihres Programms zu liegen und її vykonannya zu bestellen (alternativ haben Sie nicht mehr als eine Unterbrechung). Dann nehmen Sie die Datei wie "TimerDebug.c", fügen Sie sie dem Projekt hinzu, kompilieren Sie, flashen Sie das MK. Was tun wir? Licht, Verbindungen bis zur Einführung von PB3, aktive Morgatime, und es gibt keine täglichen Änderungen auf PB0 und PB1. Warum ist es rechts? Ist es nicht richtig? Shchob tse z'yasuvati, um unser Programm zu verbessern. Es gibt keine Debugger in IAR, Sie müssen AVR Studio hacken. Der mittlere Teil der Produktion kann von der Website des Erbauers http://atmel.com bezogen werden. Probleme mit Vstanovlennyam, denke ich, nicht an Buti schuld. Bevor Sie AVR Studio starten, wählen Sie den Debug-Modus für IAR und erstellen Sie eine benutzerdefinierte cof-Datei (alle Optionen für das Projekt können wie im vorherigen Artikel beschrieben eingestellt werden). Willkommen bei AVR Studio, wir heißen Sie herzlich willkommen, bitte wählen Sie Öffnen. Gehen Sie nun in den Ordner mit dem Projekt, dort Debug \ Exe, wählen Sie dort "TimerDebug.cof" aus, erstellen Sie dort das Projekt, deproponuyut, wählen Sie das ATMega16-Gerät und den Simulator-Setup-Modus aus. Wenn alles richtig gemacht wurde, werde ich schließlich mit dem Genesungsprozess beginnen Die Mitte des Lagodzhennya hier ist viel schwieriger, weil. können Sie alle Register des MK durchsehen und die Werte manuell per Mausklick einstellen. Um beispielsweise ein Umverteilungs-Flag im TIFR-Register bei Bit 7 (unter dem schwarzen Quadrat bei TIMSK) zu setzen, können Sie im nächsten Schritt des Programms (durch Drücken von F10 oder F11) einen Umverteilungsprozess durchführen (das Flag wird automatisch gesetzt werden, wenn Sie die TCNT2- und OCR2-Register ändern). Ale, auf unserem Podiv wird es keine Wiedergutmachung geben! Lebensmittelpost: Warum? Vіdcriєmo registrieren CPU, SREG. Dieses Register ist dem Roboter des Prozessors zugeordnet, das wichtigste Bit (I-Bit, Interrupt-Bit) ist für die Verarbeitung aller Änderungen im MK zuständig. Wir haben kein Yoga installiert. Varto yogo vistaviti, wie im Gefolge der Auferstehung (als das siebte Bit sofort in TIFR eingefügt wurde). Sie können eine Besonderheit bemerken: Sobald der Prozessor in den Prozess des Neuaufbaus geht, wird dieses Bit (das Flag der Verteilung des Baus der Verarbeitung) genommen, und wenn Sie die Funktion verlassen, wird der Prozess automatisch wiederhergestellt wieder. Tse erlaubt dem Prozessor nicht, sich für eine andere zu versammeln, ohne eine Neuordnung abgeschlossen zu haben (selbst wenn er im Programm selbst in einer solchen Reihe orientiert ist - nach Fähnrich). Später muss dem Code eine Zeile hinzugefügt werden, um dieses Bit in einem einzelnen Lager zu setzen. Dodamo mi yogo zur Funktion init_timer2. Video kommt: Nachdem Sie nun die Release-Konfiguration vorgenommen und den MK geflasht, F7 gedrückt und AVReal32.exe gestartet haben, ist es gut, dass alles wie folgt funktioniert. Notiz: Wenn das Programm angepasst wird, sollten die Intervalle der Timer geändert werden, als ob es zu lange stinkt, damit das Programm beim Aktualisieren in AVR Studio tausendmal aktualisiert wird, senken Sie die Mitte des MC und Sie Überprüfen Sie nicht den Timer-Betrieb. Zagalogodzhennya wieder ähnlich wie in anderen Programmiersystemen, wie Visual C ++. Nachdem wir nun gelernt haben, wie man das Programm anpasst, erstellen wir eine neue Datei in IAR (und speichern die alte aus dem Projekt) und geben den folgenden Code ein: Ich nehme zunächst eine vorbereitete Firmware-Datei (Dateien vor dem Artikel, dem Release-Ordner, der TimerButton.hex-Datei oder dem Kompilieren des Textes) und schreibe Yoga an den MK. Nachdem Sie das Firmware-Kabel gewechselt haben, verbinden Sie es mit den Tasten PC0 und PC1 und versuchen Sie, їх zu drücken. Es ist erwähnenswert, dass beim Drücken auf eine der Tasten das PORTB-Register erhöht wird (aufleuchtet) und sich beim Drücken auf eine andere ändert. Wenn es nicht funktioniert - versuchen Sie, eine Taste zu drücken und die andere zu maximieren - d_yatime. Rechts in der Tatsache, dass ich die Knöpfe in fortschreitender Reihenfolge einschalte: Beim Drücken auf den Knopf der Schnurrhaare „verbeugt“ sich der MK vor der Tür, und wenn er losgelassen wird, flackert er zu Boden. Da Sie die Tasten auf andere Weise verbunden haben, dauert es weniger als ein bisschen, um das Programm zu modernisieren. Werfen wir einen Blick auf den Code. Hier ist der Roboter mit dem Timer trohi inakshe organisiert. In spratsovuє kozhnі 11072 Takt (tobto koіnі 1.001175 ms) Es gibt auch eine delay(long unsigned int Pause_ms)-Funktion, da sie den Pause_ms-Anzahl-Millisekunden-Parameter nimmt, den Zähler zurücksetzt und prüft, ob der Zähler den Wert von Pause_ms erreicht, wonach der MK-Roboter fortfährt. Auf diese Weise schreiben wir Verzögerung (1500), wir bilden eine Verzögerung im Programm in 1,5 Sekunden. Dies ist besonders praktisch, um stündliche Intervalle zu bilden. Mit einem Timer, alles herausgefunden. Ale navіscho in vikoristovuєtsya? Werfen wir einen Blick auf die unerschöpfliche while(1)-Schleife von main(). In diesem Zyklus wird anstelle des PINB-Registers die Knopfstütze durch Analyse verändert. Und gibt es dort eine 50-ms-Ausblendung? Tse usunennya t. "Tasten klappern". Auf der rechten Seite wird beim Drücken des Knopfes ein Schlag auf einen Kontakt gegen den anderen geschlagen, und, Scherben von Metallkontakten, der Schlag ist eine Feder. Kontakte, Federn, zamikayutsya, die rozmikayutsya kіlka razіv, nicht diejenigen respektieren, die zrobiv mehr als einen Stoß fingern. Tse zu produzieren, bevor der MK die Sprotte auf den Druck fixiert. Werfen wir einen Blick auf den Zeitplan der Fallout-Spannung am Ausgang PC0 pro Stunde. Vin kann so aussehen: Punkt A ist der Moment, in dem die Taste gedrückt wird. Vin kann MK reparieren. Dann lass uns Sprotten von Zamikan und Rozmikan gehen (sie können es nicht sein, oder sie können 12 Stück sein - Sie können den Anblick mit Vipadkovym nehmen). An Punkt B ist der Kontakt bereits oberflächlich fixiert. Mіzh A und B liegen im Durchschnitt bei fast 10 ms. Nareshti, bei Punkt D gibt es einen Rosmarin. Wie kann ich diese inakzeptable Manifestation loswerden? Scheint genauso einfach. Es ist notwendig, den Moment des Drückens der Taste (Punkt A) festzulegen, nach einer bestimmten Stunde, z. B. 50 ms (Punkt C), zu überprüfen, ob die Taste tatsächlich gedrückt wurde, um festzustellen, ob die Taste im Moment gedrückt ist Freigabe (Punkt D). Tobto muss eine Pause von A nach C machen, so dass der ganze „Brunnen“ in der Mitte der Pause erscheint. Und jetzt versuchen Sie, eine Reihe zu verwenden, die eine Falte bildet, erstellen Sie das Programm und nähen Sie es in MK. Durch einfaches Drücken auf die Knöpfe können Sie leicht überqueren, so dass das ganze Mehl nicht wunderbar war. Und was ist mit der Arbeit, wenn Sie beispielsweise 40 Tasten an MK anschließen müssen? Aje an der neuen Leine 32 Visnovkas. Es wäre besser gewesen, auf keinen Fall. Tatsächlich ist es möglich. Manchmal vikoristovuyut Algorithmus, Titel durch Gating. Für die Sie Tasten benötigen, um sich mit der Matrix zu verbinden, wie im Kleinen gezeigt (die Kleinen stammen aus Mortons Buch "MK AVR, ein Einführungskurs", wo es um die AVR-Programmierung in Assembler geht). Bei der Übermittlung eines visnovka PB0-Protokolls. 1 (+5V), und auf den Wicklungen PB1 und PB2 log. 0 dürfen die Tasten 1, 4 und 7 bearbeitet werden. Sie können bestimmen, welche Art von Leder von ihnen ist, indem Sie die Spannung an einem der Schalter PB3..PB5 ändern. In dieser Reihenfolge werden nacheinander PB0..PB2-Protokolle ausgegeben. 1 können Sie den Standard der Tasten zuweisen. Ich erkannte, dass die Pins PB0..PB2 als Ausgänge und PB0..PB2 als Eingänge verwendet werden können. Um zu bestimmen, wie viele Schlüssel Sie für ein Array von X-Schaltflächen benötigen, müssen Sie ein Paar X-Multiplikatoren kennen, deren Summe am kleinsten ist (für unser Beispiel mit 40 Schaltflächen werden die Zahlen 5 und 8 benötigt). Das bedeutet, dass bis zu 256 Taster an einen MK angeschlossen werden können (und noch mehr von den Decodern, aber zu den Decodern später). Es ist besser, weniger Visnovkіv-Ausgänge und mehr Eingänge zu erstellen. In diesem Fall dauert das Experimentieren aller Zeilen der Matrix weniger als eine Stunde. Eine ähnliche Art der Verbindung (Strobe) ist nicht weniger leistungsfähig als Tasten. Dort können Sie verschiedene Geräte anschließen, angefangen bei einer Matrix aus Leuchtdioden bis hin zu Flash-Speicherchips. © Kiselow Roman
Der Kampf mit Schlamm ist hier nicht mehr obov'yazkovo. Denn Die Scanfrequenz ist niedrig, daher gab die Taste des TM2-Modells keinen schmutzigen Ton von sich - sie endete früher, senkte den Beginn des Scans. Und die Achse dessen, was hier geraucht werden kann, dann ist es tse zahist auf die bestmögliche Weise im Ergebnis. Adzhe varto an der Spitze drückt im Moment des Lesens die Linie und sichert den einmaligen Angriff. Es ist möglich, wegzukommen, nachdem man den Automaten umgedreht hat. Nehmen wir an, dass nach dem Hinzufügen der letzten Iteration zu Up zwei oder drei Iterationen bestätigen, dass die Taste immer noch gedrückt ist, und zu Dn gehen.
Um ehrlich zu sein, ich habe das Dressing meines Projekts ein wenig geändert. Denn Wenn ich nicht viel mehr Druck brauchte, dann habe ich das Fähnchen „Dovge-Druck“ vor dem Obrobnik AL i angebracht, ansteckend, um die Anzahl der alten Drücke aufzuräumen. Was es erlaubte, die Fremdheit der Roboterschnittstelle des Zubehörs zu verschieben, wirkte sich nachteilig auf den Ansturm von zdіysnyuvavsya auf den Menüpunkt aus, und die Kombination von zwei langen Anstürmen tat nicht vikoristovuvalis vzagalі. Planen
Header-Datei
void BUT_Init (nichtig);
void BUT_Debrief (nichtig);
unsigned char BUT_GetKey (void);
Drehen Sie den Knopf anstelle des Puffers, wenn der Puffer geleert ist. Wird von der Hauptschleife des Programms aufgerufen.
void BUT_SetKey (unsigned char key);
Schreiben Sie in den Pufferwert. Vikoristovuetsya, um den Knopf zu drücken. aktuelle Datei
unsigned char comp = 0;
{
unsigned char Schlüssel;
//Folgetests von visnovkіv mk
wenn(BitIsClear(PIN_BUTTON, EINGABE))
Schlüssel = KEY_ENTER;
sonst wenn(BitIsClear(PIN_BUTTON, CANCEL))
Schlüssel = KEY_CANCEL;
sonst wenn(BitIsClear(PIN_BUTTON, OBEN))
key=KEY_UP;
sonst wenn(BitIsClear(PIN_BUTTON, UNTEN))
Schlüssel = KEY_DOWN;
anders{
Schlüssel = KEY_NULL;
}
wenn(Schlüssel) (
// її Nummer in den Puffer schreiben
wenn(comp == SCHWELLE) (
comp = SCHWELLE + 10;
pressedKey = Taste;
Rückkehr
;
}
sonst wenn(komp< (THRESHOLD+5)) comp++;
anders comp=0;
}
...
wenn(Schlüssel)
{
wenn(Vergleich > SCHWELLE2)
{
comp = SCHWELLE2 - 40;
pressedKey = Taste;
Rückkehr
;
}
anders comp++;
{
pressedKey = Taste;
Rückkehr;
}
}
anders comp=0;
...
#include „mein_datei_name.h“
{
Funktionskörper
}
PORTD=0xFF;
DDRB=0xFF;
PORTB = 0x00;
{
Körperzyklus
}
// Kommentar






Cherven 2007