Mikrocontrollertechnik MODUL C

Größe: px
Ab Seite anzeigen:

Download "Mikrocontrollertechnik MODUL C"

Transkript

1 MODUL C

2

3 Copyright Das folgende Werk steht unter einer Creative Commons Lizenz (http://creativecommons.org). Der vollständige Text in Deutsch befindet sich auf

4

5 23 Inhaltsverzeichnis MODUL C C Wiederholung... Kurze Zusammenfassung Modul B... Software UART...3 Software UART zum Senden...3 Software UART zum Empfangen...6 Software UART mit Interrupt...8 C A/D und D/A Wandler...9 A/D Wandler...9 Die Initialisierung des A/D Wandlers... Die Referenzspannungsquelle (ADMUX)... Anordnung im Datenregister (ADMUX)... Der Kanalmultiplexer (ADMUX)...2 Der Vorteiler (ADCSRA)... 3 Weitere Einstellungen... 3 Polling...4 Interrupts...4 Beispiel für eine Initialisierung (Polling, Single Conversion Mode)...5 Die SF Register des A/D Wandlers...5 Das ADMUX Register... 5 Das ADC Kontroll und Statusregister A...7 Das Sonderfunktionsregister SFIOR...8 Das 6 Bit ADC Datenregister... 9 A/D Wandlung mittels Polling...2 Single Conversion Mode... 2 Free Running Mode... 2 A/D Wandlung mittels Interrupt (Auto Trigger)...22 Free Running Mode Wandlung auslösen mit dem externen Interrupt...24 Wandlung auslösen mit dem Timer Weitere Aufgaben i

6 23 D/A Wandler...28 Das R 2R Netzwerk...28 Weitere Aufgaben...3 C2 Timer...35 Einführung...35 Was ist ein Timer? Was kann man mit Timern tun? Grundsätzliche Funktionsweise des Timers...36 Der Timer als Zeitgeber...36 Überlauf mit dem Timer...36 Initialisierung des Timer für den Überlauf Interrupt...37 Überlauf mit dem Timer mit Voreinstellung...39 Der Timer als Zähler (Counter)...4 Timer als Zähler (Counter)...4 Pulsweitenmodulation mit dem Timer...4 Pulsweitenmodulation mit Timer...4 Funktionsweise des "Fast PWM" Modus:...4 Initialisierung des Timer für den "Fast PWM" Modus...42 Die SF Register des Timer...43 Das Timer/Counter Control Register TCCR...43 Das Timer/Counter Interrupt Mask Register TIMSK...44 Das Timer/Counter Interrupt Flag Register TIFR...45 Das Timer/Counter Register TCNT...46 Das Output Compare Register OCR...46 Weitere Aufgaben...46 C3 Die I2C Schnittstelle (TWI)...47 Einführung...47 Der synchrone I2C Bus...48 Die I2C Datenübertragung...48 Das I2C Protokoll Die Adressierung... 5 Die TWI Schnittstelle des ATmega32A...5 ii

7 23 Die Initialisierung der TWI Schnittstelle...5 Polling... 5 Interrupt... 5 Die Bitrate der Schnittstelle (TWBR und TWSR)...5 Die SF Register der TWI Schnittstelle...52 Das Kontroll Register TWCR Das Status Register TWSR Das Bitraten Register TWBR Das Datenregister TWDR Das Adress Register TWAR Die I2C Bibliothek...55 Bus initialisieren mit I2CINI...55 Startbit senden mit I2CSTA...56 Daten senden mit I2CSND...57 Daten empfangen und ACK senden mit I2CRAK...57 Daten empfangen und NACK senden mit I2CRNA...57 Stoppbit senden mit I2CSTO...58 Die Echtzeituhr (RTC) DS I2C Daten zur Echtzeituhr senden...59 I2C Daten von der Echtzeituhr empfangen...6 Das EEPROM 24LC I2C Daten zum EEPROM senden...62 I2C Daten vom EEPROM empfangen...63 Weitere Aufgaben (für Fortgeschrittene)...65 C4 Die SPI Schnittstelle...73 Einführung...73 Aufbau der SPI Schnittstelle...73 Verdrahtung und Schieberichtung...73 Die SPI Modi und die Geschwindigkeit...75 Funktionsweise der SPI Schnittstelle...76 Die Initialisierung der SPI Schnittstelle...77 Die SF Register der SPI Schnittstelle...78 iii

8 23 Das SPI Control Register SPCR Das SPI Status Register SPSR Das SPI Data Register SPDR... 8 Ansteuerung eines Slaves mittels Polling...8 Ansteuerung eines Slaves mittels Interrupt...82 Weitere Aufgaben...84 C5 Die USB Schnittstelle...87 Kurze Einführung zu USB...87 USB Transfer...87 Endpunkte Control Transfer Der SETUP Abschnitt ( Transaktion) Der DATEN und der STATUS Abschnitt (Handshake)...9 Der schreibende Control Transfer (Data OUT)...9 Der lesende Control Transfer (Data IN)...9 Die Enumeration... 9 Der Geräte Deskriptor Der Konfigurations Deskriptor Der Schnittstellen Deskriptor Der Endpunkt Deskriptor Die String Deskriptoren Firmware AT9USBKEY...95 Kurze Beschreibung der Firmware...95 Hauptprogramm: USB Bibliothek Treiberfunktionen:...95 Enumeration:...95 Anwendungskommunikation:...96 Zur Kommunikation mit den Endpunkten:...96 Control Endpunkt SETUP Abschnitt:...96 DATA IN und STATUS Abschnitt:...96 DATA OUT und STATUS Abschnitt:...97 OUT Endpunkt IN Endpunkt iv

9 23 Übersicht zur Firmware...99 Das Hauptprogramm (at9usbkey_firmware...)... Die USB Bibliothek (SR_USB.asm, usb_srs.c)... Die Interrupt Service Rinen... USB_GEN (USB GENeral Interrupt)... USB_COM (USB Endpoint/Pipe COMmunication Interrupt)... Die Unterprogramme... 2 Basisinitialisierungen mit INIDEV und INIEP...2 Die Enumeration mit SETUP...4 SNDDES (usb_send_descriptor)...6 Die Anwendungskommunikation...7 EP_SP (usb_ep_setpd4_7)...7 EP2_AD (usb_ep2_readadc)...8 v

10 vi 23

11 23 C Wiederholung Die Grundlagen der Assembler Programmierung aus dem Modul B sollen anhand einiger Programmieraufgaben gefestigt werden. Kurze Zusammenfassung Modul B Mechanische Schalter an Eingängen ohne hardwaremäßige Entprellung müssen softwaremäßig mit Hilfe einer Zeitschleife entprellt werden (Pull Up Widerstände nicht vergessen; mit PIN und nicht mit PORT einlesen!). Bei der Benutzung von Unterprogrammen und Interrupt Behandlungsrinen (ISR) muss der Stapel initialisiert werden! Am Besten die 4 Zeilen zur Initialisierung im Template nie löschen. Auf die Arbeitsregister kann üblicherweise im gesamten Programm zugegriffen werden. Man spricht dann von globalen Variablen. Variablen die aber nur innerhalb eines Unterprogramms benötigt werden, sollten kein wertvolles Arbeitsregister blockieren. Innerhalb von Unterprogrammen und Interruptrinen soll man mit lokalen Variablen arbeiten. Um Arbeitsregister für lokale Variablen zu befreien wird ihr Inhalt auf dem Stapel mit dem Befehl push zwischengespeichert. Vor dem Verlassen des Unterprogramms bzw. der Rine wird der Inhalt dann wieder ins Arbeitsregister zurückgespeichert (pop). Globale Variablen, die zur Übergabe von Daten an Unterprogramme dienen werden Parameter genannt. Am besten benutzt man immer die gleichen Arbeitsregister für die Parameterübergabe (in diesem Kurs das Doppelregister W (r24:r25 bzw. WL:WH)). Diese Arbeitsregister dürfen dann nicht auf den Stapel gerettet werden. Bei mehreren Parametern (z.b. Tabellen) sollte auf Speicherzellen im SRAM zurückgegriffen werden. Interrupts müssen einzeln für die lokale Baugruppe und global ( sei) freigeschaltet werden. Zusätzlich muss der Interruptvektor mit einem Sprungbefehl zur ISR initialisiert werden. In einer Interruptrine müssen zwingend alle Register die in der ISR verwendet werden, sowie auch das Statusregister SREG, auf dem Stapel gesichert (push) und von diesem wiederhergestellt (pop) werden. Die ISR schließt mit einem reti ab! Es existieren beim ATmega32A drei externe Interrupts (INT, INT, INT2) an PD2, PD3 und PB2. Im SF Register MCUCR (bzw. MCUCSR für INT2) wird festgelegt, ob der Interrupt auf eine positive Flanke, eine negative Flanke oder eine beliebige Flanke bzw. einen Pegel (nur INT und INT) reagiert. Erstaunlicherweise reicht es das MCUCR Register (bzw. MCUCSR) zu initialisieren, damit die Interruptflags bei auftretender Flanke bereits gesetzt werden, sogar wenn der externe Interrupt noch gar nicht freigeschaltet ist! Wartet der Controller in einer Warteschleife auf ein Ereignis, so bezeichnet man das als Polling. Polling hat den Vorteil einer sequentiellen Programmierung, ist aber nicht sehr effektiv, da der Controller blockiert wird. Wenn möglich sollten C Wiederholung

12 23 deshalb Interrupts eingesetzt werden. Mit Interrupts ist Multitasking möglich, da einzelne Baugruppen unabhängig von Prozessor arbeiten können und beim Auftreten eines wichtigen Ereignisses dieses durch eine Unterbrechung mitteilen. Die Programmierung mittels Interrupts erhöht allerdings die Komplexität der Programme. Die serielle Schnittstelle (EIA 232) wird auch heute noch sehr häufig eingesetzt. Damit eine Kommunikation richtig ablaufen kann, muss das gleiche Datenformat (Anzahl der Datenbits, gleiche Parität, gleiche Anzahl von Stoppbits) und die gleiche Übertragungsgeschwindigkeit (Baud bzw. Bit/s) verwendet werden. Werden zwei Endgeräte (z.b. PC und Controller) eingesetzt, so müssen die Leitungen gekreuzt werden (Null Modem Kabel). Oft werden bei proprietären Lösungen auch Steuerleitungen (z.b. CTS, RTS) eingesetzt. Diese sind richtig anzuschließen. Die Schnittstelle arbeitet mit anderen Pegeln wie der Controller!! Es muss ein Schnittstellen-Wandlerbaustein (z.b. MAX232) eingesetzt werden, da sonst der Controller zerstört werden kann. Die meisten ATmega Controller besitzen eine Hardware Schnittstelle. Diese wird mit UART oder USART bezeichnet (Universal Synchronous/Asynchronous Receiver/Transmitter). Die USART des ATmega32A wird mit Hilfe von 4 SF Registern initialisiert. Für die Baudrate wird ein Teilerwert in dem Doppelregister UBRRH:UBRRL abgelegt wird. Das Datenformat wird im Register UCSRC eingestellt. Sender und Empfänger sowie die Interrupts werden in UCSRB eingeschaltet. Beim Polling werden die Flags im Statusregister UCSRA abgefragt. Das Datenregister heißt UDR. Daten werden am Pin PD (RxD) eingelesen, und am Pin PD (TxD) ausgegeben. Wurde der Sende bzw. Empfängerbaustein eingeschaltet so ist das entsprechende Pin automatisch richtig als Eingang oder Ausgang initialisiert. Die Übertragungsgeschwindigkeit der seriellen Schnittstelle wird beim Controller durch Teilung seiner Taktfrequenz eingestellt. Für eine sichere Übertragung über die serielle Schnittstelle sollte ein externer Quarz verwendet werden und die Abweichung zur erwünschten Übertragungsgeschwindigkeit nach Datenblatt,5 % nicht überschreiten, da sonst häufiger Fehler auftreten können. Bei kurzen Leitungen können aber ohne weiteres höhere Abweichungen (±2 %) toleriert werden. Nach EIA 232 Standard sollte die Schnittstelle bis zu einer Abweichung von ±4% bei Baudraten unter 92 Baud funktionieren. 2 C Wiederholung

13 23 Software-UART Ein wichtiger Schritt bei der Programmierung ist die Fehlersuche (Debugging). Für die Ausgabe von Fehlermeldungen oder Registerinhalten ist die serielle Schnittstelle erste Wahl. Leider ist die einzige serielle Hardware Schnittstelle oft schon vom Projekt in Beschlag genommen. Eine Lösung ist die Verwendung eines AVR Controllers mit zwei seriellen Hardware Schnittstellen wie der zum ATmega32A pinkompatible und sparsame ATmega644p2. (das p m Eine einfachere alternative Lösung ist eine Software Emulation der Schnittstelle. Sie hat zudem folgende Vorteile: Jedes beliebige Pin kann zum Senden verwendet werden kann. Dies gilt auch beim Empfang mittels Polling. Jede Baudrate ist bei guter Programmierung mit geringer Abweichung realisierbar unabhängig vom verwendeten Quarz. Natürlich gibt es auch Nachteile, da sonst keine Hardware UARTs existieren würden: Bei der Emulation kann der Controller während des Sendens oder des Empfangs mittels Polling sonst keine Aufgaben wahrnehmen. Bei hohen Übertragungsgeschwindigkeiten müssen eventuell spezielle Unterprogramme mit entsprechenden Zeitschleifen geschrieben werden um die Fehlerquote klein zu halten. Der Code fällt umfangreicher aus. Software-UART zum Senden. Das folgende Unterprogramm zeigt eine mögliche Lösung. Die Baudrate kann mittels einer Zuweisung beliebig eingestellt werden. Das Datenformat beträgt fest 8N, es sind also Bit zu senden. Nach dem Startbit kommt das Zeichen (LSB first) und dann ein Stoppbit. Beispiel: 2 Beim ATmega644p ist darauf zu achten, dass die SF Register sich teilweise im SRAM befinden. Sie müssen dann mit sts und lds anstatt von und in adressiert werden. sbi, cbi, sbic und sbis können dann nicht verwendet werden. Es muss auf die Bitmaskierung zurückgegriffen werden. C Wiederholung 3

14 23 Es wird eine 6 Bit Zeitschleife verwendet. Zur Berechnung des Anfangswerts des Schleifenzähler G wird die genaue Formel benutzt: G = t Bit t T t = Bit 4t T 4t T 4 Mit t Bit = Baud und tt = Takt ergibt sich: G = Takt 4Baud 4 Takt ist die Taktfrequenz des Controllers (bei uns 6 MHz) und Baud die Bitrate der seriellen Schnittstelle). Beim Startbit und beim Stoppbit benötigt der cbi bzw. der sbi Befehl einen Taktzyklus, so dass ein Viertel (Zeit eines Taktzyklus) abgezogen werden muss. Zur Berechnung des Zeitschleifenzählers ergibt sich damit für das Start- bzw. das Stoppbit die folgende Formel: GStart = GStopp = Takt 2 4Baud 4 Im Hauptteil des Unterprogramms wird das Zeichen, das sich im Register r243 befinden muss, 8 mal (Zähler in r25) mit dem Schiebebefehl lsr nach Rechts geschoben. Das niederwertigste Bit (2) wird dabei in das Übertragsbit (Carry, Statusregister SREG) geschoben. Ein bedingter Sprungbefehl bewirkt dann, dass die Leitung bei einer Null auf Masse bzw. bei einer Eins auf VCC gezogen wird. Nach 8 Schiebeoperationen wurde dann das ganze Zeichen versendet. Da bei der Verzweigung, je nach Bit eine unterschiedliche Anzahl von Befehlen verwendet wird, muss ein nop Befehle als Zeitausgleich eingefügt werden. Die Verarbeitung der Daten benötigt 8 Taktzyklen. Für den Zeitschleifenzähler der 8 Datenbit ergibt sich folgende Formel: GDatenbit = Takt 9 4Baud 4 Da die Berechnungen in Assembler mittels einer Ganzzahvision erfolgt, findet keine Rundung statt und es kann ein Fehler von 4 Taktzyklen ( Schleifendurchgang) entstehen. Dies ist bei einer Baudrate von 52 Baud nicht hinnehmbar, da ein Fehler von 4 Taktzyklen/39 Taktzyklen* = 2,9 % entstehen könnte. Um dies zu vermeiden wird 3 Das Doppelregister r24:r25 ist hier für die Parameterübergabe reserviert und wird deshalb auch nicht auf den Stapel gerettet. 4 C Wiederholung

15 23 die Berechnung mit multipliziert (und später wieder durch geteilt). Durch eine Addition von 5 kann dann eine richtige Rundung durchgeführt werden. Erweiterte Formeln für den Zeitschleifenzähler: GStart = GStopp Takt 2 5 4Baud 4 = GDatenbit Takt 9 5 4Baud 4 = ; ; Zuweisungen ; EQU TXDDR = DDRC ;DDR-Register fuers Senden.EQU TXPORT = PORTC ;Port-Register fuers Senden.EQU TXPNr = ;Pin Nummer fuers Senden.EQU.EQU Baud Clock = 52 = 6 ;Baudrate ;Systemtakt (CPU) ; ; Sende Byte (r24) ueber die serielle Schnittstelle (8N) ; SSNDC: push XL ;rette verwendete Register push XH sbi sbi SSNDC: SSNDC2: SSNDC3: SSNDC4: SSNDC5: TXDDR,TXPNr TXPORT,TXPNr r25,8 ;Ausgang ;Leitung auf ;Zaehler = 8 cbi TXPORT,TXPNr ;Startbit senden ;Zeitschleife fuer das Startbit XL,LOW(((((*Clock)/(4*Baud))-((2*)/4)+5)/)) XH,HIGH(((((*Clock)/(4*Baud))-((2*)/4)+5)/)) sbiw XL, brne SSNDC ;Sende Zeichen LSB first! lsr r24 ;Bit in den Uebertrag (Carry) schieben brcs SSNDC3 ;Carry-Bit testen cbi TXPORT,TXPNr ;Null rjmp SSNDC4 ;zur Zeitschleife sbi TXPORT,TXPNr ;Eins nop ;Zeitausgleich ;Zeitschleife fuer ein Datenbit XL,LOW(((((*Clock)/(4*Baud))-((9*)/4)+5)/)) XH,HIGH(((((*Clock)/(4*Baud))-((9*)/4)+5)/)) sbiw XL, brne SSNDC5 dec r25 ;falls nicht alle Bits durch, dann naechstes Bit brne SSNDC2 nop ;Zeitausgleich für Sprungbefehl (MSB) sbi TXPORT,TXPNr ;Stoppbit senden ;Zeitschleife fuer das Stoppbit XL,LOW(((((*Clock)/(4*Baud))-((2*)/4)+5)/)) XH,HIGH(((((*Clock)/(4*Baud))-((2*)/4)+5)/)) SSNDC6: sbiw XL, brne SSNDC6 pop pop ret XH XL C Wiederholung ;Register wiederherstellen ;zurueck 5

16 23 C a) Zeichne das Flussdiagramm zum Unterprogramm. b) Das obige Unterprogramm befindet sich in der Bibliothek "SR_UART_SOFT_sample.asm". Schreibe ein Hauptprogramm zum Testen des Unterprogramms. Gib dem Hauptprogramm den Namen "C_UART_SOFT_test.asm". c) Welche maximale Abweichung ergibt sich bei einer Baudrate von 52 Baud und bei einer Baudrate von 96 Baud? Sind diese Abweichungen hinnehmbar? Begründe. C Die Bibliothek soll um ein ein Unterprogramm mit dem symbolischen Namen SSNDC für eine feste Baudrate von 52 Baud (6 MHz Quarz) erweitert werden. Es ist eine einfache 8 Bit Zeitschleife zu verwenden. Ein Zeitfehler soll mit nop Befehlen ausgeglichen werden. a) Teste das Unterprogramm. Nenne die Bibliothek "SR_UART_SOFT.asm" und das Hauptprogramm "C_UART_SOFT_test2.asm". b) Sende das Zeichen U und miss die Baudrate mit dem Oszilloskop. Der Fehler darf maximal,5 % betragen! Software-UART zum Empfangen. Ein Unterprogramm für die Bibliothek soll ähnlich wie beim Senden den Empfang mittels Software ermöglichen. Das Abtasten soll zur Mitte der Bitzeit erfolgen. Die Schiebeoperation und die Berechnung der Zeitschleifen erfolgt ähnlich wie beim Senden. 6 C Wiederholung

17 C2 23 a) Die Bibliothek soll um ein ein Unterprogramm mit dem symbolischen Namen SRCVC erweitert werden. Programmiere und teste das Unterprogramm mit 52 Baud. b) Im Hauptprogramm wird dazu das von der PC Tastatur empfangene Byte als Echo zurück zum PC geschickt wird. Schreibe das Hauptprogramm und nenne es "C2_UART_SOFT_test3.asm". C Wiederholung 7

18 23 Software-UART mit Interrupt Besonders beim Empfang wird der Controller lange blockiert, da nicht gewusst ist, wann Daten eintreffen werden. Hier bietet es sich an einen externen Interrupt zu opfern um auf eintreffende Daten reagieren zu können. C3 a) Die Bibliothek soll um ein eine Interruptrine mit dem symbolischen Namen ISRSRC erweitert werden. Die negative Flanke des Startbit an PB2 (INT2) soll den Empfang des Datenbyte auslösen. Programmiere und teste die ISR. b) Im Hauptprogramm wird dazu das von der PC Tastatur empfangene Byte als Echo zurück zum PC geschickt wird. Schreibe das Hauptprogramm und nenne es "C3_UART_SOFT_test4.asm". Bemerkungen: Falls möglich sollte beim Software UART und auch beim Debuggen immer mit der höchstmöglichen Baudrate gearbeitet werden. Setzt man die serielle Schnittstelle zum Debuggen ein, so muss man darauf achten das Timing des eigentlichen Programms nicht beeinflusst wird. Um weiter Arbeitszeit des Controllers einzusparen können die Zeitschleifen durch Timerinterrupts ersetzt werden. Durch Mehrfachtastung könnten Fehler entdeckt werden und die Übertragung bei großen Leitungslängen (bzw. hoher Störstrahlung) verbessert werden. Wie schon erwähnt besitzt der pinkompatible ATmega644p zwei Hardware USARTs. Er bietet aber auch die Möglichkeit an jedem beliebigen Pin einen externen Interrupt auszulösen und somit interruptgesteuert Daten zu empfangen. 8 C Wiederholung

19 23 C A/D- und D/A-Wandler Analog Digital Wandler4 (Analog to Digital Converter (ADC)) setzen analoge Signale in digitale Daten um. Digital Analog Wandler5 (Digital to Analog Converter (DAC)) tun genau das Gegenteil. Die Theorie zu A/D Wandlern füllt ganze Bücher. Es soll hier nur auf die in den ATmega Mikrocontrollern integrierten A/D Wandler eingegangen werden. A/D-Wandler A/D Wandler wandeln eine analoge Spannung in digitale Zahlenwerte um. Wichtige Kriterien sind hierbei die Wandlungszeit, die Auflösung in Bit und die Genauigkeit. A/D Wandler mit sehr hoher Auflösung benötigen viel Wandlungszeit. Ein solcher Wandler nach dem Dual Slope Verfahren (Zählverfahren) kann relativ einfach mit dem internen Komparator des ATmega32A und ein wenig externer Beschaltung aufgebaut werden. Schnelle A/D Wandler, welche Signale mit hohen Frequenzen wandeln können, haben eine relativ geringe Auflösung. Einen guten Kompromiss ermöglichen die in den AVR Controllern eingesetzten A/D Wandler, welche nach dem Wägeverfahren6 arbeiten. Die Genauigkeit eines A/D Wandlers wird durch Quantisierungsfehler, Nullpunktfehler, Verstärkungsfehler, Nichtlinearität, Monotoniefehler und dynamische Fehler bestimmt. Im Datenblatt des ATmega32A findet man Angaben zur Genauigkeit des integrierten Wandlers. Durch ein eingebautes Abtast und Halte Glied ist der dynamischen Fehler des integrierten Wandlers klein. Es können sogar Wandlungen, während sich der Controller in einem Schlafmodus befindet, durchgeführt werden um das eingestreute Rauschen zu minimieren. Wichtig für eine hohe Genauigkeit ist aber auch das Lay und die Beschaltung beim Anschluss an den A/D Wandler (siehe Datenblatt). Der im ATmega32A integrierte A/D Wandler besitzt viele unterschiedliche Konfigurations möglichkeiten und ist deshalb flexibel einsetzbar. Er eine Auflösung von Bit und eine schnellste Wandlungszeit nach Datenblatt von 3 µs (bei geringerer Genauigkeit), womit Frequenzen von einigen khz verarbeitet werden können. Ein Multiplexer am Eingang ermöglicht es 8 verschiedene Eingangsspannungen zu wandeln. Es können auch mit Hilfe von je zwei Eingängen Differenzsignale verarbeitet werden. Ein Vorverstärker kann die Eingangsspannung um den Faktor verstärken (Faktor 2 möglich bei SMD Bauformen und entsprechendem Lay). Alle Eingänge des A/D Wandlers werden über die Pins von Port A eingelesen. 4 A/D Wandler, oder auch noch Analog Digital Umsetzer (ADU) 5 D/A Wandler, oder auch noch Digital Analog Umsetzer (DAU) 6 Beim Wägeverfahren handelt es sich um ein Kompensationsverfahren. Die Annäherung an die Eingangsspannung erfolgt in gewichteten Schritten (Verfahren der sukzessiven Approximation). C A/D- und D/A-Wandler 9

20 23 Als Referenzspannung kann die Betriebsspannung des Controllers verwendet werden, eine externe Referenzspannung oder eine interne Referenzquelle von 2,56 V. Mit einer Bit Auflösung und einer Referenzspannung von zum Beispiel 5 V ist dann die feinste Auflösungsstufe 5 V / 2 = 4,883 mv. In der folgenden Abbildung aus dem Datenblatt des ATmega32A sieht man die vollständige A/D Wandler Baugruppe im Blockschaltbild. Über die SF Register ADMUX, ADCSRA und SFIOR wird der Wandler konfiguriert. Im 6 Bit Datenregistern ADC (ADCL und ADCH) wird das Ergebnis der Wandlung abgelegt. C A/D- und D/A-Wandler

21 23 Die Initialisierung des A/D-Wandlers Zur Initialisierung und Statusabfrage des A/D Wandler dienen die drei Register: ADMUX In diesem Register werden die Referenzspannungsquelle, die Anordnung der Datenbit im Datenregister (links oder rechtsbündig) und die zu verwendeten Eingangspins mit ihrer Betriebsart und Verstärkung festgelegt. ADCSRA Das Kontroll und Statusregister schaltet auf Wunsch den Wandler, den ADC Interrupt und den Auto Trigger ein, kann eine neue Wandlung einleiten, initialisiert den Vorteiler und enthält das Interrupt Flag. SFIOR In diesem Spezialregister werden nur drei Bit für den A/D Wandler benötigt. Sie entscheiden welche Interrupt Quelle den Auto Trigger auslösen soll Daten stehen nach der Wandlung im Doppelregister: ADC (ADCH, ADCL) zur Verfügung. Die Referenzspannungsquelle (ADMUX) Es kann zwischen mittels zweier Bit (REFS, REFS) im Register ADMUX zwischen drei Referenzspannungsquellen gewählt werden:. Es wird die interne Referenzspannungsquelle von 2,56 V benutzt. 2. Es wird eine externe Referenzspannung am Pin AREF des Chip angelegt. 3. Die Betriebsspannung des Wandlers am Pin AVCC wird als Referenz benutzt. Bemerkung: Beim MICES Board sind AVCC und AREF mit der Betriebsspannung des Controllers verbunden. Für die folgende Versuche wird die Spannung des Wandlers (5 V) am Pin AVCC als Referenz benutzt. Anordnung im Datenregister (ADMUX) Das Bit ADLAR (ADC Left Adjust Result) entscheidet über die Ausrichtung des Bit Ergebnisses der A/D Wandlung. Werden alle Bit des Ergebnisses benötigt, so macht nur eine rechtsbündige Anordnung im 6 Bit Datenregister ADC Sinn. Das Ergebnis ist eine 6 Bit Dualzahl. C A/D- und D/A-Wandler

22 23 ADLAR = Bit ADC ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC ADC ADCH ADCL Beim Einlesen des Resultats muss ADCL vor ADCH eingelesen werden!! Wird keine so hohe Präzision benötigt, oder soll die Wandlung mit möglichst hoher Geschwindigkeit erfolgen, so kann mit nur 8 Bit gewandelt werden. Die beiden niederwertigsten Bits werden verworfen. Dies vereinfacht auch die Verarbeitung der Daten, da dann nur mit dem 8 Bit SF Register ADCH gearbeitet wird. Die Anordnung erfolgt linksbündig. ADLAR = Bit ADC ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC ADC ADCH ADCL Es wird nur ADCH eingelesen. Der Kanalmultiplexer (ADMUX) Bei eingeschalteter A/D Wandler Baugruppe sind die ausgewählten Pins des Port A keine digitalen Ein bzw. Ausgangspins mehr. Es können nun analoge Signale eingelesen werden. Ein Multiplexer ermöglicht es aus den 8 Eingangspins auszuwählen. Oft wird ein analoger Eingang unsymmetrisch betrieben. Die analoge Spannung liegt gegen die analoge Masse AGND des Chip an. Die Auswahl des Pins geschieht durch Einschreiben der dem Pin entsprechenden Dualzahl in die 5 MUX Bits des ADMUX Register (MUX MUX4). Soll zum Beispiel PIN PA4 ausgewählt werden, so ist b zu initialisieren (siehe Tabelle des ADMUX Registers im Kapitel Die SF Register des A/D Wandlers ). Soll eine symetrische Spannung eingelesen werden, so werden zwei Eingangspins benötigt. Die vielen Kombinationsmöglichkeiten des Anschlusses (25 = 32) zeigt die oben erwähnte Tabelle. Interessant ist auch die Möglichkeit den A/D Wandler Eingang zur Fehlersuche oder zur Kalibrierung mit einer Referenzspannungsquelle oder mit Masse zu verbinden. Das Messen einer Referenzspannung ermöglicht zum Beispiel die Bestimmung der Betriebsspannung des Chips. Besonders interessant ist dies bei mobilen Geräten mit Akku. 2 C A/D- und D/A-Wandler

23 23 Der Vorteiler (ADCSRA) Wie im großen Blockschaltbild ersichtlich benötigt der A/D Wandler eine Taktfrequenz, welche von einem Vorteiler (prescaler) geliefert wird. Der Vorteiler teilt den Systemtakt und muss laut Datenblatt eine Taktfrequenz zwischen 5 khz und 2 khz liefern, damit der A/D Wandler seine maximale Auflösung erreicht. Die Taktfrequenz darf allerdings auch höher sein, wenn nur mit 8 Bit gearbeitet wird. Der Vorteiler wird mit 3 Bit (ADPS ADPS2) im Kontrollregister ADCSRA eingestellt. Die beiden ersten Kombinationen liefern den gleichen Teilungsfaktor. Um zum Beispiel mit einem 6 MHz Quarz bei voller Auflösung zu arbeiten bleibt nur die Teilung durch 28 (6 MHz/28 = 25 khz). Das Taktsignal wird nur geliefert, wenn der A/D Wandler Baustein eingeschaltet ist. C ADPS2 ADPS ADPS Teilungs-fak tor a) Eine normale Wandlung (free running mode) benötigt 3 Taktzyklen des A/D Wandlertakts. Berechne die Wandlungszeit, falls bei 6 MHz der Vorteiler auf 28 eingestellt wird. b) Im Datenblatt ist eine minimale Wandlungszeit von 3 µs angegeben. Mit welcher höchsten Taktfrequenz kann der Wandler noch arbeiten (wenn auch nicht mit voller Auflösung)? c) Berechne die maximale Signalfrequenz bei einer A/D Wandlungszeit von 3 µs nach Nyquist7. Weitere Einstellungen Wie bei allen anderen Baugruppen ist der A/D Wandler nach einem RESET abgeschaltet um Strom zu sparen. Das Einschalten der Baugruppe geschieht mit dem Bit ADEN (ADCSRA). 7 Das Nyquist Shannonsche Abtasttheorem besagt, dass ein kontinuierliches, bandbegrenztes Signal, mit einer Minimalfrequenz von Hz und einer Maximalfrequenz f max, mit einer Frequenz größer als 2 f max abgetastet werden muss, damit man aus dem so erhaltenen zeitdiskreten Signal das Ursprungssignal ohne Informationsverlust (aber mit unendlich großem Aufwand) exakt rekonstruieren und (mit endlichem Aufwand) beliebig genau approximieren kann (Quelle Wikipedia). C A/D- und D/A-Wandler 3

