Dokumentation Metronom



Ähnliche Dokumente
Programmierkurs Java

Das Modul ARTIKEL-BARCODE ermöglicht den Druck von Barcode-Etiketten der EAN-Codes 8 und 13.

Bilder zum Upload verkleinern

Interrupt-Programmierung

ARAkoll 2013 Dokumentation. Datum:

Bedienungsanleitung. Stand: Copyright 2011 by GEVITAS GmbH

Einführung in die Programmierung

Versuch 3: Sequenzielle Logik

Dokumentation zum Spielserver der Software Challenge

MC-Hx 006. Einbindung des MC-Hx Modul als MODBus TCP Slave. MB DataTec GmbH. Stand:

Qt-Projekte mit Visual Studio 2005

Dokumentation IBIS Monitor

Betriebsanleitung. Mikroprozessorgesteuerter Batterie-Kapazitätstester CAPTEST 1225 und 2425 Für 12V (0,3 A 25 A) oder 24V (0,3 A 25 A)

Auto-Provisionierung tiptel 30x0 mit Yeastar MyPBX

Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten

Zählen von Objekten einer bestimmten Klasse

1. Aktionen-Palette durch "Fenster /Aktionen ALT+F9" öffnen. 2. Anlegen eines neuen Set über "Neues Set..." (über das kleine Dreieck zu erreichen)

Abruf und Versand von Mails mit Verschlüsselung

Dokumentation. estat Version 2.0

Inhaltsverzeichnis

COMET - Speed Seite 1

Local Control Network

1 Vom Problem zum Programm

Anlegen eines Speicherbereichs mit DB, DW eleganter in Kombination mit EQU, Timer-Interrupt

Elektrische Logigsystem mit Rückführung

M a i l C r e d i t. \\Burt\user\Soutschek\FP\Technik\Frankiermaschinen\00_PC Software\MailCredit\Anleitung MailCredit Installation.

S7-Hantierungsbausteine für R355, R6000 und R2700

Übungen Programmieren 1 Felix Rohrer. Übungen

Highspeedaufnahmen mit dem Arduino Uno Board

Wichtige Information zur Verwendung von CS-TING Version 9 für Microsoft Word 2000 (und höher)

GEVITAS Farben-Reaktionstest

Makros sind Textersetzungen, welche vom Präprozessor aufgelöst werden. Dies Passiert bevor der Compiler die Datein verarbeitet.

Kapitel 7 - Wägungen

Datensicherung. Beschreibung der Datensicherung

Beispiel(unten ist der Spielfeldrand):

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

CMS.R. Bedienungsanleitung. Modul Cron. Copyright CMS.R Revision 1

Möglichkeiten des Parallelbetriebs der VR-NetWorld Software Parallelbetrieb VR-NetWorld Software 4.4x und Version 5.0 ab der 2. Beta!

Professionelle Seminare im Bereich MS-Office

Carolo Knowledge Base

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

6.3 Serienbriefe über Microsoft Excel und Word

Erstellen der Barcode-Etiketten:

Bereich METIS (Texte im Internet) Zählmarkenrecherche

EasyWk DAS Schwimmwettkampfprogramm

Anleitung für die Formularbearbeitung

MY.AQUAGENIUZ.COM Website

Dokumentation für die software für zahnärzte der procedia GmbH Onlinedokumentation

Regiometer. Bedienungsanleitung

Installation TKGS Hundesportprogramm unter Windows 8

E-Government Sondertransporte (SOTRA) Registrierung von Benutzerkennung

Import und Export von Übergängern

Erweiterung AE WWS Lite Win: AES Security Verschlüsselung

Novell Client. Anleitung. zur Verfügung gestellt durch: ZID Dezentrale Systeme. Februar ZID Dezentrale Systeme

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

Grundfunktionen und Bedienung

Stellvertretenden Genehmiger verwalten. Tipps & Tricks

Versuch 3. Frequenzgang eines Verstärkers

