\documentclass[ngerman]{article} \usepackage[T1]{fontenc} \usepackage[utf-8]{inputenc} \usepackage{multicol} \usepackage{url} \usepackage{graphicx,color} \usepackage{graphics} \DeclareGraphicsExtensions{.eps} \usepackage{moreverb} \setcounter{secnumdepth}{0} \setcounter{tocdepth}{0} \begin{document} \title{Der Piezo–Summer des AVR–Butterfly}[AVR–Butterfly Piezo–Summer] \author{Ulrich Hoffmann, Michael Kalus} \maketitle \begin{multicols}{2} \parskip = 0.33\baselineskip \advance\parskip by 0pt plus 2pt Für die Ausgabe von Tönen hat der AVR--Butterfly einen Piezosummer. Dieser ist an PORTB5 angeschlossen. Benutzt man PWM (Pulsweiten--Modulation), lassen sich verschiedene Frequenzen generieren, um Melodien zu spielen. \begin{center} \includegraphics[width=0.6\columnwidth]{2007-01/piezo}\\ {Das Piezo--Element auf dem Butterfly--Board} \end{center} Dieser Port--Pin 5 dient neben der normalen I/O--Funktion auch als Output für den PWM--Timer. Er ist daher zur Ausgabe von Frequenzen besonders gut geeignet. Deswegen haben ihn die Atmel--Ingenieure wohl auch als Anschluss für den Piezo--Summer auf dem AVR--Butterfly--Board verwendet. Aber auch durch einfaches Umschalten des Pins lassen sich dem Summer Töne entlocken: Siehe Forth--Beispiel--Code im Listing auf Seite \pageref{piezolisting} \begin{center} \includegraphics[width=0.95\columnwidth]{2007-01/piezo_schematic}\\ {Ansteuerungsschaltung des Piezo--Elements} \end{center} \subsection*{Funktion der Port--Pins} Die Output--Pins auf dem ATmega169 können alle einzeln gesteuert werden. Direkt mittels der \texttt{SBI}-- und \texttt{CBI}--Befehle oder durch Beschreiben/Lesen des zugehörigen Data--Registers. Jeder Pin verfügt über hi--sink \& hi--source--Eigenschaften und ist daher in der Lage, eine LED zu treiben. Auch hat jeder Pin einen eigenen pull--up--Widerstand mit Vcc--unabhängigem Wert sowie Schutzdioden gegen Vcc und Gnd. \begin{center} \includegraphics[width=0.95\columnwidth]{2007-01/pinx}\\ {Interne Schaltung der ATmega169 Ein/Ausgabe--Pins} \end{center} Nomenklatur:\\ Registername, Portbuchstabe $x$, Pin Nummer $n$\\ \begin{small} \begin{tabular}{llll} DRB5 & Port B data register pin 5; & w/r \\ DDRB5 & Port B data direction register pin 5; & w/r \\ pinB5 & Port B pin register B pin 5; & read only\\ \end{tabular} \end{small} Jeder Port --- und damit jeder Pin einzeln auch --- besteht aus 3 Registern. Dem Data--Register DRx, dem Data--Direction--Register DDRx und dem Port--Input--Register PINx. Die Pins können einzeln Eingang oder Ausgang sein. Das PINx spielt eine besondere Rolle, es kann nur eingelesen werden. Das geschieht aber über die gleichen Pins wie beim DRx. Eine den ganzen Portx betreffende Kontrolle besteht über das MCUCR. Wird dort das pull--up--disable--bit (PUDbit) gesetzt, sind alle Pins des Ports ohne pull--up--Widerstand. Jeder Pin eines Ports ist mehrfach belegt. Unser PORTB5 hat neben dem I/O noch die Funktionen OC1A/PCINT13, Bit 5. OC1A, Output--Compare--Match--A--output: Der PB5--Pin dient zur Ausgabe für den Timer/Counter1 Output--Compare--A. Dazu muss der Pin als Output (DDB5 set (one)) gesetzt sein. Dann ist der OC1A der Ausgabepin für die PWM--mode--timer--function. Und schließlich dient er noch als PCINT13, Pin--Change--Interrupt--Source 13: Der PB5--Pin ist dann Eingang für eine externe Interrupt Quelle. Über einen Multiplexer können diese alternativen Funktionen zugewiesen werden. Siehe Datenblatt des ATmega169. \end{multicols} \subsection{Links} \begin{tabular}{ll} AVR--Butterfly Manual: &\url{http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3146}\\ Piezo: &\url{http://www.forth-ev.de/wiki/doku.php/projects:avr:pietzo_speaker}\\ Datenblatt ATmega169: &\url{http://www.atmel.com/} Suche: ATmega169\\ \end{tabular} \vfill \small{Schaltungen und Foto entstammen den Atmel--Datenblättern. Sie sind hier nur zur Illustration wiedergegeben.} \newpage \begin{quote} \label{piezolisting} \listinginput[1]{1}{2007-01/piezo.fs} \end{quote}