Pr r r P. ür ö r r. rst ür r t. r r 1 r rs tät r ür r. rs st r. P t

Größe: px
Ab Seite anzeigen:

Download "Pr r r P. ür ö r r. rst ür r t. r r 1 r rs tät r ür r. rs st r. P t"

Transkript

1 r r 2st Pr r r P 2st t r t ür ö r r rst ür r t rt t 2st tr ss2st P t r r 1 r rs tät r ür r rs st r

2 Ü r 2st t r t Pr r str t r r r µ 2st r t t r ä t P t r r s t

3 t r t r t r t r r sät3 Ü r ü r tr t r s Pr r s r r Pr r r r s Pr s rrs r t s t 3 t r t r s t t r t rt r t r t r st s t ss t Pr r rs r r s t t r t s t s tt r r r st ss ÿ r t s t t t s r Pr r rs r rtr P s r r t rt 2st t r r t t t r s t t r t t s P Pr r str t r 5 ü r

4 s Pr t tt rst t 2 s s tt t s 2st r r s r t r r t r 0+&1 -)#''8)# 2#$3 ;<%&()%..#),=>?4@ "+'3.*A r r t t r r s rät 3 P ü r P ü r 95: ; # < s r t t r µ ü r rs ss2st s t t s t r t r s s P Pr r str t r 5 t s t

5 t s t s t s t r tt rst t s3 s r t s 0+&1 r t rs s r s -)#''8)# t ü rtr t r t s s r s s r s s s r s t r t 3 ätt t s t ü r rs r t P r tät st t s r s 2 t s r rt r tt r 2#$3 95: ; # < ;<%&()%..#),=>?4@ "+'3.*A s P Pr r str t r 5 t s t

6 t s t Pr r3 t r tr t t r tr t r r t tät t tr t r r t r t r t r s t str t r rt r t t r r sendbuf[] baud init curdev lasttemp lastwind Daten main() RS232Init() RS232Send() I2CRec() I2CStart() SendToPC() GetTemp() Aktivitäten s P Pr r str t r 5 t s t

7 t s t Pr r3 t r tr t t r tr t r r t tät t tr t r r t r t r t r s t str t r rt r t t r r Pr 3 r r r ts t r 3 t s tr t t r3 r r r r t r s st t r 3 r r t r r rs s3 s P Pr r str t r 5 t s t