24 23 Das Einleiten einer Wandlung geschieht entweder softwaremäßig durch das Setzen des Bit ADSC (start conversion) im Register ADCSRA oder aber hardwaremäßig durch einen Interrupt. Polling Beim Polling (ständige Abfrage durch die Software) kann das Bit ADSC oder das Flag ADIF benutzt werden um das Ende der Wandlung festzustellen. ADSC bleibt während der Wandlung auf Eins und wird gleich nach der Wandlung durch die Hardware gelöscht, ADIF muss nach der Wandlung manuell durch Setzen einer Eins gelöscht werden. Man unterscheidet den Single Conversion Mode bei dem jede einzelne Wandlung durch erneutes Schreiben des ADSC Bits eingeleitet wird und den Free Running Mode (Freilaufmodus), bei dem jedes Ende einer Wandlung automatisch eine neue Wandlung auslöst. Für den Free Running Mode muss der Auto-Trigger mit dem Bit ADATE (ADCSRA) eingeschaltet werden. Durch (einmaliges) Setzen des ADSC Bits wird die erste Wandlung eingeleitet. Diese erste Wandlung dauert etwas länger (25 statt 3 A/D Taktzyklen). Der Auto Trigger leitet automatisch nach der ersten erfolgten Wandlung eine neue Wandlung ein, wenn eine positive Flanke einer Trigger Quelle entdeckt wird 8. Die Trigger Quelle wird mit drei Bit (ADTS ADTS2) im SF Register SFIOR festgelegt. Im Free Running Mode (ADTS = ADTS = ADTS2 = ) ist die Trigger Quelle der A/D Wandler selbst. Jedes Ende einer Wandlung triggert also eine erneute Wandlung. Der Auto-Trigger funktioniert im Free Running Mode mit und ohne freigeschaltete Interrupts! Auch bei gesperrten Interrupts wird das Interrupt Flag ADIF gesetzt. Um weitere Trigger zu ermöglichen, und damit Wandlungen auszulösen, muss das Flag dann aber softwaremäßig gelöscht werden. Interrupts Außer dem A/D Wandler selbst kommen als Trigger Quellen noch unterschiedliche Interrupt Quellen in Frage. Besonders interessant ist das Auslösen eines Interrupts durch ein externes Signal (externer Interrupt) oder durch einen der Timer. Damit ist das Wandeln in festen Zeitabständen zum Beispiel fürs Datalogging möglich. Das interruptgesteuerte Wandeln ermöglicht es den Mikrocontroller, während der Wandlungszeit des A/D Wandlers, für andere Aufgaben zu nutzen und sollte bevorzugt verwendet werden. 8 Tritt diese Flanke während einer laufenden Wandlung auf, so wird sie wird sie ignoriert. 4 C A/D- und D/A-Wandler

25 23 Beispiel für eine Initialisierung (Polling, Single Conversion Mode) ;ADC initialisieren Tmp,b ;REFS = AVCC als Referenzspannung ADMUX,Tmp ;ADLAR = linksbuendig (obere 8 Bit in ADCH) ;MUX = unsymetrisch PA (ADC) Tmp,b ;ADEN = (ADC einschalten) ADCSRA,Tmp ;ADPS = (6MHz/28 = 25kHz) ;andere Bits per default = Die SF-Register des A/D-Wandlers Das ADMUX Register Das ADMUX Register befindet sich auf der SRAM Adresse x27 (SF Register Adresse x7). Die Befehle sbi, cbi, sbic und sbis dürfen verwendet werden, da es sich um eines der unteren 32 Register handelt. ADMUX = ADC Multiplexer Selection Register Bit ADMUX x7 Startwert Read/Write REFS REFS ADLAR MUX4 MUX3 MUX2 MUX MUX REFSn Reference Selection Bits REFS, REFS Mit diesen beiden Bit wird die Quelle für die Referenzspannung ausgewählt (3 Möglichkeiten). Änderungen an diesen Bits werden erst nach einer eventuell stattfindenden Wandlung berücksichtigt. Liegt eine externe Referenzspannung an Pin AREF, so soll nicht softwaremäßig auf interne Spannungsquelle geschaltet werden! * Externe Referenzspannung am Pin AREF des Chip (zwischen 2 V und VCC, interne Spannungsquelle VREF abgeschaltet) Die Spannung des Wandler am Pin AVCC wird als Referenz benutzt*. reserviert Eine interne Referenzspannung VREF von 2,56 V wird benutzt*. Der offene Eingang AREF soll zur Störunterdrückung mit einem Kondensator (z.b. nf) gegen Masse geschaltet werden. Weitere Informationen zur Störunterdrückung im Datenblatt unter "Analog Noise Canceling Techniques". ADLAR ADC Left Adjust Result MUXn Das Bit Ergebnis der A/D Wandlung wird rechtsbündig im Doppelregister ADC abgelegt (siehe ADCL und ADCH). Das Bit Ergebnis der A/D Wandlung wird linksbündig im Doppelregister ADC abgelegt (siehe ADCL und ADCH). Analog Channel and Gain Selection Bits MUX-MUX4 Mit diesen fünf Bit wird der bzw. die Eingangspins PAx am Port A (Eingangskanal), die Betriebsart (unsymmetrisch (unipolar, Spannung gegen Masse) oder symmetrisch (differenziell, C A/D- und D/A-Wandler 5

26 23 bipolar, Spannung zwischen zwei Pins)) und der Verstärkungsfaktor9 nach der folgenden Tabelle ausgewählt. Änderungen an diesen Bits werden erst nach einer eventuell stattfindenden Wandlung berücksichtigt. MUXn UNSYMETRISCH (Pin gegen Masse) PA (ADC) PA (ADC) PA2 (ADC2) PA3 (ADC3) PA4 (ADC4) PA5 (ADC5) PA6 (ADC6) PA7 (ADC7) Positiver (nicht-invert.) Eingang SYMETRISCH Negativer (invert.) Eingang Verstärkung PA (ADC) PA (ADC) PA (ADC) PA (ADC) PA (ADC) PA (ADC) PA (ADC) PA (ADC) x x 2x 2x PA2 (ADC2) PA3 (ADC3) PA2 (ADC2) PA3 (ADC3) PA2 (ADC2) PA2 (ADC2) PA2 (ADC2) PA2 (ADC2) x x 2x 2x PA (ADC) PA (ADC) PA2 (ADC2) PA3 (ADC3) PA4 (ADC4) PA5 (ADC5) PA6 (ADC6) PA7 (ADC7) PA (ADC) PA (ADC) PA (ADC) PA (ADC) PA (ADC) PA (ADC) PA (ADC) PA (ADC) x x x x x x x x PA (ADC) PA (ADC) PA2 (ADC2) PA3 (ADC3) PA4 (ADC4) PA5 (ADC5) PA2 (ADC2) PA2 (ADC2) PA2 (ADC2) PA2 (ADC2) PA2 (ADC2) PA2 (ADC2) x x x x x x,22 V (Bandgap-Referenz VBG) V (GND) 9 Die 2 fache Verstärkung ist nicht für PDIP Gehäuseformen getestet. 6 C A/D- und D/A-Wandler

27 23 Das ADC Kontroll- und Statusregister A Das ADCSRA Register befindet sich auf der SRAM Adresse x26 (SF Register Adresse x6). Die Befehle sbi, cbi, sbic und sbis dürfen verwendet werden, da es sich um eines der unteren 32 Register handelt. ADCSRA = ADC Control and Status Register A Bit ADCSRA x6 Startwert Read/Write ADEN ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS ADPS ADC Enable ADSC 7 schaltet den A/D Wandler aus (Baugruppe verbraucht keinen Strom!). Geschieht dies während einer Wandlung, so wird diese abgebrochen. schaltet den A/D-Wandler ein. ADC Start Conversion wird nach einer Wandlung automatisch wieder auf Null gesetzt. Das Löschen des Bit während der Wandlung hat keinen Einfluss. startet die A/D-Wandlung und kann dazu benutzt werden festzustellen, ob momentan eine Wandlung durchgeführt wird. Single Conversion Mode: Jede einzelne Wandlung wird durch erneutes Schreiben des Bits eingeleitet. Free Running Mode: Durch (einmaliges) Setzen des Bit wird die erste Wandlung eingeleitet. Die erste Wandlung dauert länger (25 statt 3 A/D Taktzyklen), da ein zusätzlicher Umwandlungszyklus vorangestellt wird, der zur Initialisierung des Wandlers dient. ADSC und ADEN können gleichzeitig gesetzt werden. ADATE ADC Auto Trigger Enable ADIF ADC Interrupt Flag ADIE beendet den Auto Trigger. startet den Auto-Trigger. Der Auto Trigger kann auf eine von acht Interrupt Quellen (Trigger Quellen) reagieren. Der A/D Wandler startet eine Wandlung, wenn eine positive Flanke der Interrupt Quelle erkannt wird. Die Interrupt Quelle wird mit drei Bit (ADTS ADTS2) im SFIOR Register ausgewählt. keine aktuelle Daten im Datenregister ADC wird Eins sobald der Wandlungszyklus beendet ist und die Daten im Doppelregister ADC (ADCL, ADCH) aktualisiert wurden. Gleichzeitig wird ein ADC Complete Interrupt ausgelöst, wenn Interrupts global erlaubt sind (I im SREG) und das ADIE Bit gesetzt wurde. Wurde ein Interrupt ausgelöst, so wird das Bit hardwaremäßig nach dem Ausführen des Interrupt gelöscht. Im Polling Betrieb kann das Bit manuell durch Schreiben einer Eins gelöscht werden! ADC Interrupt Enable der A/D Wandler Interrupt ist gesperrt. Das Setzen dieses Bit ermöglicht das Auslösen eines Interrupts in dem Moment, wo die A/D Wandlung beendet ist und neue Daten anliegen (ADI Flag im ADCSRA). Interrupts müssen dazu global frei gegeben sein (I= im SREG mit "sei"). ADPSn ADC Prescaler Select Bits ADPS2, ADPS, ADPS Mit diesen drei Bit wird der Teilungsfaktor des Vorteilers ausgewählt. Der kleinste Teilungsfaktor ist C A/D- und D/A-Wandler 7

28 23 2. Die Taktfrequenz des A/D Wandlers soll bei voller Auflösung ( Bit) zwischen 5 und 2 khz liegen! Bei 8 Bit kann sie bis zu MHz betragen. Sie errechnet sich mit: Wandlungstakt = Systemtakt Teilungsfaktor ADPS2 ADPS ADPS Teilungs-fakto r Das Sonderfunktionsregister SFIOR Das SFIOR Register befindet sich auf der SRAM Adresse x5 (SF Register Adresse x3). Die Befehle sbi, cbi, sbic und sbis dürfen nicht verwendet werden, da es sich um eines der oberen 32 Register handelt. SFIOR = Special Function IO Register Bit SFIOR x3 Startwert Read/Write ADTS2 ADTS ADTS - ACME PUD PSR2 PSR R ADTSn ADC Auto Trigger Source ADTS2, ADTS, ADTS Falls der Auto Trigger Modus eingeschaltet wurde (ADATE in ADCSRA) werden diese drei Bit im SFIOR Register benötigt um die Trigger Quelle auszuwählen. Eine A/D Wandlung wird durch die steigende Flanke der ausgewählten Interrupt Quelle ausgelöst. ADTS2 ADTS ADTS Trigger-Quelle Free Running Modus Analoger Komparator Externer Interrupt INT Timer Compare Timer Overflow Timer Compare B Timer Overflow Timer Capture Event C A/D- und D/A-Wandler

29 23 Das 6-Bit ADC Datenregister Die beiden 8 Bit Register ADCH und ADCL befindet sich auf den SRAM Adressen x25 und x24 (SF Register Adressen x5 und x4). Die Befehle sbi, cbi, sbic und sbis dürfen verwendet werden. ADCH = ADC Data Register High Bit ADCH x5 ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC9 ADC3 ADC8 ADC2 Startwert Read/Write R R R R R R R R ADCL = ADC Data Register Low Bit ADCL x4 ADC7 ADC ADC6 ADC ADC5 - ADC4 - ADC3 - ADC2 - ADC - ADC - Startwert Read/Write R R R R R R R R ADCn ADC Data Register Bit n Das Resultat einer A/D-Wandlung befindet sich in diesem 6 Bit Doppelregister. Werden differentielle (symmetrische) Eingänge benutzt, so liegt das Resultat in Zweierkomplementform vor! ADLAR = : Ist das ADLAR Bit im Register ADMUX gelöscht, so sind die Bits rechtsbündig angeordnet (obere Zeile). Diese Einstellung ist günstig, wenn alle Bit benötigt werden. Die Wertigkeit der Bits entspricht dann einer 6 Bit Dualzahl. Das niederwertige Register muss zuerst gelesen werden und dann das hochwertige Register! Erst nach dem Lesen des hochwertigen Register werden neue Daten in ADC abgelegt. ADLAR = : Ist das ADLAR Bit im Register ADMUX gesetzt, so sind die Bits linksbündig angeordnet (untere Zeile). Diese Einstellung ist günstig, wenn die zwei niederwertigsten Bit vernachlässigt werden können, man also nur mit 8 Bit weiterarbeitet. Es reicht dann nur ADCH auszulesen. ADLAR = Bit ADC ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC ADC ADCH ADCL ADLAR = Bit ADC ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC ADC ADCH C A/D- und D/A-Wandler ADCL 9

30 23 A/D-Wandlung mittels Polling Single Conversion Mode Im Single Conversion Mode (Einzelwandlungsmodus) muss jede Wandlung manuell neu gestartet werden, da das Bit ADSC (starte Wandlung, ADCSRA) nach der Wandlung automatisch von der Steuerung wieder zurückgesetzt wird. Dieses Bit kann auch für das Polling, zur Kontrolle ob die Wandlung angeschlossen ist, verwendet werden. Bemerkung: Eine Variante ist die Überprüfung des ADIF Flag. Dieses Flag muss allerdings manuell, durch Schreiben einer Eins, zurückgesetzt werden. Programmbeispiel: Der ATmega32A Controller soll eine Spannung zwischen V und 5 V an PA (ADC) in eine 8 Bit Zahl wandeln. PA soll als unsymmetrischer Eingang geschaltet sein. Der Spannungswert soll binär über LEDs an Port C angezeigt werden. Das Ende der Wandlungszeit wird mittels Polling ermittelt. ;******************************************************************************* ;* ;* Titel: AD-Wandler Polling (single conversion) mit ADSC ;* (C_adc_single_conversion_.asm) ;* Datum: 5// Version:.2 ;* Autor: WEIGU ;* ;* Informationen zur Beschaltung: ;* ;* Prozessor: ATmega32A Quarzfrequenz: 6MHz ;* Eingaenge: Analoge Spannung an PA (ADC) ;* Ausgaenge: 8 LEDs an PORTC ;* ;* Informationen zur Funktionsweise: ;* Die Spannung an PA (ADC) wird eingelesen und als 8 Bit-Wert binaer am ;* PORTC an 8 LEDs ausgegeben sobald die Wandlung abgeschlossen ist. ;* ;******************************************************************************* ; ; Einbinden der controllerspezifischen Definitionsdatei ; NOLIST ;List-Output ausschalten.include "m32def.inc" ;AVR-Definitionsdatei einbinden.list ;List-Output wieder einschalten ; ; Programmspeicher (FLASH) Programmstart nach RESET ab Adr. x ; CSEG ;was ab hier folgt kommt in den FLASH-Speicher.ORG x ;Programm beginnt an der FLASH-Adresse x RESET: rjmp INIT ;springe nach INIT (ueberspringe ISR Vektoren) ; ; Initialisierungen und eigene Definitionen ; ORG INT_VECTORS_SIZE ;Platz fuer ISR Vektoren lassen INIT:.DEF Zero = r5 ;Register wird zum Rechnen benoetigt clr r5 ;und mit Null belegt.def Tmp = r6 ;Register 6 dient als erster Zwischenspeicher.DEF Tmp2 = r7 ;Register 7 dient als zweiter Zwischenspeicher 2 C A/D- und D/A-Wandler

31 .DEF.DEF.DEF Cnt = r8 WL = r24 WH = r25 23 ;Register 8 dient als Zaehler ;Register 24 und 25 dienen als universelles ;Doppelregister W und zur Parameteruebergabe ;ADC initialisieren Tmp,b ;REFS = AVCC als Referenzspannung ADMUX,Tmp ;ADLAR = linksbuendig (obere 8 Bit in ADCH) ;MUX = unsymetrisch PA (ADC) Tmp,b ;ADEN = (ADC einschalten) ADCSRA,Tmp ;ADPS = (6MHz/28 = 25kHz) ;andere Bits per default = ;PORTC (8 Bit) als Ausgang ser Tmp ;DDRC = b DDRC,Tmp ; ; Hauptprogramm ; MAIN: sbi ADCSRA,ADSC ;eine AD-Wandlung ausloesen LOOP: sbic ADCSRA,ADSC ;Polling bis Wandlung fertig rjmp LOOP in Tmp,ADCH ;oberste 8 Bit einlesen und ausgeben PORTC,Tmp rjmp MAIN ;Endlosschleife ; EXIT ;Ende des Quelltextes C a) Zeichne das dem Programmbeispiel entsprechende Flussdiagramm. b) Teste das Programm mit einer variablen Spannungsquelle ( 5 V). Speichere das Programm als "C_adc_single_conversion_.asm". c) Teste eine Variante mit der Abfrage des ADIF Flag. Speichere das Programm als "C_adc_single_conversion_2.asm". Free Running Mode Der Free Running Mode unterscheidet sich zum einfachen Polling mit ADIF dadurch, dass die Wandlung nur einmalig eingeleitet wird. Das Ende einer Wandlung startet automatisch die nächste Wandlung. Dadurch wird um ein Takt schneller gewandelt, da der Vorteiler nicht zurückgesetzt werden muss (siehe Zeitdiagramme im Datenblatt). Bei der Initialisierung muss das ADATE Bit (ADc Auto Trigger Enable) gesetzt werden und der Free Running Mode im SFIOR Register gewählt werden. Programmbeispiel (Auszug): ;ADC initialisieren Tmp,b ;REFS = AVCC als Referenzspannung ADMUX,Tmp ;ADLAR = linksb. (obere 8 Bit in ADCH) ;MUX = unsymetrisch PA (ADC) Tmp,b ;ADEN = (ADC einschalten) ADCSRA,Tmp ;ADATE = (Auto Trigger Modus ein) ;ADPS = (6MHz/28 = 25kHz) ;andere Bits per default = in Tmp,SFIOR ;ADTS = free running mode andi Tmp,b SFIOR,Tmp ;PORTC (8 Bit) als Ausgang ser Tmp ;DDRC = b DDRC,Tmp C A/D- und D/A-Wandler 2

32 23 ; ; Hauptprogramm ; MAIN: sbi ADCSRA,ADSC ;AD-Wandlung ausloesen fuer free running mode ;einmaliger Vorgang LOOP: sbis ADCSRA,ADIF ;Polling ob Wandlung fertig rjmp LOOP in Tmp,ADCH ;oberste 8 Bit einlesen und ausgeben sbi ADCSRA,ADIF ;ADC Interrupt Flag manuell loeschen (mit!) PORTC,Tmp rjmp LOOP ;Endlosschleife C2 a) Teste das obige Programm im Free Running Mode. Speichere das Programm als "C2_adc_free_running_.asm". b) Es soll mit Hilfe des Oszilloskop die Wandlungszeit bei allen drei Programmen ermittelt werden. Dazu wird die analoge Eingangsspannung auf Minimum ( V) eingestellt und das Oszilloskop an Pin PC angeschlossen. Hinter der Ausgabe in den Programmen wird folgende Zeile eingefügt: sbi PORTC,. Bestimme jetzt aus dem Abstand der Impulse die Wandlungszeiten. Notiere und kommentiere die Ergebnisse. A/D-Wandlung mittels Interrupt (Auto Trigger) Bei eingeschaltetem Auto Trigger, kann eine von acht Interrupt Quellen (Trigger Quellen) eine Wandlung auslösen. Der A/D Wandler startet eine Wandlung, wenn eine positive Flanke der Interrupt Quelle erkannt wird. Die Interrupt Quelle wird mit drei Bit (ADTS ADTS2) im SFIOR Register ausgewählt. Zusätzlich zu den Initialisierungen beim Polling muss der Interruptvektor initialisiert werden (ADCCaddr), der Auto Trigger Modus muss eingeschaltet werden (ADATE im SF Register ADCSRA) und die Interrupt Quelle muss im SFIOR ausgewählt werden (ADTS ADTS2). Der A/D Wandler Interrupt muss erlaubt sein (ADIE im SF Register ADCSRA) und Interrupts müssen global zugelassen sein (I im Statusregister SREG). Free Running Mode Ein Spezialfall ist der Free Running Mode. Hierbei wird kontinuierlich gewandelt. Wurde das Resultat der Wandlung im Datenregister abgelegt, so wird gleich die nächste Wandlung gestartet. Dies geschieht durch die positive Flanke des Interrupt des A/D Wandlers selbst. Die Wandlung muss nur einmalig mit dem Bit ADSC gestartet werden. Der Free Running Mode wird im SFIOR aktiviert mit ADTS = b. Die gleiche Aufgabe wie oben soll nun im Free Running Mode mit Hilfe eines Interrupts programmiert werden. Programmbeispiel (Auszug): ; ; Sprungadressen fuer die Interrupts organisieren (ISR VECTORS) 22 C A/D- und D/A-Wandler

33 23 ; ;Vektortabelle (im Flash-Speicher).ORG ADCCaddr ;interner Vektor fuer ADCC (alt.:.org x2) ;A/D-Wandlung vollstaendig ADC complete rjmp ISR_AD ;Springe zur ISR von ADCC ; ; Initialisierungen und eigene Definitionen ; ORG INT_VECTORS_SIZE ;Platz fuer ISR Vektoren lassen INIT:.DEF Zero = r5 ;Register wird zum Rechnen benoetigt clr r5 ;und mit Null belegt.def Tmp = r6 ;Register 6 dient als erster Zwischenspeicher.DEF Tmp2 = r7 ;Register 7 dient als zweiter Zwischenspeicher.DEF Cnt = r8 ;Register 8 dient als Zaehler.DEF WL = r24 ;Register 24 und 25 dienen als universelles.def WH = r25 ;Doppelregister W und zur Parameteruebergabe... ;Stapel initialisieren (fuer Unterprogramme bzw. Interrupts) Tmp,HIGH(RAMEND) ;RAMEND (SRAM) ist in der Definitions SPH,Tmp ;datei festgelegt Tmp,LOW(RAMEND) SPL,Tmp ;ADC initialisieren Tmp,b ;REFS = AVCC als Referenzspannung ADMUX,Tmp ;ADLAR = linksb. (obere 8 Bit in ADCH) ;MUX = unsymetrisch PA (ADC) Tmp,b ;ADEN = (ADC einschalten) ADCSRA,Tmp ;ADATE = (Auto Trigger Modus ein) ;ADIE = (ADC interrupt enable) ;ADPS = (6MHz/28 = 25kHz) ;andere Bits per default = in Tmp,SFIOR ;ADTS = free running mode andi Tmp,b SFIOR,Tmp ;PORTC (8 Bit) als Ausgang ser Tmp ;DDRC = b DDRC,Tmp ;A/D-Wandlung ausloesen (einmalig) Interrupts erlauben sbi ADCSRA,ADSC ;A/D-Wandlung ausloesen fuer free running mode sei ;globales Interrupt-Flag setzen (Int. erlauben) ; ; Hauptprogramm ; MAIN: rjmp MAIN ; ; Unterprogramme und Interrupt-Behandlungsrinen ; ; Interrupt-Behandlungsrine ADC ISR_AD: push r6 ;benutzte Reg. retten (r6 = Zwischenspeicher) in r6,sreg ;Statusregister einlesen push r6 ;Statusregister retten in rcall r6,adch PORTC,r6 Ws ;oberste 8 Bit einlesen und ausgeben pop pop reti r6 SREG,r6 r6 ;Werte der geretteten Register wieder;herstellen C A/D- und D/A-Wandler ;Anzeige * pro Sekunde ;Rücksprung ins Hauptprogramm aus einer ;Interrupt-Behandlungsrine 23

34 C3 23 a) Zeichne das dem Programmbeispiel entsprechende Flussdiagramm. b) Teste das Programm mit einer variablen Spannungsquelle ( 5 V). Speichere das Programm als "C3_adc_int_free_running_.asm". Wandlung auslösen mit dem externen Interrupt Bei diesem Fall handelt es sich auch um einen Spezialfall, da gegenüber den anderen sechs Fällen hier kein echter zweiter Interrupt generiert werden muss. Bereits die Initialisierung des SF Register MCUCR bewirkt, dass das Interrupt Flag (INTF, INTF oder INTF2) beim Auftreten einer Flanke am entsprechenden Pin gesetzt wird. Das externe Interrupt Flag löst dann eine ADC Wandlung aus. Wurde der ADC Interrupt erlaubt, wird dann nach der Wandlung ein ADC Interrupt ausgelöst.!! Zum Nutzen des externen Interrupt als Triggerquelle muss nur im SF Register MCUCR festgelegt werden mit welcher Flanke gearbeitet wird! Die Triggerquelle INT wird im SFIOR aktiviert mit ADTS = b. Da hier kein realer externer Interrupt auftritt, wird auch das Flag INTF nicht automatisch gelöscht. Dies muss manuell durch Schreiben einer Eins in der ADC ISR geschehen. Eine steigende Flanke am Pin INT (PD2) soll eine Wandlung auslösen. Die Spannung am unsymmetrischen Eingang PA wird als 8 Bit Wert über Port C ausgegeben. Programmbeispiel (Auszug): ; ; Sprungadressen fuer die Interrupts organisieren (ISR VECTORS) ; ;Vektortabelle (im Flash-Speicher).ORG ADCCaddr ;interner Vektor fuer ADCC (alt.:.org x2) ;AD-Wandlung vollstaendig ADC complete rjmp ISR_AD ;Springe zur ISR von ADCC ; ; Initialisierungen und eigene Definitionen ; ORG INT_VECTORS_SIZE ;Platz fuer ISR Vektoren lassen INIT:.DEF Zero = r5 ;Register wird zum Rechnen benoetigt clr r5 ;und mit Null belegt.def Tmp = r6 ;Register 6 dient als erster Zwischenspeicher.DEF Tmp2 = r7 ;Register 7 dient als zweiter Zwischenspeicher.DEF Cnt = r8 ;Register 8 dient als Zaehler.DEF WL = r24 ;Register 24 und 25 dienen als universelles.def WH = r25 ;Doppelregister W und zur Parameteruebergabe ;Stapel initialisieren (fuer Unterprogramme bzw. Interrupts) Tmp,LOW(RAMEND) ;RAMEND (SRAM) ist in der DefinitionsSPL,Tmp ;datei festgelegt Tmp,HIGH(RAMEND) SPH,Tmp ;ADC initialisieren Tmp,b ;REFS = AVCC als Referenzspannung ADMUX,Tmp ;ADLAR = linksbuendig (obere 8 Bit in ADCH) 24 C A/D- und D/A-Wandler

35 in andi ori 23 ;MUX = unsymetrisch PA (ADC) Tmp,b ;ADEN = (ADC einschalten) ADCSRA,Tmp ;ADATE = (Auto Trigger Modus aktivieren) ;ADIE = (ADC interrupt enable) ;ADPS = (6MHz/28 = 25kHz) ;andere Bits per default = Tmp,SFIOR ;ADTS = external interrupt request Tmp,b Tmp,b SFIOR,Tmp ;INT steigende Flanke initialisieren ;(INT muss nicht gesondert ueber GICR aktiviert werden!!) in Tmp,MCUCR ;steigende Flanke von INT initialisieren ori Tmp,b MCUCR,Tmp ;PORTC (8 Bit) als Ausgang ser Tmp ;DDRC = b DDRC,Tmp ;Interrupts global erlauben sei ;globales Interrupt-Flag setzen (Int. erlauben) ; ; Hauptprogramm ; MAIN: rjmp MAIN ;Endlosschleife ; ; Unterprogramme und Interrupt-Behandlungsrinen ; ; Interrupt-Behandlungsrine ADC ISR_AD: push r6 ;benutzte Reg. retten (r6 = Zwischenspeicher) in r6,sreg ;Statusregister einlesen push r6 ;Statusregister retten in r6,adch PORTC,r6 in ori r6,gifr ;INTF-Bit im GIFR manuell loeschen, (mit!) r6,b ;damit erneutes Interrupt erkannt wird! GIFR,r6 pop pop reti r6 SREG,r6 r6 C4 ;oberste 8 Bit einlesen und ausgeben ;Werte der geretteten Register wieder;herstellen ;Rücksprung ins Hauptprogramm aus einer ;Interrupt-Behandlungsrine a) Zeichne das dem Programmbeispiel entsprechende Flussdiagramm. b) Teste das Programm mit einer variablen Spannungsquelle ( 5 V) Speichere das Programm als "C4_adc_int_int.asm".. Wandlung auslösen mit dem Timer Hier soll als Beispiel noch das Auslösen eines Interrupt im Millisekundenrythmus mit dem Timer demonstriert werden. Auf dieses Beispiel kann man zurückkommen, wenn man das Kapitel zum Timer durchgearbeitet hat. Es werden dazu Timer und Timer 2 im CTC Modus verwendet. Mit einem Quarz von 6 MHz und einem Teiler von 64 benötigt man 25 Zählschritte um eine Interruptfrequenz von Hz (t = ms) zu erhalten. C A/D- und D/A-Wandler 25

36 23 Weitere Aufgaben C5 Erweitere das erste Programm um eine Dual BCD Wandlung. Dazu kann das unten stehende Unterprogramm zum Teilen durch und durch verwendet werden. Der Spannungswert soll als Vielfaches von mv an den drei untersten Stellen des Siebensegment Displays ausgegeben werden. Der Einfachheit halber wird der gewandelte 8 Bit Wert ( 255) mit Zwei multipliziert (Befehl lsl). Der dabei gemachte Fehler ( 5 statt 5) liegt nur bei zwei Prozent. Teste das Programm mit einer variablen Spannungsquelle ( 5 V). Speichere das Programm als "C5_adc_voltmeter.asm". ; ; Ganzzahvision 2Byte / Byte ; ;Dividend: r,r (LSB) ;Divisor r2 ;Schleifenzähler r6 ;Resultat Rest in r + Quotient in r ;Achtung Ueberlauf wenn obere n Bit des Dividenden groesser gleich n Bit Divisor DIV2: push in push r6 r6,sreg r6 r6,8 ;Schleifenzaehler init. (Bitzahl Quotient) DIV2A: lsl rol brcs cp brlo r r DIV2B r,r2 DIV2C ;Rotiere Dividend Stelle nach links ;rechts wird Null reingeschoben ;Falls Carry muss Subtraktion erfolgen! ;Subtraktion testen ;Ueberspringe Subtraktion, wenn kleiner DIV2B: sub inc r,r2 r ;Subtraktion durchfuehren ;Bit im Dividenden setzen DIV2C: dec brne r6 DIV2A ;Schleifenzaehler dekrementieren pop pop ret r6 SREG,r6 r6 Bemerkung: Zum Erhöhen der Genauigkeit kann noch die oberste Stelle ( 5) mit 2 multipliziert werden (Befehl lsl) und dann vom gesamten Wert subtrahiert werden. C6 26 Konfiguriere und programmiere den ATmega32A so, dass sein A/D Wandler im Free Running Mode mit Interrupt arbeitet. Das Assemblerprogramm soll so aufgebaut sein, dass die Spannung an PA (ADC) gemessen und ihre Höhe über eine Bargraph Anzeige (Balkenanzeige) ausgegeben wird. Die Bargraph Anzeige soll mit Hilfe von den 8 LEDs an Port C gebildet werden. Dazu ist es notwendig die Spannung in einen 3 Bit Wert umzuwandeln (einfach die hochwertigsten drei Bits verwenden!). Benutze zur Programmierung der Bargraph Anzeige eine Tabelle. Schließe an PA ein Potentiometer an und überprüfe die Funktionsweise C A/D- und D/A-Wandler

