diff --git a/20151210/Makefile b/20151210/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..3ff5a0d4adedf0426fa107eae07db3016505c394 --- /dev/null +++ b/20151210/Makefile @@ -0,0 +1,606 @@ +# Hey Emacs, this is a -*- makefile -*- +############################################################################### +# RP6 MAKEFILE FOR WinAVR +# Based on WinAVR Sample makefile written by Eric B. Weddington, +# J�rg Wunsch, et al. +# +# +# YOU NEED TO EDIT SOME SMALL THINGS IN THIS FILE IF YOU WANT TO USE +# IT FOR YOUR OWN PROJECTS! +# THESE LINES ARE ALL AT THE TOP OF THIS FILE AND MARKED VERY CLEARLY ! +# BETTER DO NOT EDIT ANYTHING ELSE! +# +# To compile everything you can simply type "make all" on a command line in +# this directory or simply use the supplied batch files! +# To remove all the temporary files the compiler has generated you can use +# "make clean" +# See end of this file and "make" user manual for more details! +# +# +# Note: Everything behind a '#' is interpreted as a comment in this file! +# +############################################################################### + + + + +############################################################################### +# Target file name (without extension). +# This is the name of your main C source file! Do NOT append the ".c"! +# Example: Let's assume your main source file is "RP6Base_MyProgram.c", then +# you would write: TARGET = RP6Base_MyProgram + +TARGET = blink-5 + +############################################################################### + + + +############################################################################### +# Specify relative path to RP6 library files here. +# This is "../lib" usually. + +RP6_LIB_PATH=../RP6Lib +RP6_LIB_PATH_OTHERS= $(RP6_LIB_PATH)/RP6base $(RP6_LIB_PATH)/RP6common + +############################################################################### + + +#------------------------------------------------ +# Main Source file is _automatically_ added here: +SRC = $(TARGET).c + +############################################################################### +# If there is more than one source file, append them here separated by spaces. +# Usually you have to add the Library files here! (ONLY add c files "*.c" here, +# NO header files "*.h"!) +# Don't forget to add relative paths! + +#SRC += $(RP6_LIB_PATH)/RP6base/RP6RobotBaseLib.c +#SRC += $(RP6_LIB_PATH)/RP6common/RP6uart.c +##SRC += $(RP6_LIB_PATH)/RP6common/RP6I2CmasterTWI.c + +# You can also wrap lines by appending a backslash to the end of the line +# like this: +#SRC += xyz.c \ +#abc.c \ +#asdf.c +# +############################################################################### + + +############################################################################### +# Optimization level, can be [0, 1, 2, 3, s]. 0 turns off optimization. +# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) + +OPT = s + +############################################################################### + + + + + + + + + + + +# # +#-----------------------------------------------------------------------------# +############################################################################### +######-------------------------------------------------------------------###### +###### DO NOT EDIT ANYTHING BELOW IF YOU DO NOT KNOW WHAT YOU ARE DOING! ###### +######-------------------------------------------------------------------###### +############################################################################### +#-----------------------------------------------------------------------------# +# # + + + + + + + + + + + + + + +# MCU name - atmega32 for RP6 Base and Processor Expansion +MCU = atmega32 + + +# Output format. (can be srec, ihex, binary) +FORMAT = ihex + + +# List Assembler source files here. +# Make them always end in a capital .S. Files ending in a lowercase .s +# will not be considered source files but generated files (assembler +# output from the compiler), and will be deleted upon "make clean"! +# Even though the DOS/Win* filesystem matches both .s and .S the same, +# it will preserve the spelling of the filenames, and gcc itself does +# care about how the name is spelled on its command-line. +ASRC = + + +# Debugging format. +# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. +# AVR Studio 4.10 requires dwarf-2. +# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. +DEBUG = dwarf-2 + + +# List any extra directories to look for include files here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRAINCDIRS = $(RP6_LIB_PATH) $(RP6_LIB_PATH_OTHERS) + + +# Compiler flag to set the C Standard level. +# c89 = "ANSI" C +# gnu89 = c89 plus GCC extensions +# c99 = ISO C99 standard (not yet fully implemented) +# gnu99 = c99 plus GCC extensions +CSTANDARD = -std=gnu99 + + + + +# DO NOT USE THIS FOR RP6 PROJECTS! +# +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# F_CPU = 8000000 + +# Place -D or -U options here +CDEFS = -DDEBUG_MEASURE_DUTY_CYCLE +# -DF_CPU=$(F_CPU)UL +# uncommented - caused a compile problem. + + + + +# Place -I options here +CINCS = + + + +#---------------- Compiler Options ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CFLAGS = -g$(DEBUG) +CFLAGS += $(CDEFS) $(CINCS) +CFLAGS += -O$(OPT) +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +CFLAGS += -Wall -Wstrict-prototypes -Werror +CFLAGS += -Wa,-adhlns=$(<:.c=.lst) +CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +CFLAGS += $(CSTANDARD) + + +#---------------- Assembler Options ---------------- +# -Wa,...: tell GCC to pass this to the assembler. +# -ahlms: create listing +# -gstabs: have the assembler create line number information; note that +# for use in COFF files, additional information about filenames +# and function names needs to be present in the assembler source +# files -- see avr-libc docs [FIXME: not yet described there] +# -listing-cont-lines: Sets the maximum number of continuation lines of hex +# dump that will be displayed for a given single line of source input. +ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs,--listing-cont-lines=100 + + +#---------------- Library Options ---------------- +# Minimalistic printf version +PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min + +# Floating point printf version (requires MATH_LIB = -lm below) +PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt + +# If this is left blank, then it will use the Standard printf version. +PRINTF_LIB = +#PRINTF_LIB = $(PRINTF_LIB_MIN) +#PRINTF_LIB = $(PRINTF_LIB_FLOAT) + + +# Minimalistic scanf version +SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min + +# Floating point + %[ scanf version (requires MATH_LIB = -lm below) +SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt + +# If this is left blank, then it will use the Standard scanf version. +SCANF_LIB = +#SCANF_LIB = $(SCANF_LIB_MIN) +#SCANF_LIB = $(SCANF_LIB_FLOAT) + + +MATH_LIB = -lm + + + +#---------------- External Memory Options ---------------- + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# used for variables (.data/.bss) and heap (malloc()). +#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# only used for heap (malloc()). +#EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff + +EXTMEMOPTS = + + + +#---------------- Linker Options ---------------- +# -Wl,...: tell GCC to pass this to linker. +# -Map: create map file +# --cref: add cross reference to map file +LDFLAGS = -Wl,-Map=$(TARGET).map,--cref +LDFLAGS += $(EXTMEMOPTS) +LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) + + + +#---------------- Programming Options (avrdude) ---------------- + +# Programming hardware: alf avr910 avrisp bascom bsd +# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 +# +# Type: avrdude -c ? +# to get a full listing. +# +AVRDUDE_PROGRAMMER = stk500 + +# com1 = serial port. Use lpt1 to connect to parallel port. +AVRDUDE_PORT = com1 # programmer connected to serial device + +AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex +#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep + + +# Uncomment the following if you want avrdude's erase cycle counter. +# Note that this counter needs to be initialized first using -Yn, +# see avrdude manual. +#AVRDUDE_ERASE_COUNTER = -y + +# Uncomment the following if you do /not/ wish a verification to be +# performed after programming the device. +#AVRDUDE_NO_VERIFY = -V + +# Increase verbosity level. Please use this when submitting bug +# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> +# to submit bug reports. +#AVRDUDE_VERBOSE = -v -v + +AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) +AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) +AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) + + + +#---------------- Debugging Options ---------------- + +# For simulavr only - target MCU frequency. +DEBUG_MFREQ = $(F_CPU) + +# Set the DEBUG_UI to either gdb or insight. +# DEBUG_UI = gdb +DEBUG_UI = insight + +# Set the debugging back-end to either avarice, simulavr. +DEBUG_BACKEND = avarice +#DEBUG_BACKEND = simulavr + +# GDB Init Filename. +GDBINIT_FILE = __avr_gdbinit + +# When using avarice settings for the JTAG +JTAG_DEV = /dev/com1 + +# Debugging port used to communicate between GDB / avarice / simulavr. +DEBUG_PORT = 4242 + +# Debugging host used to communicate between GDB / avarice / simulavr, normally +# just set to localhost unless doing some sort of crazy debugging when +# avarice is running on a different computer. +DEBUG_HOST = localhost + + + +#============================================================================ + + +# Define programs and commands. +SHELL = sh +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size +NM = avr-nm +AVRDUDE = avrdude +REMOVE = rm -f +REMOVEDIR = rmdir +COPY = cp +WINSHELL = cmd + + +# Define Messages +# English +MSG_ERRORS_NONE = Errors: none +MSG_BEGIN = -------- begin -------- +MSG_END = -------- end -------- +MSG_SIZE_BEFORE = Size before: +MSG_SIZE_AFTER = Size after: +MSG_COFF = Converting to AVR COFF: +MSG_EXTENDED_COFF = Converting to AVR Extended COFF: +MSG_FLASH = Creating load file for Flash: +MSG_EEPROM = Creating load file for EEPROM: +MSG_EXTENDED_LISTING = Creating Extended Listing: +MSG_SYMBOL_TABLE = Creating Symbol Table: +MSG_LINKING = Linking: +MSG_COMPILING = Compiling: +MSG_ASSEMBLING = Assembling: +MSG_CLEANING = Cleaning project: + + + + +# Define all object files. +OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) + +# Define all listing files. +LST = $(SRC:.c=.lst) $(ASRC:.S=.lst) + + +# Compiler flags to generate dependency files. +GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d + + +# Combine all necessary flags and optional flags. +# Add target processor to flags. +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) + + + + + +# Default target. +all: begin gccversion sizebefore build sizeafter end + +build: elf hex eep lss sym + +elf: $(TARGET).elf +hex: $(TARGET).hex +eep: $(TARGET).eep +lss: $(TARGET).lss +sym: $(TARGET).sym + + + +# Eye candy. +# AVR Studio 3.x does not check make's exit code but relies on +# the following magic strings to be generated by the compile job. +begin: + @echo + @echo $(MSG_BEGIN) + +end: + @echo $(MSG_END) + @echo + + +# Display size of file. +HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex +ELFSIZE = $(SIZE) --format=avr --mcu=$(MCU) $(TARGET).elf + +sizebefore: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ + 2>/dev/null; echo; fi + +sizeafter: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ + 2>/dev/null; echo; fi + + + +# Display compiler version information. +gccversion : + @$(CC) --version + + + +# Program the device. +program: $(TARGET).hex $(TARGET).eep + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) + + +# Generate avr-gdb config/init file which does the following: +# define the reset signal, load the target file, connect to target, and set +# a breakpoint at main(). +gdb-config: + @$(REMOVE) $(GDBINIT_FILE) + @echo define reset >> $(GDBINIT_FILE) + @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) + @echo end >> $(GDBINIT_FILE) + @echo file $(TARGET).elf >> $(GDBINIT_FILE) + @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) +ifeq ($(DEBUG_BACKEND),simulavr) + @echo load >> $(GDBINIT_FILE) +endif + @echo break main >> $(GDBINIT_FILE) + +debug: gdb-config $(TARGET).elf +ifeq ($(DEBUG_BACKEND), avarice) + @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. + @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ + $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) + @$(WINSHELL) /c pause +else + @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ + $(DEBUG_MFREQ) --port $(DEBUG_PORT) +endif + @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) + + + +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT=$(OBJCOPY) --debugging \ +--change-section-address .data-0x800000 \ +--change-section-address .bss-0x800000 \ +--change-section-address .noinit-0x800000 \ +--change-section-address .eeprom-0x810000 + + +coff: $(TARGET).elf + @echo + @echo $(MSG_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-avr $< $(TARGET).cof + + +extcoff: $(TARGET).elf + @echo + @echo $(MSG_EXTENDED_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof + + + +# Create final output files (.hex, .eep) from ELF output file. +%.hex: %.elf + @echo + @echo $(MSG_FLASH) $@ + $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ + +%.eep: %.elf + @echo + @echo $(MSG_EEPROM) $@ + -$(OBJCOPY) -j .eeprom --set-section-flags .eeprom=alloc,load \ + --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0 + +# Create extended listing file from ELF output file. +%.lss: %.elf + @echo + @echo $(MSG_EXTENDED_LISTING) $@ + $(OBJDUMP) -h -S $< > $@ + +# Create a symbol table from ELF output file. +%.sym: %.elf + @echo + @echo $(MSG_SYMBOL_TABLE) $@ + $(NM) -n $< > $@ + + + +# Link: create ELF output file from object files. +.SECONDARY : $(TARGET).elf +.PRECIOUS : $(OBJ) +%.elf: $(OBJ) + @echo + @echo $(MSG_LINKING) $@ + $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) + + +# Compile: create object files from C source files. +%.o : %.c + @echo + @echo $(MSG_COMPILING) $< + $(CC) -c $(ALL_CFLAGS) $< -o $@ + + +# Compile: create assembler files from C source files. +%.s : %.c + $(CC) -S $(ALL_CFLAGS) $< -o $@ + + +# Assemble: create object files from assembler source files. +%.o : %.S + @echo + @echo $(MSG_ASSEMBLING) $< + $(CC) -c $(ALL_ASFLAGS) $< -o $@ + +# Create preprocessed source for use in sending a bug report. +%.i : %.c + $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ + + +# Target: clean project. +clean: begin clean_list end + +clean_list : + @echo + @echo $(MSG_CLEANING) + +# We want to keep the generated hexfiles: +# $(REMOVE) $(TARGET).hex + + $(REMOVE) $(TARGET).eep + $(REMOVE) $(TARGET).cof + $(REMOVE) $(TARGET).elf + $(REMOVE) $(TARGET).map + $(REMOVE) $(TARGET).sym + $(REMOVE) $(TARGET).lss + $(REMOVE) $(OBJ) + $(REMOVE) $(LST) + $(REMOVE) $(SRC:.c=.s) + $(REMOVE) $(SRC:.c=.d) + $(REMOVE) $(SRC:.c=.i) + $(REMOVE) .dep/* + $(REMOVEDIR) .dep + + +# Include the dependency files. +include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) + + +# Listing of phony targets. +.PHONY : all begin finish end sizebefore sizeafter gccversion \ +build elf hex eep lss sym coff extcoff \ +clean clean_list program debug gdb-config + + +############################################################################### +# Based on WinAVR Sample makefile written by Eric B. Weddington, +# J�rg Wunsch, et al. +# Released to the Public Domain. +# Please read the "make" user manual! +# +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device, using avrdude. +# Please customize the avrdude settings first! +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +# +############################################################################### diff --git a/20151210/ainf-uebung-20151210.pdf b/20151210/ainf-uebung-20151210.pdf index a1f066174b1ab5bdbc5859faa48dfb7f130ce670..f887d177207dbe517ce42d1ac5831a821b84503b 100644 Binary files a/20151210/ainf-uebung-20151210.pdf and b/20151210/ainf-uebung-20151210.pdf differ diff --git a/20151210/ainf-uebung-20151210.tex b/20151210/ainf-uebung-20151210.tex index 10d9cdb58e9b4abee19bb41b5cc2c1d6d828ab5a..5a5b7e1dfdf7091434d9a0c6be4c5a037e8af935 100644 --- a/20151210/ainf-uebung-20151210.tex +++ b/20151210/ainf-uebung-20151210.tex @@ -46,7 +46,7 @@ \section*{Angewandte Informatik\\Übungsaufgaben -- 10.\ Dezember 2015} - \exercise{Bit-Array} + \subsection*{Bit-Array} Schreiben Sie C-Funktionen, die ein "`Array von Bits"' realisieren, z.\,B.: @@ -75,6 +75,8 @@ Sie benötigen eine Division (\lstinline|/|) sowie den Divisionsrest (Modulo: \lstinline|%|). \end{itemize} +\iffalse + \exercise{Arrays mit Zahlen} \begin{minipage}[t]{0.5\textwidth} @@ -148,4 +150,6 @@ \end{enumerate} \end{minipage} +\fi + \end{document} diff --git a/20151210/blink-4.c b/20151210/blink-4.c new file mode 100644 index 0000000000000000000000000000000000000000..4d98f159c7916de6a93510ad8f1451f05df5477e --- /dev/null +++ b/20151210/blink-4.c @@ -0,0 +1,16 @@ +#include <avr/io.h> + +#define F_CPU 8000000 +#include <util/delay.h> + +int main (void) +{ + DDRC = 0x70; + PORTC &= ~0x70; + while (1) + { + PORTC ^= 0x70; + _delay_ms (500); + } + return 0; +} diff --git a/20151210/blink-5.c b/20151210/blink-5.c new file mode 100644 index 0000000000000000000000000000000000000000..84f15c14f2311600e8566373f886339499bb9a1c --- /dev/null +++ b/20151210/blink-5.c @@ -0,0 +1,24 @@ +#include <avr/io.h> +#include <avr/interrupt.h> + +ISR (TIMER0_COMP_vect) +{ + static int counter = 0; + if (counter++ > 1000) + { + PORTB ^= 0x83; + counter = 0; + } +} + +int main (void) +{ + cli (); + TCCR0 = (1 << CS01) | (0 << CS00); + TIMSK = 1 << OCIE0; + sei (); + DDRB = 0x83; + PORTB = 0; + while (1); + return 0; +} diff --git a/20151210/unions-4.c b/20151210/unions-4.c new file mode 100644 index 0000000000000000000000000000000000000000..a2e77170674f30d16ccb57a91f996d0422c9148a --- /dev/null +++ b/20151210/unions-4.c @@ -0,0 +1,33 @@ +#include <stdio.h> +#include <stdint.h> + +int main (void) +{ + union { + uint8_t byte; + struct { + unsigned LEDsR:3; + unsigned LEDsL:3; + unsigned reserved:2; + }; + struct { + unsigned LED1:1; + unsigned LED2:1; + unsigned LED3:1; + unsigned LED4:1; + unsigned LED5:1; + unsigned LED6:1; + unsigned reserved1:1; + unsigned reserved2:1; + }; + } statusLEDs; + + printf ("%d %d %d %d %d %d\n", statusLEDs.LED1, statusLEDs.LED2, statusLEDs.LED3, + statusLEDs.LED4, statusLEDs.LED5, statusLEDs.LED6); + printf ("%d %d\n", statusLEDs.LEDsR, statusLEDs.LEDsL); + statusLEDs.byte = 0x38; + printf ("%d %d %d %d %d %d\n", statusLEDs.LED1, statusLEDs.LED2, statusLEDs.LED3, + statusLEDs.LED4, statusLEDs.LED5, statusLEDs.LED6); + printf ("%d %d\n", statusLEDs.LEDsR, statusLEDs.LEDsL); + return 0; +} diff --git a/20151217/ainf-20151217.pdf b/20151217/ainf-20151217.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a9e7b1dcb6173c69eb756b3bfe9ad58d1ed7d5a4 Binary files /dev/null and b/20151217/ainf-20151217.pdf differ diff --git a/20151217/ainf-20151217.tex b/20151217/ainf-20151217.tex new file mode 100644 index 0000000000000000000000000000000000000000..7ad562c17797df497dfbe9db2e915bf8b21c8c8e --- /dev/null +++ b/20151217/ainf-20151217.tex @@ -0,0 +1,517 @@ +% ainf-20151217.pdf - Lecture Slides on Applied Computer Sciences +% Copyright (C) 2012, 2013, 2015 Peter Gerwinski +% +% This document is free software: you can redistribute it and/or +% modify it either under the terms of the Creative Commons +% Attribution-ShareAlike 3.0 License, or under the terms of the +% GNU General Public License as published by the Free Software +% Foundation, either version 3 of the License, or (at your option) +% any later version. +% +% This document is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this document. If not, see <http://www.gnu.org/licenses/>. +% +% You should have received a copy of the Creative Commons +% Attribution-ShareAlike 3.0 Unported License along with this +% document. If not, see <http://creativecommons.org/licenses/>. + +\documentclass[10pt,t]{beamer} + +\usepackage{pgslides} +\usepackage{pdftricks} +\usepackage{rotating} + +\newrgbcolor{orange}{0.7 0.2 0.0} + +\begin{psinputs} + \usepackage[utf8]{inputenc} + \usepackage[german]{babel} + \usepackage[T1]{fontenc} + \usepackage{helvet} + \renewcommand*\familydefault{\sfdefault} + \usepackage{pstricks,pst-grad,pst-node,pst-plot} +\end{psinputs} + +\lstdefinestyle{asm}{basicstyle=\color{structure}, + language={}, + gobble=4} + +\title{Angewandte Informatik} +\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} +\date{17.\ Dezember 2015} + +\begin{document} + +\maketitleframe + +\sectionnonumber{\inserttitle} + +\begin{frame} + + \showsectionnonumber + + \begin{itemize} + \item[\textbf{1}] \textbf{Einführung} + \item[\textbf{2}] \textbf{Einführung in C} + \item[\textbf{3}] \textbf{Bibliotheken} + \item[\textbf{4}] \textbf{Algorithmen} + \begin{itemize} + \item[4.1] Differentialgleichungen + \item[4.2] Rekursion + \item[4.3] Stack und FIFO + \color{red} + \item[4.4] Aufwandsabschätzungen + \end{itemize} + \item[\textbf{5}] \textbf{Hardwarenahe Programmierung} + \begin{itemize} + \color{medgreen} + \item[5.1] Bit-Operationen + \item[5.2] I/O-Ports + \item[5.3] Interrupts + \color{red} + \item[5.4] volatile-Variable + \color{black} + \item[5.5] Software-Interrupts + \item[\dots] + \end{itemize} + \color{gray} + \item[\makebox(0,0){\textbf{\raisebox{0.5ex}{\dots}}}] +% \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke} + \end{itemize} + +\end{frame} + +\section{Einführung} +\section{Einführung in C} +\section{Bibliotheken} +\section{Algorithmen} + +\section{Hardwarenahe Programmierung} +\subsection{Bit-Operationen} +\subsubsection{Zahlensysteme} + +\begin{frame}[fragile] + + \showsection + \vspace*{-\smallskipamount} + \showsubsection + \vspace*{-\medskipamount} + \showsubsubsection + + Oktal- und Hexadezimal-Zahlen lassen sich ziffernweise\\ + in Binär-Zahlen umrechnen: + + \begin{verbatim} + 000 0 0000 0 1000 8 + 001 1 0001 1 1001 9 + 010 2 0010 2 1010 A + 011 3 0011 3 1011 B + 100 4 0100 4 1100 C + 101 5 0101 5 1101 D + 110 6 0110 6 1110 E + 111 7 0111 7 1111 F + \end{verbatim} + + \begin{picture}(0,0) + \put(8,3){\begin{rotate}{15} + \color{red}\bf + Auswendig lernen! + \end{rotate}} + \end{picture} + +\end{frame} + +\subsubsection{Bit-Operationen in C} + +\begin{frame}[fragile] + + \showsubsubsection + + \begin{tabular}{lll} + C-Operator & Verknüpfung & Anwendung \\[\smallskipamount] + \lstinline,&, & Und & Bits gezielt löschen \\ + \lstinline,|, & Oder & Bits gezielt setzen \\ + \lstinline,^, & Exklusiv-Oder & Bits gezielt invertieren \\ + \lstinline,~, & Nicht & Alle Bits invertieren \\[\smallskipamount] + \lstinline,<<, & Verschiebung nach links & Maske generieren \\ + \lstinline,>>, & Verschiebung nach rechts & Bits isolieren + \end{tabular} + + \bigskip + + Beispiele: + \begin{itemize} + \item + Bit Nr.\ 5 gezielt auf 1 setzen: + \lstinline{PORTB |= 1 << 5;} + \item + Bit Nr.\ 6 gezielt auf 0 setzen: + \lstinline{PORTA &= ~(1 << 6);} + \item + Ist Bit Nr.\ 4 gesetzt? + \lstinline{if (PINC & (1 << 4) ...} + \smallskip + \item + Umschalten zwischen Ein- und Ausgabe: \lstinline{DDR}\\ + Bit = 1: Ausgabe; Bit = 0: Eingabe + \end{itemize} + + \begin{picture}(0,0) + \put(8.4,1){\begin{rotate}{15} + \color{red}\bf + \shortstack{Details abhängig von\\Prozessor und Compiler!} + \end{rotate}} + \end{picture} + +\end{frame} + +\subsection{I/O-Ports} + +\begin{frame}[fragile] + +% \showsection + \showsubsection + \vspace*{-1.5\medskipamount} + {\large\textbf{\color{structure}5.3\quad Interrupts}} + + \bigskip + + Kommunikation mit externen Geräten + + \bigskip + + \begin{center} + \begin{pdfpic} + \psset{unit=1cm}% + \begin{pspicture}(0,0)(10,6) + \rput(0,0){\psframe[framearc=0.25](2,5)} + \rput(1,4.5){\makebox(0,0)[t]{Prozessor}} + \rput(2.0,3.7){\pnode{p0}} + \rput(2.0,3.3){\pnode{q0}} + \rput(2.0,1.0){\pnode{i0}} + \rput(2.12,1.2){\pnode{j0}} + \rput(2.02,1.3){\pnode{k0}} + \rput(2.12,1.4){\pnode{l0}} + \rput(3.5,1.4){\pnode{m0}} + \rput(8,0){\psframe[framearc=0.25](2,5)} + \rput(9,4.5){\makebox(0,0)[t]{\shortstack{externes\\Gerät}}} + \rput(8.0,3.7){\pnode{p1}} + \rput(7.88,3.3){\pnode{q1}} + \rput(7.98,3.2){\pnode{r1}} + \rput(7.88,3.1){\pnode{s1}} + \rput(6.5,3.1){\pnode{t1}} + \rput(8.0,1.0){\pnode{i1}} + \rput(8.0,1.2){\pnode{j1}} + \ncline{->}{p0}{p1} + \ncline{q0}{q1} + \nccurve[angleB=90]{q1}{r1} + \nccurve[angleA=-90]{r1}{s1} + \ncline{->}{s1}{t1} + \rput(2.2,3.8){\makebox(0,0)[lb]{Prozessor schreibt in Output-Port}} + \rput(2.2,3.1){\makebox(0,0)[lt]{Prozessor liest Input-Port}} + \ncline{->}{i1}{i0} + \rput(7.8,1.1){\makebox(0,0)[rb]{externes Gerät ruft Interrupt auf}} + \end{pspicture} + \end{pdfpic} + \end{center} + +\end{frame} + +\begin{frame}[fragile] + + \showsubsection + + In Output-Port schreiben = Leitungen ansteuern + \begin{tabbing} + Datei: \= \file{RP6Base/RP6Base\_Examples/RP6Examples\_20080915/}\\ + \> \file{RP6Lib/RP6base/RP6RobotBaseLib.c} + \end{tabbing} + \begin{onlyenv}<1> + Suchbegriff: \lstinline{setMotorDir} + + \medskip + + \begin{lstlisting}[gobble=6] + void setMotorDir(uint8_t left_dir, uint8_t right_dir) + { + /* ... */ + if(left_dir) + PORTC |= DIR_L; + else + PORTC &= ~DIR_L; + if(right_dir) + PORTC |= DIR_R; + else + PORTC &= ~DIR_R; + } + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(2.2,0.50){\vector(-2,1){0.5}} + \put(2.25,0.40){\makebox(0,0)[l]{Output-Port}} + \put(4.7,3.0){\vector(-2,1){0.75}} + \put(4.7,3.0){\vector(-2,-1){0.75}} + \put(4.8,3.0){\makebox(0,0)[l]{Manipulation einzelner Bits}} + \end{picture} + + \vspace*{-1.5cm} + \strut\hfill\textarrow\ Steuerung der Motordrehrichtung + \end{onlyenv} + \begin{onlyenv}<2> + Suchbegriff: \lstinline{updateStatusLEDs} + + \medskip + + \begin{lstlisting}[gobble=6] + DDRB &= ~0x83; + PORTB &= ~0x83; + if(statusLEDs.LED4){ DDRB |= SL4; PORTB |= SL4; } + if(statusLEDs.LED5){ DDRB |= SL5; PORTB |= SL5; } + if(statusLEDs.LED6){ DDRB |= SL6; PORTB |= SL6; } + DDRC &= ~0x70; + PORTC &= ~0x70; + DDRC |= ((statusLEDs.byte << 4) & 0x70); + PORTC |= ((statusLEDs.byte << 4) & 0x70); + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(3.7,3.9){\vector(-1,0){0.5}} + \put(3.75,3.9){\makebox(0,0)[l]{Data Direction Register: auf Input(!) setzen}} + \put(3.7,3.5){\vector(-1,0){0.5}} + \put(3.75,3.5){\makebox(0,0)[l]{internen Pull-Up-Widerstand ausschalten}} + \put(8.7,2.7){\makebox(0,0)[l]{\shortstack{Manipulation\\einzelner Bits}}} + \put(7.2,1.0){\makebox(0,0)[l]{\shortstack{3 Bits\\gemeinsam}}} + \end{picture} + + \lstinline{union statusLEDs}: Bit-Felder vs.\ Byte + \end{onlyenv} + +\end{frame} + +\subsection{Interrupts} + +\begin{frame}[fragile] + + \showsubsection + + Externes Gerät ruft (per Stromsignal) Unterprogramm auf + + Zeiger hinterlegen: "`Interrupt-Vektor"' + + \medskip + + Datei: \file{RP6Base/RP6Base\_Examples/RP6Examples\_20080915/\\ + RP6Lib/RP6base/RP6RobotBaseLib.c} + + Suchbegriff: \lstinline{ISR} + + \vspace{2.0cm} + + \begin{lstlisting} + ISR (INT0_vect) + { + mleft_dist++; + mleft_counter++; + /* ... */ + } + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(1.9,4.3){\vector(-1,-1){1.4}} + \put(2.0,4.4){\makebox(0,0)[l]{"`Dies ist ein Interrupt-Handler."'}} + \put(2.3,3.6){\vector(-1,-1){0.7}} + \put(2.4,3.6){\makebox(0,0)[l]{Interrupt-Vektor 0 darauf zeigen lassen}} + \put(3.7,2.9){\makebox(0,0)[l]{Schreibweise abhängig von Prozessor und Compiler!}} + \end{picture} + + \vspace*{-1.5cm} + \strut\hfill Aufruf durch Sensor an Encoder-Scheibe\\ + \strut\hfill\textarrow\ Entfernungsmessung + +\end{frame} + +\subsection{volatile-Variable} + +\begin{frame}[fragile] + + \showsubsection + + \begin{lstlisting} + volatile uint16_t mleft_counter; + + /* ... */ + + volatile uint16_t mleft_dist; + + /* ... */ + + ISR (INT0_vect) + { + mleft_dist++; + mleft_counter++; + /* ... */ + } + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(1.6,5.2){\vector(-1,-1){0.55}} + \put(1.6,5.2){\vector(-1,1){0.55}} + \put(1.6,5.2){\makebox(0,0)[l]{"`Immer lesen und schreiben. Nicht wegoptimieren."'}} + \end{picture} + \vspace{-3cm} + \begin{lstlisting} + int main (void) + { + int prev_mleft_dist = mleft_dist; + while (mleft_dist == prev_mleft_dist) + /* just wait */; + } + \end{lstlisting} + +\end{frame} + +\iffalse + +\subsection{Software-Interrupts} + +\begin{frame}[fragile] + + \showsubsection + + \begin{lstlisting}[style=asm] + mov ax, 0012 + int 10 + \end{lstlisting} + \pause + \begin{picture}(0,0) + \color{red} + \put(2.8,0.95){\vector(-1,0){0.55}} + \put(2.9,0.95){\makebox(0,0)[l]{Parameter in Prozessorregister}} + \put(1.7,0.50){\vector(-1,0){0.55}} + \put(1.8,0.50){\makebox(0,0)[l]{Funktionsaufruf über Interrupt-Vektor}} + \end{picture} + + \pause + Beispiel: VGA-Grafikkarte + \begin{itemize} + \item Modus setzen: \lstinline{mov ah, 00} + \item Grafikmodus: \lstinline{mov al, 12} + \item Textmodus: \lstinline{mov al, 03} + \end{itemize} + + \pause + \bigskip + Verschiedene Farben: Output-Ports + \begin{itemize} + \item \newterm{Graphics Register\/}: Index \lstinline{03CE}, Daten \lstinline{03CF} + \item Index 0: \newterm{Set/Reset Register} + \item Index 1: \newterm{Enable Set/Reset Register} + \item Index 8: \newterm{Bit Mask Register} + \item Jedes Bit steht für Schreibzugriff auf eine Speicherbank. + \item 4 Speicherbänke \textarrow\ 16 Farben + \end{itemize} + +\end{frame} + +\fi + +\subsection{Aufwandsabschätzungen} + +\begin{frame}[fragile] + + \showsubsection + + Beispiel: Sortieralgorithmen + + \begin{itemize} + \item + Maximum suchen\only<2->{: $\mathcal{O}(n)$} + \hfill + \begin{minipage}[t]{5.6cm} + \vspace*{-1.3cm} + \begin{pdfpic} + \psset{unit=0.5pt} + \begin{pspicture}(-20,-20)(250,200) + \psline[arrows=->](-10,0)(200,0) + \psline[arrows=->](0,-10)(0,200) + \psplot[plotpoints=200]{1}{125}{2 x 0.06 mul exp} + \put(70,190){\mbox{$g(n) \sim 2^n$}} + \psplot[plotpoints=200]{0}{190}{x x mul 0.005 mul} + \put(190,190){\mbox{$g(n) \sim n^2$}} + \psplot[plotpoints=200]{1}{190}{x ln x mul 0.1 mul} + \put(195,100){\mbox{$g(n) \sim n \log n$}} + \psplot[plotpoints=200]{0}{190}{x 0.4 mul} + \put(195,75){\mbox{$g(n) \sim n$}} + \psplot[plotpoints=200]{1}{190}{x ln 10 mul} + \put(195,50){\mbox{$g(n) \sim \log n$}} + \put(205,0){\makebox(0,0)[l]{$n$}} + \put(-10,210){\makebox(0,0)[l]{$g(n)$}} + \psplot[plotpoints=200]{1}{190}{30} + \put(195,25){\mbox{$g(n) \sim 1$}} + \end{pspicture} + \end{pdfpic} + \small + \begin{description}\itemsep0pt + \item[$n$:] Eingabedaten + \item[$g(n)$:] Rechenzeit + \end{description} + \vspace*{-10cm}\strut + \end{minipage} + \pause[3] + \item + Maximum ans Ende tauschen\\ + \textarrow\ Selectionsort\pause: $\mathcal{O}(n^2)$ + \pause + \item + Während Maximumsuche prüfen,\\abbrechen, falls schon sortiert\\ + \textarrow\ Bubblesort\pause: $\mathcal{O}(n)$ bis $\mathcal{O}(n^2)$ + \pause + \item + Rekursiv sortieren\\ + \textarrow\ Quicksort\pause: $\mathcal{O}(n\log n)$ bis $\mathcal{O}(n^2)$\hfill + \end{itemize} + +\end{frame} + +\sectionnonumber{\inserttitle} + +\begin{frame} + + \showsectionnonumber + + \begin{itemize} + \item[\textbf{1}] \textbf{Einführung} + \item[\textbf{2}] \textbf{Einführung in C} + \item[\textbf{3}] \textbf{Bibliotheken} + \item[\textbf{4}] \textbf{Algorithmen} + \begin{itemize} + \item[4.1] Differentialgleichungen + \item[4.2] Rekursion + \item[4.3] Stack und FIFO + \color{medgreen} + \item[4.4] Aufwandsabschätzungen + \end{itemize} + \item[\textbf{5}] \textbf{Hardwarenahe Programmierung} + \begin{itemize} + \color{medgreen} + \item[5.1] Bit-Operationen + \item[5.2] I/O-Ports + \item[5.3] Interrupts + \item[5.4] volatile-Variable + \color{black} + \item[5.5] Software-Interrupts + \item[\dots] + \end{itemize} + \color{gray} + \item[\makebox(0,0){\textbf{\raisebox{0.5ex}{\dots}}}] +% \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke} + \end{itemize} + +\end{frame} + +\end{document} diff --git a/20151217/ainf-uebung-20151217.pdf b/20151217/ainf-uebung-20151217.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a8720cbc931d8d767e3972bba1828b1b557c4175 Binary files /dev/null and b/20151217/ainf-uebung-20151217.pdf differ diff --git a/20151217/ainf-uebung-20151217.tex b/20151217/ainf-uebung-20151217.tex new file mode 100644 index 0000000000000000000000000000000000000000..e538b4f63582673e87d3427da86faa1f24586eb2 --- /dev/null +++ b/20151217/ainf-uebung-20151217.tex @@ -0,0 +1,122 @@ +% ainf-uebung-20151217.pdf - Exercises on Applied Computer Sciences +% Copyright (C) 2013, 2015 Peter Gerwinski +% +% This document is free software: you can redistribute it and/or +% modify it either under the terms of the Creative Commons +% Attribution-ShareAlike 3.0 License, or under the terms of the +% GNU General Public License as published by the Free Software +% Foundation, either version 3 of the License, or (at your option) +% any later version. +% +% This document is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this document. If not, see <http://www.gnu.org/licenses/>. +% +% You should have received a copy of the Creative Commons +% Attribution-ShareAlike 3.0 Unported License along with this +% document. If not, see <http://creativecommons.org/licenses/>. + +\documentclass[a4paper]{article} + +\usepackage{pgscript} +\usepackage{enumerate} +\usepackage{pdftricks} +\usepackage{sfmath} + +\begin{psinputs} + \usepackage{pgscript} +% \definecolor{PracticallyWhite}{rgb}{0.99 0.99 0.99} + \definecolor{verylightgray}{rgb}{0.95 0.95 0.95} +\end{psinputs} + +\newcounter{exercise} +\newcommand{\exercise}[1]{\addtocounter{exercise}{1}\subsection*{Aufgabe \arabic{exercise}: #1}} + +\newcounter{points} +\newcommand{\onepoint}{(1 Punkt)\addtocounter{points}{1}} +\newcommand{\points}[1]{(#1 Punkte)\addtocounter{points}{#1}} + +\begin{document} + + \thispagestyle{empty} + + \section*{Angewandte Informatik\\Übungsaufgaben -- 17.\ Dezember 2015} + + \subsection*{Arrays mit Zahlen} + + \begin{minipage}[t]{0.5\textwidth} + Wir betrachten das folgende Programm: + \begin{lstlisting}[gobble=6] + #include <stdio.h> + + void f (int *s0, int *s1) + { + while (*s0 >= 0) + { + int *s = s1; + while (*s >= 0) + if (*s0 == *s++) + printf ("%d ", *s0); + s0++; + } + printf ("\n"); + } + + int main (void) + { + int a[] = { 10, 4, 3, 7, 12, 0, 1, -1 }; + int b[] = { 7, 14, 0, 8, 9, 22, 10, -1 }; + f (a, b); + return 0; + } + \end{lstlisting} + \end{minipage}\hfill + \begin{minipage}[t]{0.5\textwidth} + \vspace*{-\bigskipamount} + \begin{enumerate}[\quad(a)] + \item + Was bewirkt die Funktion \lstinline{f} und warum?\\ + \points{4} + \item + Von welcher Ordnung (Landau-Symbol) ist die Funktion und warum? + + Wir beziehen uns hierbei auf die Anzahl der Vergleiche + in Abhängigkeit von der Länge der Eingabedaten \lstinline{s0} und \lstinline{s1}. + Für die Rechnung dürfen Sie beide Längen mit $n$ gleichsetzen, + obwohl sie normalerweise nicht gleich sind. + \points{2} + \item + Was passiert, wenn Sie beim Aufruf der Funktion für einen der + Parameter den Wert \lstinline{NULL} übergeben und warum? + \points{2} + \item + Was passiert, wenn Sie das Hauptprogramm wie folgt abändern + (\file{aufgabe-1d.c}) und warum? + \begin{lstlisting}[gobble=8] + int main (void) + { + int a[] = { 10, 4, 3, 7, 12, 0, 1 }; + int b[] = { 7, 14, 0, 8, 9, 22, 10 }; + f (a, b); + return 0; + } + \end{lstlisting} + \points{2} + \item + Beschreiben Sie -- in Worten und/oder als C-Quelltext --, wie + sich die Funktion \lstinline{f} effizienter gestalten läßt, + wenn man die ihr übergebenen Arrays \lstinline{s0} und + \lstinline{s1} als sortiert voraussetzt.\\ + \points{5} + \item + Von welcher + Ordnung (Landau-Symbol) ist Ihre effizientere Version der Funktion und warum?\\ + \points{2} + \end{enumerate} + \end{minipage} + +\end{document} diff --git a/20151217/logo-hochschule-bochum-cvh-text.pdf b/20151217/logo-hochschule-bochum-cvh-text.pdf new file mode 120000 index 0000000000000000000000000000000000000000..a05946126bc0ce6a2818740da2893f59eb0c659c --- /dev/null +++ b/20151217/logo-hochschule-bochum-cvh-text.pdf @@ -0,0 +1 @@ +../common/logo-hochschule-bochum-cvh-text.pdf \ No newline at end of file diff --git a/20151217/logo-hochschule-bochum.pdf b/20151217/logo-hochschule-bochum.pdf new file mode 120000 index 0000000000000000000000000000000000000000..b6b9491e370e499c9276918182cdb82cb311bcd1 --- /dev/null +++ b/20151217/logo-hochschule-bochum.pdf @@ -0,0 +1 @@ +../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20151217/pgscript.sty b/20151217/pgscript.sty new file mode 120000 index 0000000000000000000000000000000000000000..95c888478c99ea7fda0fd11ccf669ae91be7178b --- /dev/null +++ b/20151217/pgscript.sty @@ -0,0 +1 @@ +../common/pgscript.sty \ No newline at end of file diff --git a/20151217/pgslides.sty b/20151217/pgslides.sty new file mode 120000 index 0000000000000000000000000000000000000000..5be1416f4216f076aa268901f52a15d775e43f64 --- /dev/null +++ b/20151217/pgslides.sty @@ -0,0 +1 @@ +../common/pgslides.sty \ No newline at end of file