Inhalt. Aufgabe 4: LED-Modul Hinweise Testen des Moduls Sommersemester 2015

Ähnliche Dokumente
Inhalt. Übungen zu Systemnahe Programmierung in C (SPiC) Schnittstellenbeschreibung. Inhalt

Übungen zu Systemnahe Programmierung in C (SPiC)

Sebastian Maier (Lehrstuhl Informatik 4) Übung 4. Sommersemester 2017

Übungen zu Systemnahe Programmierung in C (SPiC)

Inhalt. Übungen zu Systemnahe Programmierung in C (SPiC) Inhalt. Globale Variablen

Wiederholung: Zugriff auf AVR-Prozessor-Register. Aufgabe 3: 7seg-Modul der SPiCboard-Bibliothek

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

U3-1 Register beim AVR-μC. U3 3. Übung. U3-2 I/O-Ports des AVR-μC. 1 Überblick. 2 Makros für Register-Zugriffe. 1 Überblick

Wiederholung: Zugriff auf AVR-Prozessor-Register. Aufgabe 3: 7seg-Modul der SPiCboard-Bibliothek

Übungen zu Grundlagen der systemnahen Programmierung in C (GSPiC) im Wintersemester 2017/18

Wiederholung: Zugriff auf AVR-Prozessor-Register

U2-1 Register beim AVR- C. U2-2 I/O-Ports des AVR- C. 1 Überblick. 2 Makros für Register-Zugriffe. 1 Überblick

Übungen zu Systemnahe Programmierung in C (SPiC) Wintersemester 2017/18

Übungen zu Systemnahe Programmierung in C (SPiC) Wintersemester 2018/19

U5-2 Register beim AVR-µC

GdI2 - Systemnahe Programmierung in C Übungen Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2006 U4.fm

Wer möchte, kann sein Programm auch auf echter Hardware testen

U3 3. Übung U3 3. Übung. Systemnahe Programmierung in C Übungen Moritz Strübe Universität Erlangen-Nürnberg Informatik 4, 2009 U3.fm

Besprechung Aufgabe 1. Pointer. Register und Ports. SPiC - Ü U3.1

Parallel-IO. Ports am ATmega128

Übungen zu Systemnahe Programmierung in C (SPiC)

Arduino für FunkAmateure

Zeiger vom Typ (void *) sind am besten für Zeigerarithmetik geeignet, da sie kompatibel zu jedem Zeigertyp sind.

Inhalt. Übungen zu Systemnahe Programmierung in C (SPiC) Inhalt

Übungen zu Grundlagen der systemnahen Programmierung in C (GSPiC) im Sommersemester 2018

myavr Programmierung in C

Ansteuerung eines LCD-Screens

IR NEC Empfänger mit 4x7 LED Anzeige (ATtiny2313)

U4 Grundlagen der C-Programmierung

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

C++ mit dem Arduino (Uno und Mega2560)

Grundlagen der Informatik 2 Modul Systemnahe Programmierung in C (SPiC) Klausur am 25. Juli 2008

AVR Ein/Ausgabe. Inhaltsverzeichnis

Microcontroller Kurs Programmieren Microcontroller Kurs/Johannes Fuchs 1

Lotto. eine Projektarbeit in DVT. von Sven Schwab

C++ mit dem Arduino (Uno und Mega2560)

Erste Gehversuche mit ARDUINO (Teil 3) (DL6OAA) Die 7-Segmentanzeige (1-stellig)

Einführung Sprachfeatures Hinweise, Tipps und Styleguide Informationen. Einführung in C. Patrick Schulz

Serielle Schnittstelle, erstes Testprogramm (a)

d) Was passiert, wenn das folgende Programmstück übersetzt und ausgeführt

f) Was versteht man beim Zugriff auf I/O-Register unter dem Begriff "Memory-mapped"?

Für den Anschluss dieses und anderer Module dieser Serie an das myavr Board steht ein Adapter zur Verfügung.

b) Gegeben sei folgende Enumeration: enum SPRACHE {Deutsch, Englisch, Russisch};

8.3 Taster am µcontroller

Zeiger vom Typ (void *) sind am besten für Zeigerarithmetik geeignet, da sie kompatibel zu jedem Zeigertyp sind.

Aufgaben zur Attiny-Platine

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 29

V cc. 1 k. 7 mal 150 Ohm

4 Formelsammlung C/C++

Die Software zum Unser kleiner Computer