37 23 deines Programms. Bei minimaler Spannung (linker Anschlag) darf nur eine LED leuchten, bei maximaler Spannung (rechter Anschlag) sollen alle LEDs leuchten. Speichere das Programm als "C6_adc_bargraph.asm". C7 Entwickle für den ATmega32A ein Assemblerprogramm, das an PA2 (ADC2) die Spannung misst, wenn an INT eine fallende Signalflanke erscheint. Der umgewandelte Spannungswert ( Bit) soll mit Hilfe eines Unterprogramms in ein String (mit ASCII Zeichen) umgewandelt werden und dann über die serielle Schnittstelle mit 92 Baud (8N) zu einem PC gesendet werden. Das Unterprogramms mit den symbolischen Namen B6_STR wandelt eine 6 Bit Zahl in einen String mit einer festen Länge von 5 ASCII Zeichen ( 65536). Speichere das Programm als " C7_adc_to_EIA232.asm". C8 Ähnliche Aufgabe wie die vorige Aufgabe, nun soll der String allerdings in mittels Interrupt über die serielle Schnittstelle versendet werden. Speichere das Programm als "C8_adc_to_EIA232_2.asm". C9 Im Single Conversion Mode soll abwechselnd die Spannung an PA (ADC) und an PA (ADC) in einen 8 Bit Wert umgewandelt und über Port C (für ADC) bzw. Port B (für ADC) ausgegeben werden. Entwickle das hierzu notwendige Assemblerprogramm für den ATmega32A. Speichere das Programm als "C9_adc_dual_conversion.asm". CA a) Baue das folgende Modul um Sprache zu digitalisieren. Das Signal eines Elektret Kondensatormikrofons wird mittels eines OPV als Differenz verstärker in eine Spannung zwischen und 5 V umgesetzt. Es wird ein sogenannter rail to rail OPV verwendet, der den gesamten Bereich seiner Versorgungsspannung nutzen kann. b) Beschreibe ausführlich die Funktionsweise der Schaltung (nutze die Formeln des OPV als Differenzverstärker!) c) Teste die Schaltung ausgiebig mit den obigen Programmen. Das Elektretmikrofon ist ein Kondensatormikrofon mit einer Elektretfolie. Meist befindet sich in der Mikrofonkapsel noch ein Mikrofonverstärker (FET). Zum Betrieb reicht eine Spannung von ungefähr,5 Volt bei ma. Das Elektretmikrofon hat Kugelcharakteristik und deckt den Frequenzbereich von 2 Hz bis 2 khz ab. Wegen seiner kompakten Bauweise wird er praktisch in allen mobilen Geräten eingesetzt. C A/D- und D/A-Wandler 27

38 23 D/A-Wandler Damit digitale Informationen mittels D/A Wandlern umgesetzt werden können müssen sie in einem gewichteten Code vorliegen. Der Dualcode (binäres Zahlensystem) ist ein solch gewichteter Code (2 =, 2 = 2, 22= 4, 23 = 8...). Umso mehr Bits verwendet werden umso höher ist die Auflösung des D/A Wandlers. Mit 8 Bits kann ein analoges Signal mit 256 unterschiedlichen Spannungswerten erzeugt werden. Umso höher die Auflösung, umso kleiner wird die Treppenstufung des analogen Signals. Das R-2R-Netzwerk Ein D/A Wandler lässt sich sehr einfach mit einem sogenannten R 2R Netzwerk realisieren. Ein solches Netzwerk besitzt nur Widerstände mit den Werten R und 2R. Im folgenden soll ein solches Netzwerk für zwei Stellen des Dualcodes untersucht werden: Fall: PB = und PB = Die Ausgangsspannung wird in diesem ersten Fall V sein, da keine Spannung anliegt. 28 C A/D- und D/A-Wandler

39 23 2 Fall: PB = und PB = An PB = liegt die Betriebsspannung des Controllers an. Es ergibt sich folgende Schaltung: Die Parallelschaltung von 3R (R+2R) mit 2R ergibt einen Gesamtwiderstand von 6/5 R. Auf diesen fallen in der Reihenschaltung mit 2R = /5 R also 6 Anteile der Spannung von 6. Davon tragen dann 2/3 zur Ausgangsspannung bei. Die Ausgangsspannung beträgt ¼ der Gesamtspannung. 3 Fall: PB = und PB = Die Spannung wird geteilt und die Hälfte der Betriebsspannung liegt am Ausgang. 4 Fall: PB = und PB = Die Spannung teilt sich ähnlich wie im 2. Fall auf. Es liegen dann ¾ der Betriebsspannung am Ausgang an. C A/D- und D/A-Wandler 29

40 23 Damit ergibt sich folgende Tabelle: Fall Dezimalwert PB (2) PB (2) UA 2 ¼ VCC 3 2 ½ VCC 4 3 ¾ VCC Jedes Bit trägt seinen Teil zur resultierenden Ausgangsspannung bei! Die höchste Stelle PB (2) steuert die Hälfte der Betriebsspannung bei. Die niedrigere Stelle ein Viertel. Erweitert man das Netzwerk zum Beispiel auf drei Bit, so ergibt sich folgende Tabelle: Fall Dezimalwert PB2 (22) PB (2) PB (2) UA 2 /8 VCC 3 2 /4 VCC 4 3 3/8 VCC 5 4 /2 VCC 6 5 5/8 VCC 7 6 3/4 VCC 8 7 7/8 VCC Eine dritte Stelle wird also ein Achtel der Betriebsspannung beisteuern. Ein solches Netzwerk lässt sich beliebig ausbauen. Die kleinste Änderung der Ausgangsspannung lässt sich dann mit Hilfe der folgenden Gleichung berechnen : 3 C A/D- und D/A-Wandler

41 U Amin= 23 V CC 2n Ein solches R 2R Netzwerkes hat einen konstanten Innenwiderstand R i = R, egal für wie viele Stellen es ausgelegt wurde. Eine Belastung des Ausgangs bewirkt also keine Verfälschung des Resultats. Nur die maximal abgreifbare Spannung sinkt. Um in der Praxis ein R 2R Netzwerk zu bauen braucht man präzise Widerstandswerte (E96 Reihe, %). Mit einer Parallelschaltung kann der Widerstandswert halbiert werden. Um die Ausgänge des Controllers nicht zu sehr zu belasten, sollen die Widerstandswerte nicht kleiner als kω sein. Ein nachgeschalteter Operationsverstärker minimiert die Belastung des Netzwerks und liefert den nötigen Strom. Um den ganzen Spannungsbereich zu nutzen (GND VCC) wird ein rail to rail OPV einzusetzen, der bis zu den Grenzen seiner Betriebsspannung arbeiten kann. Der nachgeschaltete Verstärker (LM386) erlaubt es einen Lautsprecher anzuschließen. Bemerkungen: Natürlich gibt es Digital Analog Wandler mit R 2R Netzwerke auch in integrierter Form. Eine andere und einfachere Möglichkeit ein analoges Signal zu erzeugen ist die Pulsweitenmodulation (siehe Timer). Weitere Aufgaben CB Berechne die kleinste Spannungsänderung für den obigen 8 Bit D/A Wandler. In welcher Schaltung wird der Operationsverstärker betrieben? Ermittle die Verstärkung und die Funktion Bass Boost (J3) aus dem Datenblatt des LM386. C A/D- und D/A-Wandler 3

42 CC 23 Programmiere einen kleinen Funktionsgenerator. Über zwei Schalter S und S soll die Wellenform ausgewählt werden können (Sinus, Dreieck, Sägezahn und Rechteck). Der Sinus wird mit der folgenden Tabelle erzeugt (Datei auf weigu.lu/a/asm). Sinus, Dreieck und Sägezahn werden mit der höchstmöglichen Frequenz ausgegeben. Beim Rechteck kann eine beliebige Zeitschleife eingefügt werden. a) Zeichne das dem Programmbeispiel entsprechende Flussdiagramm. b) Schreibe das Assemblerprogramm und speichere es unter dem Namen "CC_DAC_wavegen.asm". c) Ermittle mit Hilfe eines Oszilloskops oder eines Frequenzzählers die maximalen Frequenzen für Sinus, Dreieck und Sägezahn. d) Die Ausgabefrequenz aller Wellenformen soll nun auf 44 Hz verringert werden. Bestimme die nötige Zeitverzögerungen zwischen zwei Ausgaben und erweitere entsprechend dein Programm. Sinustabelle:.DB.DB.DB.DB.DB.DB.DB.DB.DB.DB.DB.DB.DB.DB.DB.DB.DB.DB.DB.DB.DB.DB.DB.DB.DB.DB.DB.DB.DB.DB.DB.DB CD 32 28, 3, 34, 37, 4, 43, 46, 52, 55, 58, 62, 65, 67, 7, 76, 79, 82, 85, 88, 9, 93, 98, 2, 23, 26, 28, 2, 23, 28, 22, 222, 224, 226, 228, 23, 234, 235, 237, 238, 24, 24, 243, 245, 246, 248, 249, 25, 25, 25, 253, 253, 254, 254, 254, 255, 255, 255, 255, 255, 255, 254, 254, 254, 253, 252, 25, 25, 25, 249, 248, 245, 244, 243, 24, 24, 238, 237, 234, 232, 23, 228, 226, 224, 222, 28, 25, 23, 2, 28, 26, 23, 98, 96, 93, 9, 88, 85, 82, 76, 73, 7, 67, 65, 62, 58, 52, 49, 46, 43, 4, 37, 34, 28, 24, 2, 8, 5, 2, 9, 3,, 97, 93, 9, 88, 85, 82 79, 76, 73, 7, 67, 65, 62, 59 57, 54, 52, 49, 47, 44, 42, 4 37, 35, 33, 3, 29, 27, 25, 23 2, 2, 8, 7, 5, 4, 2,, 9, 7, 6, 5, 5, 4, 3 2, 2,,,,,,,,,,,,, 2 2, 3, 4, 5, 5, 6, 7, 9,, 2, 4, 5, 7, 8, 2 2, 23, 25, 27, 29, 3, 33, 35 37, 4, 42, 44, 47, 49, 52, 54 57, 59, 62, 65, 67, 7, 73, 76 79, 82, 85, 88, 9, 93, 97, 3, 6, 9, 2, 5, 8, 2, Für Fortgeschrittene: Die zwölf Tasten einer Matrixtastatur sollen dazu dienen Musik zu erzeugen. (siehe Tabelle). Erweitere das obige Programm, so dass die erwünschten Töne in einer beliebigen Wellenform anhand der Tasten erzeugt werden können. Zur Abfrage der Tastatur kann das Unterprogramm " SR_3x4_KEYPAD.asm" C A/D- und D/A-Wandler

43 23 verwendet werden (siehe Aufgabe B5D). Schreibe das Assemblerprogramm und speichere es unter dem Namen "BD_DAC_tonegen.asm". f (Hz) f (Hz) Do (C) Re (D) Mi (E) Fa (F) Sol (G) La (A) 22 Si (H, B) 247 Tipps: Die Ausgabe aller Wellenform aus 256 Byte großen Flash Tabellen erleichtert die Aufgabe. Es muss ein Lautsprecher verwendet werden, der diese tiefen Töne (Sinus hat keine Oberwellen) auch ausgeben kann! CE a) Mit Hilfe des Electret Mikrofons und des A/D Wandlers sollen jetzt Signale digitalisiert werden, und dann gleich wieder mit dem D/A/Wandler über den Lautsprecher ausgegeben werden. Schreibe das Assemblerprogramm und speichere es unter dem Namen "BE_ADC_DAC.asm". b) Vervollständige das folgende Programm mit den entsprechenden Initialisierungen und beschreibe ausführlich seine Funktionsweise. Speichere es unter dem Namen "BE_ADC_DAC_delay.asm". ; ; Organisation des Datenspeichers (SRAM) ; DSEG ;was ab hier folgt kommt in den SRAM-Speicher TAB:.BYTE 8 ;8 Byte grosse Tabelle im Datensegment MAIN: sbi ADCSRA,ADSC LOOP: XL,LOW(TAB) XH,HIGH(TAB) WL,LOW(8) WH,HIGH(8) LOOP2: sbis rjmp in sbi st ADCSRA,ADIF LOOP2 Tmp,ADCH ADCSRA,ADIF X+,Tmp sbiw breq WL, LOOP ld rjmp Tmp,X PORTB,Tmp LOOP2 C A/D- und D/A-Wandler ;AD-Wandlung ausloesen fuer free running mode ;einmaliger Vorgang ;Polling bis Wandlung fertig ;oberste 8 Bit einlesen und ausgeben ;ADC Interrupt Flag manuell loeschen (mit!) ;Endlosschleife 33

44 34 23 C A/D- und D/A-Wandler

45 23 C2 Timer Einführung Die drei Timer des ATmega32 bieten sehr viele unterschiedliche Betriebsarten. Im folgenden Kapitel sollen nur einige der Betriebsarten kennen gelernt werden. Was ist ein Timer? Ein Timerbaustein oder eine Timereinheit ist ein dualer Aufwärtszähler mit der Schrittweite Eins. Er ist zu jeder Zeit lese und schreibbar und kann vielfältig als Zeitgeber (timer) oder Zähler (counter) eingesetzt werden. Als Timer wird der Systemtakt zum Zählen verwendet. Mittels Vorteiler kann dieser falls nötig verringert werden. Als Counter erhöhen externe Flanken am Timereingang (z.b. T) den Zählstand. Der Timer ist eigenständig und läuft immer unabhängig vom Controllerkern und Programm. Nur mit ihr kann man zum Beispiel zeitliche Abstände präzise bestimmen oder mittels Interrupt in genauen Zeitabständen Ereignisse auslösen. Im ATmega32 bzw. ATmega8 sind drei unabhängige Timereinheiten mit teils unterschiedlichen Eigenschaften verfügbar. Was kann man mit Timern tun? Timer kann man einsetzen um Zeitverzögerungen zu bewirken (anstatt von Zeitschleifen), als Frequenzgenerator oder zähler ( messer), als Ereigniszähler für externe Signale, um Zeitabstände externer Signale zu messen, als Zeitgeber (Uhr), oder zur Pulsweitenmodulation zum Beispiel zum Ansteuern von Motoren, Der ATmega32 enthält drei Universal Timer mit folgenden Eigenschaften: Timer/Counter : 8 Bit ( 255) Aufwärtszähler mit externem oder internem Takt mit Vorteiler ( Bit) Überlauf Interrupt (TV) und Vergleichswertinterrupt (OCF) Frequenzgenerator Externer Ereigniszähler Pulsweitenmodulation PWM (fast PWM und phase correct PWM) Vergleichswertauswertung mit der Möglichkeit den Timer zurückzusetzen (clear timer on compare match, CTC Modus) Der Einfachheit halber wird im Text nicht immer zwischen Timer und Counter unterschieden. Die Bezeichnung "Timer" wird allgemein für die Timereinheit verwendet. C2 Timer 35

46 23 Timer/Counter : 6 Bit ( 65535) zusätzlich zu Timer : Zwei unabhängige Vergleichswertauswertungen Input Capture Einheit (mit Rauschunterdrückung). Sie ermöglicht die Zeitmessung externer Signale (Stoppuhr) 4 Interruptquellen (Überlauf (TV), 2 mal Vergleichswert (OCFA und OCFB) und Input Capture (ICF)) Timer/Counter 2: 8 Bit ( 255) ähnlich Timer, allerdings ohne externen Ereigniszähler! zusätzlich zu Timer : Timer 2 kann als Echtzeituhr (real time clock, RTC) verwendet werden Grundsätzliche Funktionsweise des Timers Ein Timer (Zeitgeber) oder Counter (Zähler) wird gesetzt (initialisiert) und gestartet. Danach läuft2 (zählt) er unabhängig und unbeeinflusst vom Controllerkern und der anderen Peripherie bis man ihn stoppt. Hat der Timer seinen Höchstwert (255 bzw für 8 und 6 Bit) erreicht, so beginnt er wieder bei Null. Bei diesem Überlauf, oder bei einem anderen vorgegebenem Wert wird ein Flag gesetzt, das durch Polling abgefragt werden kann, oder es wird, was meist sinnvoller ist, ein Interrupt ausgelöst. Man kann den Timer auch beim Erreichen eines Überlaufs oder eines Vergleichswertes ein Signal an einem Pin ausgeben lassen, oder zum Beispiel die Zählrichtung umkehren. Als Takt kann der AVR Takt verwendet werden. Ein Vorteiler ermöglicht die Änderung der Taktfrequenz. Es kann aber auch ein externer Takt verwendet werden. Zum Kennenlernen wird in den folgenden Kapiteln der 8 Bit Timer verwendet. Alle Beispiele lassen sich auch auf die beiden anderen Timer übertragen indem man die Bezeichnung der Register anpasst. Der Timer als Zeitgeber Überlauf mit dem Timer Nach der Aktivierung des Timers beginnt dieser gleich mit dem Zählen. Bei jedem Überlauf des Timers wird automatisch das Flag TV im SF Register TIFR gesetzt. Bei Timer also jedes Mal wenn dieser von (Default Startwert nach Reset) bis 255 gezählt hat (nach 256 Zählschritten). Der Timer soll nun bei jedem Überlauf periodisch einen Interrupt auslösen (Timer Overflow Interrupt). 2 Der Timer wird automatisch inkrementiert oder dekrementiert. 36 C2 Timer

47 23 Initialisierung des Timer für den Überlauf-Interrupt Zuerst muss geklärt werden mit welcher Taktrate gezählt werden soll. Diese Einstellung erfolgt mit den Bits 2 (CS-CS2) des Timer/Counter Controll Registers TCCR. Folgende Tabelle bietet einen Überblick: Bit 2 Bit Taktquelle Bit CS2 CS CS Timer Stopp (verbraucht keinen Strom) Systemtakt (:) Systemtakt / 8 Systemtakt / 64 Systemtakt / 256 Systemtakt / 24 externer Takt: fallende Flanke an T (PB) externer Takt: steigende Flanke an T (PB) Bemerkung: Durch Setzen der drei Bits CS-CS2 auf einen Wert größer als Null wird der Timerbaustein eingeschaltet. Er beginnt nach dieser Initialisierung gleich mit dem Zählen ab Null, wenn kein Wert voreingestellt wurde. Die Frequenz errechnet sich mit: f= Systemtakt Vorteiler Zählschritte Beispiel: Als Vorteiler wurde 24 gewählt bei einer Quarzfrequenz von 6 MHz. Damit ergibt sich eine Zählfrequenz des Timers von 6 MHz / 24 = 5625 Hz. Da jedes Interrupt nach 256 Zählschritten erfolgt, wird der Interrupt also mit einer Frequenz von 5625 / 256 = 6, Hz aufgerufen. Hinweis: Die obige Tabelle gilt ähnlich für Timer. Für Timer 2 ist sie allerdings nicht gültig da dieser keine externen Signale verarbeiten kann. Dafür kann aber zusätzlich ein Vorteiler von 32 und 28 eingestellt werden (siehe Datenblatt). C2 Timer 37

48 23 Damit das Interrupt ausgelöst wird müssen drei Bedingungen erfüllt sein:. Das Flag TV im Timer Interrupt Flag Register TIFR muss Eins sein (TV = ). Dies wird automatisch gesetzt wenn ein Überlauf erfolgt! 2. Der TO Interrupt muss erlaubt sein (TOIE = im Register TIMSK). 3. Interrupts müssen global freigegeben sein (I in SREG = mit "sei") Um den Timer als Zeitgeber im Interrupt Betrieb zu benutzen, müssen außer der üblichen Initialisierung also noch folgende Schritte erledigt werden: Sprungadresse für den Interrupt organisieren (aus der Definitionsdatei: OVFaddr = x6) und der Interruptrine einen Namen zuweisen (z.b. INTT). ; ; Sprungadressen fuer die Interrupts organisieren (ISR VECTORS) ; ;Vektortabelle (im Flash-Speicher).ORG OVFaddr ;Vektor Nr 2 (Adresse x6) fuer rjmp INTT ;INTT (Timer-Overflow Interrupt) ; ; Initialisierungen und eigene Definitionen ; ORG INT_VECTORS_SIZE ;Platz fuer ISR Vektoren lassen INIT: 38 Initialisierung des Stapels nicht vergessen! Die Timereinheit mit den Flags CS-CS2 im SF Register TCCR einschalten. Gleichzeitig wird der Vorteiler festgelegt. Da die oberen fünf Bit dieses Registers nur für die PWM Steuerung zuständig sind, und per default Null sind, muss hier nicht zwingend eine Maskierung eingesetzt werden C2 Timer

49 23 ;Timer einschalten und Vorteiler festlegen Tmp,x2 ;TCCR = b (Systemtakt/8) TCCR,Tmp ; TIE im SF Register TIMSK mittels Maskierung setzen ;Timer Interrupt erlauben in Tmp,TIMSK ; ori Tmp,x ;Mit einer ODER-Maskierung (b) ;Bit (TOIE) im TIMSK-Register auf eins setzen TIMSK,Tmp ;Timer -Overflow-Interrupt ein Interrupts global freigeben (sind bei Reset des Controllers per default gesperrt) ;Interrupts freigeben sei ;Interrupts global freigeben (I-Bit im SREG) Interruptrine schreiben. Innerhalb der Rine müssen die Flags (SREG) und alle!, innerhalb der Rine benutzten Register, auf den Stapel gerettet werden. C2 Es soll am Pin PA mittels Timer Interrupt ein Rechtecksignal durch Toggeln des Ausgangs erzeugt werden. Es wird ein Frequenzzähler oder Oszilloskop an das Pin angeschlossen. Um zu zeigen, dass die CPU (das Hauptprogramm) dadurch nicht belastet wird, soll das Hauptprogramm im Sekundentakt von Null an aufwärts zählen und den Zählerstand am Sieben Segment Display ausgeben. Der Code für das Hauptprogramm ist vorgegeben (Unterprogrammbibliotheken für Display und Zeitschleifen müssen eingebunden werden und die entsprechenden Ports initialisiert werden!): ; ; Hauptprogramm ; MAIN: rcall NDISP ;Darstellungsunterprogramm aufrufen adiw YL, ;Zaehler inkrementieren rjmp MAIN ;Weiter a) Errechne die zu erwartende Frequenz, wenn bei der Initialisierung des Timers der Vorteiler auf 256 eingestellt wird (Quarzfrequenz 6 MHz). b) Zeichne das Flussdiagramm und erstelle das Programm. Nenne das Programm "C2_8bit_timer_.asm" c) Überprüfe die Frequenz mittels Zähler oder Oszilloskop. Überlauf mit dem Timer mit Voreinstellung Das Timerzählregister TCNT kann nicht nur ausgelesen werden, sondern auch beschrieben werden. Dies ermöglicht es die Zählschritte bis zum Überlauf zu verringern. Wird das Register zum Beispiel mit dem Startwert 2 voreingestellt, so zählt der Timer von 2 bis 255, also nur 56 Schritte. Soll jetzt, um zum Beispiel eine höhere Frequenz zu erzeugen, der Timer nach jedem Überlauf mit einem festen Startwert versehen werden, so muss das gleich am Anfang der Interruptrine (vor den Push Befehlen!) geschehen um die Genauigkeit des Timers nicht zu gefährden. Am einfachsten wird der Startwert in einer globalen Variablen bei der Initialisierung festgelegt. C2 Timer 39

50 23 C2 Ändere das Programm C2 so um, dass der Timer immer mit dem Startwert 5 beginnt. Nenne das neue Programm "C2_8bit_timer_2.asm". a) Ermittle rechnerisch und per Zähler (Oszilloskop) die erzeugte Frequenz. b) Errechne den Startwert, der benötigt wird um eine Frequenz von 44 Hz (Kammereton A (LA)) zu erzeugen. Überprüfe das Ergebnis. C22 Ändere das Programm C2 so um, dass im Hauptprogramm im Sekundenrythmus der Startwert des Timers ab Null jeweils um 5 erhöht wird. Nenne das neue Programm "C22_8bit_timer_3.asm". Bemerkung: Der Timer hat auch eine Funktion um Frequenzen ohne Interrupt zu erzeugen (Frequenzgenerator)! Ein fest zugeordnetes Pin (OC (PB3)) wird bei entsprechender Initialisierung getoggelt sobald ein im Output Compare Register OCR eingetragener Wert erreicht wurde (siehe PWM). Der Timer als Zähler (Counter) Über ein reserviertes Pin kann die fallende oder die steigende Flanke eines externen Signals dazu verwendet werden den Zähler zu erhöhen. So ist es möglich den Timer als Zähler externer Ereignisse einzusetzen. Timer als Zähler (Counter) Um den Timer als Zähler einzusetzen, reicht es, über die Bits CS-CS2 im Timer/Counter Control Register TCCR statt einem internen Takt einen externen Takt auszuwählen. Dabei kann die steigende Flanke oder die fallende Flanke des externen Signals zum Zählen genutzt werden. Es ist sinnvoll, da meist mit Pull Up Widerständen gearbeitet wird (negative Logik), die fallende Flanke zum Zählen zu verwenden. Das externe Signal muss an Pin T (PB) angelegt werden. C23 Ein nicht entprellter Taster soll als Signalquelle für den Zähler dienen (T als Eingang initialisieren und Pull Up einschalten!). Der Zählstand (TCNT) soll im Hauptprogramm im Sekundentakt angezeigt werden. Der Zähler ist auf den Wert 246 voreingestellt, und beim Überlauf soll eine LED (PA) umgeschaltet werden. Nenne das neue Programm "C23_8bit_counter_.asm". Pulsweitenmodulation mit dem Timer Die Leistung kann bei vielen elektrischen Geräten durch Veränderung der Spannung gesteuert werden. Es gibt aber auch Geräte wo dies nicht zufriedenstellend funktioniert, da diese Geräte zum Beispiel eine Mindestspannung zum Arbeiten benötigen (LED, Motor). Die Pulsweitenmodulation bietet hier Abhilfe und lässt sich (anders als eine variable Spannung) sehr leicht mit einem Mikrocontroller realisieren. 4 C2 Timer

51 23 Bei der Pulsweitenmodulation wird eine Rechteckspannung mit fester Frequenz verwendet, bei der der Tastgrad3 (duty cycle) verändert wird. Die Impulsweite im Verhältnis zur Periodendauer wird meist in Prozent ausgedrückt. Impulsdauer t i t Tastgrad g = i T Pausendauer t p Periodendauer T = t i t p Pulsweitenmodulation mit Timer Die Pulsweitenmodulation lässt mit dem Timer relativ einfach softwaremäßig realisieren. Bei dieser Variante mit Überlauf und Vergleichswert Interrupt kann dann jedes beliebige Ausgangspin genutzt werden. Noch einfacher geht es allerdings wenn der Timer alle Aufgaben selber übernimmt. Dieser von ATMEL genannte "Fast PWM" Modus benötigt keine Interruptrinen und schont somit die Ressourcen des Controllers. Als Ausgang muss für Timer der OC Pin (PB3) genutzt werden. Funktionsweise des "Fast PWM"-Modus: Der Timer zählt durchgehend von bis 255 und beginnt dann wieder bei (Zählregister TCNT). Ein gesamter Durchlauf entspricht der Periodendauer des PWM Signals. Die Frequenz wurde durch den Systemtakt und den Vorteiler bestimmt. 3 Oft findet man auch den Begriff "Tastverhältnis". Dieser Begriff ist allerdings nicht einheitlich definiert. Oft findet man ihn als Kehrwert des Tastgrads, manchmal ist er gleich wie der Tastgrad definiert, oder auch als Verhältnis zwischen Impuls und Pausendauer. C2 Timer 4

52 f= 23 Systemtakt Vorteiler 256 Am Ausgangspin OC liegt High Pegel an (nicht invertierender Modus). In einem zweiten Register, dem sogenannten Vergleichsregister OCR, wird ein Vergleichswert festgelegt. Erreicht der Zählwert diesen Vergleichswert, so kippt der Pegel am Ausgangspin OC auf Low Pegel. Der Zähler zählt ungerührt weiter um beim Überlauf das Ausgangspin wieder auf High Pegel zu setzen. Der Vergleichswert bestimmt den Tastgrad! Initialisierung des Timer für den "Fast-PWM"-Modus Um den "Fast PWM" Modus einzuschalten müssen die Bits WGM und WGM im Kontrollregister TCCR beide auf Eins gesetzt werden. In diesem Modus wird mit COM = und COM = (beide ebenfalls im Kontrollregister TCCR) der nicht invertierende PWM Modus ausgewählt (invertierender Modus: Modus: COM = und COM = ). Über die Bits CS-CS2 wird über den Vorteiler die Frequenz eingestellt. Das letzte freie Bit (FOC) im Register TCCR muss in diesem Modus auf Null gesetzt werden. 42 C2 Timer

53 23 Zusätzlich zur Initialisierung des Kontrollregisters TCCR muss nur noch das Pin OC (PB3) als Ausgang initialisiert werden, und ein Vergleichswert muss ins Vergleichsregister OCR Register geschrieben werden. Die ganze Initialisierung besteht zum Beispiel aus folgenden Zeilen: ;viertes Pin von Port B (PB3) als Ausgang initialisieren sbi DDRB,3 ;Ausgang ;Timer einschalten, Vorteiler festlegen und Fast PWM waehlen Tmp,x6C ;TCCR = b (Fast PWM,nicht inv., /256) TCCR,Tmp ; ;Vergleichswert fuer PWM festlegen Tmp,63 ;Vergleichswert festlegen OCR,Tmp ; C24 Die Helligkeit einer LED soll im Sekundenrhythmus erhöht werden. Dazu soll im Hauptprogramm einmal pro Sekunde der Vergleichswert ab um 5 erhöht werden. Die Siebensegmentanzeige gibt gleichzeitig den Vergleichswert aus. a) Schreibe das Programm und nenne es " C24_8bit_timer_pwm_.asm". b) Betrachte die Spannung mit einem Oszilloskop. Interessant ist auch die Ausgabe mittels Summer. c) Welchen Einfluss hat die Frequenz? Bemerkung: Im normalen Modus kann mit Hilfe des Vergleichswertregisters ein zusätzlicher Interrupt bei Übereinstimmung des Zählwertes mit dem Vergleichswert ausgelöst werden (Output Compare Match Interrupt). Im sogenannten CTC Modus (Clear Timer on Compare Match Mode) kann der Timer bei Erreichen des Vergleichswertes auch zurückgesetzt werden. Die SF-Register des Timer Das Timer/Counter Control Register TCCR Das Timer/Counter Control Register befindet sich auf der SRAM Adresse x53 (SF Register Adresse x33) und wird mit der Abkürzung "TCCR" angesprochen (Definitionsdatei). Die Befehle sbi, cbi, sbic und sbis können nicht verwendet werden. TCCR = Timer/Counter Control Register Bit TCCR x33 Startwert Read/Write FOC WGM COM COM WGM CS2 CS CS W WGMn Waveform Generation Mode C2 Timer WGM, WGM 43