Technische Informatik Basispraktikum Sommersemester 2001

Matrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version September

Fakultät Angewandte Informatik Lehrprofessur für Informatik

Programmierung Weichenmodul S/D Tafel 1

Stepperfocuser 2.0 mit Bootloader

Pages, Keynote. und Numbers

ELVIS - d. Schwarzschrift Anzeige Gerät. für ELOTYPE 4 / 4E. Bedienungsanleitung. Stand: August 1999

Mandant in den einzelnen Anwendungen löschen

VERWALTUNG. Postfächer, Autoresponder, Weiterleitungen, Aliases. Bachstraße 47, 3580 Mödring

Dokumentation für die software für zahnärzte der procedia GmbH Onlinedokumentation

Anwenderdokumentation PersoSim

Benutzung der LS-Miniscanner

Durchführung der Datenübernahme nach Reisekosten 2011

Bedienungsanleitung Version 1.0

Tevalo Handbuch v 1.1 vom

Dokumentation zur Versendung der Statistik Daten

Einführung in die Programmierung für Wirtschaftsinformatik

Würfelt man dabei je genau 10 - mal eine 1, 2, 3, 4, 5 und 6, so beträgt die Anzahl. der verschiedenen Reihenfolgen, in denen man dies tun kann, 60!.

1. Melden Sie sich als Administrator an und wechseln Sie zum Desktop

Drucken/Kopieren/Scannen und Störungen am Gerät im Hochschulnetz

Leere Zeilen aus Excel-Dateien entfernen

Angewandte Mathematik und Programmierung

Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank

Wie man Registrationen und Styles von Style/Registration Floppy Disketten auf die TYROS-Festplatte kopieren kann.

Einführung in die Programmierung (EPR)

BFI Industrie-Elektronik GmbH + Co. KG

Programmierung in C. Grundlagen. Stefan Kallerhoff

UP4DAR HOWTO: Firmware-Update via RS232- Schnittstelle

Anleitungen zum KMG- -Konto

Aufgabenstellung Praktikum Mikrorechentechnik Sommersemester 2014

Physik & Musik. Stimmgabeln. 1 Auftrag

Das Modul ABRUF-AUFTRAG ermöglicht es, Teillieferungen zum Auftrag auszuführen, wobei automatisch im Auftrag die Restmengen verwaltet werden.

i2c-bus.de I2C-002 KURZBESCHREIBUNG I 2 C Modul mit PCA Bit I/O Port-Expander Dokument NR.: I2C-002-D-01

Synchronisierung. Kommunikationstechnik, SS 08, Prof. Dr. Stefan Brunthaler 73

Frankieren in Microsoft Word mit dem E Porto Add in der Deutschen Post

EASYINSTALLER Ⅲ SuSE Linux Installation

Lehrer: Einschreibemethoden

Einrichten des IIS für VDF WebApp. Einrichten des IIS (Internet Information Server) zur Verwendung von Visual DataFlex Web Applications

Tutorial -

Anleitung für die Registrierung und das Einstellen von Angeboten

Guide DynDNS und Portforwarding

Transkript:

Beuth Hochschule für Technik Berlin Fachbereich VII Elektrotechnik Mechatronik Optometrie Studiengang Bachelor Elektrotechnik Dokumentation Metronom Projekt im Labor Mikrocomputertechnik Teilnehmer: Benjamin Schmidt 765543 benjamin.schmidt@beuth-hochschule.de Susanne Henke 635234 susanne.henke@beuth-hochschule.de Kevin Smart 742621 kevin.smart@beuth-hochschule.de Betreuer: Peter Gober Durchführung: Sommersemester 2013