Mikrocontroller - Schnelleinstieg

Friedrich-Alexander-Universität Erlangen-Nürnberg

Systemnahe Programmierung in C Übungen Moritz Strübe, Michael Stilkerich Universität Erlangen-Nürnberg Informatik 4, 2010 U2.fm

Was ist ein µ-controller?

c dl SPiC (Teil C, SS 11) 14 µc-systemarchitektur 14.1 Überblick x0000 0x0046 main:... wait:... Peripherie 0x1FFFF

Übungen zu Systemnahe Programmierung in C (SPiC) Inhalt. Moritz Strübe, Rainer Müller (Lehrstuhl Informatik 4) Sommersemester 2014

Mikrocontrollerplatine vorbereiten

A B C D E C 5 7 D 3 E. 2. [6-Bit, positiv] Welche Dezimalzahl wird durch die gegebene Bit-Sequenz kodiert?

d) Welche Aussage zu Zeigern ist richtig? Beim Rechnen mit Zeigern wird immer der Typ des Zeigers beachtet.

Übungen zu Systemnahe Programmierung in C (SPiC)

Überblick: Teil C Systemnahe Softwareentwicklung

Starten Sie die Arduino IDE und geben Sie den folgenden Programmcode ein:

C.1 Serielle Schnittstelle, erstes Testprogramm (a)

a) Welche Aussage zu Zeigern ist richtig? Die Übergabesemantik für Zeiger als Funktionsparameter ist callby-value.

Programmierung mit C Modularisierung von Programmen. Präprozessor-Anweisungen nutzen.

Inhalt. Übungen zu Systemnahe Programmierung in C (SPiC) Implementierung von Interruptbehandlungen. Interrupts

Projektarbeit in DVT auf dem Entwicklerboard

U4 Grundlagen der C-Programmierung

Mikrocontroller. Projekt. August update: 27. August 2017 um 15:20

Zeiger vom Typ (void *) sind am besten für Zeigerarithmetik geeignet, da sie kompatibel zu jedem Zeigertyp sind.

AVR-8-bit-Mikrocontroller Gruppe AVR-C-Projekte Teil AVR_PB_LED

C++ - Einführung in die Programmiersprache Header-Dateien und Funktionen. Leibniz Universität IT Services Anja Aue

b) Gegeben sei folgende Enumeration: enum SPRACHE {Deutsch, Englisch, Russisch};

Programmierung mit C Zeiger

Microcontroller Praktikum SS2010 Dipl. Ing. R. Reisch

Inhalt. Übungen zu Systemnahe Programmierung in C (SPiC) Interrupts. Inhalt. Interrupts. Synchronisation

#include "C:\Users\media\Desktop\Harri\Technik\Elektronik\Projekte\Stiftuhr\Servotest\servotest\servotest.h"

HTL St.Pölten. EL Autor: Kuran. Mikrocontrollerprogrammierung Teil 1:

b) Was bewirken folgende Programmanweisungen? uint8_t x = 42; x ^= x;

Grundlagen der Objektorientierung :

U3 Grundlagen der AVR-Programmierung

Eingaben. Themen heute. Taster. Eingaben Zuweisungen Zeitmessung. Programmieren für Ingenieure Sommer Andreas Zeller, Universität des Saarlandes

Prof. Dr.-Ing. F. Kesel Dipl.-Ing. (FH) J. Hampel Dipl.-Ing. (FH) A. Reber

Mikrocontroller. Programmierung in C. Jan Unger

d) Welche Aussage zu volatile ist richtig?

Zeiger vom Typ void* benötigen weniger Speicher als andere Zeiger, da bei anderen Zeigertypen zusätzlich die Größe gespeichert werden muss.

Bisher hatten immer nur als Ausgänge geschaltet und hierfür folgende Befehle benutzt:

RO-Tutorien 17 und 18

Die Grösse der primitiven Datentypen in C ist architekturabhängig

Technische Dokumentation

RO-Tutorien 15 und 16

Einführung in AVR-Assembler

Stopp-Uhr. Erstellen Sie ein Programm (in Zweier- bzw. Dreier-Gruppen), welches folgende Bedingungen erfüllt:

Eine tastergesteuerte LED

Transkript:

Übungen zu Systemnahe Programmierung in C (SPiC) Peter Wägemann, Sebastian Maier, Heiko Janker () Übung 4 Ablauf vom Quellcode zum laufenden Programm Active-high & Active-low Hinweise Sommersemester 2015 2 16 Ablauf vom Quellcode zum laufenden Programm Erstellen einer.h-datei (Konvention: gleicher Name wie.c-datei) 1 #ifndef LED_H 2 #define LED_H 3 /* fixed-width Datentypen einbinden (im Header verwendet) */ 4 #include <stdint.h> 5 /* LED-Typ */ 6 typedef enum { RED0=0, YELLOW0=1, GREEN0=2,... } LED; 7 /* Funktion zum Aktivieren einer bestimmten LED */ 8 uint8_t sb_led_on(led led); 9... 10 #endif Mehrfachinkludierung (evtl. Zyklen!) vermeiden Include-Guard durch Definition und Abfrage eines Präprozessormakros Konvention: das Makro hat den Namen der.h-datei,. ersetzt durch _ Der wird nur eingebunden, wenn das Makro noch nicht definiert ist Vorsicht: flacher Namensraum Wahl möglichst eindeutiger Namen 2 16 3 16

Ablauf vom Quellcode zum laufenden Programm test.c gcc test.o 7seg.c gcc 7seg.o libspicboard 7seg.h timer.h adc.h 1. Präprozessor 2. Compiler 3. Linker 4. Programmer/Flasher ld aufgabe4.elf libspicboard.a 7seg.o led.o timer.o adc.o button.o müssen Initialisierung durchführen (z.b. Portkonfiguration) z.b. in Java mit Klassenkonstruktoren möglich C kennt kein solches Konzept Workaround: Modul muss bei erstem Aufruf einer seiner Funktionen ggf. die Initialisierung durchführen muss sich merken, ob die Initialisierung schon erfolgt ist Mehrfachinitialisierung vermeiden 1 static uint8_t initdone = 0; 2 // alternativ: lokale static Variable in init() 3 4 static void init(void) {... } 5 void mod_func(void) { 6 if(initdone == 0) { 7 initdone = 1; 8 init(); 9 } 10... Initialisierung darf nicht mit anderen n in Konflikt stehen! 4 16 Active-high & Active-low 5 16 Ausgang: active-high & active-low Ausgang je nach Beschaltung: active-high: high-pegel (logisch 1; V cc am Pin) LED leuchtet active-low: low-pegel (logisch 0; GND am Pin) LED leuchtet 5 16 6 16

Eingang: active-high & active-low Eingang je nach Beschaltung: active-high: Button gedrückt high-pegel (logisch 1; V cc am Pin) active-low: Button gedrückt low-pegel (logisch 0; GND am Pin) interner pull-up-widerstand (im ATmega32) konfigurierbar 8155B AVR 07/09 8155B AVR 07/09 Note: Note: Bottom pad Bottom should pad should be soldered be soldered to ground. to ground.!1#/())*=8!1#/())*=8!3#>())*#'!3=0())*#,!&#$())*#/!&53())*#2!3#>())*#'!3=0())*#,!&#$())*#/!&53())*#2 0 0 *+4))!33( *+2))!0-.,%1#'( *+/))!0-.'%-.&/( *+,))!&,( *+4))!33( *+'))!"#$%&'( *+2))!0-.,%1#'( *+/))!0-.'%-.&/( *+,))!&,( *+'))!"#$%&'( TQFP/MLF TQFP/MLF!"#$%&'())*+'!"#$%&'())*+'!&,())*+,!&,())*+,!-.&/%0-.'())*+/!-.&/%0-.'())*+/!1#'%0-.,())*+2!1#'%0-.,())*+2!33())*+4!33())*+4 *#8) *#7) *#6) *#4) *#2) *#/) *#,) *#') *=8) ATmega32A!0=#'!0=#,!0=#/!0=#2!0=#4!0=#6!0=#7!0=#8? 0 0 *#2))!&53( *#2))!&53( *#/))!&#$( *#/))!&#$( *#,))!3=0( *#,))!3=0( *#'))!3#>( *#'))!3#>( *=8))!1#/( *=8))!1#/( Jeder I/O-Port des AVR-µC wird durch drei 8-bit Register gesteuert: Datenrichtungsregister (DDRx = data direction register) Datenregister (PORTx = port output register) Port Eingabe Register (PINx = port input register, nur-lesbar) Jedem Anschluss-Pin ist ein Bit in jedem der 3 Register zugeordnet PDIP PDIP Pinout ATmega32A ATmega32A 7 16 I/O-Port-Register 8 16 Beispiel: Initialisierung eines Ports DDRx: hier konfiguriert man Pin i von Port x als Ein- oder Ausgang Bit i = 1 Pin i als Ausgang verwenden Bit i = 0 Pin i als Eingang verwenden PORTx: Auswirkung abhängig von DDRx: ist Pin i als Ausgang konfiguriert, so steuert Bit i im PORTx Register ob am Pin i ein high- oder ein low-pegel erzeugt werden soll Bit i = 1 high-pegel an Pin i Bit i = 0 low-pegel an Pin i ist Pin i als Eingang konfiguriert, so kann man einen internen pull-up-widerstand aktivieren Bit i = 1 pull-up-widerstand an Pin i (Pegel wird auf high gezogen) Bit i = 0 Pin i als tri-state konfiguriert PINx: Bit i gibt aktuellen Wert des Pin i von Port x an (nur lesbar) Pin 3 von Port B (PB3) als Ausgang konfigurieren und PB3 auf Vcc schalten: 1 DDRB = (1 << PB3); /* =0x08; PB3 als Ausgang nutzen... */ 2 PORTB = (1 << PB3); /*...und auf 1 (=high) setzen */ Pin 2 von Port D (PD2) als Eingang nutzen, pull-up-widerstand aktivieren und prüfen ob ein low-pegel anliegt: 1 DDRD &= ~(1 << PD2); /* PD2 als Eingang nutzen... */ 2 PORTD = (1 << PD2); /* pull-up-widerstand aktivieren*/ 3 if ( (PIND & (1 << PD2)) == 0) { /* den Zustand auslesen */ 4 /* ein low Pegel liegt an, der Taster ist gedrückt */ 5 } Die Initialisierung der Hardware wird in der Regel einmalig zum Programmstart durchgeführt 9 16 10 16