54 23 Mit diesen zwei Bit wird der Operationsmodus des Timer festgelegt: WGM WGM 2 2 Modus: Normaler Modus Phasenkorrekter PWM-Modus CTC-Modus (clear timer on compare match) Fast PWM-Modus COMn Compare Match Output Mode COM, COM Mit diesen zwei Bit wird das Verhalten des Ausgangspin OC festgelegt. Je nach Modus ändert das Verhalten: COM COM 2 2 COM COM 2 2 CSn Clock Select Timer Verhalten im normalen Modus: OC abgeschaltet (normales Port-Pin) Toggele OC bei Vergleichsübereinstimmung Lösche OC bei Vergleichsübereinstimmung Setze OC bei Vergleichsübereinstimmung Verhalten im Fast-PWM Modus: OC abgeschaltet (normales Port-Pin) Reserviert nicht-invertierender Fast-PWM-Modus invertierender Fast-PWM-Modus CS2, CS, CS Mit diesen drei Bit wird die Taktquelle für Timer festgelegt. CS2 CS CS Taktquelle: Timer Stopp (verbraucht keinen Strom, default nach RESET!) Systemtakt (:) Systemtakt / 8 ( Systemtakt / 64 Systemtakt / 256 Systemtakt / 24 externer Takt: fallende Flanke an T (PB) externer Takt: steigende Flanke an T (PB) Weitere Informationen findet man im Datenblatt. Das Timer/Counter Interrupt Mask Register TIMSK Das Timer/Counter Interrupt Mask Register befindet sich auf der SRAM Adresse x59 (SF Register Adresse x39) und wird mit der Abkürzung "TIMSK" angesprochen (Definitionsdatei). Die Befehle sbi, cbi, sbic und sbis können nicht verwendet werden. 44 C2 Timer

55 23 TIMSK = Timer/Counter Interrupt Mask Register Bit TIMSK x39 Startwert Read/Write OCIE2 TOIE2 TICIE OCIEA OCIEB TOIE OCIE TOIE OCIE Timer/Counter Output Compare Match Interrupt Enable kein OCF Interrupt erlaubt. Das Setzen dieses Bit ermöglicht das Auslösen eines Interrupts in dem Moment, wo das OCF Flag (TIFR) gesetzt wird, also eine Übereinstimmung zwischen dem Zählregister TCNT und dem Vergleichsregister OCR stattgefunden hat, oder wenn das Flag manuell gesetzt wurde. Interrupts müssen dazu global frei gegeben sein (I= im SREG mit "sei"). TOIE Timer/Counter Overflow Interrupt Enable kein TOV Interrupt erlaubt. Das Setzen dieses Bit ermöglicht das Auslösen eines Interrupts in dem Moment, wo das TOV Flag (TIFR) gesetzt wird, also ein Überlauf auftrat oder wenn das Flag manuell gesetzt wurde. Interrupts müssen dazu global frei gegeben sein (I= im SREG mit "sei"). Das Timer/Counter Interrupt Flag Register TIFR Das Timer/Counter Interrupt Flag Register befindet sich auf der SRAM Adresse x58 (SF Register Adresse x38) und wird mit der Abkürzung "TIFR" angesprochen (Definitionsdatei). Die Befehle sbi, cbi, sbic und sbis können nicht verwendet werden. TIFR = Timer/Counter Interrupt Flag Register Bit TIFR x38 Startwert Read/Write OCF TOV OCF2 TOV2 ICF OCFA OCFB TOV OCF TOV Output Compare Flag Keine Übereinstimmung des Inhalts des Zählregister mit dem Inhalt des Vergleichsregister. Bei Übereinstimmung (compare match) des Wertes im im Zählregister TCNT mit dem Wert im Vergleichsregister OCR wird das Flag gesetzt. Das Flag wird automatisch gelöscht, wenn der OC Interrupt ausgeführt wird. Manuell kann das Flag durch das Schreiben einer Eins! gelöscht werden. Timer/Counter Overflow Flag Keine Überlauf eingetreten. Tritt ein Überlauf des Zählregisters TCNT auf so wird das Flag gesetzt. Das Flag wird automatisch gelöscht, wenn der OV Interrupt ausgeführt wird. Manuell kann das Flag durch das Schreiben einer Eins! gelöscht werden. C2 Timer 45

56 23 Das Timer/Counter Register TCNT Das Timer/Counter Register befindet sich auf der SRAM Adresse x52 (SF Register Adresse x32) und wird mit der Abkürzung "TCNT" angesprochen (Definitionsdatei). Die Befehle sbi, cbi, sbic und sbis können nicht verwendet werden. Das Register ist les und schreibbar. TCNT = Timer/Counter Register Bit TCNT x32 Startwert Read/Write TCNT7 TCNT6 TCNT5 TCNT4 TCNT3 TCNT2 TCNT TCNT Das Output Compare Register OCR Das Output Compare Register befindet sich auf der SRAM Adresse x5c (SF Register Adresse x3c) und wird mit der Abkürzung "OCR" angesprochen (Definitionsdatei). Die Befehle sbi, cbi, sbic und sbis können nicht verwendet werden. Das Register ist les und schreibbar. OCR = Output Compare Register Bit OCR x3c Startwert Read/Write OCR7 OCR6 OCR5 OCR4 OCR3 OCR2 OCR OCR Weitere Aufgaben C25 Ändere das Programm C2 so um, dass es mit dem 6 Bit Timer arbeitet. Es soll die gleiche Frequenz erzeugt werden! Ermittle die für Timer benötigten Register (Datenblatt). Nenne das neue Programm "C25_6bit_timer_.asm". (Achtung!! Wenn mit 6 Bit (SF Doppelregister) gearbeitet wird soll bei beiden in oder Befehlen cli vor und sei hinten angestellt werden damit Interrupts das Lesen nicht beeinflussen können!!) 46 C2 Timer

57 23 C3 Die I2C Schnittstelle (TWI) Einführung Die von Philipps entwickelte synchrone I2C-Master-Slave-Schnittstelle, (Inter-Integrated Circuit, gesprochen I-Quadrat-C) dient der Kommunikation zwischen verschiedenen integrierten Schaltkreisen (IC, Integrated Circuit). Sie wurde für die Unterhaltungselektronik entwickelt (Fernsehgeräte) und ist dort weit verbreitet (viele ansteuerbare Spezial ICs). Bei einigen AVR Controllern wird die Schnittstelle hardwaremäßig unterstützt und heißt aus Urheberrechtsgründen nicht I2C sondern TWI Schnittstelle (Two Wire Bus). Vorteile des I2C Busses ist der geringe Verdrahtungsaufwand und die geringen Kosten bei der Entwicklung eines Gerätes. Es werden nur drei Leitungen benötigt. Ein Mikrocontroller kann so ein ganzes Netzwerk an ICs mit nur drei Leitungen und einfacher Software kontrollieren. Dies senkt die Kosten des zu entwickelnden Gerätes. Während des Betriebes können Chips zum Bus hinzugefügt oder entfernt werden (hot plugging). Nachteile des I2C Busses sind die geringe Geschwindigkeit und die geringe überbrückbare Distanz. Daten können nur abwechselnd über die Datenleitung gesendet werden (Halbduplex) und zusätzlich zu den Daten müssen die Adressen der Bausteine versendet werden. Verwendung: Der I2C Bus wird meist zur Übertragung von Steuer und Konfigurationsdaten verwendet, da es dabei meist nicht auf Schnelligkeit ankommt. Er wird zum Beispiel verwendet bei Echtzeituhren, Lautstärkereglern, Sensoren, A/D un D/A Wandlern mit niedriger Abtastrate, EEPROM Speicherbausteinen oder bidirektionale Schaltern und Multiplexern. Große Bedeutung hatte das I²C Protokoll in der Vergangenheit im Chipkartenbereich. Er ist nicht geeignet für größere Entfernungen, da die Störsicherheit gering ist und zu Fehlern in der Übertragung führt. Der I²C Bus ist als synchrone Master Slave Schnittstelle konzipiert. Es ist allerdings auch möglich mehrere Master einzusetzen (multimaster mode). Die Buszuteilung ist dabei in den Spezifikation geregelt und verhindert Kollisionen. Im Normalfall sendet der Master und ein Slave reagiert darauf. Es können je nach verwendeten ICs vier Geschwindigkeiten eingesetzt werden: khz (standard mode) 4 khz (fast mode; erweiterter Adressraum) MHz (fast mode plus) 3,4 MHz (high-speed mode). C3 Die I2C Schnittstelle (TWI) 47

58 23 Beim ATmega32A (ATmega8A) sind maximal 4 khz zulässig. Der synchrone I2C-Bus Im obigen Bild sind ein Master und drei Slaves eingezeichnet. Der synchrone I²C Bus benötigt eine Taktleitung (serial clock line, SCL) und eine Datenleitung (serial data line, SDA). Die Pull Up Widerstände an der Takt und Datenleitung ziehen beide Leitungen im Ruhezustand auf High Pegel4. Alle am Bus angeschlossene Bausteine besitzen einen Open-Collector- oder Open-Drain-Ausgang (der Kollektor bzw. Drain eines Transistors ist unbeschaltet (offen) und wird durch den gemeinsamen Pull Up Widerstand des Busses mit VCC verbunden). Ist der bipolare Transistoren bzw. der FET durchgeschaltet, so wird der Bus auf Masse gezogen. Man nennt einen solche Verschaltung auch noch eine Wired-And-Verknüpfung da die Schaltung wie ein Und Gatter wirkt. Die I2C-Datenübertragung Der Master schreibt auf der Datenleitung SDA zum Slave oder liest von ihm. Der Takt auf der Taktleitung SCL wird vom Master erzeugt5. Damit ein Datenbit gültig ist, darf sich sein Pegel während einer Clock High Phase nicht ändern (gilt nicht für Start, Stopp und Repeated Start Signal). Nach einer Start Bedingung ist der Bus belegt (busy) und kein anderer Master, als der Master der die Start Bedingung erzeugt hat, darf den Bus stoppen. Nach einer Stopp Bedingung ist der Bus wieder leer (idle). 4 Durch die Pull Up Widerstände soll ein Strom von maximal 3 ma fließen. Bei niedrigen Geschwindigkeiten kann ein höherer Widerstand (geringerer Energieverbrauch) verwendet werden. Bei V CC = 5 V sind 4,7 k im standard mode und,8 k im fast mode gute Werte (bis zu einer Bus Kapazität von 2 pf). Weitere Berechnungen findet man in den I2C Specs bzw im Datenblatt des verwendeten Controllers. (http://www.nxp.com/acrobat_download/usermanuals/um24_3.pdf). 5 Im Bedarfsfall kann der Slave die Low Phase des Takts verlängern indem er SCL auf Low Pegel zieht (clock stretching) und so den Master bremsen. 48 C3 Die I2C Schnittstelle (TWI)

59 23 Das I2C-Protokoll Mit einer fallende Flanke auf SDA (SCL = High) startet der Master die Kommunikation. Nach dem Startbit sendet der Master als erstes das Adressbyte an den Slave. Das Adressbyte besteht aus einer 7 Bit Slave Adresse und einem Schreib Lese Bit, welches die Richtung der Kommunikation festlegt. Der Slave bestätigt den korrekten Empfang mit einem ACK Bestätigungsbit (ACKnowledgement). Der Master erzeugt die 9 Taktimpulse und liest dann die Taktleitung. Hier kann dann ein langsamer Slave mit einem Low Pegel eine Wartezeit erzwingen (clock stretching). Je nach Richtung der Kommunikation sendet jetzt der Master oder der Slave beliebig viele Datenbytes (8 Bit, MSB first). Jedes Datenbyte wird vom Gegenüber mit einem ACK Bit (Low Pegel) bestätigt. Die Übertragung wird durch das Senden eines NACK Bits (Not ACKnowledge, High Pegel) vom Master oder Slave abgebrochen. Mit einer steigenden Flanke auf SDA (SCL = High) gibt der Master den Bus wieder frei (Stoppbit). Um Zeit zu sparen kann der Master auch den Bus nicht freigeben (kein Stoppbit) und gleich mit einem weiteren Startbit (Repeated Start) eine neue Kommunikation starten. Die Kommunikationsrichtung kann hierbei natürlich beliebig geändert werden. C3 Die I2C Schnittstelle (TWI) 49

60 23 Die Adressierung Das vom Master gesendete Adressbyte besteht, wie beschrieben, aus sieben Bit die die eigentliche Adresse des Slave darstellen und einem achten Bit das die Lese oder Schreibrichtung festlegt. Die I²C Schnittstelle nutzt einen Adressraum von 7 Bit, womit gleichzeitig 2 Bausteine auf einem Bus angesprochen werden können (6 der 28 möglichen Adressen sind für Sonderzwecke reserviert). Jeder I²C fähige Baustein (IC) hat eine festgelegte Adresse. Bei manchen ICs kann ein Teil der Adresse hardwaremäßig mittels Steuerpins festgelegt werden. So können z.b. bis zu acht gleichartige ICs an einem I²C Bus betrieben werden. Immer häufiger kann die Adresse aber auch softwaremäßig umprogrammiert werden (z.b. bei digitalen Sensoren). Es besteht auch noch eine neuere alternative Bit Adressierung (36 Bausteine). Sie ist abwärtskompatibel zum 7 Bit Standard (nutzt zusätzlich 4 der 6 reservierten Adressen). Die TWI-Schnittstelle des ATmega32A Die hardwaremäßige TWI Schnittstelle des ATmega Controller entspricht der I2C Schnittstelle. Der Controller kann dabei sowohl als Master als auch als Slave programmiert werden. Ein Multi Master Mode ist möglich, soll aber hier nicht behandelt werden (siehe Datenblatt). Beim ATmega32A werden die Pins PC (SCL) und PC (SDA) verwendet. Diese Pins brauchen bei eingeschalteter Schnittstelle nicht mehr speziell konfiguriert zu werden. Die Initialisierung der TWI-Schnittstelle Zur Initialisierung und Statusabfrage der Schnittstelle dienen die Register: TWCR (TWI Control Register) und TWSR (TWI Status Register). Die Geschwindigkeit (Bitrate) der Schnittstelle wird beim Betrieb im Master Modus über das Register: TWBR (TWI Bit Rate Register) und 2 Bit (Vorteiler) im TWSR Register festgelegt. Daten werden über das Register: TWDR (TWI Data Register) ausgegeben bzw. eingelesen. Wird der Controller als Slave genutzt, so wird seine Adresse im Register: TWAR (TWI Slave Address Register) abgelegt. Das interessanteste Register ist das Kontrollregister TWCR. Mit dem Bit TWEN wird der Baustein eingeschaltet. 5 C3 Die I2C Schnittstelle (TWI)

61 23 Polling Mit dem Bit TWINT wird eine Aktion gestartet, die vorher vorbereitet wurde: Beim vorigen Setzen des Bits TWSTA gibt der Controller als Master ein Startbit aus. Beim vorigen Setzen des Bits TWSTO gibt der Controller als Master ein Stoppbit aus. Beim vorigen Setzen des Bits TWEA gibt der Controller als Master eine Bestätigung (ACK) aus. Beim vorigen Ablegen von Daten im Datenregister TWDR gibt der Controller ein Datenbyte aus. Mit TWINT = wird die Aktion also eingeleitet. Die Steuerung setzt TWINT = und führt die Operation dann aus. Als Flag zeigt TWINT dann das Ende der Operation an. Im Statusregister wird mit 5 Statusbit ermittelt werden, ob die Operation erfolgreich war. Im einfachen Pollingbetrieb zeigt das Flag TWINT also an wenn die Operation abgeschlossen ist. Interrupt Mit dem Bit TWIE kann auch ein Interrupt freigegeben werden. Die ISR, welche dann nach Beendigung der Operation aufgerufen wird muss sich selbst um das Löschen des Flag TWINT durch Schreiben einer Eins kümmern. Dadurch wird allerdings auch die nächste Operation gestartet und die entsprechenden Register müssen schon vorbereitet sein. Die Bitrate der Schnittstelle (TWBR und TWSR) Wird der Controller als Slave betrieben, so sind hier keine Einstellungen erforderlich, allerdings muss die Taktfrequenz des Controller 6 mal höher als die Bitrate des Busses liegen! Im Masterbetrieb errechnet sich die Bitrate mit: f SCL = Systemtakt 6+2 TWBR Vorteiler TWBR ist dabei der Wert des Bitraten Registers TWBR. Der Vorteiler errechnet sich mit 4TWPS aus dem Inhalt der beiden Bit TWPS und TWPS im Statusregister TWSR. Damit ergeben sich folgende Werte für den Vorteiler: TWPS TWPS TWPS Vorteiler (4TWPS) C3 Die I2C Schnittstelle (TWI) 5

62 23 Der Wert des Bitraten Register errechnet sich dann mit einem erwählten Vorteiler aus: TWBR = C3 ( Systemtakt 6 f SCL ) 2 Vorteiler Berechne den Wert von TWBR und den Wert des Vorteilers für den standard mode bei einem Quarz von 6 MHz. Notiere die Zeilen, die zur Initialisierung nötig wären. Die SF-Register der TWI-Schnittstelle Das Kontroll-Register TWCR TWCR Register: SF Register Adresse x36 (SRAM Adresse x56) Befehle: in, (sbi, cbi, sbic, sbis nicht da Adresse > 32 (xf)!) TWCR = TWI Control Register Bit TWCR x36 Startwert Read/Write TWINT TWEA TWSTA TWSTO TWWC TWEN - TWIE R R TWINT TWI Interrupt Flag TWEA es wurde eine Operation gestartet, die noch nicht beendet ist. wird von der Hardware auf Eins gesetzt, sobald eine TWI Operation beendet ist. Gleichzeitig wird ein TWI Interrupt ausgelöst, wenn Interrupts global erlaubt sind (I im SREG) und das TWIE Bit gesetzt wurde. Durch das Schreiben einer Eins muss das Bit softwaremäßig gelöscht werden! Dies startet auch eine neue Operation. Vor dem Löschen müssen deshalb alle Register, die für die Operation benötigt werden schon beschrieben sein! Auch beim Verwenden des Interrupts muss das Bit manuell gelöscht werden! Dies geschieht hier nicht automatisch durch die Hardware! TWI Enable Acknowledge Bit sendet ein NACK nachdem Daten (Slave Adresse, globaler Anruf) angekommen sind. sendet ein ACK nachdem Daten (Slave Adresse, globaler Anruf) angekommen sind. TWSTA TWI START Condition Bit muss per Software wieder zurückgesetzt werden, wenn das Startbit erfolgreich versendet wurde! sendet eine Startbedingung als Master falls der Bus frei ist (wartet sonst auf eine Stoppbedingung). TWSTO TWI STOP Condition Bit 52 wird nach dem Senden einer Stoppbedingung automatisch rückgesetzt. C3 Die I2C Schnittstelle (TWI)

63 23 sendet eine Stoppbedingung als Master. Kann im Slave Modus benutzt werden um im Fehlerfall einen neuen definierten Zustand zu erreichen (SCL und SDA hochohmig). TWI Write Collision Flag TWCC wird automatisch gelöscht wenn Daten in das Datenregister TWDR geschrieben werden und keine Operation anhängig ist (TWINT = ). Kollision! Zeigt an, dass versucht wurde in das Datenregister TWDR zu schreiben obschon die vorherige Operation noch nicht beendet wurde (TWINT = ). TWI Enable TWEN schaltet die TWI Schnittstelle aus (Baugruppe verbraucht keinen Strom!). schaltet die TWI Schnittstelle ein. TWI Interrupt Enable ADIE der TWI Interrupt ist gesperrt. Das Setzen dieses Bit ermöglicht das Auslösen eines Interrupts in dem Moment, wo die TWI Operation beendet ist (TWINT Flag = im TWCR). Das Status-Register TWSR TWSR Register: SF Register Adresse x (SRAM Adresse x2) Befehle: in,, sbi, cbi, sbic, sbis TWSR = TWI Status Register Bit TWSR x Startwert Read/Write TWS TWS7 TWS6 TWS5 TWS4 TWS3 - TWPS TWPS R R R R R R TWI Status TWS7-TWS3 Die 5 Statusbits müssen aus dem Register ausmaskiert werden! Sie geben an ob eine Operation erfolgreich durchgeführt wurde und sollten kontrolliert werden. Für den Mastermode gelten folgende Codes: TWS TWSR (maskiert) Bedeutung x8 Startbedingung wurde gesendet. x Wiederholte Startbedingung gesendet (repeated start). x8 Slave-Adresse fürs Schreiben gesendet. ACK empfangen. x2 Slave-Adresse fürs Schreiben gesendet. NACK empfangen. x28 Datenbyte gesendet. ACK empfangen. x3 Datenbyte gesendet. NACK empfangen. x38 Datenverlust! x4 Slave-Adresse fürs Lesen gesendet. ACK empfangen. x48 Slave-Adresse fürs Lesen gesendet. NACK empfangen. x5 Datenbyte empfangen. ACK wurde gesendet. x58 Datenbyte empfangen. NACK wurde gesendet. C3 Die I2C Schnittstelle (TWI) 53

64 TWPS 23 TWI Prescaler Bits TWPS,TWPS Diese beiden Bits legen den Vorteiler für die Bitrate fest: TWPS TWPS TWPS Vorteiler (4TWPS) Das Bitraten-Register TWBR TWBR Register: SF Register Adresse x (SRAM Adresse x2) Befehle: in,, sbi, cbi, sbic, sbis TWBR = TWI Bit Rate Register Bit TWBR x TWBR7 TWBR6 TWBR5 TWBR4 TWBR3 TWBR2 TWBR TWBR Startwert Read/Write TWBRn TWI Bit Rate Register Bit n Im Masterbetrieb errechnet sich die Bitrate mit: f SCL = Systemtakt 6+2 TWBR Vorteiler TWBR ist der Wert des Bitraten Registers TWBR. Der Vorteiler wurde im Statusregister TWSR festgelegt. TWBR ermittelt man mit: TWBR = ( Systemtakt 6 f SCL ) 2 Vorteiler Das Datenregister TWDR TWDR Register: SF Register Adresse x3 (SRAM Adresse x23) Befehle: in,, sbi, cbi, sbic, sbis TWDR = TWI Data Register 54 C3 Die I2C Schnittstelle (TWI)

65 Bit TWDR x3 Startwert Read/Write TWDR7 TWDR6 TWDR5 TWDR4 TWDR3 TWDR2 TWDR TWDR TWDRn TWI Data Register Bit n Das Datenbyte enthält das letzte zu sendende Byte oder das zuletzt empfangene Byte. Es kann nur beschrieben werden wenn TWINT = (TWCR). Das Adress-Register TWAR Dieses Register wird nur im Slave-Modus benötigt! TWAR Register: SF Register Adresse x2 (SRAM Adresse x22) Befehle: in,, sbi, cbi, sbic, sbis TWAR = TWI (Slave) Adress Register Bit TWAR x2 Startwert Read/Write TWAn TWA6 TWA5 TWA4 TWA3 TWA2 TWA TWA TWGCE TWI (Slave) Adress Register Bit n Im Slavemodus wird in diesem Register die Slave Adresse eingetragen TWGCE TWI General Call Recognition Enable Bit Erlaubt das Erkennen eines globalen Rundrufs auf dem Bus. Die I2C-Bibliothek Im folgenden soll eine kleine Bibliothek zum Senden und Empfangen von Daten als Master mittels Polling (ständiges Abfragen) über den I2C Bus erstellt werden. Die Bibliothek besteht aus 6 kleinen Unterprogrammen. Zur Parameterübergabe wird das Doppelregister r25:r24 verwendet. Daten werden mit r24 übermittelt (r24 dient manchmal auch als Zwischenspeicher). Die, aus fünf Bit bestehende Statusinformation (siehe Statusregister TWSR) befindet sich in r25. Die Bibliothek findet man auf: ("SR_I2C.asm") Bus initialisieren mit I2CINI Die Initialisierung beschränkt sich auf das Festlegen der Bitrate. Dieses Unterprogramm muss als erstes im Hauptprogramm aufgerufen werden. Die Zuweisungen können auch im Hauptprogramm erfolgen. ; ; Zuweisungen C3 Die I2C Schnittstelle (TWI) 55

66 23 ; EQU I2C_Clock = ;I2C Geschwindigkeit (nur oder 4).EQU CPU_Clock = 6 ;Systemtakt ;Achtung! Je nach Systemtakt muss der Vorteiler ;und die Formel im UP I2CINI angepasst werden ; ; I2C (TWI) initialisieren ; I2CINI: push r6 clr r6 ;TWPS = (Vorteiler = ) TWSR,r6 ;TWBR=((Systemtakt/I2C Takt)-6)/(2*Vorteiler) r6,((cpu_clock/i2c_clock)-6)/2 TWBR,r6 ;das Einschalten der Baugruppe (TWEN in TWCR) pop r6 ;erfolgt jeweils beim Ansteuern ret Startbit senden mit I2CSTA Als erstes muss ein Startbit gesendet werden (wird das Unterprogramm ohne voriges Stoppen des Busses verwendet, so erfolgt ein Repeated Start). Dieses Unterprogramm zeigt die Struktur, welche auch in den folgenden Unterprogrammen verwendet wird. ; ; Startbit senden ; I2CSTA: push r24 r24,xa4 ;TWCR=b TWINT,TWSTA u. TWEN setzen TWCR,r24 I2CST: in r24,twcr ;warten bis TWINT wieder sbrs r24,twint ;Operation beendet rjmp I2CST in r25,twsr ;Status-Code in r25 andi r25,xf8 pop r24 ret 56 C3 Die I2C Schnittstelle (TWI)

67 23 Daten senden mit I2CSND In diesem Unterprogramm zum Senden (send) von Daten werden die Daten zuerst in das Datenregister kopiert. Die Bestätigung (ACK) kommt vom Slave. ; ; Daten senden ; I2CSND: push r24 TWDR,r24 ;r24 (Daten) ins Datenregister r24,x84 ;TWCR=b TWINT u. TWEN setzen TWSTA TWCR,r24 ;ruecksetzen I2CSN: in r24,twcr ;warten bis TWINT wieder sbrs r24,twint ;Operation beendet rjmp I2CSN in r25,twsr ;Status-Code in r25 andi r25,xf8 pop r24 ret Daten empfangen und ACK senden mit I2CRAK Es werden zwei Unterprogramme zum Empfang (receive) von Daten benötigt. Das erste Unterprogramm (I2CRAK) sendet nach dem Empfang eine positive Empfangsbestätigung (ACK). Das empfangene Datenbyte befinden sich in r24. ; ; Daten empfangen mit ACK ; I2CRAK: r24,xc4 ;TWCR=b TWINT, TWEA u. TWEN setzen TWCR,r24 I2CRA: in r24,twcr ;warten bis TWINT wieder sbrs r24,twint ;(Start-Operation beendet) rjmp I2CRA in r24,twdr ;Daten in r24 in r25,twsr ;Status-Code in r25 andi r25,xf8 ret Daten empfangen und NACK senden mit I2CRNA Das zweite Unterprogramm sendet nach dem Empfang eine negative Empfangsbestätigung (NACK) und beendet damit die Übertragung. ; ; Daten empfangen ohne ACK (NACK) ; I2CRNA: r24,x84 ;TWCR=b TWINT u. TWEN setzen TWCR,r24 I2CRN: in r24,twcr ;warten bis TWINT wieder sbrs r24,twint ;(Start-Operation beendet) rjmp I2CRN in r24,twdr ;Daten in r24 in r25,twsr ;Status-Code in r25 andi r25,xf8 ret C3 Die I2C Schnittstelle (TWI) 57

68 23 Stoppbit senden mit I2CSTO Mit dem Stopbit gibt der Master den Bus wieder frei. Ohne Stoppbit kann der Master mit einem neuen Startbit (repeated start) den Bus weiter besetzen. ; ; Stoppbit senden ; I2CSTO: push r6 r6,x94 ;TWCR=b TWINT, TWSTO u. TWEN setzen TWCR,r6 pop r6 ret Die Echtzeituhr (RTC) DS37 Das Senden und Empfangen von Daten über den I2C Bus soll mit einer Echtzeituhr (Real Time Clock) getestet werden. Eine Echtzeituhr läuft auch ohne externe Spannungsversorgung mit einer Batterie (üblicherweise Lithium Knopfzelle mit 3 V) weiter. Es wird der I2C Baustein DS37 von Maxim als Echtzeituhr verwendet. Zur äußeren Beschaltung wird nur ein Uhrenquarz (32,768 khz) und die Batterie benötigt. Der DS37 besitzt auch einen Ausgang (SQW/OUT) mit dem ein quarzgenauer Takt ausgegeben werden kann, um zum Beispiel einen Interrupt im Sekundentakt auszulösen. Die I2C Adresse des Bausteins ist b (x68). Bemerkungen: Wird keine Batterie angeschlossen, so muss Pin 3 mit Masse verbunden werden, damit der Baustein angesprochen werden kann. Der DS37 arbeitet nur im Standard Mode ( khz). 58 C3 Die I2C Schnittstelle (TWI)

69 23 Der Uhrenbaustein besitzt 64 Register (RAM Speicherzellen), welche über eine Registeradresse angesprochen werden können. Die ersten sieben Register enthalten die Daten der Uhr (Uhrzeit (3), Wochentag () und Datum (3)). Das achte Register dient als Kontrollregister. Die restlichen 56 Speicherzellen können beliebig beschrieben und gelesen werden (gepuffertes RAM). Uns interessieren hier besonders die ersten sieben Register. Sobald das Sekundenregister beschrieben wurde (Bit 7 (CH) = ) läuft die Uhr. Die Daten werden im BCD Code 6 abgelegt. I2C-Daten zur Echtzeituhr senden Zum Senden von Daten an den Baustein wird das erste Bit (Bit, LSB) des Baustein Adressbytes auf Null fürs Schreiben gesetzt. Mit der 7 Bit Adresse des DS37 erhält man dann b (xd) als Gesamt Adressbyte. Nach dem Senden der Baustein Adresse muss beim DS37 als erstes Datenbyte die Adresse der zu adressierenden Speicherzelle gesendet werden. Praktischerweise wird die Adresse (Adresszeiger) automatisch nach dem Schreiben eines Registerinhalts erhöht, so dass nacheinander alle 7 Registerinhalte gesendet werden können. 6 Der BCD Code (Binary Coded Decimal) ist ein Code mit dual kodierten Dezimalziffern. 4 Bit (Nibble) stellen eine Dezimalziffer ( 9) im Dualcode dar (b-b). C3 Die I2C Schnittstelle (TWI) 59

70 23 Es ist sinnvoll die Daten vorher in einer SRAM Tabelle (hier symbolische Adresse (Label): RTCTAB) abzulegen. Das folgende Unterprogramm zeigt die Vorgehensweise beim Beschreiben des Uhrenbausteins. Tritt ein Fehler bei der Übertragung auf, so wird dies mit einer LED signalisiert. Das Unterprogramm befindet sich in der Bibliothek " SR_RTC_DS37_sample.asm" (http://weigu.lu/a/asm). ; ; Daten senden (7 Datenbyte, Tabelle RTCTAB im SRAM) ; RTCSND: rcall I2CSTA ;Startbit senden + Kontrolle cpi r25,x8 brne RTCSNE r24,xd ;Adresse des RTC DS37 (Maxim ) senden rcall I2CSND ;(Bit 2^ = schreiben) + Kontrolle cpi r25,x8 brne RTCSNE r24,x ;Adresszeiger = senden + Kontrolle rcall I2CSND cpi r25,x28 brne RTCSNE ;7 Datenbyte senden + Kontrolle lds r24,rtctab+ ;Sekunden rcall I2CSND cpi r25,x28 brne RTCSNE lds r24,rtctab+ ;Minuten rcall I2CSND cpi r25,x28 brne RTCSNE lds r24,rtctab+2 ;Stunden rcall I2CSND cpi r25,x28 brne RTCSNE lds r24,rtctab+3 ;Wochentag rcall I2CSND cpi r25,x28 brne RTCSNE lds r24,rtctab+4 ;Tag rcall I2CSND cpi r25,x28 brne RTCSNE lds r24,rtctab+5 ;Monat rcall I2CSND cpi r25,x28 brne RTCSNE lds r24,rtctab+6 ;Jahr rcall I2CSND cpi r25,x28 brne RTCSNE rjmp RTCSNR RTCSNE: sbi ERRDDR,ERRPNr ;Ausgang fuer Fehler LED initialisieren sbi ERRPORT,ERRPNr ;Fehler LED ein RTCSNR: rcall I2CSTO ;Stoppbit senden ret I2C-Daten von der Echtzeituhr empfangen C3 6 a) Die Bibliothek soll um ein ein Unterprogramm mit dem symbolischen Namen RTCREC erweitert werden. Das Unterprogramm soll die abgespeicherten 7 Datenbyte aus dem RTC auszulesen. Die Vorgehensweise C3 Die I2C Schnittstelle (TWI)

71 23 kann aus dem unteren Diagramm ausgelesen werden. b) Schreibe ein Hauptprogramm, das bei der Initialisierung die Uhr setzt, und dann in einer Schleife den Minuten und den Sekundenwert ausliest und auf dem 7 Segmentdiplay darstellt. Nenne das Hauptprogramm "C3_I2C_RTC_test.asm". Bemerkungen: Wird sofort nach einem Stoppbit ein erneutes Startbit gesendet, so wird dies auch als Repeated Start erkannt. Bei der Fehlerbehandlung (Kontrolle) ist dies zu beachten. Es kann natürlich auch zwischen Stoppbit und Startbit eine kurze Zeitschleife eingefügt werden. Auch beim Lesen wird der Adresszeiger im RTC automatisch mit jeder Leseoperation erhöht. Um den Lesezyklus des DS37 zu stoppen benötigt dieser eine negative Bestätigung (NACK) vom Master. Das EEPROM 24LC256 Als zweites Beispiel soll hier ein EEPROM mit 256 Kibit Speicher (32 KiB) verwendet werden. Ziel ist es einige Sekunden Sprache mit dem Electret Mikrofon (A/D Wandler) aufzunehmen und dann wieder per D/A Wandler auszugeben. Ein EEPROM ist natürlich auch nützlich um zum Beispiel Zeichenketten (mehrsprachige Menüführung am LCD Display) oder Graphiken (Webserver) abzuspeichern. Der Baustein 24LC256 beherrscht den Fast Mode (4 khz). Wir werden diesen Modus nutzen um eine möglichst hohe Frequenz zu erreichen. Das EEPROM 24LC256 besitzt 3 Pins um die Adresse per Hardware festzulegen. Damit besteht die Möglichkeit 8 Bausteine am Bus zu betreiben (2 Mibit (256 KiB) Speicher). Die Grundadresse beträgt b gefolgt von den drei per Hardware kodierten Bits A2, A und A. C3 Die I2C Schnittstelle (TWI) 6

72 23 In unserem Beispiel legen wir die drei Pins auf Masse und erhalten b als Adresse. Damit ergibt sich xa als gesamtes Adressbyte beim Schreiben und xa beim Lesen. Das Pin WP (Write Protect) muss mit Masse verbunden werden, wenn Lesen und Schreiben erlaubt werden sollen. Wird es mit VCC verbunden, so ist nur das Lesen erlaubt. I2C-Daten zum EEPROM senden Da in diesem EEPROM mehr als 256 Byte angesprochen werden muss eine Word (6 Bit) zur Adressierung der Speicherzellen verwendet werden. Es bestehen zwei Möglichkeiten: Schreiben von einzelnen Bytes ( Byte Write). Dabei muss jedes Mal die 6 Bit Adresse mit übermittelt werden. Sequentielles Schreiben einer ganze Seite ( Page Write), wobei eine Seite aus 64 Byte besteht (insgesamt 52 Seiten mit je 64 Byte). Quelle: Datenblatt 24LC256 (Microchip) 62 C3 Die I2C Schnittstelle (TWI)

73 23 Die zweite Möglichkeit soll hier genutzt werden, da sie effektiver ist. Auch wenn nur Byte geschrieben zu schreiben ist, wird im EEPROM eine ganze Seite (64 Byte) beschrieben. Dieser Schreibzyklus braucht nach Datenblatt maximal 5 ms. Während dieser Zeit sendet der Slave keine ACK Impulse! Es muss also nach jedem Schreiben eine Wartezeit von 5 ms eingelegt werden! C32 Es soll eine Bibliothek mit dem Namen " SR_EEPROM_24LC256.asm" erstellt werden: a) Schreibe ein Unterprogramm mit dem symbolischen Namen E24SB um ein einzelnes Byte in den EEPROM Speicher zu schreiben. Die Adresse und das Datenbyte befinden sich im SRAM (Label: E24ADL, E24ADH und E24BYTE). Das Unterprogramm soll auch die Wartezeit von 5 ms berücksichtigen. b) Schreibe ein zweites Unterprogramm mit dem symbolischen Namen E24SP um eine ganze Seite (Page, 64 Byte) in den EEPROM Speicher zu schreiben. Die Adresse und eine Datentabelle mit 64 Byte befinden sich im SRAM (Label: E24ADL, E24ADH und E24PAGE). Das Unterprogramm soll auch die Wartezeit von 5 ms berücksichtigen. I2C-Daten vom EEPROM empfangen Beim Lesen der Daten gibt es drei Möglichkeiten: Lesen des Datenbyte an der momentanen Adresse (Current Address Read). Der interne Adresszeiger wird beim Lesen kontinuierlich um erhöht. War die zuletzt gelesene Adresse n, so wird der Inhalt der Adresse n+ gelesen. Lesen eines Bytes an einer beliebigen Adresse ( Random Read). Die 6 Bit Adresse muss zuerst in das EEPROM geschrieben werden. C3 Die I2C Schnittstelle (TWI) 63

