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
|
|
- Heini Simen
- vor 6 Jahren
- Abrufe
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
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
Überblick: Teil C Systemnahe Softwareentwicklung 12 Programmstruktur und Module 13 Zeiger und Felder 14 -Systemarchitektur 15 Nebenläufigkeit 16 Speicherorganisation 17 Zusammenfassung Ereignisbehandlung
MehrWas 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)
Mehrc 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
MehrGrundlagen 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
Mehrt 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
MehrU5-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
MehrGdI2 - 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
MehrGrundlagen 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
MehrSystemnahe 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
MehrInterruptsystem 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
MehrUnter 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
MehrInhalt. Ü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) Moritz Strübe, Rainer Müller (Lehrstuhl Informatik 4) Sommersemester 2014 Inhalt Interrupts Allgemein AVR Interrupt-Handler Synchronisation volatile Lost
MehrU3 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
MehrEinleitung 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)?....
MehrU5 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) Sebastian Maier (Lehrstuhl Informatik 4) Übung 4 Sommersemester 2016 Inhalt Module Schnittstellenbeschreibung Ablauf vom Quellcode zum laufenden Programm
MehrUse 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
MehrIR 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
MehrInhalt. Ü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)
MehrInhalt. Ü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) Sebastian Maier, Heiko Janker (Lehrstuhl Informatik 4) Übung 2 Wintersemester 2015/2016 Inhalt Compileroptimierung Ein- & Ausgabe über Pins Interrupts Synchronisation
MehrU5 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
MehrAtmega 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
Mehr11: 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) Moritz Strübe, Rainer Müller (Lehrstuhl Informatik 4) Sommersemester 2014 Inhalt Aufgabe4 Led Modul Wiederholung Konfiguration der Pins Hinweise zur Aufgabe
Mehrc 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
Mehr05. 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
MehrU23 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
MehrParallel-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
MehrMakros 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
MehrProzessoren 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
MehrInhalt. 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
MehrInterrupts. 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
Mehrmyavr 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
MehrEinfü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
Mehrtä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
MehrRechnerarchitektur 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
MehrMikroprozessoren 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)
MehrMicrocontroller 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.
MehrAufbau 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
MehrProgrammieren 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
MehrU4 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,
MehrEinfü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)
MehrAtmel 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
MehrE Mikrocontroller-Programmierung
E Mikrocontroller-Programmierung E Mikrocontroller-Programmierung E.1 Überblick Mikrocontroller-Umgebung Prozessor am Beispiel AVR-Mikrocontroller Speicher Peripherie Programmausführung Programm laden
Mehra) 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
MehrEinfü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
MehrDatenstrukturen, 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
MehrHelvePic32 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,
MehrProzessoren 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
MehrTechnische 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
MehrAutonome 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,
Mehri386 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
MehrAVR-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
MehrArduino µ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
MehrARM 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
MehrMicrocontroller 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
MehrEinfü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) Aufgabe 1 Multiplexer in VHDL. (a) Analysieren Sie den VHDL Code und zeichnen Sie den entsprechenden Schaltplan (mit Multiplexer). (b) Beschreiben Sie zwei
MehrName: 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) 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
MehrProgrammiertechnik. 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
MehrSerielle 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.
MehrKlasse 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
MehrBisher 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
MehrProcessorsTechnik 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
MehrU4 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
MehrVorlesung 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
MehrWer 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
MehrEinfü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:
MehrU23 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
MehrBetriebssystembau. 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
MehrProgrammieren 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
MehrKarlsruher 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
MehrSpeicheraufbau 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
MehrGRAFIK 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
MehrAnsteuerung 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
MehrInstitut 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
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
MehrU23 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
MehrName: 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
MehrDie 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
Mehrf) 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
MehrLö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
MehrF 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
MehrJ 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
MehrB1 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
MehrMikrocomputertechnik. 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
MehrInhalt. 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
MehrTechnische 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
MehrFü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
MehrEinfü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
MehrMikroprozessoren 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)
Mehrb) 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
MehrStopp-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...
MehrTag 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!
MehrC.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
MehrC++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