8 r t r r t r t s r r r 3 r st t r r 3 r r ü r st t r P s t P s r ss P s t r t s r auto t t static t Pr r st rt Pr r s rä t Pr r st rt Pr r static t Pr r st rt Pr r int a = 0; static int b = 47; void f(void) { auto int a = b; static int c = 11; // a: global // b: local to module // a: local to function (auto optional) // destroyed at end of block // c: local to function, not destroyed s P Pr r str t r 5 r

9 r t r rts t r t s r s t r str t s t r t r t s s rä t ö Ü rr s r ÿ ss ÿ rs t r s t s r r 1 Pr 3 r t s r s r3 ö r t3 s r s s r t µ tr r P tt r s q 3 r r r s ü r s t r r r ü r s t Pr r 3 t r r t st ts r st ö t r t s r s P Pr r str t r 5 r

10 ös r s r r t s 3 s ör r t t ü r r t t sendbuf[] baud init curdev lasttemp lastwind main() RS232Send() I2CRec() SendToPC() RS232Init() RS232.c I2CStart() I2C.c GetTemp() weather.c s P Pr r str t r 5 r s r

11 s st := t t ttst class s röÿ r Pr r st Pr r t rt s ss t t r r r ö r r t r ö st s t r r t r s t s 1 Pr 3 r r t ss ÿ ü r s ttst str t ttst s s str rt r t tsä t r r t r t r rst r t s P Pr r str t r 5 r s r

12 st s 3 t t st t r r s r r t s ü r t r s rt s ttst.h t t ä t r t t r.c t t ä t t r #include <Modul.h> void RS232Init(uint16_t br); void RS232Send(char ch); #include <RS232.h> static uint16_t baud = 2400; static char sendbuf[16]; void RS232Init(uint16_t br) { baud = br; void RS232Send(char ch) { sendbuf[ ] = ch; RS232.h: ttst rtr ö t r t r r t st t t t RS232.c: t r t ö t t r r t st t t t t r s t t static s r ttst st t s r ss r rtr t r s P Pr r str t r 5

13 1 rt 1 rt rt rt 2 t r public 1 rt t static t r r private s rä r t r t 1 rt r t Ü rs t3 s r.c t.o t foo.c Compiler foo.o a, f t foo.c uint16_t a; // public static uint16_t b; // private void f(void) // public { static void g(int) // private { t t foo.o 2 a f r 1 rt rt 2 b g s static rt r s t 1 rt rt s P Pr r str t r 5

14 rt rt rt t rt r 2 t r r t r s r t rt s r Ü rs t3 s öst r rt t bar.c extern uint16_t a; // declare void f(void); void main() { a = 0x4711; f(); // declare // public // use // use t t bar.o 2 main r 1 rt rt 2 a f s öst s P Pr r str t r 5

15 rt rts t ös r t r r foo.c bar.c Compiler Compiler foo.o bar.o a, f main a, f Linker main, a, f bar st t t2 s r 2 r t s t t t r r ös r r r t ss ÿ ü r 2 3 r 2 s r t ss Ü rs t3 s r st t r t r t r s r t s P Pr r str t r 5

16 r t s r üss r rt r t r r r t void f(void); r r extern extern uint16_t a; s extern t rs t r r t r r t r t r s r s r r t r t r r t st t r ttst s s 1 rt rt t s s 1 rt rt r s s s 3 s st t 2 r s r r s r rt Ü r st r t t s r 3 st interface import implements s P Pr r str t r 5

17 r rts s ttst foo.h // foo.h #ifndef _FOO_H #define _FOO_H // declarations extern uint16_t a; void f(void); #endif // _FOO_H t r foo.c // foo.c #include <foo.h> // definitions uint16_t a; void f(void){ r bar.c r // bar.c extern uint16_t a; void f(void); #include <foo.h> void main() { a = 0x4711; f(); s P Pr r str t r 5

18 rü 3 s tt rst t preprocess Quellmodule Objektmodule link compile ELF-Binary RS232.h I2C.h RS232.c I2C.c gcc gcc (Compiler) gcc (Compiler) (Compiler) RS232.o I2C.o ld (Linker) weather weather.c weather.o io.h....h io.o....o....o....o....o....o avr-libc.lib s st t s r t r s t.h t rt ttst.c t t rt ttst rt.h t s r3 st ss r t t ü r st r r r r s 3 s.h t s 3 t rt ts r t s P Pr r str t r 5

19 s ss Pr 3 r r r r s r r r st s rt r t r r t r s t s st s 3 t t st t r r s r t s r t r s rt s ttst.h t t ä t r t t r.c t t ä t t r #include <Modul.h> private 2 s static r t s ü r t r r ös r t ss ÿ ü r 2 st t t2 s r 2 s r t ss Ü rs t3 s r st t r r s r t s P Pr r str t r 5 s ss

20 Ü r 2st t r t Pr r str t r r r µ 2st r t t r ä t P t r r s t

21 r r P t r t r a rst s rt s a r char a; ä t r ür rt a r r r char *p = &a; ä t r ür r 3 r ein a p s P r r 5 r ü r

22 r P t r r r P t r t ä t s rt r ss r r r r r st r r Ü r r ss r t r r r 3 r r s r s t rt r ÿ t r t ö r s r rs rä r 2 r r r ässt s r t s r 3 3 r s ä 3 t r Pr r r r Pr Pr r str t r r ü rs t r t r 3 r r s ä st rq Pr r s P r r 5 r ü r

23 t r r r r := ä t r ür r s r ss 2 t 1 t 2 3 r s int x = 5; x 5 int *ip; int y; ip = &x; ➊ ip y ➊ 5 ➋ r y = *ip; ➋ s P r r 5 r t

24 r ss r s r t r r ss r t r & x r är & r t r rt r 3 r ss r r r x r s r t r * y r är * r t r rt r r3 ä t r r r y r st r r 3 r s t (*(& x)) x r r s r t r st r r t s r ss r t rs t r rr s r s ü r t r s * 2 t rs t t 1t t t är x * y s rü r 2 3 r r uint8_t *p1, *p2 typedef char *CPTR t r t r s är x = *p1 s rü s s r ü r 3 r rr r ä s r s ür st t s 3 rs t s P r r 5 r t

25 r s t s r t P r t r r r 2 ü r P r t r rt r r r r t rt r t t tsä P r t r s r rs t ä r s t ür r r s r t r ä t s r ss r s s t s r t rs rü r r 3 r r s rä rt r r 2 r r s P r r 5 r t

26 r s t s r t rts s s tü r r void swap (int *, int *); int main() { int a=47, b=11;... swap(&a, &b); ➊... void swap (int *px, int *py) { int tmp; tmp = *px; ➋ *px = *py; ➌ *py = tmp; ➍ a b px py tmp ➊ ➌ ➍ ➋ s P r r 5 r t

27 r s t s r t rts s 3 s r tt void swap (int *, int *); int main() { int a=47, b=11;... swap(&a, &b); ➊ a 47 b 11 ➊ r void swap (int *px, int *py) { int tmp; px py tmp s P r r 5 r t

28 r s t s r t rts s 3 s r tt void swap (int *, int *); int main() { int a=47, b=11;... swap(&a, &b); a 47 b 11 r void swap (int *px, int *py) { int tmp; px py tmp s P r r 5 r t

29 r s t s r t rts s 3 s r tt void swap (int *, int *); int main() { int a=47, b=11;... swap(&a, &b); a 47 b 11 r void swap (int *px, int *py) { int tmp; tmp = *px; ➋ *px px py tmp s P r r 5 r t

30 r s t s r t rts s 3 s r tt void swap (int *, int *); int main() { int a=47, b=11;... swap(&a, &b); a 47 b 11 r void swap (int *px, int *py) { int tmp; tmp = *px; ➋ *px = *py; ➌ *px px *py py tmp 47 s P r r 5 r t

31 r s t s r t rts s 3 s r tt void swap (int *, int *); int main() { int a=47, b=11;... swap(&a, &b); a 11 b 11 r void swap (int *px, int *py) { int tmp; tmp = *px; ➋ *px = *py; ➌ px py ➌ tmp 47 s P r r 5 r t

32 r s t s r t rts s 3 s r tt void swap (int *, int *); int main() { int a=47, b=11;... swap(&a, &b); a 11 b 47 r void swap (int *px, int *py) { int tmp; tmp = *px; ➋ *px = *py; ➌ *py = tmp; ➍ px py ➍ tmp 47 s P r r 5 r t

33 r r rr 2s r := ä t r ür rt ss 2 s 2 t 1 t 2 3 r t s r 2 2 r rt = 3 r r r = r t s r s static uint8_t LEDs[8 * 2]; st t r 33 s r rt röÿ 3 r t r t s r auto r r r st s // constant, fixed array size void f(int n) { auto char a[num_leds * 2]; // constant, fixed array size auto char b[n]; // C99: variable, fixed array size s P r r 5 r ü r

34 t s r r r t t rt3 s r t uint8_t LEDs[4] = { RED0, YELLOW0, GREEN0, BLUE0 ; int prim[5] = { 1, 2, 3, 5, 7 ; r 3 t s r s t s r r st t t t s rt uint8_t LEDs[4] = { RED0 ; // => { RED0, 0, 0, 0 int prim[5] = { 1, 2, 3 ; // => { 1, 2, 3, 0, 0 r r 1 3 t s r s ss s st t 3 r t s r s t röÿ uint8_t LEDs[] = { RED0, YELLOW0, GREEN0, BLUE0 ; int prim[] = { 1, 2, 3, 5, 7 ; s P r r 5 r ü r

35 3 r 2 t 1 t s r t s r < ür = röÿ t 1 r t ü r rü t ä rq Pr r = s uint8_t LEDs[] = { RED0, YELLOW0, GREEN0, BLUE0 ; LEDs[3] = BLUE1; r for (unit8_t i = 0; i < 4; i++) { sb_led_on(leds[i]); LEDs[4] = GREEN1; // UNDEFINED!!! s P r r 5 r ü r

36 r s r 3 r st s2 t t s äq t 3 st t r s rst t s s array &array[0] s ä t r rt t rä rt r Ü r s r tt t r st r t r 3 r ö s s tü r int array[5]; array int *ip = array; ➊ int *ep; ep = &array[0]; ➋ ➊ ➋ 1 ➍ r ep = &array[2]; ➌ *ep = 1; ➍ ip ep ➊ ➋ ➌ ➌ s P r r 5 2 t t s q 3

37 r s r 3 r st s2 t t s äq t 3 st t r s rst t s s array &array[0] s ä t r rt t rä rt r Ü r s r tt t r st r t r 3 r ö s 3 s r tt int array[5]; array r int *ip = array; ➊ int *ep; ep = &array[0]; ➋ ep = &array[2]; ➌ ip ep ➌ s P r r 5 2 t t s q 3

38 r s r 3 r st s2 t t s äq t 3 st t r s rst t s s array &array[0] s ä t r rt t rä rt r Ü r s r tt t r st r t r 3 r ö s 3 s r tt int array[5]; array int *ip = array; ➊ int *ep; ep = &array[0]; ➋ r ep = &array[2]; ➌ *ep = 1; ➍ ip ep *ep ➌ s P r r 5 2 t t s q 3

39 r s r 3 r st s2 t t s äq t 3 st t r s rst t s s array &array[0] s 3 t t *array array[0] r r t r s s r r r t r t r s uint8_t LEDs[] = { RED0, YELLOW0, GREEN0, BLUE0 ; LEDs[3] = BLUE1; uint8_t *p = LEDs; r for (unit8_t i = 0; i < 4; i++) { sb_led_on(p[i]); s P r r 5 2 t t s q 3

40 t r t rs 3 3 r st r r ä t r r rt st rä r r s st r t t ö int array[3]; int *ip = array; ➊ array ip++; ➋ ip++; ➌ ip ➊ ➊ ➋ ➌ int array[5]; ip = array; ➊ (ip+3) &ip[3] r ip ➊ r r r t t r r röÿ s tt2 s t rü s t t s P r r 5 r r t t

41 r r t t r t r t t s r t ++ Prä P st r t rs s ä st t Prä P st r t rs s r t + t tr t s int rt s r s3 r st rs t tr t 3 r r 3 r t 3 s r st 3 r s r t < <= == >= >! = r ss s 33 r r r s P r r 5 r r t t

42 r s r s r s ss t t r r t t ässt s r t äq t r r t ür int i, array[n], *ip = array; t < t array &array[0] ip &ip[0] *array array[0] * ip ip[0] *(array + i) array[i] * (ip + i) ip[i] array++ ip++ r array st st t r rt ö r r t r r t r st t r r 3 r r t rä rt r s P r r 5 r r t t

43 r s t s r t r r r r s r ü r 2 r r static uint8_t LEDs[] = { RED0, YELLOW1 ; = void enlight(uint8_t *array, unsigned n) { for (unsigned i = 0; i < n; i++) sb_led_on(array[i]); void main() { enlight(leds, 2); uint8_t moreleds[] = { YELLOW0, BLUE0, BLUE1 ; enlight(moreleds, 3); r r t ü r röÿ r r röÿ ss 1 3 t s P r t r t ü r r ä s r t r t r 3 tr s r s ÿ NUL s P r r 5 r s t s r t r

44 r s t s r t r rts r r r s r ü r 2 r r r r P r t r s const r rt s t t t rä r t r t void enlight(const uint8_t *array, unsigned n) { = 3 3 ss r r r rt t r st äq t 2 t 1 ö r void enlight(const uint8_t array[], unsigned n) { t s t s r r t s t r t rs r t t array[] ö r t röÿ s t s r s st r tt s P r r 5 r s t s r t r

45 r s t s r t r rts t int strlen(const char *) s r t r t rt 3 r ü r tr void main() { const char *string = "hallo"; // string is array of char sb_7seg_shownumber(strlen(string)); t "hallo" h a l l o \0 r t r s r t r t 2 t 1 int strlen(const char s[]) { int n = 0; while (s[n]!= \0 ) n++; return n; r t r 2 t 1 int strlen(const char *s) { const char *end = s; while (*end!= \0 ) end++; return end - s; s P r r 5 r s t s r t r

46 r r r r r r r s int x = 5; int *ip = &x; int **ipp = &ip; /* ** ipp = 5 */ x 5 ip ipp r r r P r t rü r t öt t r r t r 2 r r ü r 3 swap() t ür r r ü r s P r r 5 r t rt rt2

47 r t r t r s t ss s t t ü r t ö r r r s // invokes job() every second void doperiodically(void (*job)(void)) { while (1) { job(); // invoke job for (volatile uint16_t i = 0; i < 0xffff; i++) ; // wait a second r void blink(void) { sb_led_toggle(red0); void main() { doperiodically(blink); // pass blink() as parameter s P r r 5 r t rt rt2

48 r t rts 2 t 1 t 2 3 r r P r t s r ä 3 r 2 t 1 t s r t 2 ü t2 r t s r r r s 3 r s t s3 rs r r P r t r P r t r r t s r r r s t s3 r r t r t r t 3 r tp r r ss r s r t r r t öt t t s 3 r st st t r t s3 r void blink(uint8_t which) { sb_led_toggle(which); void main() { void (*myfun)(uint8_t); // myfun is pointer to function myfun = blink; // blink is constant pointer to function myfun(red0); // invoke blink() via function pointer blink(red0); // invoke blink() s P r r 5 r t rt rt2

49 r t rts t s3 r r t ür ü r t s 3 r st s2 r r r ss r t st r // Example: asynchronous button events with libspicboard #include <avr/interrupt.h> // for sei() #include <7seg.h> // for sb_7seg_shownumber() #include <button.h> // for button stuff // callback handler for button events (invoked on interrupt level) void onbutton(button b, BUTTONEVENT e) { static int8_t count = 1; sb_7seg_shownumber(count++); // show no of button presses if (count > 99) count = 1; // reset at 100 r void main() { sb_button_registercallback( // register callback BUTTON0, BUTTONEVENT_PRESSED, // for this button and events onbutton // invoke this function ); sei(); // enable interrupts (necessary!) while (1) { // wait forever s P r r 5 r t rt rt2

50 s ss r r st r r ö t s r t r s rt r ür t r 2 r r r ür t r r t s t r s ä ä st r rs Pr r s2 t t s ö t s ä t r rr 2 3 r r * r ss r t r & r s r t r * r r t t t s2 t t s q 3 3 r [] r t r r r ö t r s Ü r t t Pr 3 r ü r t s P r r 5 s ss

51 Ü r 2st t r t Pr r str t r r r µ 2st r t t r ä t P t r r s t

52 s st µ tr r µ tr r := Pr 3 ss r + r + P r r t s t rs2st 2st ä r r 3 sät3 1t r st 3 t r t r r st ü st s 2st s s t s r st r t t P r r r t r t r ss ss 3ä P rts t s r P r t r s s s 2st P t r t r 3 s ÿ Pr 3 ss r µ P s s t r r s µ rr s t r ÿ r Pr 3 ss r s P µ 2st r t t r 5 Ü r

53 s s t PA0 - PA7 PC0 - PC7 VCC PORTA DRIVERS/BUFFERS PORTC DRIVERS/BUFFERS GND PORTA DIGITAL INTERFACE PORTC DIGITAL INTERFACE CPU-Kern AVCC AREF MUX & ADC PROGRAM COUNTER ADC INTERFACE STACK POINTER TWI TIMERS/ COUNTERS OSCILLATOR Peripherie Speicher PROGRAM FLASH INSTRUCTION REGISTER SRAM GENERAL PURPOSE REGISTERS INTERNAL OSCILLATOR WATCHDOG TIMER OSCILLATOR XTAL1 INSTRUCTION DECODER X Y Z MCU CTRL. & TIMING XTAL2 RESET CONTROL LINES ALU INTERRUPT UNIT INTERNAL CALIBRATED OSCILLATOR AVR CPU STATUS REGISTER EEPROM PROGRAMMING LOGIC SPI USART + COMP. - INTERFACE PORTB DIGITAL INTERFACE PORTB DRIVERS/BUFFERS PORTD DIGITAL INTERFACE PORTD DRIVERS/BUFFERS PB0 - PB7 PD0 - PD7

54 s P r t t r 0x0000 0x0046 0x1FFFF main:... wait:... IRQ-Vektoren Anwendungs- Code Boot-Code Programmadressraum (Flash) KiB, 2-Byte-Elemente Datenbus 16 8 Recheneinheit Adressbus 32 Register 64 IO-Register bis zu 160 Ext. IO-Register bis zu 4KiB internes SRAM bis zu knapp 60 KiB externes SRAM 0x0000 0x0020 0x0060 0x0100 0x1100 0xFFFF Datenadressraum (SRAM) 0 64 KiB, 1-Byte-Elemente r r r t t r tr t r r ür t P r r st r s r t s r r r r P s rt r t t r t s r st r r s 3 r ssr s P µ 2st r t t r 5 r t t r

55 r t t Pr 3 ss r Zero bit Programmspeicher Vcc SR RESET... Z SR SR` µc PC PC` R1 R1` Bus main: ldi R1, 48 dec R1 beq L1 call f sub R1, 58 L1:... f: add R1, 11 ret... 0x0000 0x0002 0x0004 0x0006 0x0008 0x000A 0x0100 0x0102 r s s s r Ps r 3 ss rs r 3 3 r st r Pr r 3ä r P t t sr st r tt t s r t Pr r r t t r st r s P µ 2st r t t r 5 r t t r

56 r t t Pr 3 ss r RESET PC = 0x0000 Zero bit Programmspeicher Vcc SR RESET... Z SR SR` µc PC PC` R1 R1` Bus main: ldi R1, 48 dec R1 beq L1 call f sub R1, 58 L1:... f: add R1, 11 ret... 0x0000 0x0002 0x0004 0x0006 0x0008 0x000A 0x0100 0x0102 w = *PC++ decode(w) execute(w) s P µ 2st r t t r 5 r t t r

57 r t t Pr 3 ss r RESET PC = 0x0000 Zero bit Programmspeicher Vcc SR RESET... Z SR SR` µc PC PC` R1 R1` Bus main: ldi R1, 48 dec R1 beq L1 call f sub R1, 58 L1:... f: add R1, 11 ret... 0x0000 0x0002 0x0004 0x0006 0x0008 0x000A 0x0100 0x0102 w = *PC++ decode(w) execute(w) s P µ 2st r t t r 5 r t t r

58 r t t Pr 3 ss r RESET PC = 0x0000 Zero bit Programmspeicher Vcc SR RESET... Z SR PC SR` PC` µc R1 R1` Bus main: ldi R1, 48 dec R1 beq L1 call f sub R1, 58 L1:... f: add R1, 11 ret... 0x0000 0x0002 0x0004 0x0006 0x0008 0x000A 0x0100 0x0102 w = *PC++ decode(w) execute(w) s P µ 2st r t t r 5 r t t r

59 r t t Pr 3 ss r RESET PC = 0x0000 Zero bit Programmspeicher Vcc SR RESET... Z 0 SR SR` µc PC PC` R1 47 R1` Bus main: ldi R1, 48 dec R1 beq L1 call f sub R1, 58 L1:... f: add R1, 11 ret... 0x0000 0x0002 0x0004 0x0006 0x0008 0x000A 0x0100 0x0102 w = *PC++ decode(w) execute(w) w: dec <R> R = 1 if(r == 0) Z = 1 else Z = 0 w: beq <lab> if(z) PC = lab w: call <func> PC` = PC PC = func s P µ 2st r t t r 5 r t t r

60 r t t Pr 3 ss r RESET PC = 0x0000 Zero bit Programmspeicher Vcc SR RESET... Z 0 SR SR` µc PC PC` R1 47 R1` Bus main: ldi R1, 48 dec R1 beq L1 call f sub R1, 58 L1:... f: add R1, 11 ret... 0x0000 0x0002 0x0004 0x0006 0x0008 0x000A 0x0100 0x0102 w = *PC++ decode(w) execute(w) w: dec <R> R = 1 if(r == 0) Z = 1 else Z = 0 w: beq <lab> if(z) PC = lab w: call <func> PC` = PC PC = func s P µ 2st r t t r 5 r t t r

61 r t t Pr 3 ss r RESET PC = 0x0000 Zero bit Programmspeicher Vcc SR RESET... Z 0 SR SR` µc PC PC` R1 58 R1` Bus main: ldi R1, 48 dec R1 beq L1 call f sub R1, 58 L1:... f: add R1, 11 ret... 0x0000 0x0002 0x0004 0x0006 0x0008 0x000A 0x0100 0x0102 w = *PC++ decode(w) execute(w) w: dec <R> R = 1 if(r == 0) Z = 1 else Z = 0 w: beq <lab> if(z) PC = lab w: call <func> PC` = PC PC = func w: ret PC = PC` s P µ 2st r t t r 5 r t t r

62 P r r rät P r r rät r t P r r r t s ÿ r r tr t s t rs t st t r s r 2s s ÿ r r r t t r t ss t3 s Pr 3 ss rs t s s ÿ r P r r st r ü r st r s r tr r st r st r P r r r r t st r rt 3 DDRD t r st r t t st s 3 PORTD PIND st r s ä ür t r r s 3 r r 2 r r r 3 r r t 2 3 ss s P µ 2st r t t r 5 P r r

63 P r r rät s s t2 s P r r rät µ tr r r t r t r s2 r s r ttst r P r t r P rts ä r st r t r r r r r q 3 r r r 1t r t r r ö t r r r r ä rt t rr t s ös r r r äÿ s r r ss r s st s öst t st 3 r s r t s Ü rtr t t s2 r 3 r s2 r 3 Pr t st 3 r t s r t r s r t s r s rt 3 t st 3 r r r s t rt s s r ü r s s üss r s t3t r ö r r st r t r s P µ 2st r t t r 5 P r r

64 P r r rät st r s t rs r t t r ür r st r r2 st µ P rt s rt 1 s rt P s st r s r ssr t r r r t ü r r s Pr 3 ss rs load store st r s r ssr r s rt r r r t ü r s 3 in out st r r ss st r r r t t!""#$%% &'($ )*+,- )*+,. )*+,/ )*+,0 )*+,1 )*+,2 )*+,3 )*+,4 5'6$!"#$%!&#' ()*+, -. ( / !"*$%!&*' ( (466 (467 (48 (43 66!"9$%!&9' (4: (4; (4< (4& (4= (4" (4> (46 (47 66!"2$%!&2'?2)7 -@ABCD2EFGHBC7$?FHIFH$2EAIJCB$)BK@LHBC 3<!6>$%!">' 4?)-9 4?)-9; 4?)-9< 4?)-9& <; 4?)-9= 4?)-9" 4?)-9> 4?)-96 4?)-97!66$%!"6' 99)9 999; 999< 999& 999= 999" 999> <;!67$%!"7' 4,09 4,09; 4,09< 4,09& 4,09= 4,09" 4,09> 4,096 4,097 <3 s P µ 2st r t t r 5 P r r

65 P r r rät st r rts r2 st r r ö rt r st r r r r t r st r t 3 r r ü 3 PORTD++ 2 t t s r r r t r r s r t rt #define PORTD (*(volatile uint8_t *) s 0x12 {{ Adresse: int {{ Adresse: volatile uint8_t * st {{ Wert: volatile uint8_t r r 3 r ) PORTD st t s2 t t s äq t 3 r volatile uint8_t r r ss 0x12 t #define PORTD (*(volatile uint8_t *) 0x12) PORTD = (1<<7); // set D.7 uint8_t *preg = &PORTD; // get pointer to PORTD *preg &= ~(1<<7); // use pointer to clear D.7 s P µ 2st r t t r 5 P r r

66 st r3 r ä t P r r rät r t ä 3 r t r rt r r r st r s r3 t ä r s rs r t r s rs r 3 r r r r t s ü rt t r ö st r 3 s s rt r // C code #define PIND (*(uint8_t*) 0x10) void foo(void) { if (! (PIND & 0x2)) { // button0 pressed if (! (PIND & 0x4)) { // button 1 pressed // Resulting assembly code foo: lds r24, 0x0010 // PIND->r24 sbrc r24, 1 // test bit 1 rjmp L1 // button0 pressed L1: sbrc r24, 2 // test bit 2 rjmp L2 L2: ret PIND r t r t s r r r t ss r rt r24 t st s P µ 2st r t t r 5 1 rs volatile

67 r volatile 2 3 r r ös r volatile ü t stä r r r ä t r r s r3 ö st r rt r tt r r r s rt r tt r rä r 3 rü s r // C code #define PIND \ (*(volatile uint8_t*) 0x10) void foo(void) { if (! (PIND & 0x2)) { // button0 pressed if (! (PIND & 0x4)) { // button 1 pressed // Resulting assembly code foo: lds r24, 0x0010 // PIND->r24 sbrc r24, 1 // test bit 1 rjmp L1 // button0 pressed L1: lds r24, 0x0010 // PIND->r24 sbrc r24, 2 // test bit 2 rjmp L2 L2: ret PIND st volatile r s r st r t s r s P µ 2st r t t r 5 1 rs volatile

68 r volatile 2 3 r r rts volatile t r rt t r s s r s t r s r üt3 s t3t r t s rt 3 t r // C code // Resulting assembly code void wait(void) { wait: for (uint16_t i = 0; i < 0xffff; i++); // compiler has optimized // "unneeded" loop volatile! ret t t r volatile r rs t r st rt ö t r st r t r t r ö t r ü rt r volatile r r rü t ä r t s P µ 2st r t t r 5 1 rs volatile

69 P r r rät P rts P rt := r ü r s t s ä t r s t r 1t r r t rr t P s t rt s µ P s µ P t rt s µ P t rt Pr 3 ss r ü rt t rr t r r s t st ü r s r P r r r s 1t r r t rr t t r t t r st t ä P r r rät r t s P µ 2st r t t r 5 P rts

70 s P P rt P Power Ground Programming/debug Digital Analog Crystal/CLK PD2 (PTCXY/INT0/OC3B/OC4B) PD1 (PTCXY/OC4A/TXD0) PD0 (PTCXY/OC3A/RXD0) PC6 (RESET) PC5 (ADC5/PTCY/SCL0) PC4 (ADC4/PTCY/SDA0) PC3 (ADC3/PTCY) PC2 (ADC2/PTCY) s st rü st 3 r P t t r t r ü s t (OC2B/INT1/PTCXY) PD3 (XCK0/T0/PTCXY) PD PC1 (ADC1/PTCY/SCK1) PC0 (ADC0/PTCY/MISO1) t r t r t r (SDA1/ICP4/ACO/PTCXY) PE PE3 (ADC7/PTCY/T3/MOSI1) VCC 4 21 GND GND (SCL1/T4/PTCXY) PE1 (XTAL1/TOSC1) PB6 (XTAL2/TOSC2) PB AREF PE2 (ADC6/PTCY/ICP3/SS1) AVCC PB5 (PTCXY/XCK0/SCK0) P r r 3 P s s s r rt (OC0B/T1/PTCXY) PD5 (OC0A/PTCXY/AIN0) PD6 (PTCXY/AIN1) PD7 (ICP1/CLKO/PTCXY) PB0 (OC1A/PTCXY) PB1 (SS0/OC1B/PTCXY) PB2 (MOSI0/TXD1/OC2A/PTCXY) PB3 (MISO0/RXD1/PTCXY) PB4 P t P t s s r 3 s ÿ P st t r ür s P s t 3 r r ü s P µ 2st r t t r 5 P rts

71 s P rt st r Pr P rt 1 s r st r rt s ür 1 = DDR1 t r t st r t ür P st r s t r s s t r t r DDRD7 DDRD6 DDRD5 DDRD4 DDRD3 DDRD2 DDRD1 DDRD0 R/W R/W R/W R/W R/W R/W R/W R/W PORT1 t st r st P s s r rt s t t P st s s r st P s r rt s t rt t t r P rst t PORTD7 PORTD6 PORTD5 PORTD4 PORTD3 PORTD2 PORTD1 PORTD0 R/W R/W R/W R/W R/W R/W R/W R/W PIN1 t st r t r räs t rt P P ä r r t s s PIND7 PIND6 PIND5 PIND4 PIND3 PIND2 PIND1 PIND0 R/W R/W R/W R/W R/W R/W R/W R/W r s s s P µ 2st r t t r 5 P rts

72 tr t r t t r P rt r r r r r t t s är ss r s 3 s 3 ss r 3 str t r r s t t r t2 tr t r // Structure declaration struct Student { char lastname[64]; char firstname[64]; long matnum; int passed; ; // Variable definition struct Student stud; tr t rt2 sst t 3 s 2 3 s t t r t r r r t stud.lastname.firstname.matnum.passed???? s P µ 2st r t t r 5 1 rs r t2 struct union

73 tr t r r t t s r 3 rr 2 tr t r r t t s t s rt r struct Student { char lastname[64]; char firstname[64]; long matnum; int passed; ; struct Student stud = { "Meier", "Hans", 4711, 0 ; t s r r r r ü r r t ü r r 3 r 3 s P t t rq r 3 r t enum 2 t typedef r r typedef struct { volatile uint8_t *pin; volatile uint8_t *ddr; volatile uint8_t *port; port_t; port_t porta = { &PINA, &DDRA, &PORTA ; port_t portd = { &PIND, &DDRD, &PORTD ; s P µ 2st r t t r 5 1 rs r t2 struct union

74 tr t r t3 r.pin PINA porta.ddr 0 DDRA.port 0 PORTA tr t r t r t. r t r 3 r port_t porta = { &PINA, &DDRA, &PORTA ; *porta.port = 0; // clear all pins *porta.ddr = 0xff; // set all to input t t ö r Pr r tät s s P µ 2st r t t r 5 1 rs r t2 struct union

75 tr t r t3 r.pin PINA porta.ddr 0 DDRA pport.port 0 PORTA r tr t r ür r öt t port_t *pport = &porta; // p --> porta *(*pport).port = 0; // clear all pins *(*pport).ddr = 0xff; // set all to output t -> r t r ässt s s r s->m (*s).m port_t *pport = &porta; // p --> porta t s *pport->port = 0; // clear all pins ö r Pr r tät s *pport->ddr = 0xff; // set all to output s P µ 2st r t t r 5 1 rs r t2 struct union

76 tr t r s t s r t r s t3 3 rr 2s r tr t r 2 ü r void initport(port_t p) { *p.port = 0; // clear all pins *p.ddr = 0xff; // set all to output p.port = &PORTD; // no effect, p is local variable void main(void) { initport(porta); röÿ r tr t r r s s r 3 t Student s 2t 3 r r ss r ü r t r st t tr t r void initport(const port_t *p){ *p->port = 0; // clear all pins *p->ddr = 0xff; // set all to output // p->port = &PORTD; compile-time error, *p is const! void main(void) { initport(&porta); s P µ 2st r t t r 5 1 rs r t2 struct union

77 t tr t r t r tr t r t ö t r r tät st t r r r sst t r 3 ss 33 t2 3 s üt3 3 t r s st rs 3 3 r s EICRA 1t r t rr t tr st r t rt s ös r ür 1t r t rr t INT0 INT ISC11 ISC10 ISC01 ISC00 R/W R/W R/W R/W typedef struct { uint8_t ISC0 : 2; // bit 0-1: interrupt sense control INT0 uint8_t ISC1 : 2; // bit 2-3: interrupt sense control INT1 uint8_t reserved : 4; // bit 4-7: reserved for future use EICRA_t; s P µ 2st r t t r 5 1 rs r t2 struct union

78 s r tr t r t t r r r r ü r r rt r ässt s rs 2 t r r t r üt3 ür t s 2 sts s void main(void) { union { uint16_t val; uint8_t bytes[2]; u; u.val = 0x4711; // show high-byte sb_7seg_showhexnumber(u.bytes[1]); // show low-byte sb_7seg_showhexnumber(u.bytes[0]); u.val.bytes 0x4711 0x11 0x47 s P µ 2st r t t r 5 1 rs r t2 struct union

79 s t tr t r s s s r t t t r rt st r s 3 r t s s r 3 ö typedef union { volatile uint8_t reg; // complete register volatile struct { uint8_t ISC0 : 2; // components uint8_t ISC1 : 2; uint8_t reserved : 4; ; EICRA_t; void foo(void) { EICRA_t *eicra = (EICRA_t *) 0x69; uint8_t oldval = eicra->reg; // save register eicra->isc0 = 2; // use register eicra->isc1 = 1; // eicra->reg = oldval; // restore register s P µ 2st r t t r 5 1 rs r t2 struct union

80 Ü r 2st t r t Pr r str t r r r µ 2st r t t r ä t P t r r s t

81 r s P r r rät tr tt r s P rt P s t r st r t rt r t s Pr r s ä r s t t r t r r P s Pr r ü r rü t st r äÿ r t r t s t t rr t rät t s Pr 3 ss r r r r t s t r3 t s P ä t 5 t rr ts ü r

82 t rr t t s r ÿ main() call: explizite Aktivierung durch Funktionsaufruf handler() if( ) handler(); handler() ret interrupt: implizite Aktivierung durch Hardwaresignal isr() iret isr: interrupt service routine t 1 t 2 t 3 t 4 t 5 (z. B. Pegelwechsel an Pin) (z. B. Timer abgelaufen) s P ä t 5 t rr ts ü r

83 P s t rr ts r t P t st rt s 2st r s r t r t s2 r 3 Pr r r s r ü r s Pr r rstr t r r rs Pr 3 ss r3 t s r t r r r q t s P Pr 3 ss r st r r r r 3 t t s st 3 r st s q t Pr r Pr r r t t r rs r t rr ts r s st rt s 2st r s r t r t s2 r 3 Pr r r s r t Pr r t 1t t s r rt r Pr 3 ss r r r s r t r s t tsä tr tt ö r 1 tät r ä t 2 r s t r r r Pr r r t s r r rs r r r t s 3 s r t s s r t ss3 r s s P ä t 5 t rr ts ü r

84 t rr t r rs r r r ÿ main() handler() if( ) handler(); handler() ret buf[...] isr() iret t 1 t 2 t 3 t 4 t 5 (z. B. Pegelwechsel an Pin) (z. B. Timer abgelaufen) s P ä t 5 t rr ts ü r

85 t rr ts rr st t rr ts s t r s t s rrt r r öt t 3 r 2 r s t t s 3 t rät s 3 s t rr st r s t IE t rr t t t sr st r r P s r ü r s rt 1 r r ä r rr3 t ö s r r t rr t st s IE t r sst r Pr 3 ss r cli IE r t rr t s s rrt sei IE s t t rr t s r t IE s s 3 s t r r s s rrt tr t r IE s s ä r r t rr t r t s rrt s P ä t 5 t rr ts t r

86 t rr ts rr s IE=1 sei() cli() sei() IE=0 main() isr() buf[...] Verzögerung t 1 t 2 t 3 t 4 t 5 t 6 iret (z. B. Timer abgelaufen) t t t t t t t t main() s s s rrt IE t sei() cli() r s r IE r t s rrt r IE r t st t r rü t r rt main() t s r IE rt r s ä t r ä r r r t s s s rrt IE t r r s main() r rt s t3t s P ä t 5 t rr ts t r

87 s t rr ts Ü r ➊ rät s s rt t rr t s r r r tt r r ä st s t IE t r r ➋ st t r r t rr ts r s rrt IE s 3 t t rr ts r rt 1 r r ➌ st r t r s rt 3 t P t t sr st r t t s r r r 3 r st r ü r s r ➍ 3 r t rr t r r r tt t ➎ r s ü rt ➏ t r rt t r t r r t rr t st r t r r st r rt st t rr ts r r IE s s r r r rt s t3t ➀ ➁ ➂➃ Interrupt-Handler ➅ ➄ s P ä t 5 t rr ts t r

88 s t rr ts t s IRQs enabled bit RESET PC = 0x0000 Zero bit Programmspeicher SR RESET Vcc INT... Z IE 0 1 SR PC SR` µc IP 0 PC` R1 R1` Bus main: ldi R1, 48 dec R1 beq L1 call f sub R1, 58 L1:... f: add R1, 11 ret... isr: ldi R1,1 dec R1 sts a, R1 iret 0x0000 0x0002 0x0004 0x0006 0x0008 0x000A 0x0100 0x0102 0x0200 0x0202 0x0204 0x0206 SR.IE && IP false w = *PC++ decode(w) true w = icall IRQ pending bit execute(w) r s r t r s r s Ps r 3 ss rs r t rr tq ä t st r r r r r r tt t w: call <func> PC` = PC PC = func w: ret PC = PC` w: icall SR` = SR SR.IE = 0 IP = 0 PC` = PC PC = isr R1` = R1 w: iret SR = SR` PC = PC` R1 = R1` s P ä t 5 t rr ts t r

89 s t rr ts t s IRQs enabled bit RESET PC = 0x0000 Zero bit Programmspeicher SR RESET Vcc ➊ INT... Z IE 0 1 SR PC SR` µc IP 1 PC` R1 R1` Bus main: ldi R1, 48 dec R1 beq L1 call f sub R1, 58 L1:... f: add R1, 11 ret... isr: ldi R1,1 dec R1 sts a, R1 iret 0x0000 0x0002 0x0004 0x0006 0x0008 0x000A 0x0100 0x0102 0x0200 0x0202 0x0204 0x0206 SR.IE && IP false w = *PC++ decode(w) true w = icall ➊ Gerät signalisiert Interrupt (aktueller Befehl wird noch fertiggestellt) execute(w) w: call <func> PC` = PC PC = func w: ret PC = PC` w: icall SR` = SR SR.IE = 0 IP = 0 PC` = PC PC = isr R1` = R1 w: iret SR = SR` PC = PC` R1 = R1` s P ä t 5 t rr ts t r

90 s t rr ts t s IRQs enabled bit RESET PC = 0x0000 Zero bit Programmspeicher SR RESET Vcc INT... Z IE 0 1 SR PC SR` µc IP 1 PC` R1 R1` Bus main: ldi R1, 48 dec R1 beq L1 call f sub R1, 58 L1:... f: add R1, 11 ret... isr: ldi R1,1 dec R1 sts a, R1 iret 0x0000 0x0002 0x0004 0x0006 0x0008 0x000A 0x0100 0x0102 0x0200 0x0202 0x0204 0x0206 SR.IE && IP false w = *PC++ decode(w) true w = icall (Vor dem nächsten instruction fetch wird der Interruptstatus überprüft) execute(w) w: call <func> PC` = PC PC = func w: ret PC = PC` w: icall SR` = SR SR.IE = 0 IP = 0 PC` = PC PC = isr R1` = R1 w: iret SR = SR` PC = PC` R1 = R1` s P ä t 5 t rr ts t r

91 s t rr ts t s IRQs enabled bit RESET PC = 0x0000 Zero bit Programmspeicher SR RESET ➌ Vcc INT... Z IE 0 0 SR PC SR` µc IP 0 PC` R1 R1` ➋ Bus main: ldi R1, 48 dec R1 beq L1 call f sub R1, 58 L1:... f: add R1, 11 ret... isr: ldi R1,1 dec R1 sts a, R1 iret 0x0000 0x0002 0x0004 0x0006 0x0008 0x000A 0x0100 0x0102 0x0200 0x0202 0x0204 0x0206 SR.IE && IP false w = *PC++ decode(w) true w = icall ➋ Die Zustellung weiterer Interrupts wird verzögert ➌ Registerinhalte werden gesichert w: call <func> PC` = PC PC = func execute(w) w: ret w: icall PC = PC` SR` = SR SR.IE = 0 IP = 0 PC` = PC PC = isr R1` = R1 w: iret SR = SR` PC = PC` R1 = R1` s P ä t 5 t rr ts t r

92 s t rr ts t s IRQs enabled bit RESET PC = 0x0000 Zero bit Programmspeicher SR RESET Vcc INT... Z IE 0 0 SR PC SR` µc IP 0 PC` R1 R1` Bus ➍ main: ldi R1, 48 dec R1 beq L1 call f sub R1, 58 L1:... f: add R1, 11 ret... isr: ldi R1,1 dec R1 sts a, R1 iret 0x0000 0x0002 0x0004 0x0006 0x0008 0x000A 0x0100 0x0102 0x0200 0x0202 0x0204 0x0206 SR.IE && IP false w = *PC++ decode(w) true w = icall ➍ Aufzurufende ISR wird ermittelt execute(w) w: call <func> PC` = PC PC = func w: ret PC = PC` w: icall SR` = SR SR.IE = 0 IP = 0 PC` = PC PC = isr R1` = R1 w: iret SR = SR` PC = PC` R1 = R1` s P ä t 5 t rr ts t r

93 s t rr ts t s IRQs enabled bit RESET PC = 0x0000 Zero bit Programmspeicher SR RESET Vcc INT... Z IE 1 0 SR PC SR` µc IP 0 PC` R1 0 R1` Bus main: ldi R1, 48 dec R1 beq L1 call f sub R1, 58 L1:... f: add R1, 11 ret... isr: ldi R1,1 dec R1 sts a, R1 iret 0x0000 0x0002 0x0004 0x0006 0x0008 0x000A 0x0100 0x0102 0x0200 0x0202 0x0204 0x0206 SR.IE && IP false w = *PC++ decode(w) true w = icall ➎ ISR wird ausgeführt execute(w) w: call <func> PC` = PC PC = func w: ret PC = PC` w: icall SR` = SR SR.IE = 0 IP = 0 PC` = PC PC = isr R1` = R1 w: iret SR = SR` PC = PC` R1 = R1` s P ä t 5 t rr ts t r

94 s t rr ts t s IRQs enabled bit RESET PC = 0x0000 Zero bit Programmspeicher SR RESET ➏ Vcc INT... Z IE 0 1 SR PC SR` µc IP 0 PC` R1 R1` ➏ Bus ➏ main: ldi R1, 48 dec R1 beq L1 call f sub R1, 58 L1:... f: add R1, 11 ret... isr: ldi R1,1 dec R1 sts a, R1 iret 0x0000 0x0002 0x0004 0x0006 0x0008 0x000A 0x0100 0x0102 0x0200 0x0202 0x0204 0x0206 SR.IE && IP false w = *PC++ decode(w) true w = icall ➏ ISR terminiert mit iret-befehl Registerinhalte werden restauriert Zustellung von Interrupts wird reaktiviert Das Anwendungsprogramm wird fortgesetzt w: call <func> PC` = PC PC = func execute(w) w: ret w: icall PC = PC` SR` = SR SR.IE = 0 IP = 0 PC` = PC PC = isr R1` = R1 w: iret SR = SR` PC = PC` R1 = R1` s P ä t 5 t rr ts t r

95 P st rt t rr ts s s s rt st rs t st r rü s ss st rt r t rr t t rr t r r P s s öst ä st r r r st t rr t s ös s P st rt r t rr t t rr t r r r s öst s r P t s P ä t 5 t rr ts t r

96 t rr tst r P t rr t st Vector No Program Address Source Interrupts definition 3 t r r r t r r ss 1 0x0000 RESET External Pin, Power-on Reset, Brown-out Reset and Watchdog System Reset 2 0x0002 INT0 External Interrupt Request 0 3 0x0004 INT1 External Interrupt Request 0 4 0x0006 PCINT0 Pin Change Interrupt Request 0 rs t P r INT0 PD2 tt r r s t t r t INT1 PD3 tt 5 0x0008 PCINT1 Pin Change Interrupt Request 1 6 0x000A PCINT2 Pin Change Interrupt Request 2 7 0x000C WDT Watchdog Time-out Interrupt 8 0x000E TIMER2_COMPA Timer/Counter2 Compare Match A 9 0x0010 TIMER2_COMPB Timer/Coutner2 Compare Match B 10 0x0012 TIMER2_OVF Timer/Counter2 Overflow 11 0x0014 TIMER1_CAPT Timer/Counter1 Capture Event 12 0x0016 TIMER1_COMPA Timer/Counter1 Compare Match A 13 0x0018 TIMER1_COMPB Timer/Coutner1 Compare Match B 14 0x001A TIMER1_OVF Timer/Counter1 Overflow 15 0x001C TIMER0_COMPA Timer/Counter0 Compare Match A 16 0x001E TIMER0_COMPB Timer/Coutner0 Compare Match B 17 0x0020 TIMER0_OVF Timer/Counter0 Overflow 18 0x0022 SPI0 STC SPI1 Serial Transfer Complete 19 0x0024 USART0_RX USART0 Rx Complete 20 0x0026 USART0_UDRE USART0, Data Register Empty 21 0x0028 USART0_TX USART0, Tx Complete 22 0x002A ADC ADC Conversion Complete s P ä t 5 t rr ts s

97 1t r t rr ts st r t rr st r ür INT0 INT1 EIMSK 1t r t rr t s st r t st INT s s ös t INT r t rt s t INT INT1 INT0 R/W R/W EICRA 1t r t rr t tr st r t ür 1t r t rr ts INT0 INT1 st r s öst r P st r ISC11 ISC10 ISC01 ISC00 R/W R/W R/W R/W s 3 t rr t s tr ts ISC 0 ISC 1 st r s ös r ür INT1 ür INT0 t ts r s ISC11 ISC10 Description 0 0 The low level of INT1 generates an interrupt request. 0 1 Any logical change on INT1 generates an interrupt request. 1 0 The falling edge of INT1 generates an interrupt request. 1 1 The rising edge of INT1 generates an interrupt request. s P ä t 5 t rr ts s

98 1t r t rr ts r r tt st t r t rr t r t s r st r t s r r rst t rstüt3 r avrlibc r ISR(SOURCE_vect) avr/interrupt.h #include <avr/interrupt.h> #include <avr/io.h> ISR(INT1_vect) { // invoked for every INT1 IRQ static uint8_t counter = 0; sb_7seg_shownumber(counter++); if (counter == 100) counter = 0; void main(void) { // setup s P ä t 5 t rr ts s

99 1t r t rr ts r rts r tt r r r t rr t t r t rr st r s ts r t s r t rstüt3 r avrlibc r s ür t 3 s avr/interrupt.h avr/io.h void main(void) { DDRD &= ~(1<<PD3); // PD3: input with pull-up PORTD = (1<<PD3); EICRA &= ~(1<<ISC10 1<<ISC11); // INT1: IRQ on level=low EIMSK = (1<<INT1); // INT1: enable sei(); // global IRQ enable r tt t rr ts 3 ss s ss r rät t s r t rstüt3 r avrlibc sei() avr/interrupt.h s P ä t 5 t rr ts s

100 1t r t rr ts r rts r tt ts 3 t tr s r s tr t sleep str t ä t P s tr t s st r r s r tr r r t t rstüt3 r avrlibc avr/sleep.h sleep_enable() sleep_disable() s r r t sleep_cpu() s tr t #include <avr/sleep.h> void main(void) { sei(); while(1) { sleep_enable(); sleep_cpu(); sleep_disable(); // global IRQ enable // wait for IRQ t t r sleep_enable() sleep_disable() s r r s s s rs t s tr t s st s 3 r Pr r r r r t r r r r 3 r s P ä t 5 t rr ts s

101 ä t t ä t Pr r s ü r s ä ür 3 str t s s t stst t r t tsä 3 rst s ü rt r, r, ä t tr tt r t rr ts s ö Pr r r t t r r t r ä r r r r P P r r r t r3 t r 3 s r ä 3 ä tr ss2st tr ss2st r3 t Pr 3 ss r t3 Pr ä r s st s P ä t 5 ä t tt s t t

102 ä ts r 3 r ts r P r s s r3 3ä r r rt r ts st ü r tt t static volatile uint16_t cars; void main(void) { while (1) { waitsec(60); send(cars); cars = 0; // photo sensor is connected // to INT2 ISR(INT2_vect) { cars++; st r s Pr main() s ISR s s r cars P t t st t röÿ r r cars ü rst t st r r t P t t r t s P ä t 5 ä t tt s t t

103 ä ts r rts s r Pr st t main() s ISR s s r cars r t röÿ r r cars ü rst t st r r t r t rst r ss r t void main(void) { send(cars); cars = 0; // photosensor is connected // to INT2 ISR(INT2_vect) { cars++; main: lds r24,cars lds r25,cars+1 rcall send sts cars+1, zero_reg sts cars, zero_reg INT2_vect: ; save regs lds r24,cars ; load cars.lo lds r25,cars+1 ; load cars.hi adiw r24,1 ; add (16 bit) sts cars+1,r25 ; store cars.hi sts cars,r24 ; store cars.lo ; restore regs s P ä t 5 ä t tt s t t

104 ä ts r st t main: lds r24,cars lds r25,cars+1 rcall send sts cars+1, zero_reg sts cars, zero_reg INT2_vect: ; save regs lds r24,cars lds r25,cars+1 adiw r24,1 sts cars+1,r25 sts cars,r24 ; restore regs cars s r t tr tt r main t rt cars r ts st r s st r r INT2_vect r s ü rt st r r r tt t cars r r t rt cars st r r r r st t main ü r t r t t rt cars send main t cars t st r r s P ä t 5 ä t tt s t t

105 ä ts r r t main: lds r24,cars lds r25,cars+1 rcall send sts cars+1, zero_reg sts cars, zero_reg INT2_vect: ; save regs lds r24,cars lds r25,cars+1 adiw r24,1 sts cars+1,r25 sts cars,r24 ; restore regs cars s r t tr tt r main t r ts cars t s t send t main t r ts s 2t cars t cars cars.lo cars.hi INT2_vect r s ü rt cars r s r t rt Ü r s 2t cars cars.lo cars.hi main t s 2t cars cars cars.lo cars.hi ä st send r t s 3 t s P ä t 5 ä t tt s t t

106 t rr ts rr t ss r r void main(void) { while(1) { waitsec(60); cli(); send(cars); cars = 0; sei(); r t s s t st s r t s t s cars cars üss t r s ü rt r s r t t rr ts rr rr t r ISR t r r t main r rt s2 tr s 2 r s t t t rr ts rr s t s r3 ö s r t t send r send s r t s t r s3 s P ä t 5 ä t tt s t t

107 ä ts r rts 3 r t waitsec() ts r P r s s r3 3ä r r rt r ts st ü r tt t void waitsec(uint8_t sec) { // setup timer sleep_enable(); event = 0; while (! event) { // wait for event sleep_cpu(); // until next irq sleep_disable(); static volatile int8_t event; // TIMER1 ISR // triggers when // waitsec() expires ISR(TIMER1_COMPA_vect) { event = 1; st r s Pr st ts 3 t st t s t s 3 t st P t t st s P ä t 5 ä t tt s t t

108 ä ts r st void waitsec(uint8_t sec) { // setup timer sleep_enable(); event = 0; while (! event) { sleep_cpu(); sleep_disable(); static volatile int8_t event; // TIMER1 ISR // triggers when // waitsec() expires ISR(TIMER1_COMPA_vect) { event = 1; s r t tr tt r r waitsec t r ts st st t ss event t s t3t st ISR r s ü rt event r s t3t event s t3t st r r 3 st tr t s t r r t r rös s s P ä t 5 ä t tt s t t

109 st r rös s r r void waitsec(uint8_t sec) { // setup timer sleep_enable(); event = 0; cli(); while (! event) { sei(); r t s s t sleep_cpu(); cli(); sei(); sleep_disable(); static volatile int8_t event; // TIMER1 ISR // triggers when // waitsec() expires ISR(TIMER1_COMPA_vect) { event = 1; st s r t s t st r tr t s 3 st s s r t rr ts rr s r Pr r sleep_cpu() üss s r r t rt s 3 r r r t rstüt3 ss q 3 sei sleep r r P t r s ü rt s P ä t 5 ä t tt s t t

110 s ss t rr t r t r t s2 r 3 Pr r r rt t st ss r t rr t r r r r ä t 2 r s t r r r 2 r s t s ÿ s st s r s volatile r r r st t rr ts s rr cli sei t t r r r s s r r r ä r rr3 t ö s r r ä t r t rr ts st s r r ÿ rq st t st Pr t r st s r st s r 3 ss t 3 r rrs r t r s r t rr t r r s t s st static r s s P ä t 5 s ss

111 Ü r 2st t r t Pr r str t r r r µ 2st r t t r ä t P t r r s t

112 r r s t int a; int b = 1; const int c = 2; // a: global, uninitialized // b: global, initialized // c: global, const t r r ür s r r void main() { static int s = 3; // s: local, static, initialized int x, y; // x: local, auto; y: local, auto char* p = malloc( 100 ); // p: local, auto; *p: heap (100 byte) r t t s t s r r Ü rs t3 tr t st t s r s t r P t3 r r t t 1t t ä t Pr r main() ss t ä t t t s rt r a t t ä t t r rt t s rt r b s r t t ä t rä r r c 2 s t s r r 3 r 3 t tr t t r 1 3 t r rt r t t ä t t t r x y p t ä t 1 3 t t malloc() r rt r r *p s P r r s t 5 ü r

113 r r s t µ int a; int b=1; const int c=2; // a: global, uninitialized // b: global, initialized // c: global, const void main() { static int s=3; // s: local, static, initialized int x, y; // x: local, auto; y: local, auto char* p=malloc(100); // p: local, auto; *p: heap (100 byte) compile / link Quellprogramm r Symbol Table.data... <a> s=3 b=1.rodata c=2.text ELF Header main ELF-Binary Ü rs t3 r Pr r t ts r t r t 3 s sst r t 3 r röÿ r.bss t s r 2 t s P r r s t 5 µ tr r

114 r r s t µ int a; int b=1; const int c=2; // a: global, uninitialized // b: global, initialized // c: global, const void main() { static int s=3; // s: local, static, initialized int x, y; // x: local, auto; y: local, auto char* p=malloc(100); // p: local, auto; *p: heap (100 byte) compile / link Quellprogramm r Flash / ROM.data s=3 b=1.rodata c=2.text main μ-controller flash Symbol Table.data... <a> s=3 b=1.rodata c=2.text ELF Header main ELF-Binary r st t µ r.text.[ro]data s r s µ s P r r s t 5 µ tr r

115 r r s t µ r Flash / ROM RAM init Stack Heap.data copy.data.bss a=0 s=3 b=1.rodata c=2.text... x=? y=? p= *p s=3 b=1 main μ-controller flash int a; int b=1; const int c=2; Symbol Table.data... <a> s=3 b=1.rodata c=2.text compile / link ELF Header main ELF-Binary // a: global, uninitialized // b: global, initialized // c: global, const void main() { static int s=3; // s: local, static, initialized int x, y; // x: local, auto; y: local, auto char* p=malloc(100); // p: local, auto; *p: heap (100 byte) Quellprogramm 2st st rt r s.bss t t t 0 t s rt s.data t r s s s rt s r r ür t s r r t r ü t r t t r ü r t s s r r s r st t r s.data t 3 r 3 t s P r r s t 5 µ tr r

116 2 s r t := Pr r 1 3 t r t t r r s r st ä r Pr r str t r r r r r r ü r 3 s s r t void* malloc( size_t n ) r rt r r röÿ void free( void* pmem ) s #include <stdlib.h> ü r r NULL t 3 r t malloc() r rt r stä r r int* intarray( uint16_t n ) { // alloc int[n] array return (int*) malloc( n * sizeof int ); void main() { int* array = intarray(100); // alloc memory for 100 ints if( array ) { // malloc() returns NULL on failure // if succeeded, use array array[99] = 4711; free( array ); // free allocated block (** IMPORTANT! **) s P r r s t 5 2 s r t

117 2 s r t t r t s r t r ü s r r ss r Ü rs t3 r t t r r t t Pr 3 ss rr st r [e]sp 3 t r ä st r tr t ä st r t t r ä t r t r t r t r s r s t r s r r t t r st r ebp 3 t s t t r s st r esp t r s t Framepointer (Reg. ebp) Stackpointer (Reg. esp) Parameter für f1 Rücksprungadresse in main gesicherter Framepointer von main Lokale Variablen von f1 gerettete Register (falls nötig) Parameter für f2 Rücksprungadresse aus f2 zurück in f1 gesicherter Framepointer von f1 Lokale Variablen von f2 main( ) f1( ) f2( ) s P r r s t 5 2 s r t t

118 t t s r r Stack mehrerer Funktionsaufrufe int main() { int a, b, c; a = 10; b = 20; f1(a, b); return(a); Stack-Frame für main erstellen &a = fp-4 &b = fp-8 &c = fp-12 sp fp return-addr fp retten s r ür t r t t r 2t ints main() r s tr t a b c s P r r s t 5 2 s r t t

119 t t s r Stack mehrerer Funktionsaufrufe int main() { int a, b, c; a = 10; b = 20; f1(a, b); return(a); Parameter auf Stack legen Bei Aufruf sp fp Rücksprungadresse auf Stack legen return-addr fp retten a b c Parameter b Parameter a main return-addr r main() r t t r f1(int, int) r s P r r s t 5 2 s r t t

120 t t s r r Stack mehrerer Funktionsaufrufe int main() { int a, b, c; a = 10; b = 20; f1(a, b); return(a); int f1(int x, int y) { int i[3]; int n; x++; n = f2(x); return(n); f1() r s tr t y x Stack-Frame für f1 erstellen und aktivieren &x = fp+8 &y = fp+12 &(i[0]) = fp-12 &n = fp-16 sp sp fp fp i[4] = 20 würde return-addr. zerstören return-addr fp retten a b c Parameter b Parameter a main return-addr main-fp (1996) i[2] i[1] i[0] n s P r r s t 5 2 s r t t

121 t t s r r Stack mehrerer Funktionsaufrufe int main() { int a, b, c; a = 10; b = 20; f1(a, b); return(a); int f1(int x, int y) { int i[3]; int n; x++; n = f2(x); return(n); int f2(int z) { int m; m = 100; return(z+1); sp Stack-Frame von f2 abräumen ➊sp = fp sp ➋fp = pop(sp) fp fp return-addr fp retten a b c Parameter b Parameter a main return-addr main-fp (1996) i[2] i[1] i[0] n Parameter x f1 return-addr f1-fp (1968) f2() r t t r r r r f1() r s ü rt ➋ ➋ ➊ m s P r r s t 5 2 s r t t

122 t t s r r Stack mehrerer Funktionsaufrufe int main() { int a, b, c; a = 10; b = 20; f1(a, b); return(a); int f1(int x, int y) { int i[3]; int n; x++; n = f2(x); return(n); int f2(int z) { int m; m = 100; return(z+1); f2() r r ss ➌return y Rücksprung x sp fp ➌ return-addr fp retten a b c Parameter b Parameter a main return-addr main-fp (1996) i[2] i[1] i[0] n Parameter x f1 return-addr f1-fp (1968) m s P r r s t 5 2 s r t t

123 t t s r r Stack mehrerer Funktionsaufrufe int main() { int a, b, c; a = 10; b = 20; f1(a, b); return(a); 3 rü main() sp fp return-addr fp retten a b c Parameter b Parameter a main return-addr main-fp (1996) i[2] i[1] i[0] n Parameter x f1 return-addr f1-fp (1968) m s P r r s t 5 2 s r t t

124 r t t s r Stack mehrerer Funktionsaufrufe int main() { int a, b, c; a = 10; b = 20; f1(a, b); f3(4,5,6); was wäre, wenn man nach f1 jetzt eine Funktion f3 aufrufen würde? int f3(int z1, int z2, int z3) { int m; return(m); m r t t s rt r t t rt t z3 sp z2 sp fp fp z1 return-addr fp retten a b c main return-addr main-fp (1996) m i[0] n i[1] Parameter x f1 return-addr f1-fp retten m s P r r s t 5 2 s r t t

125 t t s rs s 2 s t r µ t r st t s t r3 t rt r t3 r st r ts Ü rs t3 1 t t 3 t size s r r r rü 3 t r r r st lohmann@faui48a:$ size sections.avr text data bss dec hex filename ba sections.avr t s röÿ s Pr r s r ö st r static r r r r r st ö t r t t r r st ö s r s r st r ä t s äÿ t r r ö st r sät3 r st r r t sstr t r r r 3 r 3 t s t s ät3 r s Pr r r r r s s P r r s t 5 t t s s 2 s t

Überblick: Teil C Systemnahe Softwareentwicklung

Überblick: Teil C Systemnahe Softwareentwicklung V_SPIC_handout Überblick: Teil C Systemnahe Softwareentwicklung 12 Programmstruktur und Module 13 Zeiger und Felder 14 µc-systemarchitektur Was ist ein µ-controller? µ-controller := Prozessor + Speicher

Mehr

... Polling. Interrupt: c dl GSPiC (Teil C, SS 11) 15 Nebenläufigkeit 15.1 Interrupts: Einführung 15 1

... Polling. Interrupt: c dl GSPiC (Teil C, SS 11) 15 Nebenläufigkeit 15.1 Interrupts: Einführung 15 1 Überblick: Teil C Systemnahe Softwareentwicklung 12 Programmstruktur und Module 13 Zeiger und Felder 14 -Systemarchitektur 15 Nebenläufigkeit 16 Speicherorganisation 17 Zusammenfassung Ereignisbehandlung

Mehr

Was ist ein µ-controller?

Was ist ein µ-controller? PROGRAMMING LOGIC Überblick: Teil C Systemnahe Softwareentwicklung Was ist ein µ-controller? µ-controller := Prozessor + Speicher + Peripherie Faktisch ein Ein-Chip-Computersystem SoC (System-on-a-Chip)

Mehr

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

c dl SPiC (Teil C, SS 11) 14 µc-systemarchitektur 14.1 Überblick x0000 0x0046 main:... wait:... Peripherie 0x1FFFF PROGRAMMING LOGIC Überblick: Teil C Systemnahe Softwareentwicklung Was ist ein µ-controller? 12 Programmstruktur und Module 13 Zeiger und Felder 14 -Systemarchitektur µ-controller := Prozessor + Speicher

Mehr

Grundlagen der Systemnahen Programmierung in C (GSPiC)

Grundlagen der Systemnahen Programmierung in C (GSPiC) Grundlagen der Systemnahen Programmierung in C (GSPiC) Überblick: Teil C Systemnahe Softwareentwicklung Teil C Systemnahe Softwareentwicklung 12 Programmstruktur und Module 13 Zeiger und Felder V_GSPIC_handout

Mehr

t r r P t 3 r q t t t st r2 t s t t

t r r P t 3 r q t t t st r2 t s t t s st t t ür r t r s 3 s s r 1 s rs tät ü r r t r Pr r s r t r r P t 3 r q t t t st r2 t s t t ss rt t 3 r r s t r r s r r r r r 3 s tät r 1 s rs tät ü r t r r 1 r üt3 s r ts s t r 3 s tät r 1 s rs tät

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

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

GdI2 - Systemnahe Programmierung in C Übungen Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2006 U4.fm U4 4. Übungsaufgabe U4 4. Übungsaufgabe Grundlegendes zur Übung mit dem AVR-µC Register I/O Ports Interrupts AVR-Umgebung U4.1 U4-1 Grundlegendes zur Übung mit dem AVR-mC U4-1 Grundlegendes zur Übung mit

Mehr

Grundlagen der Systemnahen Programmierung in C (GSPiC)

Grundlagen der Systemnahen Programmierung in C (GSPiC) Grundlagen der Systemnahen Programmierung in C (GSPiC) Teil C Systemnahe Softwareentwicklung Daniel Lohmann Lehrstuhl für Informatik 4 Verteilte Systeme und Betriebssysteme Friedrich-Alexander-Universität

Mehr

Systemnahe Programmierung in C (SPiC)

Systemnahe Programmierung in C (SPiC) Systemnahe Programmierung in C (SPiC) Teil C Systemnahe Softwareentwicklung Jürgen Kleinöder, Daniel Lohmann Lehrstuhl für Informatik 4 Verteilte Systeme und Betriebssysteme V_SPIC_handout Friedrich-Alexander-Universität

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

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

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

Inhalt. Übungen zu Systemnahe Programmierung in C (SPiC) Implementierung von Interruptbehandlungen. Interrupts Übungen zu Systemnahe Programmierung in C (SPiC) Moritz Strübe, Rainer Müller (Lehrstuhl Informatik 4) Inhalt Interrupts Allgemein AVR Interrupt-Handler Synchronisation volatile Sperren von Interrupts

Mehr

Übungen zu Systemnahe Programmierung in C (SPiC)

Übungen zu Systemnahe Programmierung in C (SPiC) Übungen zu Systemnahe Programmierung in C (SPiC) Moritz Strübe, Rainer Müller (Lehrstuhl Informatik 4) Sommersemester 2014 Inhalt Interrupts Allgemein AVR Interrupt-Handler Synchronisation volatile Lost

Mehr

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

U3 3. Übung U3 3. Übung. Systemnahe Programmierung in C Übungen Moritz Strübe Universität Erlangen-Nürnberg Informatik 4, 2009 U3.fm U3 3. Übung U3 3. Übung Besprechung Aufgabe 1 Pointer Register und Ports U3.1 U3-1 Zeiger U3-1 Zeiger 1 Einordnung Konstante: a 0110 0001 Variable: a Zeiger-Variable (Pointer): a char *p = &a; p U3.2 2

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

U5 Fortgeschrittene AVR-Programmierung

U5 Fortgeschrittene AVR-Programmierung U5 Fortgeschrittene AVR-Programmierung U5 Fortgeschrittene AVR-Programmierung Interrupts Synchronisation mit Unterbrechungsbehandlungen Stromsparmodi des AVR U5.1 U5-1 Externe Interrupts des AVR-μC U5-1

Mehr

Übungen zu Systemnahe Programmierung in C (SPiC)

Übungen zu Systemnahe Programmierung in C (SPiC) Übungen zu Systemnahe Programmierung in C (SPiC) Sebastian Maier (Lehrstuhl Informatik 4) Übung 4 Sommersemester 2016 Inhalt Module Schnittstellenbeschreibung Ablauf vom Quellcode zum laufenden Programm

Mehr

Use of the LPM (Load Program Memory)

Use of the LPM (Load Program Memory) Use of the LPM (Load Program Memory) Use of the LPM (Load Program Memory) Instruction with the AVR Assembler Load Constants from Program Memory Use of Lookup Tables The LPM instruction is included in the

Mehr

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

IR NEC Empfänger mit 4x7 LED Anzeige (ATtiny2313) // Include C Libriaries #include #define F_CPU 4000000UL #include #include #include #include // Definition der Segmente #define SEG_O

Mehr

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

Inhalt. Übungen zu Systemnahe Programmierung in C (SPiC) Inhalt. Globale Variablen Übungen zu Systemnahe Programmierung in C (SPiC) Peter Wägemann, Heiko Janker, Moritz Strübe, Rainer Müller () Wintersemester 24/25 volatile Verwendung Module Hinweise zur Aufgabe Übungen zu SPiC (WS 24/5)

Mehr

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

Inhalt. Übungen zu Systemnahe Programmierung in C (SPiC) Interrupts. Inhalt. Interrupts. Synchronisation Übungen zu Systemnahe Programmierung in C (SPiC) Peter Wägemann, Sebastian Maier, Heiko Janker (Lehrstuhl Informatik 4) Übung 5 Inhalt Synchronisation Stromsparmodi Aufgabe 5: Ampel Hands-on: & Sleep Sommersemester

Mehr

Übungen zu Systemnahe Programmierung in C (SPiC)

Übungen zu Systemnahe Programmierung in C (SPiC) Übungen zu Systemnahe Programmierung in C (SPiC) Sebastian Maier, Heiko Janker (Lehrstuhl Informatik 4) Übung 2 Wintersemester 2015/2016 Inhalt Compileroptimierung Ein- & Ausgabe über Pins Interrupts Synchronisation

Mehr

U5 Fortgeschrittene AVR-Programmierung U5 Fortgeschrittene AVR-Programmierung. Synchronisation mit Unterbrechungsbehandlungen

U5 Fortgeschrittene AVR-Programmierung U5 Fortgeschrittene AVR-Programmierung. Synchronisation mit Unterbrechungsbehandlungen U5 Fortgeschrittene AVR-Programmierung U5 Fortgeschrittene AVR-Programmierung Interrupts volatile-variablen Synchronisation mit Unterbrechungsbehandlungen Stromsparmodi des AVR U5.1 U5-1 Externe Interrupts

Mehr

Atmega Interrupts. Rachid Abdallah Gruppe 3 Betreuer : Benjamin Bös

Atmega Interrupts. Rachid Abdallah Gruppe 3 Betreuer : Benjamin Bös Atmega Interrupts Rachid Abdallah Gruppe 3 Betreuer : Benjamin Bös Inhaltsverzeichnis Vorbereitung Was Sind Interrupts Interruptvektoren Software Interrupts Hardware Interrupts Quellen 2 Vorbereitung Rechner

Mehr

11: Echtzeitbetriebssystem ucos-ii

11: Echtzeitbetriebssystem ucos-ii 11: Echtzeitbetriebssystem ucos-ii Sie lernen anhand aufeinander aufbauender Übungen, welche Möglichkeiten ein Echtzeitbetriebssystem wie das ucosii bietet und wie sich damit MC-Applikationen realisieren

Mehr

Übungen zu Systemnahe Programmierung in C (SPiC)

Übungen zu Systemnahe Programmierung in C (SPiC) Übungen zu Systemnahe Programmierung in C (SPiC) Moritz Strübe, Rainer Müller (Lehrstuhl Informatik 4) Sommersemester 2014 Inhalt Aufgabe4 Led Modul Wiederholung Konfiguration der Pins Hinweise zur Aufgabe

Mehr

c dl SPiC (Teil C, SS 11) 13 Zeiger und Felder 13.1 Zeiger Einführung 13 1 Zeigervariable := Behälter für Verweise ( Adresse) Beispiel int x = 5;

c dl SPiC (Teil C, SS 11) 13 Zeiger und Felder 13.1 Zeiger Einführung 13 1 Zeigervariable := Behälter für Verweise ( Adresse) Beispiel int x = 5; Überblick: Teil C Systemnhe Softwreentwicklung Einordnung: Zeiger (Pointer) Literl: Drstellung eines Wertes 0110 0001 12 Progrmmstruktur und Module Vrible: Bezeichnung chr ; eines Dtenobjekts Behälter

Mehr

05. Assembler-Programmierung. Datenstrukturen des ATMega32. Literatur

05. Assembler-Programmierung. Datenstrukturen des ATMega32. Literatur 0. Assembler-Programmierung Datenstrukturen des ATMega32 Literatur mikrocontroller.net avr-asm-tutorial.net asm Alles über AVR AVR-Assembler-Einführung Assembler AVR-Aufbau, Register, Befehle 2008: ouravr.com/attachment/microschematic/index.swf

Mehr

U23 2008 Abend 3: Musterlösungen, Taster entprellen, Unterprozeduren, Interrupts, Timer

U23 2008 Abend 3: Musterlösungen, Taster entprellen, Unterprozeduren, Interrupts, Timer Abend 3: Musterlösungen, Taster entprellen, Unterprozeduren, Interrupts, Timer Alexander Neumann e.v. http://koeln.ccc.de Köln, 1.9.2008 1 Musterlösungen Aufgabe 1 & 2 2 Taster entprellen

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

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

Makros sind Textersetzungen, welche vom Präprozessor aufgelöst werden. Dies Passiert bevor der Compiler die Datein verarbeitet. U4 4. Übung U4 4. Übung Besprechung Aufgabe 2 Makros Register I/O-Ports U4.1 U4-1 Makros U4-1 Makros Makros sind Textersetzungen, welche vom Präprozessor aufgelöst werden. Dies Passiert bevor der Compiler

Mehr

Prozessoren für mobile und. eingebettete Systeme II: Die AVR-Architektur. EMES: Eigenschaften mobiler und eingebetteter Systeme

Prozessoren für mobile und. eingebettete Systeme II: Die AVR-Architektur. EMES: Eigenschaften mobiler und eingebetteter Systeme EMES: Eigenschaften mobiler und eingebetteter Systeme Prozessoren für mobile und 00101111010010011101001010101 eingebettete Systeme II: Die AVR-Architektur Dipl. Inf. Jan Richling Wintersemester 2004/2005

Mehr

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

Inhalt. Aufgabe 4: LED-Modul Hinweise Testen des Moduls Sommersemester 2015 Ü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

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

myavr Programmierung in C

myavr Programmierung in C myavr Programmierung in C Stefan Goebel Februar 2017 Stefan Goebel myavr Programmierung in C Februar 2017 1 / 12 Grundgerüst... braucht man immer! #include // Register- und Konstantendefinitionen

Mehr

Einführung DIP & AVR EVK1100

Einführung DIP & AVR EVK1100 Einführung DIP & AVR EVK1100 Umfang: ca. 2-4 Zeitstunden Display und Buttons (DIP) DIP (Treiber, Code) Aufgaben Emqopter GmbH 2 Display: DIP204 20 Spalten x 4 Zeilen (80 Zeichen) Anzeige von Informationen

Mehr

tät ür P 2s str r t r s rs tät r r r t r t t P r r

tät ür P 2s str r t r s rs tät r r r t r t t P r r tät ür P 2s str r t r s rs tät r r r t t P 2s r t t P r r 3 3 2s P s P 1 s s s r r t r t P s ü rt P 2s s st t t r rs tät r t r r tr rr Pr r ré ö 3 3 2s P s P 1 s s t r r 2s st r t r r t3 r µ + e + e

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

Mikroprozessoren Grundlagen AVR-Controller Input / Output (I/O) Interrupt Mathematische Operationen

Mikroprozessoren Grundlagen AVR-Controller Input / Output (I/O) Interrupt Mathematische Operationen Mikroprozessoren Grundlagen Aufbau, Blockschaltbild Grundlegende Datentypen AVR-Controller Anatomie Befehlssatz Assembler Speicherzugriff Adressierungsarten Kontrollstrukturen Stack Input / Output (I/O)

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

Aufbau eines Assembler-Programms

Aufbau eines Assembler-Programms Aufbau eines Assembler-Programms. Assembler-Anweisungen (Direktiven) Einbindung von include-files Definition von Konstanten, Reservierung von Speicherplatz im RAM, 2. Was tun, wenn C Reset-Signal erhält

Mehr

Programmieren in C Teil 3: Mikrocontrollerprogrammierung

Programmieren in C Teil 3: Mikrocontrollerprogrammierung Programmieren in C Teil 3: Mikrocontrollerprogrammierung 08/30/10 Fachbereich Physik Institut für Kernphysik Bastian Löher, Martin Konrad 1 Tag 1 Hello World 08/30/10 Fachbereich Physik Institut für Kernphysik

Mehr

U4 Grundlagen der C-Programmierung

U4 Grundlagen der C-Programmierung U4 Grundlagen der C-Programmierung U4 Grundlagen der C-Programmierung Makros Enums und Typedefs Deklaration und Definition Compileroptimierungen U4.1 U4-1 Makros U4-1 Makros Makros sind Textersetzungen,

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

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

E Mikrocontroller-Programmierung

E Mikrocontroller-Programmierung E Mikrocontroller-Programmierung E Mikrocontroller-Programmierung E.1 Überblick Mikrocontroller-Umgebung Prozessor am Beispiel AVR-Mikrocontroller Speicher Peripherie Programmausführung Programm laden

Mehr

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

a) Welche Aussage zu Zeigern ist richtig? Die Übergabesemantik für Zeiger als Funktionsparameter ist callby-value. Aufgabe 1: (15 Punkte) Bei den Multiple-Choice-Fragen ist jeweils nur eine richtige Antwort eindeutig anzukreuzen. Auf die richtige Antwort gibt es die angegebene Punktzahl. Wollen Sie eine Multiple-Choice-Antwort

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

Datenstrukturen, Alignment Stack Prozeduraufruf, Parameterübergabe und -rückgabe (Calling Conventions) Leaf procedures

Datenstrukturen, Alignment Stack Prozeduraufruf, Parameterübergabe und -rückgabe (Calling Conventions) Leaf procedures Vorbesprechung U8 Datenstrukturen, Alignment Stack Prozeduraufruf, Parameterübergabe und -rückgabe (Calling Conventions) Leaf procedures Basistypen Alignment der Basistypen auf deren Grösse Grössen (abhängig

Mehr

HelvePic32 Breadboard. Internet Data Logger

HelvePic32 Breadboard. Internet Data Logger 2016/04/03 21:14 1/10 HelvePic32 Breadboard Alle Beispiele, welche beim Helvepic32 angegeben sind, können unverändert natürlich auch beim HelvePic32 Breadboard verwendet werden. Daher nutzen wir die Gelegenheit,

Mehr

Prozessoren für mobile und. eingebettete Systeme II: Die AVR-Architektur. EMES: Eigenschaften mobiler und eingebetteter Systeme

Prozessoren für mobile und. eingebettete Systeme II: Die AVR-Architektur. EMES: Eigenschaften mobiler und eingebetteter Systeme EMES: Eigenschaften mobiler und eingebetteter Systeme Prozessoren für mobile und 111111111111111 eingebettete Systeme II: Die AVR-Architektur Dr. Felix Salfner, Dr. Siegmar Sommer Wintersemester 29/21

Mehr

Technische Informatik 2: Addressierung und Befehle

Technische Informatik 2: Addressierung und Befehle Technische Informatik 2: Addressierung und Befehle Memory Map Programm Speicher: Adresse $000-$FFF max. 4096 Byte für kompiliertes Programm Data Memory: Adresse $0000-$FFFF 32 8Bit Register 64 I/O Register

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

i386 Interrupt-Deskriptortabelle (IDT)

i386 Interrupt-Deskriptortabelle (IDT) Agenda: IRQ-Behandlung in OO-Stubs Interrupts und Traps bei x86 Die Interrupt-Deskriptor-Tabelle (IDT) Aufbau der IDT Traps und Hardware IRQs Der Programmierbare Interruptcontroller PIC 8295A Aufbau Verwendung

Mehr

AVR-8-bit-Mikrocontroller Gruppe Technologie der AVR-8-bit-Mikrocontroller Teil SPI

AVR-8-bit-Mikrocontroller Gruppe Technologie der AVR-8-bit-Mikrocontroller Teil SPI Teil 101 - AVR-Architektur 1 Die Architektur der AVR-Mikrocontroller - der CPU-Kern 1.1 Einleitung und Geschichtliches 1.2 Die Architektur: RISC contra CISC 1.3 ALU - Arithmetic Logic Unit 1.4 Das Status

Mehr

Arduino µcontroller. Virtuelle COMSchnittstelle

Arduino µcontroller. Virtuelle COMSchnittstelle Aufgaben: Arduino µcontroller 1. Die gegebene Software auf einen ARDUINO MEGA-Board aufspielen weil die PORTS A (8xSchalter) und C (8xLEDs) benutzt werden. Steht nur ein UNO-Board zur Verfügung, dann den

Mehr

ARM Cortex-M Prozessoren. Referat von Peter Voser Embedded Development GmbH

ARM Cortex-M Prozessoren. Referat von Peter Voser Embedded Development GmbH ARM Cortex-M Prozessoren Referat von Peter Voser Embedded Development GmbH SoC (System-on-Chip) www.embedded-development.ch 2 Instruction Sets ARM, Thumb, Thumb-2 32-bit ARM - verbesserte Rechenleistung

Mehr

Microcontroller VU Exam 1 (Programming)

Microcontroller VU Exam 1 (Programming) Microcontroller VU 182.694 Exam 1 (Programming) Familienname/Surname: Vorname/First name: MatrNr/MatrNo: Unterschrift/Signature: Vom Betreuer auszufullen/to be lled in by supervisor Funktioniert? Kommentar

Mehr

Einführung in die Programmiersprache C

Einführung in die Programmiersprache C Einführung in die Programmiersprache C 4 Storage classes Alexander Sczyrba Robert Homann Georg Sauthoff Universität Bielefeld, Technische Fakultät Compilation units Compilierung eines mehrteiligen Programms:

Mehr

Übung 3: VHDL Darstellungen (Blockdiagramme)

Übung 3: VHDL Darstellungen (Blockdiagramme) Übung 3: VHDL Darstellungen (Blockdiagramme) Aufgabe 1 Multiplexer in VHDL. (a) Analysieren Sie den VHDL Code und zeichnen Sie den entsprechenden Schaltplan (mit Multiplexer). (b) Beschreiben Sie zwei

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

Übung zu Betriebssystembau (Ü BS)

Übung zu Betriebssystembau (Ü BS) Übung zu Betriebssystembau (Ü BS) Interruptbehandlung in OOStuBS Wanja Hofer Lehrstuhl für Informatik IV WS 07/08 1 Agenda: IRQ-Behandlung in OOStuBS Interrupts und Traps beim x86 Die Interrupt-Deskriptor-Tabelle

Mehr

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften Programmiertechnik Teil 4 C++ Funktionen: Prototypen Overloading Parameter C++ Funktionen: Eigenschaften Funktionen (Unterprogramme, Prozeduren) fassen Folgen von Anweisungen zusammen, die immer wieder

Mehr

Serielle Schnittstelle, erstes Testprogramm (a)

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

Mehr

Klasse Label. class Label { Code code; List<Integer> fixuplist; // code positions to patch int adr; // address of label in code

Klasse Label. class Label { Code code; List<Integer> fixuplist; // code positions to patch int adr; // address of label in code Klasse Label class Label { Code code; List fixuplist; // code positions to patch int adr; // address of label in code // inserts offset to label at current void put (); // defines label to be

Mehr

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

Bisher hatten immer nur als Ausgänge geschaltet und hierfür folgende Befehle benutzt: Tasten abfragen Bisher hatten immer nur als Ausgänge geschaltet und hierfür folgende Befehle benutzt: pinmode(pinnummer, OUTPUT) digitalwrite(pinnummer, HIGH) oder digitalwrite(pinnummer, LOW) Zum Abfragen

Mehr

ProcessorsTechnik Labor LCD-Uhr

ProcessorsTechnik Labor LCD-Uhr ProcessorsTechnik Labor LCD-Uhr Xu,Zhen 20465719 Aufgabe Beschreibung:LCD-Uhr HardWare :LCD161A. (4B.8B Dataverarbeiten ). Clock Chip:KS0066U Programmieren Sprache :Assemble LCD1602 PIN definieren : Pin

Mehr

U4 Grundlagen der C-Programmierung

U4 Grundlagen der C-Programmierung U4 Grundlagen der C-Programmierung U4 Grundlagen der C-Programmierung Makros Enums und Typedefs Deklaration und Definition Compileroptimierungen U4-1 Makros U4-1 Makros Makros sind Textersetzungen, welche

Mehr

Vorlesung HSMT (MRT - Teil) ab WS2011/2012

Vorlesung HSMT (MRT - Teil) ab WS2011/2012 HSMT / (MRT Teil) 27.10.11 Praktikum / Vorlesung / Dipl.Arbeiten Stephan Zielinski Horbacherstr. 116c Tel. 0241 6009 52302 Labor Goethestr, 52072 Aachen 0241 6009 52129 Büro Eupenerstr. Tel. 174173 Fax

Mehr

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

Wer möchte, kann sein Programm auch auf echter Hardware testen U4 3. Übungsaufgabe U4 3. Übungsaufgabe Grundlegendes zur Übung mit dem AVR-μC Register I/O-Ports AVR-Umgebung Peripherie U4.1 U4-1 Grundlegendes zur Übung mit dem AVR-mC U4-1 Grundlegendes zur Übung mit

Mehr

Einführung in die Programmiersprache C

Einführung in die Programmiersprache C Einführung in die Programmiersprache C 4 Storage classes Alexander Sczyrba Robert Homann Georg Sauthoff Universität Bielefeld, Technische Fakultät Compilation units Compilierung eines mehrteiligen Programms:

Mehr

U23 Assembler Workshop

U23 Assembler Workshop Ike e.v. http://koeln.ccc.de 2016-11-05 Überblick 1 CPU, Assembler Überblick x86 x86 Assembler 2 RAM, Stack, Calling Conventions Stack Calling Conventions Stackframes 3 Branches Jumps 4 Speicher, C-Interface

Mehr

Betriebssystembau. 3. Übung. Michael Engel Arbeitsgruppe Eingebettete Systemsoftware. Lehrstuhl für Informatik 12 TU Dortmund

Betriebssystembau. 3. Übung. Michael Engel Arbeitsgruppe Eingebettete Systemsoftware. Lehrstuhl für Informatik 12 TU Dortmund Betriebssystembau 3. Übung Michael Engel Arbeitsgruppe Eingebettete Systemsoftware Lehrstuhl für Informatik 12 TU Dortmund michael.engel@tu-dortmund.de http://ess.cs.uni-dortmund.de/~me/ 1 Agenda: IRQ-Behandlung

Mehr

Programmieren in C. Speicher anfordern, Unions und Bitfelder. Prof. Dr. Nikolaus Wulff

Programmieren in C. Speicher anfordern, Unions und Bitfelder. Prof. Dr. Nikolaus Wulff Programmieren in C Speicher anfordern, Unions und Bitfelder Prof. Dr. Nikolaus Wulff Vergleich: Felder und Strukturen Felder müssen Elemente vom selben Typ enthalten. Strukturen können Elemente unterschiedlichen

Mehr

Karlsruher Institut für Technologie

Karlsruher Institut für Technologie Karlsruher Institut für Technologie Lehrstuhl für Programmierparadigmen Sprachtechnologie und Compiler WS 2010/2011 Dozent: Prof. Dr.-Ing. G. Snelting Übungsleiter: Matthias Braun Lösung zu Übungsblatt

Mehr

Speicheraufbau des AT89C5131

Speicheraufbau des AT89C5131 Speicheraufbau des AT89C5131 Prinzip: - getrennter Programmspeicher (ROM) und Datenspeicher (RAM) - interner Speicher (auf dem Chip) und externer Speicher (Zusatzbausteine) Das Experimentalsystem hat keinen

Mehr

GRAFIK 128x64 IN 2 GRÖSSEN MIT ST7565. preliminary

GRAFIK 128x64 IN 2 GRÖSSEN MIT ST7565. preliminary GRAFIK 128x64 IN 2 GRÖSSEN MIT ST7565 Stand 10.2.2009 Displayabmessungen -6X9: 56x43mm (Abbildung) -6X8: 34x25mm TECHNISCHE DATEN * INKL. KONTROLLER ST7565 * VDD = 2,7... 3,3V * LOW POWER, ALSO IDEAL FÜR

Mehr

Ansteuerung eines LCD-Screens

Ansteuerung eines LCD-Screens Ansteuerung eines LCD-Screens Marcel Meinersen 4. Mai 2013 Marcel Meinersen Ansteuerung eines LCD-Screens 4. Mai 2013 1 / 27 Inhaltsverzeichnis 1 Allgemeines Was ist ein LCD-Screen? LCD 162C LED Marcel

Mehr

Institut für Informatik Prof. Dr. D. Hogrefe Dipl.-Inf. R. Soltwisch, Dipl.-Inform. M. Ebner, Prof. Dr. D. Hogrefe Informatik II - SS 04.

Institut für Informatik Prof. Dr. D. Hogrefe Dipl.-Inf. R. Soltwisch, Dipl.-Inform. M. Ebner, Prof. Dr. D. Hogrefe Informatik II - SS 04. Kontrollstrukturen Informatik II SS 2004 Teil 4: Assembler Programmierung Sprünge (bedingte und unbedingte) If-then-else, Case Loop (n Durchläufe) While (Abbruchbedingung) Institut für Informatik Prof.

Mehr

~10 RESET 3.3V 5V GND GND VIN

~10 RESET 3.3V 5V GND GND VIN Abgabe Dieses Übungsblatt ist bis Freitag, 09.05. um 12:00 per E-Mail an den eigenen Tutoren abzugeben. Bennennung beispielsweise $Matrikelnummer_Abgabe_$Blattnummer.$Format. 1 Automatische Ampelsteuerung

Mehr

U23 Assembler Workshop

U23 Assembler Workshop Ike e.v. http://koeln.ccc.de 2016-11-05 Überblick 1 CPU, Assembler Überblick x86 x86 Assembler 2 RAM, Stack, Calling Conventions Stack Calling Conventions Stackframes 3 Branches Jumps 4 Speicher, C-Interface

Mehr

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

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

Mehr

Die Technik hinter IoT: Arduino, Raspberry Pi & Co.

Die Technik hinter IoT: Arduino, Raspberry Pi & Co. Die Technik hinter IoT: Arduino, Raspberry Pi & Co. Praxisbeispiele für den Hausgebrauch Uwe Steinmann MMK GmbH 25.-26. September 2017 Uwe Steinmann (MMK GmbH) Die Technik hinter IoT 25.-26. September

Mehr

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

f) Was versteht man beim Zugriff auf I/O-Register unter dem Begriff Memory-mapped? Aufgabe 1: (1) Bei den Multiple-Choice-Fragen ist jeweils nur eine richtige Antwort eindeutig anzukreuzen. Auf die richtige Antwort gibt es die angegebene Punktzahl. Wollen Sie eine Multiple-Choice-Antwort

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

F Zeiger, Felder und Strukturen in C

F Zeiger, Felder und Strukturen in C F Zeiger, Felder und Strukturen in C F Zeiger, Felder und Strukturen in C F.1 Zeiger(-Variablen) 1 Einordnung Konstante: Bezeichnung für einen Wert a 0110 0001 Variable: Bezeichnung eines Datenobjekts

Mehr

J Mikrocontroller-Programmierung

J Mikrocontroller-Programmierung J Mikrocontroller-Programmierung J Mikrocontroller-Programmierung J.1 Überblick Mikrocontroller im Gegensatz zu Betriebssystem-Plattform Prozessor am Beispiel AVR-Mikrocontroller Speicher Peripherie Programmausführung

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

Mikrocomputertechnik. Thema: Der Aufbau des XC888-Mikrocontrollers -Teil 1 -

Mikrocomputertechnik. Thema: Der Aufbau des XC888-Mikrocontrollers -Teil 1 - Mikrocomputertechnik Thema: Der Aufbau des XC888-Mikrocontrollers -Teil 1 - Mikroprozessor-Achritekturen Folie 2 Mikroprozessor-Achritekturen Klassifizierung anhand Wortbreite CPU-Architektur und Busleitungen

Mehr

Inhalt. 5 r s t r. 5 t st r rä. 5 t r s s t 5 r t r r t r s r t t 5 r t r ss r t r s r t 5 r s t r ÿ. 5 ü t r rt. 5 ü t t. 5 r t r st r s.

Inhalt. 5 r s t r. 5 t st r rä. 5 t r s s t 5 r t r r t r s r t t 5 r t r ss r t r s r t 5 r s t r ÿ. 5 ü t r rt. 5 ü t t. 5 r t r st r s. Inhalt 5 r rt 5 r 5 r s t r 5 s 5 t st r rä 5 s t 5 t r s s t 5 r t r r t r s r t t 5 r t r ss r t r s r t 5 r s t r ÿ 5 r 5 ü t r rt 5 ts 5 s r ö3 s 5 s t 5 ü t t 5 ü t t 5 s ss 5 r t r st r s 5 r ss

Mehr

Technische Informatik 1 Übung 2 Assembler (Rechenübung) Georgia Giannopoulou (ggeorgia@tik.ee.ethz.ch) 22./23. Oktober 2015

Technische Informatik 1 Übung 2 Assembler (Rechenübung) Georgia Giannopoulou (ggeorgia@tik.ee.ethz.ch) 22./23. Oktober 2015 Technische Informatik 1 Übung 2 Assembler (Rechenübung) Georgia Giannopoulou (ggeorgia@tik.ee.ethz.ch) 22./23. Oktober 2015 Ziele der Übung Aufgabe 1 Aufbau und Aufruf von Funktionen in Assembler Codeanalyse

Mehr

Für den CTC-Mode kann demnach TCCR1A komplett auf 0 gesetzt werden, weil WGM11 und WGM10 in diesem Register liegen und beide laut Tabelle 0 sind:

Für den CTC-Mode kann demnach TCCR1A komplett auf 0 gesetzt werden, weil WGM11 und WGM10 in diesem Register liegen und beide laut Tabelle 0 sind: Timerinterrupts beim Arduino Timer 1 (16bit) Register: Bits in den Registern und ihre Bedeutung: Für den CTC-Mode kann demnach TCCR1A komplett auf 0 gesetzt werden, weil WGM11 und WGM10 in diesem Register

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

Mikroprozessoren Grundlagen AVR-Controller Input / Output (I/O) Interrupt Mathematische Operationen

Mikroprozessoren Grundlagen AVR-Controller Input / Output (I/O) Interrupt Mathematische Operationen Mikroprozessoren Grundlagen Aufbau, Blockschaltbild Grundlegende Datentypen AVR-Controller Anatomie Befehlssatz Assembler Speicherzugriff Adressierungsarten Kontrollstrukturen Stack Input / Output (I/O)

Mehr

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

b) Gegeben sei folgende Enumeration: enum SPRACHE {Deutsch, Englisch, Russisch}; Aufgabe 1: (19 Punkte) Bei den Multiple-Choice-Fragen ist jeweils nur eine richtige Antwort eindeutig anzukreuzen. Auf die richtige Antwort gibt es die angegebene Punktzahl. Wollen Sie eine Multiple-Choice-Antwort

Mehr

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

Stopp-Uhr. Erstellen Sie ein Programm (in Zweier- bzw. Dreier-Gruppen), welches folgende Bedingungen erfüllt: Inhalt Aufgabenstellung... 1 Lösung... 2 System (Kontextdiagramm)... 2 Zustands-Übergangs-Diagramm... 2 Codeierung... 4 Main-Module... 4 Module-Button... 6 Module Timer... 8 Anhang... 12 Datenflussdiagramm...

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

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

C++11. neu in C++11: range-based for. Objektorientierte Programmierung mit C++ Ersetzung durch: 1. Elementares C++ int array[] = { 1, 2, 3, 4, 5 };

C++11. neu in C++11: range-based for. Objektorientierte Programmierung mit C++ Ersetzung durch: 1. Elementares C++ int array[] = { 1, 2, 3, 4, 5 }; neu in C++11: range-based for int array[] = { 1, 2, 3, 4, 5 ; for (int x : array) // value x *= 2; C++11 for (int& x : array) // reference x *= 2; Ersetzung durch: { auto && range = range-init; for ( auto

Mehr