74 23 Sequentielles Lesen von mehreren Bytes (Sequential Read). Genau wie beim Lesen eines Bytes muss zuerst der Adresszeiger initialisiert werden. Wird aber nach dem ersten Byte kein Stoppbit sondern ein ACK gesendet, so wird der Adresszeiger automatisch inkrementiert und es können beliebig viele Bytes gelesen werden. Quelle: Datenblatt 24LC256 (Microchip) C33 64 Die Bibliothek "SR_EEPROM_24LC256.asm" soll um zwei Unterprogramme erweitert werden: a) Schreibe ein Unterprogramm mit dem symbolischen Namen E24RR um ein einzelnes Byte aus dem EEPROM Speicher zu lesen (Random Read). Die Adresse befindet sich zur Parameterübergabe im SRAM (Label: E24ADL, E24ADH). Das empfangene Datenbyte soll im SRAM abgespeichert werden (Label: E24BYTE). b) Schreibe ein zweites Unterprogramm mit dem symbolischen Namen E24RS um eine ganze Seite (Page, 64 Byte) aus dem EEPROM Speicher zu lesen (Sequential Read). Die Adresse befindet im SRAM (Label: E24ADL, E24ADH). Die 64 empfangenen Datenbyte sollen im SRAM abgespeichert werden (Label: E24BYTE). C3 Die I2C Schnittstelle (TWI)

75 23 C34 Teste das Abspeichern und Einlesen eines Byte. Die Speicherzelle E24BYTE muss nach dem Abspeichern gelöscht werden! Das empfangene Datenbyte soll auf dem 7 Segmentdisplay dargestellt werden. Nenne dein Hauptprogramm "C34_I2C_EEPROM_test.asm". C35 Teste das Abspeichern und Einlesen einer Seite (64 Byte). Die Tabelle E24PAGE muss nach dem Abspeichern gelöscht werden! Die empfangenen Datenbyte sollen in einer Schleife auf dem 7 Segmentdisplay dargestellt werden. Nenne dein Hauptprogramm "C35_I2C_EEPROM_test2.asm". Weitere Aufgaben (für Fortgeschrittene) Mit dem I2C Speicherchip lässt sich zusammen mit einem D/A Wandler und einem Mikrofon (MICES2 Board) ein Aufnahmegerät programmieren, das ungefähr 4 Sekunden Sprache oder Musik aufnimmt und diese wieder abspielt. Schließt man zusätzlich ein Potentiometer ( 5 V) an einen zweiten A/D Wandler Eingang (PA) an, so lässt sich die Abspielgeschwindigkeit verändern. Hier das vollständige Programm: ;******************************************************************************* ;* ;* Titel: Aufnahmegeraet mit EEPROM (24LC256) ;* (C36_I2C_EEPROM_ADDA.asm) ;* Datum: 25// Version:. ;* Autor: WEIGU ;* ;* Informationen zur Beschaltung: ;* ;* Prozessor: ATmega32A Quarzfrequenz: 6MHz ;* Eingaenge: Potentiometer (-5V) an PA, Mikrofonschaltung an PA (-5V) ;* Aufnahmetaster an PC2 ;* Ausgaenge: D/A-Wandler an PortB, EEPROM (I2C) an SCL und SDA ;* (PC und PC), LED Aufnahme an PC2, LED Abspielen an PC4 ;* ;* Informationen zur Funktionsweise: ;* ;******************************************************************************* ; ; Einbinden der controllerspezifischen Definitionsdatei ; NOLIST ;List-Output ausschalten.include "m32def.inc" ;AVR-Definitionsdatei einbinden.list ;List-Output wieder einschalten ; ; Organisation des Datenspeichers (SRAM) ; DSEG ;was ab hier folgt kommt in den SRAM-Speicher E24ADL:.BYTE ;6 Bit Adressezeiger EEPROM E24ADH:.BYTE E24BYTE:.BYTE ;Datenbyte EEPROM E24PAGE:.BYTE 64 ;64 Byte Seite (Page) im EEPROM TCNT:.BYTE ;Tabellenzeiger TAB:.BYTE 28 ;28 Byte Tabelle ; ; Programmspeicher (FLASH) Programmstart nach RESET ab Adr. x ; CSEG ;was ab hier folgt kommt in den FLASH-Speicher C3 Die I2C Schnittstelle (TWI) 65

76 .ORG x RESET: rjmp INIT 23 ;Programm beginnt an der FLASH-Adresse x ;springe nach INIT (ueberspringe ISR Vektoren) ; ; Sprungadressen fuer die Interrupts organisieren (ISR VECTORS) ; ;Vektortabelle (im Flash-Speicher).ORG OC2addr ;interner Vektor fuer Timer2 Compare rjmp ISR_T2 ;Bei TCNT2=OCR2 springe zur ISR Timer2.ORG OCaddr ;interner Vektor fuer Timer Compare rjmp ISR_T ;Bei TCNT=OCR springe zur ISR Timer.ORG ADCCaddr ;interner Vektor fuer ADCC (alt.:.org x2) ;AD-Wandlung vollstaendig ADC complete rjmp ISR_AD ;Springe zur ISR von ADCC ; ; Initialisierungen und eigene Definitionen ; ORG INT_VECTORS_SIZE ;Platz fuer ISR Vektoren lassen INIT:.DEF Zero = r5 ;Register wird zum Rechnen benoetigt clr r5 ;und mit Null belegt.def Tmp = r6 ;Register 6 dient als erster Zwischenspeicher.DEF Tmp2 = r7 ;Register 7 dient als zweiter Zwischenspeicher.DEF Cnt = r8 ;Register 8 dient als Zaehler.DEF WL = r24 ;Register 24 und 25 dienen als universelles.def WH = r25 ;Doppelregister W und zur Parameteruebergabe ;Stapel initialisieren (fuer Unterprogramme bzw. Interrupts) Tmp,HIGH(RAMEND) ;RAMEND (SRAM) ist in der DefinitionsSPH,Tmp ;datei festgelegt Tmp,LOW(RAMEND) SPL,Tmp ;ADC initialisieren Tmp,b ;REFS = AVCC als Referenzspannung ADMUX,Tmp ;ADLAR = linksb. (obere 8 Bit in ADCH) ;MUX = unsymetrisch PA (ADC) Tmp,b ;ADEN = (ADC einschalten) ADCSRA,Tmp ;ADATE = (Auto Trigger Modus ein) ;ADIE = (noch kein Interrupt) ;ADPS = (6MHz/6 = MHz) ;andere Bits per default = in Tmp,SFIOR ;ADTS = Timer Compare andi Tmp,b ori Tmp,b SFIOR,Tmp ;Timer einschalten und Tmp,xB TCCR,Tmp ;Vergleichswert T fuer Tmp,36 OCR,Tmp Vorteiler festlegen (SAVE) ;TCCR = b (Systemtakt/64) ;WGM = CTC-Modus den Zaehler festlegen ;36 Zaehlschritte = 6,8kHz; fs = 3,4kHz ;Timer2 einschalten und Vorteiler festlegen (PLAY) Tmp,xC ;TCCR = b (Systemtakt/64) ;!! CS2 <> CS anders als Timer!!) TCCR2,Tmp ;WGM = CTC-Modus ;Vergleichswert T2 fuer den Zaehler festlegen Tmp,36 ;5 Zaehlschritte = 5Hz OCR2,Tmp ;D/A-Wandler initialisieren ser Tmp ;D/A-Wandler an PORTB DDRB,Tmp ;Aufnahmetaster und LEDs initialisieren cbi DDRC,2 ;Aufnahmetaster an PC2 sbi PORTC,2 ;Pull-Up sbi DDRC,3 ;AufnahmeLED (SAVE) an PC3 66 C3 Die I2C Schnittstelle (TWI)

77 sbi DDRC,4 23 ;AbspieLED (PLAY) an PC4 ;I2C Bus initialisieren (4 khz) rcall I2CINI ;Interrupts global erlauben sei ; ; Hauptprogramm ; MAIN: ;T2 Interrupt (PLAY) ausschalten in Tmp,TIMSK ; andi Tmp,x7F ;Mit einer UND-Maskierung (b) ;Bit 7 (OCIE2) im TIMSK-Register loeschen TIMSK,Tmp ; cbi PORTC,4 ;Abspiel LED loeschen LOOPV: LOOPG: ;Potentiometer zum Verstellen der Abspielgeschwindigkeit an PA ;Option! dieser Teil kann falls erwuenscht geloescht werden Tmp,b ;REFS = AVCC als Referenzspannung ADMUX,Tmp ;ADLAR = linksb. (obere 8 Bit in ADCH) Tmp,b ;ADEN = (ADC einschalten) ADCSRA,Tmp ;ADPS = (6MHz/6 = MHz) sbi ADCSRA,ADSC ;eine AD-Wandlung ausloesen sbic ADCSRA,ADSC ;Polling bis Wandlung fertig rjmp LOOPV in Tmp,ADCH ;oberste 8 Bit einlesen und ausgeben lsr Tmp ;Wert durch 4 teilen lsr Tmp brne LOOPG ;auf Endstellung () Tmp,36 ;normale Abspielgeschwindigkeit OCR2,Tmp Tmp,b ;A/D Wandler zuruecksetzen (PA Mikrofoneingang) ADMUX,Tmp Tmp,b ADCSRA,Tmp sbic rjmp SAVE: PINC,2 PLAY ;Aufnahmetaster ;Timer (SAVE) Interrupt einschalten in Tmp,TIMSK ; ori Tmp,x2 ;Mit einer ODER-Maskierung (b) ;Bit 2 (OCIE) im TIMSK-Register auf eins setzen TIMSK,Tmp ; sbi ADCSRA,ADIE ;Anfangsadresse und Tabellenzaehler initialisieren, AufnahmeLED ein clr Tmp sts E24ADL,Tmp sts E24ADH,Tmp sts TCNT,Tmp sbi PORTC,3 SAVE: lds cpi brge rjmp Tmp,TCNT Tmp,64 SAVE SAVE SAVE: clr ld st inc cpi brne rcall Cnt ;PAGE (64 Byte) schreiben XL,LOW(E24PAGE) XH,HIGH(E24PAGE) YL,LOW(TAB) YH,HIGH(TAB) Tmp,Y+ X+,Tmp Cnt Cnt,64 LOOP2 E24SP LOOP2: ;zweite Haelfte der Tabelle? C3 Die I2C Schnittstelle (TWI) 67

78 ;Pageadresse erhoehen lds XL,E24ADL lds XH,E24ADH adiw XL,32 adiw XL,32 sts E24ADL,XL sts E24ADH,XH LOOP3: lds cpi brlo rjmp SAVE2: clr LOOP4: ld st inc cpi brne rcall Tmp,TCNT Tmp,64 SAVE2 LOOP3 ;64 addieren (naechste Seite) ;erste Haelfte der Tabelle? Cnt ;PAGE (64 Byte) schreiben XL,LOW(E24PAGE) XH,HIGH(E24PAGE) YL,LOW(TAB+64) YH,HIGH(TAB+64) Tmp,Y+ X+,Tmp Cnt Cnt,64 LOOP4 E24SP ;Pageadresse erhoehen lds XL,E24ADL lds XH,E24ADH adiw XL,32 adiw XL,32 brmi PLAY sts E24ADL,XL sts E24ADH,XH rjmp SAVE PLAY: 23 ;64 addieren (naechste Seite) ;Falls EEPROM voll (Bit5 = ) dann Raus ;T Interrupt (SAVE) ausschalten in Tmp,TIMSK ; andi Tmp,xFD ;Mit einer UND-Maskierung (b) ;Bit (OCIE) im TIMSK-Register loeschen TIMSK,Tmp ; cbi ADCSRA,ADIE ;Anfangsadresse und Tabellenzaehler initialisieren, Abspiel LED ein clr Tmp sts E24ADL,Tmp sts E24ADH,Tmp sts TCNT,Tmp sbi PORTC,4 PLAY2: LOOP5: rcall clr ld st inc cpi brne E24RS ;Werte an der gleichen Adresse abholen (,53ms) Cnt ;und ausgeben XL,LOW(E24PAGE) XH,HIGH(E24PAGE) YL,LOW(TAB) YH,HIGH(TAB) Tmp,X+ Y+,Tmp Cnt Cnt,64 LOOP5 ;Pageadresse erhoehen lds XL,E24ADL lds XH,E24ADH adiw XL,32 adiw XL,32 ;brmi MAINR sts E24ADL,XL sts E24ADH,XH 68 ;64 addieren (naechste Seite) ;Falls EEPROM voll (Bit5 = ) dann Raus C3 Die I2C Schnittstelle (TWI)

79 LOOP6: lds cpi brlo rjmp Tmp,TCNT Tmp,64 PLAY3 LOOP6 ;erste Haelfte der Tabelle? PLAY3: lds cpi brne lds cpi brne Tmp,E24ADL Tmp,x4 PLAY4 Tmp,E24ADH Tmp,x PLAY4 ;erstes Mal? 23 ;T2 Interrupt einschalten in Tmp,TIMSK ; ori Tmp,x8 ;Mit einer ODER-Maskierung (b) ;Bit 7 (OCIE2) im TIMSK-Register auf eins setzen TIMSK,Tmp ; cbi PORTC,3 PLAY4: LOOP7: rcall clr ld st inc cpi brne E24RS ;Werte an der gleichen Adresse abholen (,53ms) Cnt ;und ausgeben XL,LOW(E24PAGE) XH,HIGH(E24PAGE) YL,LOW(TAB+64) YH,HIGH(TAB+64) Tmp,X+ Y+,Tmp Cnt Cnt,64 LOOP7 ;Pageadresse erhoehen lds XL,E24ADL lds XH,E24ADH adiw XL,32 adiw XL,32 brmi MAINR sts E24ADL,XL sts E24ADH,XH ;64 addieren (naechste Seite) ;Falls EEPROM voll (Bit5 = ) dann Raus LOOP8: lds cpi brge rjmp Tmp,TCNT Tmp,64 PLAYR LOOP8 ;zweite Haelfte der Tabelle? PLAYR: rjmp PLAY2 ;Endlosschleife MAINR: rjmp MAIN ; ; Unterprogramme und Interrupt-Behandlungsrinen ; ; Interrupt-Behandlungsrine Timer2 (PLAY) ISR_T2: push r6 ;benutzte Reg. retten (r6 = Zwischenspeicher) in r6,sreg ;Statusregister einlesen push r6 ;Statusregister retten push r7 push YL push YH cbi nop sbi PORTC,4 lds add adc ld r7,tcnt YL,LOW(TAB) YH,HIGH(TAB) YL,r7 YH,Zero r6,y PORTB,r6 ;dient der Visualisierung mittels Oszilloskop PORTC,4 ;Wert aus Tabelle ausgeben C3 Die I2C Schnittstelle (TWI) 69

80 inc cpi breq sts rjmp ISR_TF: clr sts r7 r7,28 ISR_TF TCNT,r7 ISR_TR r7 TCNT,r7 ISR_TR: pop pop pop pop pop reti YH YL r7 r6 SREG,r6 r6 23 ;Werte der geretteten Register wieder;herstellen ;Ruecksprung aus einer ISR ;Dummy Interrupt-Behandlungsrine ISR_T: reti ;Ruecksprung aus einer ISR ;Interrupt-Behandlungsrine ADC (SAVE) ISR_AD: push r6 ;benutzte Reg. retten (r6 = Zwischenspeicher) in r6,sreg ;Statusregister einlesen push r6 ;Statusregister retten push r7 push YL push YH cbi nop sbi PORTC,3 ;dient der Visualisierung mittels Oszilloskop PORTC,3 lds add adc in st inc cpi breq sts rjmp ISR_AF: clr sts r7,tcnt YL,LOW(TAB) YH,HIGH(TAB) YL,r7 YH,Zero r6,adch Y,r6 r7 r7,28 ISR_AF TCNT,r7 ISR_AR r7 TCNT,r7 ISR_AR: pop pop pop pop pop reti YH YL r7 r6 SREG,r6 r6 ;oberste 8 Bit einlesen und ;abspeichern ;Werte der geretteten Register wieder;herstellen ;Ruecksprung aus einer ISR.INCLUDE "SR_I2C.asm" ;I2C-Bibliothek einbinden.include "SR_EEPROM_24LC256.asm" ;EEPROM-Bibliothek einbinden ; EXIT ;Ende des Quelltextes C36 7 Das obige Programm "C36_I2C_EEPROM_ADDA.asm" findet man auf der Seite a) Programmiere die Aufgabe und teste sie (Voraussetzung ist eine funktionierende EEPROM Bibliothek). b) Die Kommentare des Programms sind absichtlich lückenhaft. Ermittle die genaue Funktionsweise des Programms und ergänze die Kommentare. (Um die ISRs zu visualisieren kann man an den beiden LEDs ein Oszilloskop C3 Die I2C Schnittstelle (TWI)

81 23 anschließen und so das genaue Timing beobachten.) c) Zeichne die entsprechenden Flussdiagramme. C3 Die I2C Schnittstelle (TWI) 7

82 72 23 C3 Die I2C Schnittstelle (TWI)

83 23 C4 Die SPI Schnittstelle Einführung Motorola entwickelte die synchrone SPI-Master-Slave Schnittstelle, (Serial Periphal Interface) für die Kommunikation zwischen Mikrocontrollern. Ein ähnliches Bus System existiert von National Semiconductor und nennt sich Microwire. Die Schnittstelle arbeitet synchron in Vollduplex mit hoher Taktgeschwindigkeit (bis zu mehreren MHz). Die SPI Schnittstelle wird bei der AVR Familie zur In System Programmierung genutzt und meist hardwaremäßig unterstützt. Im Gegensatz zur asynchronen seriellen EIA 232 Schnittstelle werden keine Start, Stopp oder Paritätsbits verwendet. Auch wird keine Adresse wie bei der synchronen I2C Schnittstelle benötigt. Vorteile Schnell, da Vollduplex. Die Taktrate kann bis zur Hälfte des Systemtakts des Controllers betragen. Es werden keine Steuerbits benötigt. Es können mehrere Master abwechselnd am Bus arbeiten. Nachteile Die überbrückbare Distanz ist gering. Der Verdrahtungsaufwand ist meist höher als bei I2C (3 bis 5 Leitungen). Verwendung: Datenaustausch zwischen Mikrocontrollern, aber auch mit anderen ICs (z.b. EEPROM) oder Sensoren welche über diese Schnittstelle verfügen. Zusätzliche Ein/Ausgabeports mittels TTL Schieberegistern (Wandlung seriell parallel). Die SPI Schnittstelle arbeitet mit 8 Bit Schieberegistern. Es kann frei gewählt werden, mit welcher Geschwindigkeit (mit Vorteiler aus dem Systemtakt abgeleitet) gearbeitet wird und ob MSB oder LSB zuerst gesendet werden. Aufbau der SPI-Schnittstelle Verdrahtung und Schieberichtung Im folgenden Bild sind ein Master und drei Slaves eingezeichnet. Beliebige Ausgänge (hier PB PB2) dienen dem Master, zum Auswählen des anzusteuernden Bausteins ( /SS Slave Select). Die "Slave Select" Eingänge sind dabei Low-Aktiv! Bemerkt der Slave, dass seine SS Leitung auf Low gezogen wurde (fallende Flanke), so beginnt für ihn die Übertragung. Diese Leitung dient also auch der Synchronisation der Übertragung zwischen Master und Slave. C4 Die SPI Schnittstelle 73

84 23 Die SPI Schnittstelle arbeitet synchron, d.h. mit einer gemeinsamen Taktleitung. Auf der Serial Clock Leitung (SCK) legt der Master das Taktsignal an, solange wie SS Low ist. Dazu muss allerdings mit einem Schreiben in das SPI Datenregister die Kommunikation gestartet werden (siehe später). MOSI bedeutet Master Out Slave In und wird : verbunden. Für den Master ist diese Leitung ein Ausgang (muss initialisiert werden) und beim Slave automatisch ein Eingang. Der Master sendet über diese Leitung. MISO bedeutet Master In Slave Out und wird auch : verbunden. MISO ist für den Master automatisch ein Eingang. Er empfängt Daten vom Slave über diese Leitung. Vollduplex ist also mit der SPI Schnittstelle möglich. Beim Slave muss dieses Pin als Ausgang initialisiert werden. Pin Master Slave MOSI als Ausgang zu initialisieren automatisch Eingang MISO automatisch Eingang als Ausgang zu initialisieren SCK als Ausgang zu initialisieren automatisch Eingang /SS als Ausgang zu initialisieren automatisch Eingang Es soll hier nicht auf den möglichen Multimasterbetrieb eingegangen werden. Dass /SS Pin des Masters muss für den Single Master Betrieb als Ausgang gesetzt werden! Je nach angeschlossenen Slave muss die Schnittstelle flexibel konfigurierbar sein. Mit Hilfe des DORD Bit im Kontrollregister kann die Schieberichtung festgelegt werden. Es besteht die Möglichkeit das höchstwertige Bit zuerst (DORD = ) rauszuschieben, oder mit dem niederwertigsten Bit zu beginnen(dord = ). Mit zwei weiteren Bits lässt sich auch die Taktleitung und der Zeitpunkt der Übernahme von Daten beeinflussen: 74 C4 Die SPI Schnittstelle

85 23 Die SPI-Modi und die Geschwindigkeit Mit den beiden Bits CPOL und CPHA kann einer von vier SPI Modi ausgewählt werden. CPOL bestimmt dabei die Polarität der SCK Leitung (: Ruhezustand der Taktleitung Low, : Ruhezustand High) und CPHA die Phasenlage d.h bei welcher Flanke die Daten übernommen werden sollen (: erste Flanke sofort, : zweite Flanke nach halber Taktzeit (8 )). Zwischen dem Abtasten (sample) und der Ausgabe (Schieben) des Bits bleibt immer eine halbe Periode Zeit, damit die Signale sich stabilisieren können. SPI-Modus CPOL CPHA erste Flanke zweite Flanke Bit abtasten (steigende Flanke) Bit ausgeben (fallende Flanke) Bit ausgeben (steigende Flanke) Bit abtasten (fallende Flanke) 2 Bit abtasten (fallende Flanke) Bit ausgeben (steigende Flanke) 3 Bit ausgeben (fallende Flanke) Bit abtasten (steigende Flanke) Im Modus legt der Slave seine Daten schon beim Runterziehen von SS an MISO an. Der Master kann sie dann beim ersten Flankenwechsel übernehmen. Hier ist auf das Timing zu achten (ausreichen Zeit zwischen beiden Aktionen damit kein Bit verloren geht). CPHA = C4 Die SPI Schnittstelle 75

86 23 CPHA = Quelle: Datenblatt ATmega32A Die Frequenz des SPI Taktsignals ist an sich beliebig und wird durch einen Teilungsfaktor festgelegt. Die Taktfrequenz des Controllers (Systemtakt) wird dabei durch 2, 4, 8, 6, 32, 64 oder 28 geteilt. Die maximale Geschwindigkeit des Masters liegt mit 6 MHz Quarz also bei 8 MHz. Die Geschwindigkeit des Slave soll allerdings nicht höher als Systemtakt/4 sein! Funktionsweise der SPI-Schnittstelle Der Master legt den Schiebetakt auf die SCK Leitung, nachdem er ein Byte im Schieberegister abgelegt hat. Mit jeder Periode des Taktsignals wird Bit vom Master Schieberegister ins Slave Schieberegister und gleichzeitig vom Slave Schieberegister ins Master Schieberegister geschoben. Nach 8 Taktzyklen ist die Übertragung abgeschlossen. Die beiden 8 Bit Schieberegister können als großes 6 Bit Schieberegister betrachtet werden!! Bei jeder Datenübertragung wird immer gleichzeitig ein Byte gesendet und empfangen! 76 C4 Die SPI Schnittstelle

87 23 Will der Master nur Senden, so ignoriert er die vom Slave ankommenden Bytes, d.h er liest sie nicht ein. Will er nur Empfangen, so ignoriert der Slave die nichtssagenden ankommenden Bytes vom Master. Sowohl beim Master als auch beim Slave wird das Ende der Übertragung eines Byte, nach 8 Taktzyklen durch das SPI Interrupt Flag SPIF im SPI Statusregister angezeigt. Dieses kann mittels Polling abgefragt werden oder einen Interrupt auslösen. Daten können im SPI Datenregister SPDR abgelegt oder empfangen werden, nachdem SPIF gesetzt wurde. Schreibt man in das Datenregister SPDR, so werden die Daten im Sendepuffer abgelegt, bevor sie ins Schieberegister wandern. Da der Sendepuffer nur ein Byte groß ist, sind weitere Schreibzugriffe ins Datenregister während einer Übertragung gesperrt. Wird dies trotzdem versucht, so wird die Übertragung nicht gestört, sondern die Schreib Kollision wird mit dem Flag WCOL (Write COLlision) im Statusregister SPSR. Bei Bedarf kann dies kontrolliert werden. Um Kollisionen zu vermeiden soll immer unmittelbar nach einer Übertragung (SPIF = ) ins Datenregister geschrieben werden. Der Lesebuffer beträgt zwei Bytes. Liest man Daten aus dem Datenregister SPDR, so kann dies auch noch während der Übertragung des folgenden Bytes geschehen. Das Lesen muss allerdings abgeschlossen sein bevor die Übertragung beendet wird. Die Initialisierung der SPI-Schnittstelle Damit eine Kommunikation per SPI möglich ist, müssen Sender und Empfänger richtig initialisiert werden. 4. Die Schnittstelle muss eingeschaltet werden, und es muss festgelegt werden ob der Controller als Master oder Slave arbeitet (SPE, MSTR). 5. Beim Master müssen MOSI, SCK und /SS als Ausgang initialisiert werden, beim Slave nur MISO als Ausgang. 6. Die Schieberichtung und der verwendete SPI Modus müssen festgelegt werden (DORD, CPOL, CPHA). 7. Die Geschwindigkeit muss festgelegt werden (SPR, SPR7) 8. Wird mit Interrupts statt Polling gearbeitet, so muss neben der Initialisierung des Interrupt Vektors, dem globalen Freischalten von Interrupts auch der SPI Interrupt freigeschaltet werden (SPIE) Die SPI Schnittstelle benötigt nur drei SF Register. 7 Nur im Fall, dass die höchst mögliche Geschwindigkeit nötig ist oder der Teilungsfaktor 8 bzw. 32 benötigt wird, muss zusätzlich das Bit zur Verdopplung der Geschwindigkeit im SPI Statusregister gesetzt werden (SPI2X in SPSR) C4 Die SPI Schnittstelle 77

88 23 SPI-Kontrollregister SPCR Die gesamte Initialisierung kann im vorgenommen werden. SPSR Das SPI-Statusregister dient hauptsächlich der Abfrage des SPI Interrupt Flags SPIF beim Polling. SPDR Daten werden über das SPI-Datenregister in den Sendepuffer geschrieben bzw. aus dem Empfangspuffer gelesen. Die SF-Register der SPI-Schnittstelle Das SPI Control Register SPCR Das SPI Control Register befindet sich auf der SRAM Adresse x2d (SF Register Adresse xd) und wird mit der Abkürzung "SPCR" angesprochen (Definitionsdatei). Die Befehle sbi, cbi, sbic und sbis können verwendet werden. SPCR = SPI Control Register Bit SPCR xd Startwert Read/Write SPIE SPIE SPE DORD MSTR CPOL CPHA SPR SPR SPI Interrupt Enable kein SPI Interrupt erlaubt. In dem Moment, wo die Übertragung aller 8 Bit beendet ist wird das SPI Interrupt Flag SPIF im Statusregister SPSR gesetzt. Das Setzen des SPIE Flag ermöglicht das Auslösen eines Interrupts sobald SPIF gesetzt wurde. Interrupts müssen dazu global frei gegeben sein (I = im SREG mit "sei"). SPIF wird hardwaremäßig gelöscht wenn der Interrupt abgearbeitet wird. SPE DORD MSTR SPI Enable schaltet SPI aus. schaltet SPI ein. Muss gesetzt werden, damit SPI Operationen durchgeführt werden. Data ORDer das höchstwertigste Bit MSB wird als Erstes gesendet. das niederwertigste Bit LSB wird als Erstes gesendet. Master/Slave Select CPOL Clock Polarity CPHA 78 Controller ist Slave. Controller ist Master. Das Bit muss vor oder gleichzeitig mit dem SPE Bit gesetzt werden! Ruhezustand der Taktleitung ist Low. Ruhezustand der Taktleitung ist High. Clock PHAse C4 Die SPI Schnittstelle

