{"id":639,"date":"2013-08-04T12:47:55","date_gmt":"2013-08-04T12:47:55","guid":{"rendered":"http:\/\/blog.bachi.net\/?p=639"},"modified":"2013-08-06T19:05:11","modified_gmt":"2013-08-06T19:05:11","slug":"arduino-understanding-the-internals","status":"publish","type":"post","link":"https:\/\/blog.bachi.net\/?p=639","title":{"rendered":"Arduino: Understanding the Internals"},"content":{"rendered":"<pre class=\"brush: cpp; title: C:\/arduino-1.0.4\/hardware\/arduino\/cores\/arduino\/wiring_digital.c; notranslate\" title=\"C:\/arduino-1.0.4\/hardware\/arduino\/cores\/arduino\/wiring_digital.c\">\r\n\r\n\/* pin = Arduino Mapped Pin Name, ex. Digital pin 22: pin = 22 *\/\r\nvoid digitalWrite(uint8_t pin, uint8_t val)\r\n{\r\n    uint8_t timer = digitalPinToTimer(pin);\r\n    uint8_t bit   = digitalPinToBitMask(pin);\r\n    uint8_t port  = digitalPinToPort(pin);\r\n\r\n    volatile uint8_t *out;\r\n    out = portOutputRegister(port);\r\n\r\n    uint8_t oldSREG = SREG;\r\n    cli();\r\n\r\n    if (val == LOW) {\r\n        *out &amp;= ~bit;\r\n    } else {\r\n        *out |= bit;\r\n    }\r\n    \r\n    SREG = oldSREG;\r\n}\r\n<\/pre>\n<p>SREG (Status Register) und Globale Interrupts aktivieren: <a href=\"http:\/\/www.mikrocontroller.net\/topic\/52362\">SREG -Register<\/a><\/p>\n<pre class=\"brush: cpp; title: C:\/arduino-1.0.4\/hardware\/arduino\/cores\/arduino\/Arduino.h; notranslate\" title=\"C:\/arduino-1.0.4\/hardware\/arduino\/cores\/arduino\/Arduino.h\">\r\nextern const uint8_t PROGMEM digital_pin_to_port_PGM&#x5B;];\r\n\r\n#define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) )\r\n<\/pre>\n<pre class=\"brush: cpp; title: C:\/arduino-1.0.4\/hardware\/tools\/avr\/avr\/include\/avr\/pgmspace.h; notranslate\" title=\"C:\/arduino-1.0.4\/hardware\/tools\/avr\/avr\/include\/avr\/pgmspace.h\">\r\n#define pgm_read_byte(address_short)    pgm_read_byte_near(address_short)\r\n#define pgm_read_byte_near(address_short) __LPM((uint16_t)(address_short))\r\n<\/pre>\n<p>Was pgm_read_byte() macht bzw. wie es in Assembler \u00fcbersetzt wird: <a href=\"http:\/\/www.mikrocontroller.net\/topic\/62627\">Source von pgm_read_byte<\/a><\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nC:\\arduino-1.0.4\\hardware\\tools\\avr\\avr\\include\r\nC:\\arduino-1.0.4\\hardware\\arduino\\cores\\arduino\r\n<\/pre>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nconst uint16_t PROGMEM port_to_mode_PGM&#x5B;] = {\r\n    NOT_A_PORT,\r\n    &amp;DDRA,\r\n    &amp;DDRB,\r\n    &amp;DDRC,\r\n    &amp;DDRD,\r\n    &amp;DDRE,\r\n    &amp;DDRF,\r\n    &amp;DDRG,\r\n    &amp;DDRH,\r\n    NOT_A_PORT,\r\n    &amp;DDRJ,\r\n    &amp;DDRK,\r\n    &amp;DDRL,\r\n};\r\n<\/pre>\n<p><a href=\"https:\/\/github.com\/arduino\/Arduino\/blob\/master\/hardware\/arduino\/variants\/mega\/pins_arduino.h\">\/arduino\/variants\/mega\/pins_arduino.h<\/a><br \/>\n<a href=\"http:\/\/electronics.stackexchange.com\/questions\/26682\/accessing-data-past-64k-boundary-on-atmega1280\">Accessing data past 64k boundary on atmega1280<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\/* pin = Arduino Mapped Pin Name, ex. Digital pin 22: pin = 22 *\/ void digitalWrite(uint8_t pin, uint8_t val) { uint8_t timer = digitalPinToTimer(pin); uint8_t bit = digitalPinToBitMask(pin); uint8_t port = digitalPinToPort(pin); volatile uint8_t *out; out = portOutputRegister(port); uint8_t oldSREG = SREG; cli(); if (val == LOW) { *out &amp;= ~bit; } else { [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19],"tags":[],"class_list":["post-639","post","type-post","status-publish","format-standard","hentry","category-avr"],"_links":{"self":[{"href":"https:\/\/blog.bachi.net\/index.php?rest_route=\/wp\/v2\/posts\/639","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.bachi.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.bachi.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.bachi.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.bachi.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=639"}],"version-history":[{"count":19,"href":"https:\/\/blog.bachi.net\/index.php?rest_route=\/wp\/v2\/posts\/639\/revisions"}],"predecessor-version":[{"id":701,"href":"https:\/\/blog.bachi.net\/index.php?rest_route=\/wp\/v2\/posts\/639\/revisions\/701"}],"wp:attachment":[{"href":"https:\/\/blog.bachi.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=639"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.bachi.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=639"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.bachi.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=639"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}