Inhalt 1 Funktionsbeschreibung... 2 2 Hardware... 3 2.1 Verwendete Hardware... 3 2.2 Beschaltung... 3 3 Software... 4 3.1 Überblick Module... 4 3.2 Modul tastatur... 5 3.3 Modul lcd-routines... 5 3.4 Modul metrosound... 6 3.5 Hauptmodul... 7 4 Verwendete Peripherie des Mikrocontrollers... 8 4.1 Ports... 8 4.2 Timer... 8 4.3 Interrupts... 8 5 Diskussion... 8 6 Literaturverzeichnis... 8 Quellcode... 9 1 Funktionsbeschreibung Das entwickelte Metronom gibt für Musiker ein gleichmäßiges Tempo durch ein regelmäßiges akustisches Signal ( Schlag ) mit Betonung des jeweils ersten von 3 Schlägen (3/4-Takt) bzw. 4 Schlägen (4/4-Takt) vor. Die Anzahl Schläge pro Minute (englisch beats per minute, abgekürzt BPM) ist über eine Zehnertastatur im Bereich 50 bis 200 zu einem beliebigen Zeitpunkt eingebbar. Der Abschluss einer Zahleneingabe erfolgt durch die Taste #, z. B. 1 1 0 # zur Eingabe von 110 Schlägen pro Minute. Mit der Taste kann man zwischen den Taktarten 3/4-Takt und 4/4-Takt wählen. Beim Einschalten sind 120 Schläge pro Minute und 4/4-Takt voreingestellt. Eingegebene Werte für die Anzahl Schläge pro Minute werden während und nach Abschluss der Eingabe auf einem LCD-Display in der ersten Zeile angezeigt. Außerdem wird die eingestellte Taktart auf dem LCD-Display in der zweiten Zeile angezeigt. 1 Beispiel für die Anzeige: 120 3/4 1 Bei einigen LCD-Anzeigen bei uns im Labor ist die 2. Zeile rechts neben der 1. Zeile angeordnet.