89 23 Daten werden sofort bei der ersten Flanke übernommen. Daten werden bei der zweiten Flanke nach der halben Taktzeit (8 ) übernommen. Mit CPOL und CPHA wird der SPI Modus festgelegt: CPOL CPHA SPI Modus: 2 3 SPI Clock Rate Select SPRn SPR2X, SPR, SPR Mit drei Bit wird die Taktgeschwindigkeit (Frequenz) des Busses SCK festgelegt. Dies betrifft nur den Master. Das Bit SPR2X befindet sich im SPI Statusregister SPSR (Bit ). SPR2X SPR SPR SCK Frequenz: Systemtakt / 4 Systemtakt / 6 Systemtakt / 64 Systemtakt / 28 Systemtakt / 2 Systemtakt / 8 Systemtakt / 32 Systemtakt / 64 Weitere Informationen findet man im Datenblatt S 37. Das SPI Status Register SPSR Das SPI Status Register befindet sich auf der SRAM Adresse x2e (SF Register Adresse xe) und wird mit der Abkürzung "SPSR" angesprochen (Definitionsdatei). Die Befehle sbi, cbi, sbic und sbis können verwendet werden. SPSR = SPI Status Register Bit SPSR xe Startwert Read/Write SPIF SPIF WCOL SPI2X R R R R R R R SPI Interrupt Flag Übertragung noch nicht beendet. C4 Die SPI Schnittstelle 79

90 WCOL 23 In dem Moment, wo die Übertragung aller 8 Bit beendet ist wird das SPI Interrupt Flag SPIF gesetzt. Das Setzen des SPIE Flag in SPCR ermöglicht das Auslösen eines Interrupts. SPIF wird hardwaremäßig gelöscht wenn der Interrupt abgearbeitet wird. Wird SPIF im Polling Betrieb abgefragt, so kann das Flag durch Lesen des Statusregisters SPSR bei gesetztem SPIF und anschließendem Lesen oder Schreiben des Datenregisters SPDR gelöscht werden. Write COLlision Flag keine Schreibkollision aufgetreten. Wird SPDR während der Datenübertragung beschrieben, so meldet das WCOL Flag eine Schreibkollision. Das Flag kann (zusammen mit SPIF) durch Lesen des Statusregisters SPSR bei gesetztem WCOL und anschließendem Lesen oder Schreiben des Datenregisters SPDR gelöscht werden. SPI2X Double SPI Speed Bit keine Verdopplung der Taktgeschwindigkeit des Busses. Verdopplung der Taktgeschwindigkeit des Busses (siehe Tabelle SPCR). Das SPI Data Register SPDR Das SPI Data Register befindet sich auf der SRAM Adresse x2f (SF Register Adresse xf) und wird mit der Abkürzung "SPDR" angesprochen (Definitionsdatei). Die Befehle sbi, cbi, sbic und sbis können verwendet werden. Das Register ist les und schreibbar. SPDR = SPI Data Register Bit SPDR xf Startwert Read/Write 7 (MSB) (LSB) SPDR7 SPDR6 SPDR5 SPDR4 SPDR3 SPDR2 SPDR SPDR Der Startwert ist undefiniert. Ansteuerung eines Slaves mittels Polling Mittels zweier ATmega32A soll eine SPI Übertragung in beide Richtungen zwischen einem Master und einem Slave realisiert werden. Beide Controller besitzen 8 Schalter und 8 LEDs. Die Schalterstellung des Master soll an den LEDs des Slave sichtbar sein und umgekehrt. 8 C4 Die SPI Schnittstelle

91 23 Programm für den Master: ;Schalter und LEDs initialisieren clr Tmp ;8 Schalter an PORTA DDRA,Tmp ser Tmp PORTA,Tmp ;Pull-Ups DDRC,Tmp ;8 LEDs an PORTC ;SPI Master initialisieren ;SPI-Ausgaenge initialisieren (PB6 (MISO) automatisch Eingang) sbi DDRB,4 ;PB4 Ausgang (/SS) muss beim Master Mode vor dem ;Einschalten der Schnittstelle geschehen! sbi DDRB,5 ;PB5 Ausgang (MOSI) sbi DDRB,7 ;PB7 Ausgang (SCK) ;SPI einschalten, Master mit SCK = Systemtakt/28, MSB first, SPI Mode Tmp,x57 ;SPCR = b SPCR,Tmp ;B7 SPIE= kein Interrupt ;B6 SPE= SPI einschalten ;B5 DORD= MSB zuerst ;B4 MSTR= Master ;B32 CPOL= CPHA= SPI Modus ;B SPR= SPR= Systemtakt/28 (25khz) ;Slave aktivieren cbi PORTB,4 ;Slave aktivieren ; ; Hauptprogramm ; MAIN: in Tmp,PINA ;Schalter einlesen und ueber SPI uebertragen SPDR,Tmp ;Starte die Uebertragung W_SPIF: sbis SPSR,SPIF ;Warte bis Uebertragung fertig rjmp W_SPIF in Tmp,SPDR ;Empfange Byte vom Slave PORTC,Tmp ;und Ausgabe an LEDs rjmp MAIN ;Endlosschleife C4 Die SPI Schnittstelle 8

92 23 Programm für den Slave: ;Schalter und LEDs initialisieren clr Tmp ;8 Schalter an PORTA DDRA,Tmp ser Tmp PORTA,Tmp ;Pull-Ups DDRC,Tmp ;8 LEDs an PORTC ;SPI Slave initialisieren ;SPI-Ausgang initialisieren ;(PB4(/SS), PB5(MOSI) und PB7(SCK) automatisch Eingang) sbi DDRB,6 ;PB6 Ausgang (MISO) ;SPI einschalten, Slave mit SCK = Systemtakt/28, MSB first, SPI Mode r6,x47 ;SPCR = b SPCR,r6 ;B7 SPIE= kein Interrupt ;B6 SPE= SPI einschalten ;B5 DORD= MSB zuerst ;B4 MSTR= Slave ;B32 CPOL= CPHA= SPI Modus ;B SPR= SPR= Systemtakt/28 (25khz) ; ; Hauptprogramm ; MAIN: in Tmp,PINA ;Schalter einlesen W_SPIF: sbis SPSR,SPIF ;Warte bis Empfang fertig rjmp W_SPIF SPDR,Tmp ;Daten ueber SPI uebertragen in Tmp,SPDR ;Empfangene Daten einlesen PORTC,Tmp ;und auf LEDs ausgeben rjmp MAIN ;Endlosschleife C4 Teste die Übertragung mit den beiden vorgegebenen Programme 8. Schreibe die Programme so um, dass die Initialisierung und das Polling jeweils in einem Unterprogramm erfolgen. Nenne die neuen Programme "C4_SPI_master_polling.asm" und "C4_SPI_slave_polling.asm". Bemerkungen: Nach dem Programmieren ist ein Reset des Masters notwendig, damit der Slave richtig synchronisiert. Bei zu hohen Frequenzen (6 MHz/4 = 4 MHz) und mit CHPA = (Modus ) funktionierte die Synchronisation nicht zuverlässig. Abhilfe schafft das konsequente Einsetzen der /SS Leitung um den Slave vor der Übertragung eines jeden Bytes zu synchronisieren. Acht auf eine gemeinsame Masse zwischen beiden Schaltungen! Ansteuerung eines Slaves mittels Interrupt Die gleiche Aufgabe soll nun mit Interrupts erledigt werden. Programm für den Master: ; ; Sprungadressen fuer die Interrupts organisieren (ISR VECTORS) ; ;Vektortabelle (im Flash-Speicher).ORG SPIaddr ;interner Vektor fuer SPI (alt.:.org x8) 8 Download auf 82 C4 Die SPI Schnittstelle

93 rjmp ISRSPI 23 ;Springe zur ISR von SPI Transfer Ready... ;Schalter und LEDs initialisieren clr Tmp ;8 Schalter an PORTA DDRA,Tmp ser Tmp PORTA,Tmp ;Pull-Ups DDRC,Tmp ;8 LEDs an PORTC ;SPI Master initialisieren ;SPI-Ausgaenge initialisieren (PB6 (MOSI) automatisch Eingang) sbi DDRB,4 ;PB4 Ausgang (/SS) muss beim Master Mode vor dem ;Einschalten der Schnittstelle geschehen! sbi DDRB,5 ;PB5 Ausgang (MOSI) sbi DDRB,7 ;PB7 Ausgang (SCK) ;SPI einschalten, Master mit SCK = Systemtakt/28, MSB first, SPI Mode r6,xd7 ;SPCR = b SPCR,r6 ;B7 SPIE= Interrupt!! ;B6 SPE= SPI einschalten ;B5 DORD= MSB zuerst ;B4 MSTR= Master ;B32 CPOL= CPHA= SPI Modus ;B SPR= SPR= Systemtakt/28 (25 khz) ;Slave aktivieren cbi PORTB,4 ;Slave aktivieren ; ; Hauptprogramm ; MAIN: sei ;Interrupts Global erlauben clr Tmp SPDR,Tmp ;Uebertragung starten END: rjmp END ;Endlosschleife ; ; Unterprogramme und Interrupt-Behandlungsrinen ; ;Interruptrine zum Senden und Empfangen über den SPI Bus ISRSPI: in r6,pina ;Schalter einlesen und ueber SPI versenden SPDR,r6 in r6,spdr ;Empfange Byte vom Slave an den LEDs ausgeben PORTC,r6 reti ;Rücksprung ins Hauptprogramm Programm für den Slave: ; ; Sprungadressen fuer die Interrupts organisieren (ISR VECTORS) ; ;Vektortabelle (im Flash-Speicher).ORG SPIaddr ;interner Vektor fuer SPI (alt.:.org x8) rjmp ISRSPI ;Springe zur ISR von SPI Transfer Ready... ;Schalter und LEDs initialisieren clr Tmp ;8 Schalter an PORTA DDRA,Tmp ser Tmp PORTA,Tmp ;Pull-Ups DDRC,Tmp ;8 LEDs an PORTC ;SPI Slave initialisieren ;SPI-Ausgang initialisieren ;(PB4(/SS), PB5(MOSI) und PB7(SCK) automatisch Eingang) sbi DDRB,6 ;PB6 Ausgang (MISO) ;SPI einschalten, Slave mit SCK = Systemtakt/28, MSB first, SPI Mode C4 Die SPI Schnittstelle 83

94 r6,xc7 SPCR,r6 23 ;SPCR = b ;B7 SPIE= kein Interrupt ;B6 SPE= SPI einschalten ;B5 DORD= MSB zuerst ;B4 MSTR= Slave ;B32 CPOL= CPHA= SPI Modus ;B SPR= SPR= Systemtakt/28 (25kHz) ; ; Hauptprogramm ; MAIN: sei ;Interrupts Global erlauben END: rjmp END ;Endlosschleife ; ; Unterprogramme und Interrupt-Behandlungsrinen ; ;Interruptrine zum Senden und Empfangen über den SPI Bus ISRSPI: in r6,pina ;Schalter einlesen und SPDR,r6 ;ueber SPI uebertragen in r6,spdr ;Empfangene Daten auf LEDs ausgeben PORTC,r6 reti ;Rücksprung ins Hauptprogramm C4 Teste die Übertragung mit den beiden vorgegebenen Programme 9. Schreibe die Programme so um, dass die Initialisierung jeweils in einem Unterprogramm erfolgt. Nenne die neuen Programme "C4_SPI_master_interrupt.asm" und "C4_SPI_slave_interrupt.asm". Weitere Aufgaben C42 Im SRAM eines Slave befinden sich Werte eines Sensors. Ein Master aktiviert den Slave um die Werte abzufragen (Polling). Dabei wird für jedes Byte die /SS Leitung aktiviert. Der Master speichert die Werte im SRAM und gibt sie dann auf dem Display aus. Der Slave übermittelt die Werte mit Hilfe einer Interruptrine. Nenne die neuen Programme "C42_SPI_master_polling_.asm" und "C42_SPI_slave_interrupt_.asm". C43 Die folgende Aufgabe stammt aus dem Lehrbuch von Roland Walter (www.rowalt.de). Das Brenngerät (Programmer) dient in dieser Aufgabe als Master. Damit unser Slave nicht umprogrammiert wird, sondern die Daten über SPI richtig empfängt muss die Reset Leitung des Programmiergerätes mit dem /SS Pin statt dem Reset Pin des AVR verbunden werden. Bastle dazu einen Adapter. Die Befehle des Programmiergerätes können dann eingelesen werden und über die serielle Schnittstelle an einen PC übermittelt werden. Weitere Informationen zu den Befehlen findet man im Datenblatt des ATmega32A (bzw. ATmega8A) unter Memory Programmimg, Serial Downloading, SPI Serial Programmimg Instruction Set. Teste das Programm und finde heraus welche Befehle das Programmiergerät sendet. Nenne das neue Programm "C43_SPI_slave_interrupt_programmer.asm". 9 Download auf 84 C4 Die SPI Schnittstelle

95 C44 23 Die folgende Aufgabe stammt ebenfalls aus dem Lehrbuch von Roland Walter (www.rowalt.de). Es soll ein Master so programmiert werden, dass er einen beliebigen anderen Controller als Brenngerät (Programmer) anspricht. Der Slave wird dabei vom Master mit Spannung versorgt. Seine Reset Leitung wird über einen Ausgang (z.b. PB4,/SS) aktiviert. Die Befehle für das Programmiergerätes findet man im Datenblatt des ATmega32A (bzw. ATmega8A) unter Memory Programmimg, Serial Downloading, SPI Serial Programmimg Instruction Set. Das Programm soll den Slave in den Programmiermodus versetzen, dann die drei Signatur Bytes auslesen und dann den Programmiermodus wieder beenden. Nenne das Programm "C44_SPI_master_polling_programmer.asm". C4 Die SPI Schnittstelle 85

96 86 23 C4 Die SPI Schnittstelle

97 23 C5 Die USB-Schnittstelle In diesem Kapitel soll die Kommunikation über USB möglichst einfach dargestellt werden. Es wird ebenfalls eine kleine USB Bibliothek für ATMEL USB AVRs vorgestellt. Die Bibliothek verwendet keine Standardklassen. Sie arbeitet auf der PC Seite mit der freien libusb. Die Software und weitere Erklärungen findet man unter Kurze Einführung zu USB USB-Transfer Die USB Übertragung zwischen PC (host) und Gerät (device, function) besteht aus mehreren Protokollschichten. Die gesamte Übertragung (Kommunikationsanforderung herstellen und ausführen) wird als USB-Transfer bezeichnet. Es existieren vier unterschiedliche Transfertypen2: Control Transfer: zur Identifikation und Steuerung des Gerätes und für herstellerspezifische Anforderungen (muss von jedem USB Gerät unterstützt werden und arbeitet immer mit Endpunkt (siehe weiter unten)) Bulk Transfer: zur Übertragung großer Datenmengen ohne garantierte Geschwindigkeit (Bsp.: Laufwerk) Interrupt Transfer: mit garantierter Bandbreite für geringes Datenvolumen (Bsp.: Tastatur) Isochron Transfer: mit garantierter Bandbreite aber ohne Fehlerkorrektur (Bsp.: Streaming von Audiodaten) Ein Transfer besteht aus einer oder mehreren Transaktionen (Übergabe eines Dienstes an einen Endpunkt). Es gibt drei Arten von Transaktionen2: SETUP (Control) Transaktion: bidirektionale Nachrichten IN Transaktion: Daten vom Gerät zum PC OUT Transaktion: Daten vom PC zum Gerät Jede Transaktion muss ohne Unterbrechung abgeschlossen werden. Jede Transaktion besteht aus drei Paketen (Phasen)22: 2 Control Transfers nutzen bidirektionale Nachrichten Kanäle (Pipes). Die anderen Transfers nutzen unidirektionale Datenstrom Kanäle. 2 Zur Zeitsteuerung wird auch ein Start Of Frame Transfer bzw. Transaktion durchgeführt. Ebenfalls existiert also ein SOF Token. Es überträgt eine Zeitreferent (ms oder 25µs). 22 Es existiert auch eine vierte "Special" Phase. Auf sie soll hier nicht eingegangen werden. C5 Die USB-Schnittstelle 87

98 23 TOKEN Paket: gibt an um welchen Transaktionstyp es sich handelt (SETUP, IN, OUT) (optionale) DATA Paket: enthält Daten oder Statusinformationen (DATA 2, MDATA) Speziell: Beim erfolgreichen Abschließen eines Control Transfers wird als Status Information (siehe Handshake) ein Datenpaket ohne Daten ( ZLP, Zero Length data Packet) anstelle einer Bestätigung (ACK) versendet. STATUS (Handshake) Paket: Feedback zur Kommunikation: "Erfolg", "bin beschäftigt (warten)" und "nicht unterstützt" (ACK, NAK, STALL (NYET)). Die Paketzusammenstellung wird von der Hardware bewerkstelligt. Auf sie soll nicht weiter eingegangen werden. Endpunkte Der Datenaustausch passiert zwischen dem PC und einem spezifischen Geräteendpunkt (endpoint EP). Ein Endpunkt ist ein Datenspeicher (FIFO 23, Puffer, Speicherbank) im Gerät, der meist nur aus Bytes besteht. Jedes Gerät hat mehrere Endpunkte die über die Endpunktadresse (5) angesprochen werden. Diese Adresse enthält in Bit 7 ebenfalls die Richtung der Datenkommunikation24. Der Control Endpunkt ist in jedem Gerät vorhanden und wird für zum Beispiel für die Enumeration benötigt. Er ist als einziger Endpunkt bidirektional. Bei USB. hat er einen 8 Byte großen FIFO Speicher. Die Anzahl und mögliche Größe der anderen Endpunkte variiert. Jede Transaktion ist an eine Geräte und eine Endpunktadresse gebunden. 23 FIFO (First In First Out): Speicherbank, welche zuerst abgelegte Daten beim Lesen auch als erstes wieder ausgibt, im Gegensatz zum LIFO (Last In First Out), der zum Beispiel beim AVR Stapel verwendet wird. 24 Außer dem Control Endpunkt, da dieser bidirektional; Bit 7 = : OUT Endpunkt; Bit 7 = : IN Endpunkt 88 C5 Die USB-Schnittstelle

99 23 Control Transfer Die gesamte Enumeration der Gerätes erfolgt mittels Control Transfers (Standard Anfragen). Control Transfers können auch für herstellerspezifische Anforderungen genutzt werden. Der Control Transfer besteht aus drei Abschnitten (stages): 9. Der SETUP-Abschnitt besteht aus einer Transaktion..Der DATEN-Abschnitt kann wegfallen. Er besteht aus keiner, einer oder mehreren Transaktionen..Der STATUS-Abschnitt (Handshake) besteht aus einer Transaktion. Der SETUP-Abschnitt ( Transaktion) Die Anfrage (request) erfolgt in der Setup Token. Der PC sendet das Setup Token und das Setup Paket (Daten Paket). Das Gerät antwortet mit ACK. Alle Informationen zur Anfrage befinden sich im 8 Byte großen Setup Paket 25: Feld Bytes bmrequesttype brequest wvalue 2 windex 2 wlength 2 bmrequesttype Bit DIR DIR TYPE TYPE REC4 REC3 REC2 REC REC Data Phase Transfer Direction PC zum Gerät (OUT) Gerät zum PC (IN) 25 Benutzte Präfixe: b = Byte, w = Word, bm = Bitmap, bcd = binaercodierte Dezimalzahl, i = Index, id = Kennung C5 Die USB-Schnittstelle 89

100 TYPE TYPE, TYPE Standard Klasse Vendor (herstellerspezifische Anfrage) Reserviert REC Recipient REC, REC Device Interface Endpoint otherreserviert 23 Der DATEN- und der STATUS-Abschnitt (Handshake) Der schreibende Control Transfer (Data OUT) Bei diesem Transfer teilt der PC dem Gerät im Setup Abschnitt mit, dass er Daten zum Gerät senden will. Bei der Datenphase gibt es nach dem Empfang der Daten dann drei Möglichkeiten. Das Gerät kann den Empfang bestätigen (ACK), den PC auffordern zu warten (NAK) oder Abbrechen (STALL). Tritt beim Token oder Datenpaket ein Fehler auf, so wird das Paket ignoriert. Der DATEN Abschnitt kann aus mehreren Transaktionen bestehen! War der Transfer erfolgreich, so sendet das Gerät in der Handshake Phase ein "Zero Length" Paket an den PC zurück. Der PC antwortet mit ACK. Trat ein Fehler beim Endpunkt auf, so sendet das Gerät einen STALL. Ist es noch beschäftigt, so sendet es ein NAK. Tritt sonst ein Fehler auf, so wird das Paket ignoriert. Der lesende Control Transfer (Data IN) Bei diesem Transfer teilt der PC dem Gerät im SETUP Abschnitt mit, dass er Daten vom Gerät lesen möchte. Hier gibt es ebenfalls drei Möglichkeiten. Das Gerät kann den IN Token annehmen und die Daten bereitstellen. Der PC antwortet mit ACK. Ist das Gerät noch beschäftigt, so sendet es ein NAK. Trat ein Fehler beim Endpunkt auf, so sendet es einen STALL. Tritt sonst ein Fehler auf, so wird das Paket ignoriert. 9 C5 Die USB-Schnittstelle

101 23 In der Handshake Phase meldet der PC mit einem "Zero Length" Paket ob er die Daten erfolgreich erhalten hat. Das Gerät antwortet mit ACK. Fehler oder ein beschäftigtes Gerät geben STALL bzw. NAK zurück. Bei sonstigen Fehlern wird das Paket ignoriert. Die Enumeration Der Vorgang bei dem der PC dem Gerät eine Adresse zuordnet, alle Informationen über das Gerät erfragt, den richtigen Treiber lädt und dann eine Konfiguration auswählt, wird Enumeration genannt. Mittels Standard Anfragen (standard request) wird vom PC die Adresse des Gerätes festgelegt und mehrere sogenannte Deskriptoren (Beschreibungen) erfragt. Jedes Gerät muss mindestens 4 Deskriptoren liefern: Geräte-Deskriptor (device descriptor) Konfigurations-Deskriptor (configuration descriptor) Schnittstellen-Deskriptor (interface descriptor) Endpunkt-Deskriptor (endpoint descriptor) Es sollen hier nur die aller nötigsten Schritte einer Enumeration vereinfacht beschrieben werden. Wir gehen dabei von nur einer Konfiguration und einem Interface ohne alternative Einstellungen aus. Nachdem das Gerät an den Bus angeschlossen wurde, ermittelt der PC anhand der Spannungen der beiden Signalleitungen ob ein Low oder Full Speed angeschlossen wurde. Der PC resetet dann das Gerät (beide Datenleitungen auf Low) und stellt dabei fest ob es sich um ein Highspeed Gerät handelt. Nach dem Reset des Gerätes ist dies bereit über Endpunkt auf der Adresse angesprochen zu werden. C5 Die USB-Schnittstelle 9

102 23 Die Standard Anfragen werden dann mittels SETUP Paketen (siehe Control Transfer) durchgeführt. Das erste SETUP Paket (Get_Deskriptor) des PC erfragt (Adresse Null, Endpunkt ) 64 Byte des Geräte Deskriptor um die maximale Paketgröße von Endpunkt zu ermitteln26. Nach 8 Byte (hier befindet sich die bmaxpacketsize) bricht der PC ab und führt ein neues Reset des Gerätes aus. Mit dem zweiten SETUP Paket ( Set_Adress) sendet der PC eine Geräte Adresse. Diese wird von der Firmware dem Gerät zugewiesen. Das dritte SETUP Paket (Get_Deskriptor) erfragt die 8 Byte des Geräte Deskriptors. Dann werden mit einem vierten SETUP Paket (Get_Deskriptor) die 9 Byte des Konfigurations Deskriptors erfragt. Dieses vermittelt die Gesamtlänge des Konfigurations, Interface und aller Endpunkt Deskriptoren. Ein fünftes SETUP Paket (Get_Deskriptor) erfragt all diese Deskriptoren in einer Aktion. Weitere SETUP Pakete erfragen optionale Deskriptoren (z.b. String Deskriptoren). Der PC lädt jetzt anhand von Vendor ID und Product ID und der ".INF" Datei den entsprechenden Gerätetreiber. Ein letztes SETUP Paket der Emuneration ( Set_Configuration) bewirkt das Initialisieren und Aktivieren der User Endpunkte (Endpunkt 5). Andere, von einer Firmware nicht unterstützte Anfragen des PCs mittels SETUP Paketen, werden einfach mit STALL abgewiesen. Der Geräte-Deskriptor Es gibt pro Gerät nur einen Geräte Deskriptor27. Hier der Geräte Deskriptor mit den Werten für unsere minimale Firmware: Feldbezeichnung Byte Wert Beschreibung blength 8 (x2) bdescriptortype bcdusb 2 x bdeviceclass xff Klassencode (hier anbieterspezifisch = xff) bdevicesubclass xff Unterklassencode (hier anbietersp. = xff) bdeviceprotocoll xff Protokollcode (hier anbieterspezifisch = xff) bmaxpacketsize 8 idvendor 2 x3eb Atmel Code durch usb.org vergeben idproduct 2 x Produkt ID beliebig bcddevice 2 x Release Nummer Gerät imanufacturer Index für String-Deskriptor Hersteller iproduct 2 Index für String-Deskriptor Produkt iserialnumber 3 Index für String-Deskriptor Seriennummer bnumconfigurations Anzahl möglicher Konfigurationen Größe des Deskriptors in Byte Geräte Deskriptor = (Konstante) USB_Spec_ max. Paketgröße Endpunkt (EP_FS) 26 Diese kann 8, 6, 32, 64 Byte betragen. 27 Außer bei Verbundgeräten (composite device), die über die Schnittstellen Deskriptoren statt über den Geräte Deskriptor beschrieben werden. 92 C5 Die USB-Schnittstelle

103 23 Der Konfigurations-Deskriptor Ein Gerät kann mehrere Konfigurationen besitzen (bnumconfigurations). Ein Gerät kann zum Beispiel eine Konfiguration für die Stromversorgung per Bus besitzen und eine zweite Konfiguration für eine eigenständige Versorgung. Der Gerätetreiber wählt dann die entsprechende Konfiguration aus. Es ist immer nur eine Konfiguration aktiv. Im Feld wtotallength wird dem PC die Gesamtzahl der Bytes aller Konfigurations, Schnittstellen und Endpunkt Deskriptoren mitgeteilt. In unserem Fall sind das 9 Byte ( Konfigurations Deskriptor) + 9 Byte ( Schnittstellen Deskriptor) + 3*7 Byte (3 Endpunkte neben Endpunkt ) = 39 Byte. Feldbezeichnung Byte Wert Beschreibung blength 9 Größe des Deskriptors in Byte bdescriptortype 2 Konfigurations-Deskriptor = 2 (Konstante) wtotallength 2 39 (x27) bnuminterfaces Anzahl der Schnittstellen bconfigurationvalue Nummer um diese Konfiguration auszu-wählen (darf nicht Null sein, sonst geht Gerät in den nicht-konfigurierten Zustand) iconfiguration Index für String-Deskriptor dieser Konfiguration ( = kein Text) bmattributes x8 D7 = Versorgung durch Bus, D6 = Selbstversorgung, D5 = Remote Wakeup bmaxpower 5 Länge des Konfigurations-Deskriptors und aller untergeordneter Deskriptoren Max. Strombezug vom Bus in 2mA Schritten Der Schnittstellen-Deskriptor Der Schnittstellen Deskriptor bündelt mehrere Endpunkte zu einer Funktionsgruppe. Es können mehrere Schnittstellen gleichzeitig aktiv sein (Beispiel, Fax Schnittstelle, Druck Schnittstelle und Scan Schnittstelle bei Multifunktionsdrucker). Eine Schnittstelle kann mit der gleichen Schnittstellennummer mehrere alternative Einstellungen beherbergen, welche allerdings nicht gleichzeitig aktiviert werden können. Ein schnelles Umschalten zwischen den alternativen Einstellungen ist möglich. Feldbezeichnung Byte Wert blength 9 Größe des Deskriptors in Byte bdescriptortype 4 Schnittstellen-Deskriptor = 4 (Konstante) binterfacenumber Anzahl der Schnittstellen balternatesetting Nummer um alternative Einstellungen zu wählen bnumendpoints 3 Anzahl der Endpunkte außer Endpunkt binterfaceclass xff Klassencode (hier anbieterspezifisch = xff) binterfacesubclass xff Unterklassencode (hier anbietersp. = xff) C5 Die USB-Schnittstelle Beschreibung 93

104 binterfaceprotocol xff iinterface 23 Protokollcode (hier anbieterspezifisch = xff) Index für String-Deskriptor dieser Schnittstelle ( = kein Text) Der Endpunkt-Deskriptor Die Endpunkt Deskriptoren beschreiben die Endpunkt (außer Endpunkt ). Wichtig ist, dass bei der Endpunktadresse auch die Richtung mittels Bit 7 angegeben werden muss. Hier der Deskriptor für Endpunkt (IN, Bulk, FIFO 8 Byte) Feldbezeichnung Byte Wert Beschreibung blength 7 Größe des Deskriptors in Byte bdescriptortype 5 Schnittstellen-Deskriptor = 5 (Konstante) bendpointaddress x8 bmattributes 2 Transfertyp = Bulk (contr. =, iso. =, int. = 3) wmaxpacketsize 2 8 FIFO Größe des Endpunkts in Byte binterval Polling Interval = (ignoriert für Bulk und Control), für Iso, -255 für Interrupt Bit 7 = (IN), Bit -3 Endpunkt-Nummer (andere ) Die String-Deskriptoren Sie sind nicht unbedingt nötig, liefern aber zusätzliche lesbare Informationen. Wird ein String Deskriptor nicht benötigt, so wird sein Index auf gesetzt. Strings sind in Unicode (6 Bit) kodiert. Es werden viele unterschiedliche Sprachen unterstützt. Im String Deskriptor mit dem Index werden die unterstützten Sprachen festgelegt. Hier als Beispiel eine Unterstützung für Englisch und Deutsch: Feldbezeichnung Byte Wert Beschreibung blength 6 Größe des Deskriptors in Byte bdescriptortype 3 String-Deskriptor = 3 (Konstante) wlangid[] 2 x49 English USA (Standard) wlangid[] 2 x47 Deutsch Standard Als nächster Deskriptor folgt dann der Deskriptor mit Index Eins (hier Hersteller String Deskriptor) 94 Feldbezeichnung Byte Wert Beschreibung blength 8 Größe des Deskriptors in Byte bdescriptortype 3 String-Deskriptor = 3 (Konstante) bstring 6 x57,x45,... "W","E","I","G","U",".","L","U" C5 Die USB-Schnittstelle

105 23 Firmware AT9USBKEY Kurze Beschreibung der Firmware Der AT9USBKEY ist eine billige kleine Entwicklungsplatine von ATMEL mit einem AT9USB287 Controller. Die Firmware besteht aus 2 Dateien (Hauptprogramm, USB Bibliothek). Es wird nur eine Konfiguration und ein Interface verwendet. Es stehen neben dem zwingend vorgeschriebenem Endpunkt Null (EP) noch zwei weitere Endpunkte zur Verfügung. Ein OUT Endpunkt (EP) erlaubt dem PC Daten zum Gerät zu senden. Ein IN Endpunkt (EP2) ermöglicht es dem PC Daten vom Gerät zu lesen. Hauptprogramm: Eine blinkende LED zeigt, dass die Firmware läuft. Mit einem Flag kann das Blinken abgestellt werden. USB-Bibliothek Treiberfunktionen: Nach dem Anstecken führt der PC (Host) ein Reset das Gerät (device) aus. Der USB Teil und die interne PLL des AT9USB287 werden eingeschaltet und initialisiert. Tritt dann ein End of Reset Interrupt (EORSTI) auf, so kann der bei jedem USB Gerät vorhandene bidirektionelle Control Endpunkt (EP) initialisiert und aktiviert werden. Als nächstes sendet der PC ein SETUP Paket an Endpunkt, das durch ein Received SETUP Interrupt (RXSTPI) erkannt wird. Enumeration: Standard Requests werden vom PC mittels SETUP Paketen erfragt. Das erste SETUP Paket (Get_Deskriptor) des PC erfragt (Adresse Null, Endpunkt ) 64 Byte des Geräte Deskriptor um die maximale Paketgröße von Endpunkt zu ermitteln. Nach 8 Byte (hier befindet sich die bmaxpacketsize) bricht der PC ab und führt ein neues Reset des Gerätes aus. Mit dem folgenden SETUP Paket (Set_Adress) sendet der PC eine Geräte Adresse. Diese wird von der Firmware dem Gerät zugewiesen. Das dritte SETUP Paket erfragt die 8 Byte des Geräte Deskriptors. Dann werden mit einem vierten SETUP Paket die 9 Byte des Konfigurations Deskriptors erfragt. Dieses vermittelt die Gesamtlänge des Konfigurations, Interface und aller Endpunkt Deskriptoren. Ein fünftes SETUP Paket erfragt all diese Deskriptoren (hier 5) in einer Aktion. Weitere SETUP Pakete erfragen erfragen die 4 String Deskriptoren. Der PC kann jetzt anhand von Vendor ID und Product ID und der ".INF" Datei den C5 Die USB-Schnittstelle 95