LED-Modul Übersicht Hinweise LED 0: Port D, Pin 7 LED 1: Port C, Pin 0... 10 16 11 16 LED-Modul Aufgabe AVR-Studio Projekteinstellungen LED-Modul der SPiCboard-Bibliothek selbst implementieren Projekt wie gehabt anlegen Wenn nun übersetzt wird, werden die Funktionen aus dem eigenen LED-Modul verwendet Gleiches Verhalten wie das Original Beschreibung: http://www4.cs.fau.de/lehre/ss15/v_spic/uebung/doc Initiale Quelldatei: test.c Dann weitere Quelldatei led.c hinzufügen Eigenes Modul mit einem Testprogramm (test.c) linken Andere Teile der Bibliothek können für den Test benutzt werden Andere Teile der Bibliothek werden nach Bedarf hinzugebunden Temporäres deaktivieren zum Test der Originalfunktiononen: LEDs des SPiCboards Anschlüsse und Namen der einzelnen LEDs können dem Übersichtsbildchen entnommen werden Alle LEDs sind active-low, d.h. leuchten wenn ein low-pegel auf dem Pin angelegt wird PD7 = Port D, Pin 7 12 16 1 2 3 #if 0... #endif Sieht der Compiler diese Kommentare? 13 16

Exkurs: const uint8_t* vs. uint8_t* const PORT- und PIN-Array const uint8_t*: ein Pointer auf einen uint8_t-wert, der konstant ist Wert nicht über den Pointer veränderbar uint8_t* const ein konstanter Pointer auf einen (beliebigen) uint8_t-wert Pointer darf nicht mehr auf eine andere Speicheradresse zeigen Port Definition 1 #define PORTD (* (volatile uint8_t*)0x2b) Adressoperator: & Dereferenzierungsoperator: Port Array: 1 static volatile uint8_t * const ports[] = { &PORTD, 2 &PORTC, 3... }; Pin Array: 1 static uint8_t const pins[] = { PD7, PC0,... }; 14 16 15 16 1 void main(void){ 2 // 1.) Testen bei korrekter LED-ID 3 int8_t result = sb_led_on(red0); 4 if(result!= 0){ 5 // Test fehlgeschlagen 6 // Ausgabe z.b. auf 7-Segment-Anzeige 7 } 8 9 // 2.) Testen bei ungueltiger LED-ID 10... 11 } genau beachten (inkl. Rückgabewerte) Testen aller möglichen Rückgabewerte Fehler wenn Rückgabewert nicht der Spezifikation entspricht 16 16