Abbildung 1: Beispiel für Aufbau 2 Hardware 2.1 Verwendete Hardware Mikrocontroller-Entwicklungsboard Atmel XMEGA-A1 Xplained (mit integriertem Lautsprecher) Standard-Matrix-Tastatur (Anordnung der Tasten: 789 456 123 0#) Standard-LCD auf Basis des Controllers HD44780 (min. 2 Zeilen je 8 Zeichen) 2.2 Beschaltung Matrix-Tastatur ATxmega128A1 Spalte 1 A0 Spalte 2 A1 Spalte 3 A2 Zeile 1 A3 Zeile 2 A4 Zeile 3 A5 Zeile 4 A6

LCD GND V CC = 3,3 V RS R/W E DB0 bis DB3 DB4 DB5 DB6 DB7 ATxmega128A1 GND V CC = 3,3 V D4 GND D5 offen (unbenutzt) D0 D1 D2 D3 3 Software 3.1 Überblick Module Hauptmodul tastatur lcd-routines metrosound

3.2 Modul tastatur S1 S2 S3 1 2 3 Z1 4 5 6 Z2 7 8 9 Z3 0 # Z4 Abbildung 2: Matrix-Tastatur (Quelle: (2), Folie 123) In Abbildung 2 ist die verwendete Matrix-Tastatur schematisch dargestellt: Die 12 Tasten verbinden jeweils eine Spalten- mit einer Zeilenleitung. Es wurde ein Modul tastatur (bestehend aus den Dateien tastatur.c und tastatur.h) erstellt. Die nach außen exportierten Funktionen sind tastaturinit() und tastaturlies() (siehe auch tastatur.h). Zur Abfrage der Tastatur werden die Spaltenleitungen an Ausgänge des Mikrocontrollers angeschlossen und die Zeilenleitungen an Eingänge. Die Zeilenleitungen (Eingänge) werden mit Pullup-Widerständen (intern im Mikrocontroller) standardmäßig auf 1 gezogen. tastaturinit() initialisiert A0 bis A6 als Aus- bzw. Eingänge und konfiguriert Pull-up-Widerstände für die Eingänge. tastaturlies() fragt einmalig die Tastatur ab (und wartet nicht auf einen etwaigen Tastendruck). Nacheinander werden die Spaltenleitungen (Ausgänge) auf 0 gesetzt. Tritt an einer Zeilenleitung jetzt eine 0 auf, so ist die Taste am Kreuzungspunkt der auf 0 gesetzten Zeile gedrückt. 3.3 Modul lcd-routines Zur Ansteuerung des LCD-Displays wird ein Modul (bestehend aus den Dateien lcd-routines.c und lcd-routines.h) aus Quelle (1) verwendet. In lcd-routines.h wurden folgende Anpassungen für den verwendeten ATxmega128A1 vorgenommen: #define F_CPU 2000000

// LCD DB4-DB7 <--> PORTD Bit 0-3 #define LCD_PORT PORTD.OUT #define LCD_DDR PORTD.DIR #define LCD_DB 0 // LCD RS <--> PORTD Bit 4 (RS: 1=Data, 0=Command) #define LCD_RS 4 // LCD EN <--> PORTD Bit 5 (EN: 1-Impuls für Daten) #define LCD_EN 5 Je nach verwendetem LCD-Display ist noch die Adresse der 2. Zeile anzupassen (#define LCD_DDADR_LINE2). Die aus dem Modul verwendeten Funktionen lcd_() sind in lcd-routines.h bzw. Quelle (1) dokumentiert. 3.4 Modul metrosound Das Modul metrosound besteht aus den Dateien metrosound.c und metrosound.h). Die nach außen exportierten Funktionen sind metrosoundinit() und metrosound() (siehe auch metrosound.h). Das akustische Signal wird dadurch erzeugt, dass eine mit der Frequenz 8 khz durch TCD1 aufgerufene ISR Abtastwerte eines Sinus-Signals an den D/A-Wandler ausgibt. Die Betonung des jeweils ersten Schlages in einem Takt wird dabei dadurch erreicht, dass bei den anderen (also dem 2., 3. usw.) Schlägen nur jeder 2. Abtastwert verwendet und damit die Frequenz des ausgegebenen verdoppelt wird. Pro Minute bpm mal wird durch TCD0 eine zweite ISR aufgerufen, die zur Ausgabe eines Signalisierung des Schlages den ersten Interrupt einschaltet. Für TCD0 wird der Vorteiler 64 verwendet, der bei 2 MHz Taktfrequenz Zeiten bis 2,1 s und damit bis als Untergrenze BPM = (1 / 2,1 s) ( 60 s / min) 29 1/min ermöglichen würde. Nach Ausgabe von 800 Abtastwerten (0,1 Sekunden) deaktiviert sich der erste Interrupt selbst. Auf diese Weise wird pro Takt ein kurzes Piepen erzeugt. Abbildung 3 illustriert das Zusammenwirken der zwei Interrupts.

ISR TCD0 für Schläge (bpm pro Minute) Aktiviert ISR TCD1 ISR TCD1 für Abtastwerte (8 khz) Deaktiviert sich selbst nach 800 Aufrufen Abbildung 3: Interrupts von metrosound 3.5 Hauptmodul Das Hauptmodul in der Datei Metronom.c besteht aus der main()-funktion sowie der Logik zur Tastatureingabe. Die main()-funktion initialisiert die anderen Module, initialisiert einen regelmäßigen Interrupt für die Tastatureingabe (tastinterruptein()) und begibt sich dann in einen Schlafmodus. Die Hauptschleife ist leer, sämtliche Funktionen im Programmverlauf werden durch Interrupts ausgelöst. Der Interrupt für die Tastatureingabe wird alle 50 ms durch TCC0 ausgelöst. Die ISR verwendet die Funktion tastaturlies() aus dem Modul tastatur, um die Tastatur abzufragen. Durch die Abfrage nur alle 50 ms wird eventuelles Tastenprellen abgewartet. Wenn sich der Zustand der Tasten seit dem letzten Aufruf der ISR nicht geändert hat, wird die ISR sofort beendet. Andernfalls wird die Tasteneingabe ausgewertet. Noch nicht abgeschlossene Zahleneingaben werden lokal gespeichert und auf dem Display ausgegeben. Eine abgeschlossene Eingabe einer BPM-Zahl (Taste #) oder eine Umschaltung der Taktart () wirken auf die globalen Variablen taktart44 und bpm und werden auf dem Display ausgegeben und an die Funktion metrosound() weitergegeben.

4 Verwendete Peripherie des Mikrocontrollers 4.1 Ports Ports Funktion Dateien A0-A6 Anschluss Matrix-Tastatur tastatur.c D0-D5 Anschluss LCD lcd-routines.h/lcd-routines.c 4.2 Timer Timer Funktion Dateien TCC0 Erzeugung Interrupt alle 100 ms Metronom.c zur Abfrage der Tastatur. TCD0 Erzeugt Interrupt bpm mal pro metrosound.c Minute für Taktschläge. TCD1 Erzeugt Interrupt alle 1/8 ms für Abtastwerte. metrosound.c 4.3 Interrupts Interrupt Priorität Funktion Dateien TCC0_OVF_vect MEDIUM ausgelöst durch TCC0 (s. o.) Metronom.c TCD0_OVF_vect MEDIUM Ausgelöst durch TCD0 (s. o.) metrosound.c TCD1_OVF_vect HIGH Ausgelöst durch TCD1 (s. o.). metrosound.c 5 Diskussion Das Metronom wurde mit verschiedenen Benutzereingaben getestet und die Einhaltung einer vorgegebenen Anzahl Schläge pro Minute mit einem Oszilloskop überprüft. Der im Modul metrosound gewählte Ansatz, jeden Abtastwert einer Sinusfunktion einzeln durch eine ISR dem D/A-Wandler mit der Frequenz 8 khz zuzuführen, konsumiert während der Ausgabe eines Tones (also während 1/10 der Zeit) einen großen Teil der Rechenzeit des Mikrocontrollers (Aufruf der ISR alle 249 Takte bei einer Bearbeitungszeit der ISR von fast 100 Takten). Eine mögliche Folge ist eine gewisse Trägheit bei Tastatureingaben. Bei einer zukünftigen Überarbeitung könnte die D/A- Ausgabe auf DMA umgestellt werden. 6 Literaturverzeichnis 1. AVR-GCC-Tutorial/LCD-Ansteuerung. [Online] [Zitat vom: 15. 07 2013.] http://www.mikrocontroller.net/articles/avr-gcc-tutorial/lcd-ansteuerung. 2. Gober, Peter. Vorlesungsskript Mikrocomputertechnik. SS 2013.

Quellcode / Metronom.c Autor: Peter Gober Version 1.0, 15.07.2013 / #define F_CPU 2000000 #include <stdbool.h> #include <stdint.h> #include <stdlib.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/sleep.h> #include <util/delay.h> #include "tastatur.h" #include "lcd-routines.h" #include "metrosound.h" static bool taktart44 = true; static uint8_t bpm = 120; static void dispzeigetaktart() lcd_setcursor(0,2); if (taktart44) lcd_string("4/4"); else lcd_string("3/4"); static void disploeschebpm() lcd_setcursor(0,1); lcd_string(" "); static void dispzeigebpm() char buf[4]; disploeschebpm(); lcd_setcursor(0,1); itoa(bpm, buf, 10); lcd_string(buf); static void tastinterruptein() TCC0.CTRLA = TC_CLKSEL_DIV4_gc; TCC0.PER = 24999; TCC0.INTCTRLA = TC_OVFINTLVL_MED_gc; PMIC.CTRL = PMIC_MEDLVLEN_bm; sei(); // 0,05 s @ 2 MHz

ISR(TCC0_OVF_vect) static uint16_t wert = 0; static uint8_t stellen = 0; static char c, last_c = 0; // bisher eingegebener Wert // Anzahl Stellen bisher c = tastaturlies(); if (c == last_c) return; last_c = c; if (c == '') taktart44 =!taktart44; dispzeigetaktart(); metrosound(taktart44, bpm); else if (c == '#') if (wert < 50 wert > 200) // Fehlermeldung lcd_clear(); lcd_string("50-200!"); _delay_ms(500); lcd_setcursor(0, 1); lcd_string(" "); dispzeigetaktart(); else bpm = wert; metrosound(taktart44, bpm); wert = 0; stellen = 0; dispzeigebpm(); else if (c >= '0' && c <= '9') if (stellen < 3) if (stellen == 0) disploeschebpm(); wert = 10 wert + (c - '0'); lcd_setcursor(stellen, 1); lcd_data(c); stellen++; // Gleiches Zeichen wie eben? // Dann nicht weiter bearbeiten // Taktart wechseln // Eingabe beendet // Ziffer eingegeben int main(void) tastaturinit(); lcd_init(); metrosoundinit(); dispzeigebpm(); dispzeigetaktart(); tastinterruptein(); while(1) sleep_mode();

/ metrosound.h Erzeugung eines Metronom-Geräusches Autor: Peter Gober Version 1.0, 15.07.2013 / #ifndef SOUND_H_ #define SOUND_H_ #include <stdbool.h> #include <stdint.h> extern void metrosoundinit(); // Funktion: Einmalig aufzurufen vor Verwendung von metrosound(). // Parameter: kein // Rueckgabewert: keiner void metrosound(bool _taktart44, uint8_t bpm); // Funktion: Startet Metronomgeraeusch mit Taktart 4/4 // (falls _taktart44 == true) bzw. 3/4 und // bpm Schlaegen pro Minute. // Funktion kehrt sofort zurueck, Tonerzeugung // erfolgt durch Interrupts. // Parameter: _taktart44: true bei 4/4-Takt, false bei 3/4-Takt // bpm: Schlaege pro Minute // Rueckgabewert: keiner // Modul verwendet: DACB, TCD0, TCD1, Interrupts MED und HI. #endif / SOUND_H_ /

/ metrosound.c Erzeugung eines Metronom-Geräusches Autor: Peter Gober Version 1.0, 15.07.2013 / #include <stdint.h> #include <stdbool.h> #include <avr/io.h> #include <avr/interrupt.h> #include "metrosound.h" // Sinus-Tabelle: 2047 sin(2 PI i / 8) const static int16_t sinus[8] = 0, 1447, 2047, 1447, 0, -1447, -2047, -1447 ; static bool taktart44; static uint8_t schlagimtakt = 0; // Interrupt pro Schlag ISR(TCD0_OVF_vect) // Ton ein TCD1.INTCTRLA = TC_OVFINTLVL_HI_gc; schlagimtakt++; if ((!taktart44 && schlagimtakt == 3) (schlagimtakt == 4)) schlagimtakt = 0; // Interrupt pro Abtastwert ISR(TCD1_OVF_vect) static uint16_t i = 0; uint8_t staucher; // 2, 3, 4. Schlag im Takt werden "gestaucht" -> Frequenz höher if (schlagimtakt == 0) staucher = 1; else staucher = 2; DACB.CH0DATA = sinus[(i staucher) % 8]; i++; if (i == 800) // Nach 800 Abtastwerten (=0,1 s) Ton zuende, aus i = 0; TCD1.INTCTRLA = TC_OVFINTLVL_OFF_gc; void metrosoundinit() // Verstaerker auf XMEGA-Xplained-Board aktivieren PORTQ.DIR = (1<<3); PORTQ.OUT = (1<<3); // D/A-Wandler initialisieren DACB.CTRLA = DAC_CH0EN_bm DAC_ENABLE_bm;

DACB.CTRLB = DAC_CHSEL_SINGLE_gc; DACB.CTRLC = DAC_REFSEL_INT1V_gc; // Timer/Interrupt fuer Abtastwerte TCD1.CTRLA = TC_CLKSEL_DIV1_gc; TCD1.PER = 249; TCD1.INTCTRLA = TC_OVFINTLVL_OFF_gc; // 1/8 ms @ 2 MHz // Aktivierung in ISR(TCD1_OVF_vect) PMIC.CTRL = PMIC_MEDLVLEN_bm PMIC_HILVLEN_bm; sei(); void metrosound(bool _taktart44, uint8_t bpm) // Timer/Interrupt fuer Schlaege TCD0.CTRLA = TC_CLKSEL_DIV64_gc; TCD0.PERBUF = (2000000ul 60 / 64) / bpm - 1; TCD0.INTCTRLA = TC_OVFINTLVL_MED_gc; taktart44 = _taktart44;

/ tastatur.h Abfrage einer Matrixtastatur Anordnung der Tasten und Anschluss an den Mikrocontroller: A0 A1 A2 +----------+ 7 8 9 --A3 4 5 6 --A4 1 2 3 --A5 0 # --A6 +-----------+ Autor: Peter Gober Version 1.0, 15.07.2013 / #ifndef TASTATUR_H_ #define TASTATUR_H_ extern void tastaturinit(); // Funktion: Einmalig aufzurufen vor Verwendung von tastaturlies(). // Parameter: keine // Rueckgabewert: keiner extern char tastaturlies(); // Funktion: Falls momentan eine Taste gedrueckt ist, wird deren // ASCII-Code zurueckgegeben (z. B. ''), ansonsten 0. // Funktion wartet nicht. // Parameter: keine // Rueckgabewert: ASCII-Code der gedrueckten Taste, sonst 0 // Modul verwendet: TCC0, Interrupt MED, Ports D0-D6 #endif / TASTATUR_H_ /

/ tastatur.c Abfrage einer Matrix-Tastatur Autor: Peter Gober Version 1.0, 15.07.2013 / #include <stdbool.h> #include <stdint.h> #include <avr/io.h> #include "tastatur.h" // Masken für Bits im Port für Spalten und Zeilen #define S1 (1<<0) #define S2 (1<<1) #define S3 (1<<2) #define Z1 (1<<3) #define Z2 (1<<4) #define Z3 (1<<5) #define Z4 (1<<6) // tastaturinit() void tastaturinit() // Spalten sind Ausgaenge, Zeilen sind Eingaenge PORTA.DIR = S1 S2 S3; PORTA.DIR &= ~(Z1 Z2 Z3 Z4); // Zeilen ohne gedrueckte Tasten auf 1 ziehen PORTA.PIN3CTRL = PORT_OPC_PULLUP_gc; PORTA.PIN4CTRL = PORT_OPC_PULLUP_gc; PORTA.PIN5CTRL = PORT_OPC_PULLUP_gc; PORTA.PIN6CTRL = PORT_OPC_PULLUP_gc; // Hilfsfunktionen fuer bessere Lesbarkeit static void setze(uint8_t maske) PORTA.OUT = maske; static void loesche(uint8_t maske) PORTA.OUT &= ~maske; static bool gesetzt(uint8_t maske) return PORTA.IN & maske; // tastaturlies() char tastaturlies() // Abfrage Spalte 1

loesche(s1); setze(s2); setze(s3); if (!gesetzt(z1)) return '1'; else if (!gesetzt(z2)) return '4'; else if (!gesetzt(z3)) return '7'; else if (!gesetzt(z4)) return ''; // Abfrage Spalte 2 setze(s1); loesche(s2); setze(s3); if (!gesetzt(z1)) return '2'; else if (!gesetzt(z2)) return '5'; else if (!gesetzt(z3)) return '8'; else if (!gesetzt(z4)) return '0'; // Abfrage Spalte 3 setze(s1); setze(s2); loesche(s3); if (!gesetzt(z1)) return '3'; else if (!gesetzt(z2)) return '6'; else if (!gesetzt(z3)) return '9'; else if (!gesetzt(z4)) return '#'; return 0;