106 23 entsprechenden Gerätetreiber laden. Ein letztes SETUP Paket der Emuneration ( Set_Configuration) bewirkt das Initialisieren und Aktivieren der zwei User Endpunkte. Die Firmware antwortet auch noch auf Statusanfragen ( Get_Status).28 Andere, von dieser Firmware nicht unterstützte Anfragen des PC mittels SETUP Paket werden mit STALL abgewiesen. Anwendungskommunikation: Folgende Aktionen können nun von der PC Software gestartet werden: a) b) Ein und Ausschalten einzelner Bits (4 LEDs an PD4 PD7 und das Blink Flag PD) eines Ports ( Byte) über Endpunkt (OUT Aktion (PC Gerät)). Analoge Daten (Analog Digitalwandler) über den FIFO des Endpunkt 2 einlesen (IN Aktion (Gerät PC)). Zur Kommunikation mit den Endpunkten: Control Endpunkt SETUP-Abschnitt: Das Received SETUP Interrupt (RXSTPI) Flag wird gesetzt wenn ein SETUP Paket eintrifft (SETUP Abschnitt). In der Firmware wird ein Interrupt ausgelöst. In der Interruptrine wird ein Unterprogramm zur Behandlung des SETUP Pakets aufgerufen. In diesem Unterprogrsamm löscht die Firmware mit CBI(UEINTX,RXSTPI)29 das Interrupt Flag um das SETUP Paket zu bestätigen (ACK) und den FIFO Puffer des Endpunktes zu löschen. DATA IN und STATUS-Abschnitt: Das TXINI Flag (Transmitter Ready Interrupt Flag) zeigt, dass der FIFO Puffer frei ist und vom Controller gefüllt werden kann. Nachdem dies geschehen ist wird mit CBI(UEINTX,TXINI) das bis zu 8 Byte große Paket (FIFO Größe EP) abgeschickt und der FIFO wird wieder gelöscht, so dass er neue Daten aufnehmen kann. Wurden mehr als 8 Byte angefragt, so können mehrere Pakete vor dem Status Abschnitt gesendet werden. Dazu muss jedes Mal überprüft werden ob der FIFO Speicher leer ist (TXINI = ). Das erste OUT Paket vom PC wird von der Hardware automatisch mit NAK (PC soll warten) beantwortet. Das nächste OUT Paket setzt das RXOUTI Flag (Received OUT Data 28 Das Behandeln dieser Anfrage besteht nur um unschöne Fehlermeldungen bei lsusb -v unter Linux zu vermeiden (kann bei Bedarf gelöscht werden). 29 cbi (UEINTX,RXSTPI) steht für lösche Bit RXSTPI im SF Register UEINTX. cbi uns sbi (setze Bit) existieren so nur für die untersten 32 SF Register. Alle USB Register befinden sich im erweiterten Bereich und müssen mittels direkter SRAM Adressierung und Maskierung angesprochen werden. 96 C5 Die USB-Schnittstelle

107 23 Interrupt). Das Flag teilt mit, wann das Zero Length Paket vom PC angekommen ist. Per Polling wird auf das ZLP gewartet und dann das Flag wieder gelöscht CBI(UEINTX,RXOUTI). Quelle: Datenblatt AT9USB28 DATA OUT und STATUS-Abschnitt: Soll der PC Daten über den Daten Abschnitt des Endpunkt an das Gerät senden (was in der Firmware nicht vorkommt), so kann der Datenfluss ebenfalls mit TXINI und RXOUTI gesteuert werden. Quelle: Datenblatt AT9USB28 Ein Spezialfall tritt auf wenn keine Daten vorliegen wie bei der Get_Adress Anfrage. Es gibt also neben dem SETUP nur ein STATUS Abschnitt. Mit CBI(UEINTX,TXINI) wird im Statuspaket ein ZLP versendet. Dann wird gewartet bis der Speicher wieder frei ist (TXINI =, ACK vom PC). OUT Endpunkt Das Received OUT Data Interrupt (RXOUTI) Flag wird gesetzt wenn ein OUT Datenpaket eintrifft. Dieses wird von der Hardware bestätigt. Gleichzeitig setzt die Hardware das FIFOCON Flag (FIFO CONtrol Bit). In der Firmware wird ein RXOUT-Interrupt ausgelöst. In der Interruptrine wird ein Unterprogramm zur Behandlung des OUT Pakets aufgerufen. In diesem Unterprogrsamm löscht die Firmware mit CBI(UEINTX,RXOUTI) das Flag um das Interrupt zu bestätigen. Das RWAL Flag im gleichen SF Register zeigt den Zustand des FIFO. RWAL = bedeutet, dass Daten im FIFO vorhanden sind. Sind keine C5 Die USB-Schnittstelle 97

108 23 Daten vorhanden, so löscht die Hardware das Flag. Die Firmware überprüft RWAL und liest dann die Daten und löscht mit CBI(UEINTX,FIFOCON) das FIFOCON Flag um den FIFO Puffer wieder frei zu geben. Quelle: Datenblatt AT9USB28 IN Endpunkt Benötigt der PC ein Paket, so wird dies über das NAK IN Received Interrupt (NAKINI) Flag gemeldet. In der Firmware wird ein Interrupt ausgelöst. In der Interruptrine wird ein Unterprogramm zur Behandlung der IN Anfrage aufgerufen. In diesem Unterprogrsamm löscht die Firmware mit CBI(UEINTX,NAKINI) das Interrupt Flag. Das TXINI Flag (Transmitter Ready Interrupt Flag) zeigt, dass der FIFO Puffer frei ist und vom Controller gefüllt werden kann. Gleichzeitig wird das FIFOCON Flag (FIFO CONtrol Bit) von der Hardware gesetzt. Nachdem dies geschehen ist wird mit CBI(UEINTX,TXINI) sofort gelöscht. Der Controller füllt dann den FIFO und erlaubt mit dem Löschen des FIFOCON Flag (CBI(UEINTX,FIFOCON)) dem Controller die Daten abzuschicken. Besteht der Endpunkt aus einer Dobbelspeicherbank, so wird automatisch auf die nächste Bank umgeschaltet. (Das RWAL Flag zeigt auch hier den Zustand des FIFO. RWAL = bedeutet, dass der FIFO voll ist.) Quelle: Datenblatt AT9USB28 98 C5 Die USB-Schnittstelle

109 23 Übersicht zur Firmware C5 Die USB-Schnittstelle 99

110 23 Das Hauptprogramm (at9usbkey_firmware...) Im Hauptprogramm zeigt eine LED ( PD4) durch Blinken mit Hz, dass dieses arbeitet. Ein Flag (BLINKFLAG) ermöglicht es das Blinken abzuschalten. Dieses Flag kann später über den Endpunkt mit PD ab. bzw. eingeschaltet werden. Einzige wichtige Aktion im Hauptprogramm ist der Aufruf des Unterprogramms INIDEV (usb_init_device), das sich in sr_usb.asm (usb_srs.c) befindet. Im Hauptprogramm wird ebenfalls der AD Wandler initialisiert. Im Assembler muss auch die Vektortabelle im Hauptprogramm initialisiert werden. Die USB-Bibliothek (SR_USB.asm, usb_srs.c) In der USB Bibliothek werden die Interrupts abgefangen und behandelt, die Basisinitialisierungen des USB Teils im ATmega vorgenommen (Treiberfunktionen), die Enumeration wird durchgeführt und die die Endpunkte werden behandelt (Anwenderkommunikation). Die Interrupt-Service-Rinen In der USB Bibliothek befinden sich zwei Interrupt-Service-Rinen (Datenblatt S 252ff). Einmal wird der USB GENeral Interrupt Vektor behandelt. Dieser Interrupt Vektor kann von 2 verschiedenen Interrupts (General, Device und Host) angesprungen werden. Uns interessiert allerdings nur der End Of ReSeT Interrupt (EORSTI), welcher das Ende des vom PC auslösten Reset3 nach dem Anstecken des Gerätes anzeigt (das Gerät hat den Reset Zustand wieder verlassen). 3 Der PC zieht dazu beide Datenleitungen gleichzeitig auf Null. C5 Die USB-Schnittstelle

111 23 Die zweite ISR behandelt den USB Endpoint/Pipe COMmunication Interrupt Vektor (USB COM Interrupt). Hier interessieren uns nur drei Interrupts, welche die Endpunkte betreffen3. Für Endpunkt ist das der Received SETUP Interrupt (RXSTPI), für den bzw. die OUT-Endpunkte der Received OUT Data Interrupt (RXOUTI) und für einen oder mehrere IN-Endpunkte der NAK IN Received Interrupt (NAKINI). USB_GEN (USB GENeral Interrupt) In der Rine für den USB General Interrupt (ISR_GEN) wird überprüft ob sie von einem End Of ReSeT Interrupt (EORSTI), ausgelöst wurde. War ein anderer Interrupt der Auslöser, so wird die Rine ohne Aktion verlassen. Wurde der Interrupt erkannt, so wird er gesperrt ( CBI32 (UDINT,EORSTI)), damit er nicht mehr auftreten kann. Der Control EndPunkt (EP) wird über das Unterprogramm INIEP (usb_init_endpoint) initialisiert. Danach wird der Endpoint Received SETUP Interrupt freigeschaltet (SBI(UEIENX,RXSTPE)), damit eintreffende SETUP Pakete erkannt werden können. USB_COM (USB Endpoint/Pipe COMmunication Interrupt) Die Rine für den USB Endpoint/Pipe COMmunication Interrupt ( ISR_COM) reagiert auf die Endpoint Interrupts. Mit dem SF Register UEINT wird erkannt um welchen Endpunkt es sich handelt. Die Bitposition gibt den Endpunkt an. Mit dem SF Reg UENUM muss dann der jeweilige Endpunkt ausgewählt werden. Je nach Endpunkt wird dann eine entsprechende 3 Da jeder dieser Interrupts an allen sieben Endpunkten auftreten kann ist es wichtig, vor der Behandlung den richtigen Endpunkt mit dem ENUM Register auszuwählen. 32 cbi (UDINT,EORSTI) steht für lösche Bit EORSTI im SF Register UDINT. cbi uns sbi (setze Bit) existieren so nur für die untersten 32 SF Register. Alle USB Register befinden sich im erweiterten Bereich und müssen mittels direkter SRAM Adressierung und Maskierung angesprochen werden. C5 Die USB-Schnittstelle

112 23 Unterprogramm aufzurufen. EP: Nur falls ein Received SETUP Interrupt (RXSTPI) vorliegt wird das Unterprogramm SETUP (usb_ep_setup) aufgerufen. EP: Ein Received OUT Data Interrupt für Endpunkt bewirkt den Aufruf des Unterprogramms EP_SP (usb_ep_setpd4_7, im Unterprogramm SETUP wurde der RXOUT Interrupt freigeschaltet). EP2: Ein NAK IN Interrupt für Endpunkt 2 bewirkt den Aufruf des Unterprogramms EP2_AD (usb_ep2_readadc, im Unterprogramm SETUP wurde der NAKIN Interrupt freigeschaltet). Die Unterprogramme Basisinitialisierungen mit INIDEV und INIEP INIDEV (usb_init_device) Hier werden einige Basis Initialisierungen vorgenommen, damit ein End Of ReSeT Interrupt ausgelöst werden kann. UHWCON (USB HardWare CONfiguration)= x8 Per Software wird "Device" d.h. Gerät ausgewählt (PIN UID nicht genutzt!) da unser Gerät keine Host Funktionen (OTG) übernehmen soll. Bit 7 (UIMOD) = wählt Device Modus, Bit (UVREGE = )schaltet den Regelkreis zur Versorgung der D+ und D Leitung (= pads) mit 3 3,6V ein. USBCON (USB CONfiguration) = xb Bit 7 USBE = schaltet USB Sender/Empf. und Takt ein. Bit 5 FRZCLK bleibt (default Strom sparen). Bit 4 OTGPADE = schaltet VBUS Leitung ein. Muss auch im Device Modus 2 C5 Die USB-Schnittstelle

113 23 eingeschaltet werden, damit Einstecken und Abstecken vom Bus erkannt wird! Der Takt muss kurzzeitig einschalten werden (FRZCLK =, USBCON = x9), damit ein Transfer möglich wird und somit EORSTI auslösen kann (getestet!), kann danach aber gleich wieder abgeschaltet werden um den den Stromverbrauch zu verringern (USBCON = xb). UDIEN = x8 (USB Device Interrupt ENable) erlaubt den End Of ReSeT Interrupt. Als nächstes muss die PLL gestartet werden. Die PLL Frequenz wird aus einem 2 MHz Signal durch Multiplikation mit 24 erzeugt. Die 2 MHz werden durch Teilen der Quarzfrequenz erzeugt. Der Vorteiler wird mit den Bits PLLP PLLP2 (3 Bit, 2^2 2^4) im Register PLLCSR (PLL Control and Status Register) initialisiert (b bei 8 MHz Quarz (:4)) PLLCSR = xc. Nach dem Starten der PLL (PLLE =, PLLCSR = xe)) benötigt die PLL rund ms bevor sie einrastet. Das Flag PLOCK im Register PLLCSR meldet wenn das Einrasten erfolgt ist. Es wird einfach mittels Polling abgefragt. Mit FRZCLK = (USBCON = x9) wird der Takt aktiviert! Das Gerät muss mit UDCON = (DETACH = ) noch physikalisch verbunden werden (verbindet internen Pull Up mit der D+ Datenleitung (Full Speed)) und Interrupts mit sei global erlaubt werden. INIEP (usb_init_endpoint) Das UP INIEP dient der Initialisierung und Aktivierung der Endpunkte. Nach der Auswahl des Endpunkts mit UENUM wird dieser aktiviert (SBI(UECONX,EPEN)).Über die jeweiligen Bits in UECFGX und UECFGX werden Typ, Richtung, FIFO Größe und die Art des FIFO Puffers (einzeln oder doppelt) festgelegt. Mit dem ALLOC Bit wird der Speicher dem Puffer zugewiesen (SBI(UECFGX,ALLOC)) Wie aus dem Flussdiagramm zur Aktivierung eines Endpunkt S269 im Datenblatt ersichtlich kann mit dem Bit CFGOK im Register UECFGX dann noch überprüft ob die Zuweisung erfolgreich war. Dies wird hier nicht unterstützt. C5 Die USB-Schnittstelle 3

114 23 TYPE DIR SIZE (FIFO) BANK EP Control () IN/OUT () 8 Byte () () EP Bulk (2) OUT () 64 Byte () () EP2 Bulk (2) IN () 64 Byte (3) 2 () Die Enumeration mit SETUP Die Enumeration wird durch das Senden von Anfragen (Service Requests) vom PC aus durchgeführt. Der PC sendet SETUP Pakete mit denen er die Adresse an das Gerät vergibt, Informationen über das Gerät erfragt und die Konfiguration aktiviert. Das Gerät beantwortet die Informationsanfragen mit Deskriptoren. Da jedes Gerät mindestens aus einer Konfiguration und einem Interface bestehen muss werden hier also ein Gerätedeskriptor, ein Konfigurationsdeskriptor, ein Interfacedeskriptor und mehrere Endpunktdeskriptoren erfragt. Zusätzlich können noch Stringdeskriptoren Auskunft über das Gerät oder den Hersteller liefern. SETUP (usb_ep_setup) Dieses Unterprogramm beantworte SETUP Pakete an Endpunkt für die Enumeration. Das 8 Byte große SETUP Paket wird eingelesen, im SRAM abgespeichert und mit ACK bestätigt (RXSTPI löschen). Liegt ein Standard Request vor, so wird es sich um einen von den vier in unserer Firmware unterstützten Anfragen handelt. Falls nicht antwortet das Gerät mit STALL. 4 C5 Die USB-Schnittstelle

