@@ -282,6 +282,113 @@ src: dr_arhitecture.md
282282
283283<!-- MCUs -->
284284
285+ ---
286+
287+ # Hello World on AVR in C
288+
289+ ``` c
290+
291+ #include < avr/io.h>
292+ #include < util/delay.h>
293+
294+ #define F_CPU 12000000UL //MCU clock frequency
295+
296+ int main ()
297+ {
298+ DDRC = (1 << PC0); //Set pin 0 of PORT C as output
299+ //DDRC = Data Direction Register for PORT C
300+ while(1)
301+ {
302+ PORTC ^= (1 << PC0); //Toggle pin 0 of PORT C (XOR)
303+ _delay_ms (500);
304+ }
305+ }
306+
307+ ```
308+
309+ > Note: the above code can toggle an LED on / off every 500ms
310+
311+ ---
312+
313+ # Let's go lower level
314+ ``` c
315+
316+ // 00000000 <__vectors>:
317+ // __vectors():
318+ 0 : 0c 94 3e 00 jmp 0x7c ; 0x7c <__ctors_end> // reset
319+ 4 : 0c 94 48 00 jmp 0x90 ; 0x90 <__bad_interrupt>
320+ 8 : 0c 94 48 00 jmp 0x90 ; 0x90 <__bad_interrupt>
321+ c: 0c 94 48 00 jmp 0x90 ; 0x90 <__bad_interrupt>
322+ 10 : 0c 94 48 00 jmp 0x90 ; 0x90 <__bad_interrupt>
323+ 14 : 0c 94 48 00 jmp 0x90 ; 0x90 <__bad_interrupt>
324+ 18 : 0c 94 48 00 jmp 0x90 ; 0x90 <__bad_interrupt>
325+ 1c: 0c 94 48 00 jmp 0x90 ; 0x90 <__bad_interrupt>
326+ 20 : 0c 94 48 00 jmp 0x90 ; 0x90 <__bad_interrupt>
327+ 24 : 0c 94 48 00 jmp 0x90 ; 0x90 <__bad_interrupt>
328+ 28 : 0c 94 48 00 jmp 0x90 ; 0x90 <__bad_interrupt>
329+
330+ ................................................
331+
332+ 60 : 0c 94 48 00 jmp 0x90 ; 0x90 <__bad_interrupt>
333+ 64 : 0c 94 48 00 jmp 0x90 ; 0x90 <__bad_interrupt>
334+ 68 : 0c 94 48 00 jmp 0x90 ; 0x90 <__bad_interrupt>
335+ 6c: 0c 94 48 00 jmp 0x90 ; 0x90 <__bad_interrupt>
336+ 70 : 0c 94 48 00 jmp 0x90 ; 0x90 <__bad_interrupt>
337+ 74 : 0c 94 48 00 jmp 0x90 ; 0x90 <__bad_interrupt>
338+ 78 : 0c 94 48 00 jmp 0x90 ; 0x90 <__bad_interrupt>
339+ 0000007c <__ctors_end>:
340+
341+
342+ ```
343+
344+ ---
345+
346+ # Next code
347+
348+ ``` c
349+
350+ // __trampolines_start():
351+ 7c: 11 24 eor r1, r1 ; r1 = 0 // program jumps here at reset
352+ 7e: 1f be out 0x3f , r1 ; SREG = r1
353+ 80 : cf ef ldi r28, 0xFF ; 255
354+ 82 : d8 e0 ldi r29, 0x08 ; 8
355+ 84 : de bf out 0x3e , r29 ; SPH = 0x8 // stack pointer on the last RAM address - 0x08FF for 328P
356+ 86 : cd bf out 0x3d , r28 ; SPL = 0xFF . // stack Pointer High and Low - to get a 16b address on a 8bit MCU
357+ 88 : 0e 94 4a 00 call 0x94 ; 0x94 <main>
358+ 8c: 0c 94 59 00 jmp 0xb2 ; 0xb2 <_exit> 00000090
359+
360+ // <__bad_interrupt>: __vector_22():
361+ 90 : 0c 94 00 00 jmp 0 ; 0x0 <__vectors>. // any interrupt triggers a reset
362+
363+
364+ ```
365+
366+ ---
367+
368+ # We get to the code
369+
370+ ``` c
371+
372+ 94 : 38 9a sbi 0x07 , 0 ; DDRC = 0x01 // DDRC |= (1 << PC0);
373+
374+ 96 : 91 e0 ldi r25, 0x01 ; r25 = 1
375+ 98 : 88 b1 in r24, 0x08 ; r24 = PORTC // from here PORTC ^= (1 << PC0);
376+ 9a: 89 27 eor r24, r25 ; r24 = r24 ^ 1
377+ 9c: 88 b9 out 0x08 , r24 ; PORTC = r24
378+
379+ 9e: 2f e9 ldi r18, 0x9F ; 159 // from here _delay_ms():
380+ a0: 36 e8 ldi r19, 0x86 ; 134
381+ a2: 81 e0 ldi r24, 0x01 ; 1
382+ a4: 21 50 subi r18, 0x01 ; 1
383+ a6: 30 40 sbci r19, 0x00 ; 0
384+ a8: 80 40 sbci r24, 0x00 ; 0
385+ aa: e1 f7 brne .-8 ; 0xa4 <main+0x10 >
386+ ac: 00 c0 rjmp .+0 ; 0xae <main+0x1a >
387+ ae: 00 00 nop b0: f3 cf rjmp .-26 ; 0x98 <main+0x4 > // jumps back to the loop (98)
388+
389+
390+ ```
391+
285392---
286393src: ../../resources/mcu/slides.md
287394---
0 commit comments