115 23 Get_Status: Dieser Request muss nicht implementiert werden (Zeilen können also gelöscht werden), verhindert aber eine unschöne Fehlermeldung mit lsusb -v unter Linux. Es werden zwei leere Byte im FIFO abgelegt (x, Flag remote wakeup (2)= ), wenn das Gerät vom Bus mit Strom versorgt wird (bus powered). Hat es eine eigene Versorgung (self powered), so muss x ins FIFO geschrieben werden. Mit (CBI(UEINTX,TXINI) wird das Paket abgeschickt und das FIFO wieder gelöscht. Danach wird auf die Bestätigung des PC gewartet (ZLP). Set_Adress: Die Adresse wird ermittelt und dem Gerät zugewiesen. Ein Zero Length Paket (ZLP) meldet den Erfolg. Wurde das ZLP erfolgreich versendet (ACK vom PC), so wird die Adresse aktiviert. Get_Descriptor: Es wird überprüft, ob es sich um einen Device, Configuration oder String Deskriptor handelt. Die zu übermittelnden Deskriptoren befinden sich im Flash. Ein Unterprogramm SNDDES (usb_send_descriptor) kümmert sich um das Versenden der C5 Die USB-Schnittstelle 5

116 23 Deskriptoren. Dem UP wird in r8 die Länge des Deskriptors in Byte und in Z der Zeiger auf den Deskriptor übergeben. Set_Configuration: Um die benutzten Endpunkte zu Initialisieren müssen zuerst alle benutzten Endpunkte abgeschaltet werden und ihre Speicherbänke freigegeben werden. Dies passiert in einer Schleife. Mit dem schon bekannten Unterprogramm INIEP (usb_init_endpoint) werden dann die einzelnen Endpunkte initialisiert. Nach der Initialisierung eines jeweiligen OUT Endpunktes muss der RXOUT34 Interrupt für diesen OUT Endpunkt (UENUM = Endpunkt nummer!) erlaubt werden. Dadurch kann das Gerät einen neuen COM Interrupt auslösen, wenn Daten vom PC angekommen sind, und dann das zum OUT Endpunkt gehörende Unterprogramm aufrufen, um die Informationen abzuholen. Der NAKIN35 Interrupt wird für den jeweiligen IN Endpunkt erlaubt (UENUM = Endpunktnummer!). Dadurch kann bei einer IN Anfrage des PC ein neuer COM Interrupt ausgelöst werden, der dann das entsprechende Unterprogramm zum IN Endpunkt aufrufen kann, um die angeforderten Informationen zu liefern. Wurden alle Endpunkte erfolgreich konfiguriert, so wird ein ZLP an den PC gesendet und auf eine Bestätigung (ACK) vom PC gewartet. SNDDES (usb_send_descriptor) In einer Schleife wird der FIFO (Endpunkt ) mit dem Deskriptor gefüllt. Tritt dabei eine Unterbrechung durch den PC (RXOUT Interrupt) auf, so wird abgebrochen. Im Assembler befindet sich die Anzahl der zu schreibenden Bytes in r8, der Zeiger auf den Deskriptor in Z. Da der FIFO 8 Byte groß ist, wird er mit jeweils 8 Byte gefüllt. Dann wird die Anfrage des PC mit einem ZLP bestätigt und darauf gewartet, dass die Speicherbank wieder frei ist (TXIN Interrupt Flag) oder die Daten erfolgreich beim PC angekommen sind (ZLP vom PC, RXOUT Interrupt Flag), bevor die nächsten 8 Byte gefüllt werden. Sind alle angefragten Bytes im FIFO gelandet, so werden die restlichen Bytes abgeschickt, außer es war ein Vielfaches von 8 Byte angefragt worden. Es wird dann das ZLP vom PC gewartet und dieses dann mit einem ACK bestätigt. 34 Wird von Hardware gesetzt wenn OUT Daten vorhanden sind. 35 Wird von Hardware gesetzt wenn IN Anfrage von PC mit NAK beantwortet wurde. 6 C5 Die USB-Schnittstelle

117 23 Die Anwendungskommunikation Die folgenden zwei Unterprogramme dienen der Anwenderkommunikation. UP EP_SP und EP2_AD werden vom COM Interrupt aus aufgerufen. Folgende Aktionen werden dabei ausgelöst: EP_SP: Ein und Ausschalten einzelner Bits (4 LEDs an PD4 PD7 und das Blink Flag PD) eines Ports ( Byte) über Endpunkt (OUT Aktion (PC Gerät)). EP2_AD: Analoge Daten (Analog Digitalwandler) über den FIFO des Endpunkt 2 einlesen (IN Aktion (Gerät PC)). EP_SP (usb_ep_setpd4_7) Lese Portbyte von PC und schalte Portbits ein bzw. aus. Falls der PC Daten für Endpunkt gesendet hat, so wird in der Interruptrine dieses C5 Die USB-Schnittstelle 7

118 23 Unterprogramm aufgerufen. Das Interruptflag (RXOUTI) wird gelöscht und mit dem RWAL Flag wird überprüft ob die Daten im FIFO vorliegen und das Gerät die Erlaubnis hat die Daten zu lesen. Das Portbyte wird gelesen und die entsprechenden Aktionen werden durchgeführt (Ein bzw. Ausschalten des Blinkens und der 4 LEDs).Mit dem Löschen des FIFO CONtrol Bit wird gemeldet, dass die Speicherbank jetzt wieder frei ist. EP2_AD (usb_ep2_readadc) Sende analoge Daten an den PC. Falls der PC Daten am Endpunkt 2 anfragt, so wird in der Interruptrine dieses Unterprogramm aufgerufen. Als erstes wird eine AD Wandlung ausgelöst und es wird mittels Polling auf das Ende der Wandlung gewartet. Das Interruptflag (NAKINI) wird dann gelöscht und es wird überprüft ob die Speicherbank frei ist. Zwei Byte ( Bit Wandlung) werden ins Fifo geschrieben. Das Abschicken der Daten wird durch Löschen des FIFO CONtrol Bit erlaubt. 8 C5 Die USB-Schnittstelle

119 C5 Die USB-Schnittstelle 23 9

Analog-Digital-Converter

Analog-Digital-Converter Analog-Digital-Converter Funktionsprinzip ADC bei ATmega128 Beispiel in C Funktionsprinzip 1 Analog-Digital-Wandlung Wandelt analoge Spannung / analogen Strom (Messgröße) in einen binären Wert um, der

Mehr

C4 Die SPI Schnittstelle

C4 Die SPI Schnittstelle C4 Die SPI Schnittstelle Einführung Motorola entwickelte die synchrone SPI-Master-Slave Schnittstelle, (Serial Periphal Interface) für die Kommunikation zwischen Mikrocontrollern. Ein ähnliches Bus System

Mehr

B1 Stapelspeicher (stack)

B1 Stapelspeicher (stack) B1 Stapelspeicher (stack) Arbeitsweise des LIFO-Stapelspeichers Im Kapitel "Unterprogramme" wurde schon erwähnt, dass Unterprogramme einen so genannten Stapelspeicher (Kellerspeicher, Stapel, stack) benötigen

Mehr

C1 A/D- und D/A-Wandler

C1 A/D- und D/A-Wandler C1 A/D- und D/A-Wandler Analog Digital Wandler 4 (Analog to Digital Converter (ADC)) setzen analoge Signale in digitale Daten um. Digital Analog Wandler 5 (Digital to Analog Converter (DAC)) tun genau

Mehr

AVR-Mikrocontroller in BASCOM programmieren

AVR-Mikrocontroller in BASCOM programmieren jean-claude.feltes@education.lu 1 AVR-Mikrocontroller in BASCOM programmieren Der AD-Wandler 1. Die Eigenschaften der AD-Wandler beim Mega8 (beim Mega16 / Mega32 ist es ähnlich) Prinzip: nach dem Wägeverfahren

Mehr

Lösungen zum Kurs "Mikrocontroller Hard- und Software

Lösungen zum Kurs Mikrocontroller Hard- und Software Lösungen zum Kurs "Mikrocontroller Hard- und Software Gerhard Schmidt Kastanienallee 20 64289 Darmstadt http://www.avr-asm-tutorial.net Lösung Aufgabe 2 Aufgabe 2 sbi DDRB,PB0 2 Takte sbi PORTB,PB0 2 Takte

Mehr

Rechnerarchitektur Atmega 32. 1 Vortrag Atmega 32. Von Urs Müller und Marion Knoth. Urs Müller Seite 1 von 7

Rechnerarchitektur Atmega 32. 1 Vortrag Atmega 32. Von Urs Müller und Marion Knoth. Urs Müller Seite 1 von 7 1 Vortrag Atmega 32 Von Urs Müller und Marion Knoth Urs Müller Seite 1 von 7 Inhaltsverzeichnis 1 Vortrag Atmega 32 1 1.1 Einleitung 3 1.1.1 Hersteller ATMEL 3 1.1.2 AVR - Mikrocontroller Familie 3 2 Übersicht

Mehr

Tag 3 Timer, ADC und PWM

Tag 3 Timer, ADC und PWM Tag 3 Timer, ADC und PWM 09/01/10 Fachbereich Physik Institut für Kernphysik Bastian Löher, Martin Konrad 1 Analog-Digital-Wandler Arbeitet durch schrittweise Näherung Aktivieren des ADCs durch ADC Enable

Mehr

Interrupts. Funktionsprinzip. Funktionsprinzip. Beispiel in C

Interrupts. Funktionsprinzip. Funktionsprinzip. Beispiel in C Interrupts Funktionsprinzip Interrupts bei ATmega128 Beispiel in C Funktionsprinzip 1 Was ist ein Interrupt? C muss auf Ereignisse reagieren können, z.b.: - jemand drückt eine Taste - USART hat Daten empfangen

Mehr

UART-Kommunikation mit dem Atmel AVR

UART-Kommunikation mit dem Atmel AVR Fachbereich Elektrotechnik und Informatik Labor für Angewandte Informatik und Datenbanken Praktikum Automatisierung / Echtzeitregelung (BAU/BER) Prof.Dr.-Ing. Coersmeier UART-Kommunikation mit dem Atmel

Mehr

Seminar: Mikrocontroller. Analoge Inputs:

Seminar: Mikrocontroller. Analoge Inputs: Seminar: Mikrocontroller Analoge Inputs: Analog Komparator A/D Wandler Jonas Hummes ( jonashummes@uni-koblenz.de ) Universität Koblenz-Landau SS06 P a g e 1 Inhaltsverzeichnis Analog Komparator I. Grundlagen

Mehr

Atmel AVR für Dummies

Atmel AVR für Dummies Atmel AVR für Dummies fd0@koeln.ccc.de 29.12.2005 Übersicht 1 Hardware Kurzvorstellung Atmega8 Programmierkabel (Eigenbau vs. Kommerzlösung) Alternative: Bootloader (Programmieren via rs232) Software Speicher

Mehr

Interrupt-Programmierung

Interrupt-Programmierung Interrupt-Programmierung Am Beispiel des ATMEGA16 Microcontrollers Beispiel: Messung der Betriebszeit Die Betriebszeit zeigt an, wie lange der Rechner seit dem Booten läuft Hier: Aktualisierung der Betriebszeit

Mehr

D.1 Vorbereitung. Teil D Analog-Digital-Wandler 1

D.1 Vorbereitung. Teil D Analog-Digital-Wandler 1 D.1 Vorbereitung So wird der Analog-Digital-Wandler des Mikrocontrollers ATmega328P initialisiert: ADMUX = _BV(REFS0); ADCSRA = _BV(ADEN) _BV(ADPS2) _BV(ADPS1) _BV(ADPS0); Der Analog-Digital-Wandler ist

Mehr

Einführung in die Welt der Microcontroller

Einführung in die Welt der Microcontroller Übersicht Microcontroller Schaltungen Sonstiges Einführung in die Welt der Microcontroller Übersicht Microcontroller Schaltungen Sonstiges Inhaltsverzeichnis 1 Übersicht Möglichkeiten Einsatz 2 Microcontroller

Mehr

Der Mikrocontroller beinhaltet auf einem Chip einen kompletten Mikrocomputer, wie in Kapitel

Der Mikrocontroller beinhaltet auf einem Chip einen kompletten Mikrocomputer, wie in Kapitel 2 Der Mikrocontroller Der Mikrocontroller beinhaltet auf einem Chip einen kompletten Mikrocomputer, wie in Kapitel 1 beschrieben. Auf dem Chip sind die, ein ROM- für das Programm, ein RAM- für die variablen

Mehr

Autonome Mobile Systeme. Dr. Stefan Enderle

Autonome Mobile Systeme. Dr. Stefan Enderle Autonome Mobile Systeme Dr. Stefan Enderle 2. Mikrocontroller Einleitung Unterschied Controller / Prozessor: Speicher (RAM, Flash, Eprom) intern Viele I/Os (Digital, Analog) Bus-Unterstützung (Seriell,

Mehr

B4 Interrupts (Unterbrechungen)

B4 Interrupts (Unterbrechungen) B4 Interrupts (Unterbrechungen) Einführung Eine ankommende SMS unterbricht kurz die eben begonnene Arbeit. Ein kurzer Blick genügt um die SMS in ihrer Priorität einzuordnen und zum Beispiel die gelieferte

Mehr

8.0 Erweiterung mit dem 8 Bit D/A Maxim MAX5382

8.0 Erweiterung mit dem 8 Bit D/A Maxim MAX5382 8.0 Erweiterung mit dem 8 Bit D/A Maxim MAX5382 Der MAX5382 ist ein 8 Bit DA Wandler im SOT23 Gehäuse. Der MAX5380 besitzt eine interne Referenzspannung von 2 V, der MAX5381 von 4 Volt und der verwendete

Mehr

Zähler- und Zeitgeber-Baugruppen

Zähler- und Zeitgeber-Baugruppen Zähler- und Zeitgeber-Baugruppen Sinn: häufig müssen Zeitbedingungen eingehalten werden z.b.: einige ms warten, Häufigkeit von Ereignissen zählen etc... Lösung: 1.) Zeitschleifen = Programm abarbeiten,

Mehr

AVR-Mikrocontroller in BASCOM programmieren, Teil 2

AVR-Mikrocontroller in BASCOM programmieren, Teil 2 jean-claude.feltes@education.lu 1 AVR-Mikrocontroller in BASCOM programmieren, Teil 2 13. Interrupts 13.1 Externe Interrupts durch Taster Wenn Taster mittels Polling abgefragt werden, wie in Teil 1 beschrieben,

Mehr

Multitasking / virtuelle Maschinen mittels Atmel AVR- Mikrocontrollern (Simple & Stupid)

Multitasking / virtuelle Maschinen mittels Atmel AVR- Mikrocontrollern (Simple & Stupid) VM/AVR SIMPLE & STUPID 1 Multitasking / virtuelle Maschinen mittels Atmel AVR- Mikrocontrollern (Simple & Stupid) Stand: 26. 1. 2010 Zweck: Elementare Demonstration der Mehrprogrammausführung auf Grundlage

Mehr

Serielle Kommunikation mit dem Arduino. Teil 1: Das Serial Peripheral Interface (SPI)

Serielle Kommunikation mit dem Arduino. Teil 1: Das Serial Peripheral Interface (SPI) Serielle Kommunikation mit dem Arduino Teil 1: Das Serial Peripheral Interface (SPI) Axel Attraktor e.v. 4. Juni 2012 Axel (Attraktor e.v.) 5. Arduino-Stammtisch 4. Juni 2012 1 / 25 Serielle Kommunikation

Mehr

I2C-Echtzeituhr am Atmel AVR

I2C-Echtzeituhr am Atmel AVR Fachbereich Elektrotechnik und Informatik Labor für Angewandte Informatik und Datenbanken Praktikum Mikrocontroller und DSP (EMD) Prof.Dr.-Ing. E. Coersmeier I2C-Echtzeituhr am Atmel AVR Name, Vorname

Mehr

Unter einem Interrupt kann man sich einen durch Hardware ausgelösten Unterprogrammaufruf vorstellen.

Unter einem Interrupt kann man sich einen durch Hardware ausgelösten Unterprogrammaufruf vorstellen. Interrupttechnik mit dem ATmega32 Unter einem Interrupt kann man sich einen durch Hardware ausgelösten Unterprogrammaufruf vorstellen. Aufgrund einer Interruptanforderung wird das laufende Programm unterbrochen

Mehr

Einführung in AVR-Assembler

Einführung in AVR-Assembler Einführung in AVR-Assembler Easterhack 2008 Chaos Computer Club Cologne Stefan Schürmans, BlinkenArea stefan@blinkenarea.org Version 1.0.4 Easterhack 2008 Einführung in AVR-Assembler 1 Inhalt Vorstellung

Mehr

Tag 2 Eingabe und Interrupts

Tag 2 Eingabe und Interrupts Tag 2 Eingabe und Interrupts 08/30/10 Fachbereich Physik Institut für Kernphysik Bastian Löher, Martin Konrad 1 Taster Direkt an Portpin angeschlossen (etwa PINB0, PIND3) Pull-Up-Widerstände einschalten!

Mehr

Serie 8: Microcontroller 17./18.07.2014

Serie 8: Microcontroller 17./18.07.2014 Serie 8: Microcontroller 17./18.07.2014 I. Ziel der Versuche Erster Erfahrungen mit einem Microcontroller sollen gesammelt werden, die grundlegenden Ein- Ausgabe-Operationen werden realisiert. II. Vorkenntnisse

Mehr

Timer. Funktionsprinzip

Timer. Funktionsprinzip Timer Funktionsprinzip 8-Bit-Timer des ATmega28 Beispiel Timer im Polling- und Interrupt-Betrieb Funktionsprinzip Timer ist ein in Hardware realisierter i Zähler ändert seinen Zählerstand mit einer vorgegebenen

Mehr

Einleitung Die Pins alphabetisch Kapitel 1 Programmierung des ATmega8 und des ATmega

Einleitung Die Pins alphabetisch Kapitel 1 Programmierung des ATmega8 und des ATmega Einleitung... 11 Die Pins alphabetisch.... 12 Kapitel 1 Programmierung des ATmega8 und des ATmega328.... 15 1.1 Was Sie auf den nächsten Seiten erwartet... 19 1.2 Was ist eine Micro Controller Unit (MCU)?....

Mehr

AVR-Mikrocontroller in BASCOM programmieren, Teil 3

AVR-Mikrocontroller in BASCOM programmieren, Teil 3 jean-claude.feltes@education.lu 1/8 AVR-Mikrocontroller in BASCOM programmieren, Teil 3 Alle Beispiele in diesem Kapitel beziehen sich auf den Mega8. Andere Controller können unterschiedliche Timer haben.

Mehr

Programmierung von ATMEL AVR Mikroprozessoren am Beispiel des ATtiny13. Teil 8: gavrasmw und weitere Beispiele

Programmierung von ATMEL AVR Mikroprozessoren am Beispiel des ATtiny13. Teil 8: gavrasmw und weitere Beispiele Programmierung von ATMEL AVR Mikroprozessoren am Beispiel des ATtiny13 Eine Einführung in Aufbau, Funktionsweise, Programmierung und Nutzen von Mikroprozessoren Teil 8: gavrasmw und weitere Beispiele gavrasmw

Mehr

Temperaturmodul. Software. Bedeutung der Leuchtdioden. Kanal-LEDs. System-LEDs. Start nach Reset

Temperaturmodul. Software. Bedeutung der Leuchtdioden. Kanal-LEDs. System-LEDs. Start nach Reset Temperaturmodul Software Bedeutung der Leuchtdioden Alle LED sind sog. Bicolor-LEDs, die, wie der Name nicht sagt, drei Farben anzeigen können. Rot, grün und gelb, wenn rot und grün gemeinsam aktiviert

Mehr

Maschinenorientierte Programmierung

Maschinenorientierte Programmierung Prof. Dr. Sven-Hendrik Voß Wintersemester 2015 Technische Informatik (Bachelor), Semester 2 Termin 10, 08.12.2015 Maschinenorientierte Programmierung Seite 2 Timer- und Counter-Programmierung Maschinenorientierte

Mehr

Mikrocontroller - Schnelleinstieg

Mikrocontroller - Schnelleinstieg Mikrocontroller - Schnelleinstieg Am Beispiel des Atmel Mega8 Philipp Fabian Benedikt Maier Mikrocontroller Schnelleinstieg Seite 1 Mikrocontroller - Schnelleinstieg: - Was ist ein Mikrokontroller? - Welche

Mehr

AVR-Mikrocontrollertechnik

AVR-Mikrocontrollertechnik 1/31 Ziele der Weiterbildung Vermitteln von Grundlagen zu den AVR Controllern Vermitteln von Assembler Grundlagen Vorstellen der benötigten Hard und Software Eigenständiges Programmieren der Controller

Mehr

Halbautomatischer Antennenkoppler - Software. 1 Pin-Belegungen der ATmega-Controller. 1.1 Controller (Steuergerät) DL6GL

Halbautomatischer Antennenkoppler - Software. 1 Pin-Belegungen der ATmega-Controller. 1.1 Controller (Steuergerät) DL6GL 1 Pin-Belegungen der ATmega-Controller 1.1 Controller (Steuergerät) Port A: ADC und LED-Ansteuerung PA.0 (ADC0): Vorlaufspannung vom SWR-Koppler PA.1 (ADC1): Rücklaufspannung vom SWR-Koppler PA.2 (ADC2):

Mehr

Beschaltung eines Mikrocontrollers. Jordi Blanch Sierra Steuerungsgruppe

Beschaltung eines Mikrocontrollers. Jordi Blanch Sierra Steuerungsgruppe Beschaltung eines Mikrocontrollers Jordi Blanch Sierra Steuerungsgruppe Gliederung Was ist ein Mikrocontroller? ATmega32 Pin-Beschreibung Grundschaltungen: - Minimale Grundschaltung - Grundschaltung mit

Mehr

Treiberinstallation Bitte laden Sie sich die *inf Datei für den Treiber des Prog-S-Programmer hier herunter: www.diamex.de Kartenreiter download Programmiergeräte - ERFOS-Prog-S.zip Die *inf Datei auf

Mehr

ATmega169 Chip: Pin-Layout

ATmega169 Chip: Pin-Layout ATmega169 Chip: Pin-Layout Die logische Schnittstelle der Funktionseinheit MCU (Microcontroller Unit) entspricht der physikalischen Schnittstelle der Baueinheit (Chip). Für die Maschinenbefehle sind nur

Mehr

Die interne Peripherie der Mikrocontroller

Die interne Peripherie der Mikrocontroller DIE INTERNE PERIPHERIE DER MIKROCONTROLLER 1 Die interne Peripherie der Mikrocontroller Dargestellt am Beispiel Atmel AVR Übersicht: 1. Externe Interrupts 2. Zähler und Zeitgeber (Counter/Timer) 3. serielle

Mehr

Produktinformationen. Basis Set Atmel Atmega8 & ISP Programmer. Lieferumfang :

Produktinformationen. Basis Set Atmel Atmega8 & ISP Programmer. Lieferumfang : Produktinformationen Basis Set Atmel Atmega8 & ISP Programmer Lieferumfang : 1 Steckboard 840 Pin 1 USB ISP Programmer mit Kabel 1 Kabelsatz 32-teilig 1 Atmega8L 5 LED 3mm Klar Rot/Gelb/Grün/Blau/Weiss

Mehr

Fachhochschule Kaiserslautern Fachbereich Angewandte Ingenieurwissenschaften WS2010/11. Zeitpunkt der Prüfung: 18.01.2011 Beginn: 10.

Fachhochschule Kaiserslautern Fachbereich Angewandte Ingenieurwissenschaften WS2010/11. Zeitpunkt der Prüfung: 18.01.2011 Beginn: 10. Lehrprozessor: Coldfire MCF-5272 Zeitpunkt der Prüfung: 18.01.2011 Beginn: 10.45 Uhr Raum: Aula Bearbeitungszeit: 180 Minuten Erlaubte Hilfsmittel: Gedrucktes Vorlesungsskript von Prof. Neuschwander mit

Mehr

SPI Serial Peripheral Interface

SPI Serial Peripheral Interface SPI Serial Peripheral Interface Physik- Seminar Universität Koblenz-Landau Christian Büch 27. Juni 2006 Einleitung SPI bedeutet Serial Peripheral Interface zu Deutsch serielle Peripherie Schnittstelle

Mehr

Das Attiny-Projekt Der Bootloader 1

Das Attiny-Projekt Der Bootloader 1 Das Attiny-Projekt Der Bootloader 1 Der Bootloader Bei unserer Attiny-Platine werden die Programme über die serielle Schnittstelle übertragen. Grundsätzlich wäre es möglich, hierzu auf die im Attiny-Mikrocontroller

Mehr

Mikrocontroller - Tipps & Tricks

Mikrocontroller - Tipps & Tricks Mikrocontroller - Tipps & Tricks Mikrocontroller vs. CPU CPU alles RAM, viel RAM Keine On-Chip Peripherie Viele Chips, Motherboard Mikrocontroller Wenig RAM, Flash im Chip mit drin Peripherie an Board

Mehr

CU-R-CONTROL. Beschreibung zur Schaltung ATMega16-32+ISP MC-Controller Steuerung auf Basis ATMEL Mega16/32. Autor: Christian Ulrich

CU-R-CONTROL. Beschreibung zur Schaltung ATMega16-32+ISP MC-Controller Steuerung auf Basis ATMEL Mega16/32. Autor: Christian Ulrich Seite 1 von 10 CU-R-CONTROL Beschreibung zur Schaltung ATMega16-32+ISP MC-Controller Steuerung auf Basis ATMEL Mega16/32 Autor: Christian Ulrich Datum: 08.12.2007 Version: 1.00 Seite 2 von 10 Inhalt Historie

Mehr

Parallel-IO. Ports am ATmega128

Parallel-IO. Ports am ATmega128 Parallel-IO Ansteuerung Miniprojekt Lauflicht Ports am ATmega128 PortE (PE7...PE0) alternativ, z.b. USART0 (RS232) 1 Pin von PortC Port C (PC7...PC0) 1 Parallel-IO-Port "Sammelsurium" verschiedener Speicher

Mehr

Wir übertragen Daten mit Licht

Wir übertragen Daten mit Licht Wir übertragen Daten mit Licht Durch das Internet werden täglich Unmengen von Daten von einem Ort an den anderen transportiert. Häufig geschieht dies über Glasfasern (Abb. 1). An dem einen Ende werden

Mehr

Tutorial. Microcontroller. Grundlagen µc. Kapitel 1

Tutorial. Microcontroller. Grundlagen µc. Kapitel 1 Microcontroller Kapitel 1 Grundlagen µc µc Inhaltsverzeichnis 1 - Vorwort Seite 2 2 - Prinzipieller Programmablauf Seite 4 3 - ISR Interrupt Service Routine Seite 5 4 - Compiler Seite 7 5 - ATMega8 Seite

Mehr

Mikrocomputertechnik. Thema: Serielle Schnittstelle / UART

Mikrocomputertechnik. Thema: Serielle Schnittstelle / UART Mikrocomputertechnik Thema: Serielle Schnittstelle / UART Parallele vs. serielle Datenübertragung Parallele Datenübertragung Mehrere Bits eines Datums werden zeitgleich mittels mehrerer Datenleitungen

Mehr

Programmierung Tiny45 für DCC Lokdecoder

Programmierung Tiny45 für DCC Lokdecoder Programmierung Tiny45 für DCC Lokdecoder Hier eine Beschreibung, der Programmierung des Tiny45 für den Lokdecoder. Zur Erstprogrammierung ist ein Programmer für Atmels AVR Mikrokontroller nötig (AVRISP

Mehr

Microcontroller Kurs. 08.07.11 Microcontroller Kurs/Johannes Fuchs 1

Microcontroller Kurs. 08.07.11 Microcontroller Kurs/Johannes Fuchs 1 Microcontroller Kurs 08.07.11 Microcontroller Kurs/Johannes Fuchs 1 Was ist ein Microcontroller Wikipedia: A microcontroller (sometimes abbreviated µc, uc or MCU) is a small computer on a single integrated

Mehr

Die AVR Mikrocontrollerfamilie

Die AVR Mikrocontrollerfamilie AKES - Ausgewählte Kapitel eingebetteter Systeme 10. Mai 2006 Übersicht über den Vortrag Was sind AVRs? 2/35 Anwendungsfelder Übersicht über den Vortrag Mikrocontroller 3/35 Kleiner Chip Viel integrierte

Mehr

Microcontroller Kurs Programmieren. 09.10.11 Microcontroller Kurs/Johannes Fuchs 1

Microcontroller Kurs Programmieren. 09.10.11 Microcontroller Kurs/Johannes Fuchs 1 Microcontroller Kurs Programmieren 9.1.11 Microcontroller Kurs/Johannes Fuchs 1 General Purpose Input Output (GPIO) Jeder der Pins der vier I/O Ports kann als Eingabe- oder Ausgabe-leitung benutzt werden.

Mehr

DTMF Sender. Es können 252 Zeichen maximal am Stück übertragen werden; die Länge des Strings wird mit einem Byte übertragen.

DTMF Sender. Es können 252 Zeichen maximal am Stück übertragen werden; die Länge des Strings wird mit einem Byte übertragen. DTMF Sender Author DK1RI, Version V02.1, 20160104 This project can be found in https://www.github.com/dk1ri Einleitung Dieses Interface ist eine Vorlage für ein Interface, das ein Gerät, das sich mit DTMF

Mehr

Ein erstes Assembler-Projekt

Ein erstes Assembler-Projekt Das Attiny-Projekt Ein erstes Assembler-Projekt 1 Ein erstes Assembler-Projekt In diesem Kapitel wollen wir ein erstes einfaches Assembler-Programm für unsere Attiny-Platine schreiben. Worum soll es gehen?

Mehr

Snake Projekt. Jan Scholz. 16. März 2013

Snake Projekt. Jan Scholz. 16. März 2013 Snake Projekt Jan Scholz 16. März 2013 Inhaltsverzeichnis 1 Einführung 3 2 Hardware Entwicklung 4 2.1 Mikrocontroller............................. 4 2.2 LED-Matrix............................... 4 2.2.1

Mehr

Enseignement secondaire technique

Enseignement secondaire technique Enseignement secondaire technique Régime professionnel Métiers de l'électricité Division de l'apprentissage artisanal Section des électroniciens en communication Microélectronique Classe de X2EC Nombre

Mehr

Zusatzplatine MP-Bus HZS 562

Zusatzplatine MP-Bus HZS 562 ZUSATZPLATINE MP-BUS HZS 562 Zusatzplatine MP-Bus HZS 562 Die MP-Bus Interfaceelektronik stellt die Schnittstelle zwischen einem CAN-Bus-System und einem MP-Bus-System dar. Die Elektronik wird als MP-Bus

Mehr

Standalone-Anwendung (z.b. als Türöffner für 1 Master + 20 Tags) RS232 PC-Anbindung (an USB per Adapter) zum Übertragen der Tag- ID an den PC

Standalone-Anwendung (z.b. als Türöffner für 1 Master + 20 Tags) RS232 PC-Anbindung (an USB per Adapter) zum Übertragen der Tag- ID an den PC Der Special-Function-Chip SF6107 ist ein RFID-Receiver, welcher die Dekodierung von RFID-Tags nach dem EM-4102-Standard (125khz Lesefrequenz, 40 Bit Daten) ermöglicht. Eine jeweils leicht modifizierte

Mehr

SC18IM700-Tester v1.0. 1. Einleitung

SC18IM700-Tester v1.0. 1. Einleitung SC18IM700-Tester v1.0 1. Einleitung Der SC18IM700-Tester ist ein mittels Visual Studio.NET und in der Programmiersprache C# entwickeltes Programm. Es lehnt sich an der Funktion eines einfachen Terminal-

Mehr

Zuse-Computer: Z1. erster Rechner mit binären Zahlen. Entwicklung der computergerechten. (Grundlage für IEEE-754) funktionierte leider nie zuverlässig

Zuse-Computer: Z1. erster Rechner mit binären Zahlen. Entwicklung der computergerechten. (Grundlage für IEEE-754) funktionierte leider nie zuverlässig Überblick Grundlagen: Spannung, Strom, Widerstand, IV-Kennlinien Elektronische Messgeräte im Elektronikpraktikum Passive Filter Signaltransport im Kabel Transistor Operationsverstärker PID-Regler Sensorik

Mehr

embedded projects GmbH

embedded projects GmbH embedded projects GmbH Bedienungsanleitung USBprog 4.0 Montage Installation Debian / Ubuntu Windows 1/17 Lieber Kunde, wir möchten Ihnen mit unseren Datenenblättern einen reibungslosen Einstieg in unsere

Mehr

Einführung in AVR Assembler

Einführung in AVR Assembler Einführung in AVR Assembler Dennis Fassbender Institut für Technik Autonomer Systeme (LRT8) Universität der Bundeswehr München 09042014 Was ist Assembler? Low-level-Programmiersprache Erlaubt direkten

Mehr

Name: ES2 Klausur Thema: ARM 25.6.07. Name: Punkte: Note:

Name: ES2 Klausur Thema: ARM 25.6.07. Name: Punkte: Note: Name: Punkte: Note: Hinweise für das Lösen der Aufgaben: Zeit: 95 min. Name nicht vergessen! Geben Sie alle Blätter ab. Die Reihenfolge der Aufgaben ist unabhängig vom Schwierigkeitsgrad. Erlaubte Hilfsmittel

Mehr

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

i2c-bus.de I2C-002 KURZBESCHREIBUNG I 2 C Modul mit PCA8574 8-Bit I/O Port-Expander Dokument NR.: I2C-002-D-01 DA CL Dokument NR.: I2C-002-D-01 I2C-002 KURZBECHREIBUNG I 2 C Modul mit PCA8574 8-Bit I/O Port-Expander P Bitte denken ie an die Umwelt, bevor ie diese Datei ausdrucken DA CL Inhaltsverzeichnis 1. Modul

Mehr

Einführung in die Programmierung von Mikrocontrollern mit C/C++

Einführung in die Programmierung von Mikrocontrollern mit C/C++ Einführung in die Programmierung von Mikrocontrollern mit C/C++ Vorlesung Prof. Dr.-Ing. habil. G.-P. Ostermeyer Rechenleistung/Speicher Systemintegration Grundlagen der Mikrocontrollertechnik (Wiederholung)

Mehr

DIGITALVARIO. Anleitung Bootloader. Ausgabe 0.1 deutsch 29.11.2005. für Direkt-Digital-Vario. Firmware ab 00-06-00 Hardware 01 Seriennummer ab 0003

DIGITALVARIO. Anleitung Bootloader. Ausgabe 0.1 deutsch 29.11.2005. für Direkt-Digital-Vario. Firmware ab 00-06-00 Hardware 01 Seriennummer ab 0003 DIGITALVARIO Anleitung Bootloader Ausgabe 0.1 deutsch 29.11.2005 für Direkt-Digital-Vario Firmware ab 00-06-00 Hardware 01 Seriennummer ab 0003 1. Funktion Der Bootloader dient dazu Updates der Variosoftware

Mehr

AVR Web Server. Version 1.1. erstellt von. Ulrich Radig

AVR Web Server. Version 1.1. erstellt von. Ulrich Radig AVR Web Server Version 1.1 erstellt von Ulrich Radig 1 Vorwort: Der von mir aufgebaute AVR Webserver dient zum Steuern Messen und Regeln von diversen Gerätschaften genannt seien Garagentor, Lampen, Heizung

Mehr

Remote-Objekt-Überwachung. von Jan Schäfer und Matthias Merk

Remote-Objekt-Überwachung. von Jan Schäfer und Matthias Merk Remote-Objekt-Überwachung von Jan Schäfer und Matthias Merk Aufgabenstellung Steuerung von Sensoren zur Remote Objektüberwachung mit einem µc PIC16F874. Welcher Sensor hat gemeldet? Die Überwachung Mehrere

Mehr

U5-2 Register beim AVR-µC

U5-2 Register beim AVR-µC U5 4. Übungsaufgabe U5 4. Übungsaufgabe U5-2 Register beim AVR-µC U5-2 Register beim AVR-mC Grundlegendes zur Übung mit dem AVR-µC 1 Überblick Register Beim AVR µc sind die Register: I/O Ports Interrupts

Mehr

Serielle Schnittstelle

Serielle Schnittstelle Serielle Schnittstelle RS-232 ist ein Standard für eine bei Computern teilweise vorhandene serielle Schnittstelle, der in den frühen 1960er Jahren von dem US-amerikanischen Standardisierungskomitee Electronic

Mehr

Erzeugen von PWM-Signalen mit dem Atmel AVR-Mikrocontroller

Erzeugen von PWM-Signalen mit dem Atmel AVR-Mikrocontroller Fachbereich Elektrotechnik und Informatik Labor für Angewandte Informatik und Datenbanken Praktikum Automatisierung/Echtzeitregelung (BAU/BER) Prof.Dr.-Ing. Coersmeier Erzeugen von PWM-Signalen mit dem

Mehr

analoge Ein- und Ausgänge

analoge Ein- und Ausgänge 2016/07/17 13:39 1/5 analoge Ein- und Ausgänge analoge Ein- und Ausgänge Neben den digitalen Leitungen bietet der Arduino mehrere analoge Ein- und Ausgänge. analoge Ausgänge Die Ausgänge sind mit PWM bezeichnet.

Mehr

Der I²C-Bus. Vorstellung des Inter-Integrated Circuit -Bus. Aufbau und Funktionsweise. Beispiel PortExpander am Arduino

Der I²C-Bus. Vorstellung des Inter-Integrated Circuit -Bus. Aufbau und Funktionsweise. Beispiel PortExpander am Arduino Der I²C-Bus Vorstellung des Inter-Integrated Circuit -Bus Aufbau und Funktionsweise Beispiel PortExpander am Arduino Weitere Anwendungsmöglichkeiten Was ist der I²C-Bus entwickelt von Philips Anfang der

Mehr

Software ubiquitärer Systeme

Software ubiquitärer Systeme Software ubiquitärer Systeme 2. Übung Constantin Timm Arbeitsgruppe Entwurfsautomatisierung für Eingebettete Systeme Lehrstuhl für Informatik 12 TU Dortmund constantin.timm@cs.tu-dortmund.de http://ls12-www.cs.tu-dortmund.de/staff/timm/

Mehr

Inhaltsverzeichnis VII.

Inhaltsverzeichnis VII. \ 1 Grundlagen der Mikrocontrolier 1 1.1 Mikrocontroller-Familie ATtiny2313, ATtiny26und ATmega32 6 1.1.1 Merkmale des ATtiny2313, ATtiny26und ATmega32 8 1.1.2 Pinbelegung des ATtiny2313, ATtiny26 und

Mehr

Chip veraltet, für neue Anwendungen nicht empfehlenswert!

Chip veraltet, für neue Anwendungen nicht empfehlenswert! Experiment 3: Analog-Digital-Wandler über I2C V1.2 DK4AQ, 14.05.2013 Preis derzeit: 2,45 (Reichelt) Chip veraltet, für neue Anwendungen nicht empfehlenswert! 4 AD-Wandler + 1 DA-Wandler Auflösung: 8bit

Mehr

Servo-Modul Version

Servo-Modul Version Servo-Modul Version 1.0 24.06.2010 Mit dem Servo-Modul ist es möglich bis zu 8 Modellbau-Servos (analoges Signal) an zu steuern. Die Ansteuerung kann wahlweise über den I2C-Bus, einen COM-Port (RS232)

Mehr

2

2 TINF Interrupts EDT-Referat Jürgen Schwarzbauer 2ANB 1995/96 Inhalt : Was ist ein Interrupt? Zweck von Interrupts Maskierbare und nicht maskierbare Interrupts Aufruf eines Interrupts Anwendung von Interrupts

Mehr

a. Flipflop (taktflankengesteuert) Wdh. Signalverläufe beim D-FF

a. Flipflop (taktflankengesteuert) Wdh. Signalverläufe beim D-FF ITS Teil 2: Rechnerarchitektur 1. Grundschaltungen der Digitaltechnik a. Flipflop (taktflankengesteuert) Wdh. Signalverläufe beim D-FF b. Zähler (Bsp. 4-Bit Zähler) - Eingang count wird zum Aktivieren

Mehr

Kurs "Mikrocontroller Hard- und Software

Kurs Mikrocontroller Hard- und Software Kurs "Mikrocontroller Hard- und Software Gerhard Schmidt Kastanienallee 20 64289 Darmstadt http://www.avr-asm-tutorial.net Hardware Hardware-Aufbau Controller Experimentierboard I/O-Ports Timing Hardwaretimer

Mehr

The amforth Cookbook angefangen

The amforth Cookbook angefangen The amforth Cookbook Author: Datum: Erich Wälde 2009-02-22 angefangen 2 Inhaltsverzeichnis 1 Projekt mit ATMEGA 32 5 1.1 Board................................ 5 1.2 Beispiel Applikation........................

Mehr

ATMEGA Mikrocontroller Einführung TEIL 1. 4.November 2009 Mönchengladbach

ATMEGA Mikrocontroller Einführung TEIL 1. 4.November 2009 Mönchengladbach ATMEGA Mikrocontroller Einführung TEIL 1 DH5HS 4.November 2009 Mönchengladbach Was ist ein MCU Als Mikrocontroller (auch µcontroller, µc, MCU) werden Halbleiterchips bezeichnet, die mit dem Prozessor mindestens

Mehr

Programmierung von ATMEL AVR Mikroprozessoren am Beispiel des ATtiny13. Teil IV: Programmieren an Beispielen

Programmierung von ATMEL AVR Mikroprozessoren am Beispiel des ATtiny13. Teil IV: Programmieren an Beispielen Programmierung von ATMEL AVR Mikroprozessoren am Beispiel des ATtiny13 Eine Einführung in Aufbau, Funktionsweise, Programmierung und Nutzen von Mikroprozessoren Teil IV: Programmieren an Beispielen Die

Mehr

C.1 Serielle Schnittstelle, erstes Testprogramm (a)

C.1 Serielle Schnittstelle, erstes Testprogramm (a) C.1 Serielle Schnittstelle, erstes Testprogramm (a) Verbinden Sie die Mikrocontrollerplatine mit dem USB-Anschluss Ihres Rechners und laden Sie das abgebildete Testprogramm auf den Mikrocontroller. Es

Mehr

M-AX-16/C1 (Typ 37) Inhaltsverzeichnis 18-1 18. M-AX-16/C1

M-AX-16/C1 (Typ 37) Inhaltsverzeichnis 18-1 18. M-AX-16/C1 MAX6/C (Typ 37) Inhaltsverzeichnis 8 8. MAX6/C Zählermodul mit 3 Zählkanälen à 2Bit und integriertem InterruptController, Betriebsartenumschaltung per Software Funktionsbeschreibung 82 Blockschaltbild...

Mehr

AN025. Application Note 025 zu MODULAR-4 (ML3 und ML5) Messen der CPU-Auslastung im Echtzeitbetrieb

AN025. Application Note 025 zu MODULAR-4 (ML3 und ML5) Messen der CPU-Auslastung im Echtzeitbetrieb AN025 Application Note 025 zu MODULAR-4 (ML3 und ML5) Messen der Autor: HB AN025.DOC (6 Seiten) 1. Definition Im folgenden wie auch in allen anderen Sorcus Schriften werden folgende Kurzbezeichnungen verwendet:

Mehr

Interruptsystem AVR. Interrupt-Quellen: Extern, Timer, ADC, USART usw. (siehe IVT im Anhang) Rücksprungadresse automatisch am Stack.

Interruptsystem AVR. Interrupt-Quellen: Extern, Timer, ADC, USART usw. (siehe IVT im Anhang) Rücksprungadresse automatisch am Stack. Interruptsystem AVR Interrupt-Quellen: Extern, Timer, ADC, USART usw. (siehe IVT im Anhang) Rücksprungadresse automatisch am Stack Stack im SRAM SP initialisieren Interrupt-Kontrollregister im IO Space

Mehr

16-Bit PCA Timer/Counter

16-Bit PCA Timer/Counter 4.5.1 Programmable Counter Array (PCA) Das Programmable Counter Array besteht aus fünf PCA-Modulen, die einen gemeinsamen 16- Bit Timer/Counter als Zeitbasis verwenden. ECI: Externer Clock-Eingang für

Mehr

Wer in der Grundschule ein wenig aufgepasst hat, sollte in der Lage sein schriftlich eine Zahl durch eine zweite zu teilen.

Wer in der Grundschule ein wenig aufgepasst hat, sollte in der Lage sein schriftlich eine Zahl durch eine zweite zu teilen. Teilen binär Teil 1 - Vorzeichenlose Ganzzahlen ============ Irgendwann steht jeder Programmieren vor diesem Problem. Wie teile ich eine Binärzahl durch eine zweite? Wer in der Grundschule ein wenig aufgepasst

Mehr

XY-Plotter. Hardware. Software µp. Software PC. von Thomas Wagner

XY-Plotter. Hardware. Software µp. Software PC. von Thomas Wagner XY-Plotter von Thomas Wagner Im folgendem wird ein XY-Plotter beschrieben, der universell einsetzbar ist, jedoch für einen speziellen Einsatzzweck entworfen wurde: die Übertragung, Anzeige und Speicherung

Mehr

11. Die PC-Schnittstelle

11. Die PC-Schnittstelle PC-Schnittstelle Funktion -1. Die PC-Schnittstelle.1. Funktion Die folgenden Angaben gelten ohne Einschränkung für den PC, PC-XT, PC-AT, AT-386, AT-486 und kompatible Rechner. Sie sind nur für jene interessant,

Mehr

4.2 Peripherie ansprechen in C/I2C-Bus

4.2 Peripherie ansprechen in C/I2C-Bus M42L 1. Juni 215 4.2 Peripherie ansprechen in C/I2C-Bus 4.2.1 Problem Das Mikrocontroller-Board soll mit Hilfe eines Sensors vom Typ LM 75 (NXP) die Temperatur erfassen und ausgeben. Der Sensor ist vom

Mehr

Prozess-rechner. auch im Büro. Automation und Prozessrechentechnik. Prozessrechner. Sommersemester 2011. Prozess I/O. zu und von anderen Rechnern

Prozess-rechner. auch im Büro. Automation und Prozessrechentechnik. Prozessrechner. Sommersemester 2011. Prozess I/O. zu und von anderen Rechnern Automation und Prozessrechentechnik Sommersemester 20 Prozess I/O Prozessrechner Selbstüberwachung zu und von anderen Rechnern Prozessrechner speziell Prozessrechner auch im Büro D A D A binäre I/O (Kontakte,

Mehr

BLIT2008-Board. Uwe Berger

BLIT2008-Board. Uwe Berger 11/2008 (BLIT) 2 Inhalt Was sind Mikrocontroller AVR-Mikrocontroller Werkzeugkasten Prinzipielles zur Programmierung BLIT2008-Board 11/2008 (BLIT) 3 Was sind Mikrocontroller AVR-Mikrocontroller Werkzeugkasten

Mehr

ATMega2560Controllerboard

ATMega2560Controllerboard RIBU ELEKTRONIK VERSAND Mühlenweg 6. 8160 Preding. Tel. 017/64800. Fax 64806 Mail: office1@ribu.at. Internet: http://www.ribu.at ATMega560Controllerboard nur 66 x 40 mm große 4 fach Multilayer Platine

Mehr

Mikrocontrollertechnik

Mikrocontrollertechnik Aufgaben: Impulse zählen (Zählerfunktion) Zeitintervalle erzeugen (Zeitgeberfunktion) Prinzipschaltbild: Die Programmierung erfolgt mit den Registern TMOD und TCON: timer.doc TSC Seite 1/8 timer.doc TSC

Mehr

MSP 430. Einführung. Was kann er? Hauptthemen. Wie sieht er aus? 64 / 100 polig. Was kann er? MSP 430 1

MSP 430. Einführung. Was kann er? Hauptthemen. Wie sieht er aus? 64 / 100 polig. Was kann er? MSP 430 1 MSP 430 Mixed Signal Microcontroller MSP 430 Einführung Der Mikrocontrollers MSP430 von Texas Instruments Das Entwicklungsboard MSP-STK 430A320 http://www.ti.com Texas Instruments 1 Texas Instruments 2

Mehr