├── .gitignore ├── Firmware ├── ATtiny85 Firmware │ └── Qwiic_Joystick_v26 │ │ ├── Qwiic_Joystick_v26.hex │ │ ├── Qwiic_Joystick_v26.ino │ │ ├── Qwiic_Joystick_v26.lst │ │ ├── interrupts.ino │ │ └── nvm.h └── Python Examples │ ├── Example 1 - Basic Readings │ └── Qwiic_Joystick.py │ └── Example 2 - Snake Game │ ├── Pixel-flame.png │ └── snakedemo.py ├── Hardware ├── Panel │ ├── joystiicv1.1_panel-B.Cu.gbl │ ├── joystiicv1.1_panel-B.Mask.gbs │ ├── joystiicv1.1_panel-B.SilkS.gbo │ ├── joystiicv1.1_panel-Edge.Cuts.gm1 │ ├── joystiicv1.1_panel-F.Cu.gtl │ ├── joystiicv1.1_panel-F.Mask.gts │ ├── joystiicv1.1_panel-F.Paste.gtp │ ├── joystiicv1.1_panel-F.SilkS.gto │ ├── joystiicv1.1_panel.kicad_pcb │ └── joystiicv1.1_panel.kicad_pcb-bak └── Qwiic Joystick_Eagle │ ├── Production │ └── Qwiic Joystick-Panel.brd │ ├── Qwiic Joystick.brd │ └── Qwiic Joystick.sch ├── LICENSE.md └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore list for Eagle, a PCB layout tool 2 | 3 | # Backup files 4 | *.s#? 5 | *.b#? 6 | *.l#? 7 | *.b$? 8 | *.s$? 9 | *.l$? 10 | 11 | # Eagle project file 12 | # It contains a serial number and references to the file structure 13 | # on your computer. 14 | # comment the following line if you want to have your project file included. 15 | eagle.epf 16 | 17 | # Autorouter files 18 | *.pro 19 | *.job 20 | 21 | # CAM files 22 | *.$$$ 23 | *.cmp 24 | *.ly2 25 | *.l15 26 | *.sol 27 | *.plc 28 | *.stc 29 | *.sts 30 | *.crc 31 | *.crs 32 | 33 | *.dri 34 | *.drl 35 | *.gpi 36 | *.pls 37 | *.ger 38 | *.gpi 39 | *.xln 40 | 41 | *.drd 42 | *.drd.* 43 | 44 | *.s#* 45 | *.b#* 46 | 47 | *.info 48 | 49 | *.eps 50 | 51 | # file locks introduced since 7.x 52 | *.lck 53 | -------------------------------------------------------------------------------- /Firmware/ATtiny85 Firmware/Qwiic_Joystick_v26/Qwiic_Joystick_v26.hex: -------------------------------------------------------------------------------- 1 | :1000000020C03AC04CC338C037C081C435C034C0EA 2 | :1000100033C032C031C030C02FC024C26BC2010215 3 | :100020000000040001020408102002020202020281 4 | :100030000000000036000000000038000000000052 5 | :10004000370011241FBECFE5D2E0DEBFCDBF10E0E8 6 | :10005000A0E6B0E0ECEFF9E002C005900D92A83800 7 | :10006000B107D9F720E0A8E8B0E001C01D92A43C98 8 | :10007000B207E1F737D4C0C4C3CF81E0F8D3892BEE 9 | :1000800019F481E080937700089585B7806285BF79 10 | :10009000889585B78F7D85BF089580E090E096D4E0 11 | :1000A0008093790080917900883020F080917900E8 12 | :1000B000883740F080E2809379006091790080E099 13 | :1000C00090E08CC4089585B7877E85BF85B7806230 14 | :1000D00085BF089589E890E0F3D06091790089E8C0 15 | :1000E00090E0ECD06CE970E089E890E05BD168E4E6 16 | :1000F00071E089E890E05BC1809179008830B8F0C8 17 | :1001000080917900883798F480E090E05FD49091F6 18 | :100110007900981781F080917800833161F4109212 19 | :1001200078006091790080E090E058D4D3CF80E2ED 20 | :1001300080937900E9CF0895FF920F931F93CF9397 21 | :10014000DF938C0189E890E012D180938800F12C34 22 | :1001500001501109CF2DD0E0C017D1070CF041C0DC 23 | :1001600089E890E004D1909188009E01290F311D0B 24 | :100170002B303105A0F59091880020918800AE01C8 25 | :10018000420F511DA0916200B0916300A40FB51FF2 26 | :10019000E0916000F0916100EC0FFD1FE90FF11D8F 27 | :1001A000908190952C9192239C939091880020911E 28 | :1001B0008800AE01420F511DE0916200F091630092 29 | :1001C000E40FF51F2091600030916100C20FD31F32 30 | :1001D000C90FD11D988189239081982B9083F39426 31 | :1001E000B9CFDF91CF911F910F91FF9085CF8DE314 32 | :1001F00090E09093850080938400809197008260C6 33 | :10020000809397008091980082608093980040E0EE 34 | :1002100062E080E083C262E081E0DAD260E083E005 35 | :10022000D7D260E082E0D4D24EDF37DFE0DF52CFBA 36 | :100230000F931F93CF93DF9300D000D0CDB7DEB7DD 37 | :10024000379A82E083D28C0183E080D226E0000FCF 38 | :10025000111F2A95E1F71C830B8336E0880F991F45 39 | :100260003A95E1F79A8389838C81EFE6F0E0838306 40 | :100270008B8184838A8185838981868337980F90D7 41 | :100280000F900F900F90DF91CF911F910F910895D4 42 | :10029000CFDF81E0ECD2809376009091880080914E 43 | :1002A00088004BE050E0491B510960916200709159 44 | :1002B0006300680F711D89E890E02AC0862F85C011 45 | :1002C0009BC0CF9380918A008823C1F080918B00DE 46 | :1002D000803218F080E090E019C080918C00E091AD 47 | :1002E0007A00F0917B00E80FF11D608380918C0013 48 | :1002F0008F5F80938C0080938B0006C0C62FAAD09E 49 | :10030000882341F38C2F7ED081E090E0CF91089537 50 | :10031000CF92DF92EF92FF920F931F93CF93DF93D1 51 | :100320006C01EB017B01E40EF51E00E010E0CE1540 52 | :10033000DF0531F06991C601C4DF080F191FF7CF3F 53 | :10034000C801DF91CF911F910F91FF90EF90DF9047 54 | :10035000CF90089580918B00882331F090E0209118 55 | :100360008C00821B910908956ED090E00895F2DF11 56 | :10037000892BA9F080918B00882371F020918C004B 57 | :10038000E0917A00F0917B00E20FF11D808190E016 58 | :100390002F5F20938C00089545D090E008958FEF53 59 | :1003A0009FEF089570938E0060938D000895709371 60 | :1003B000900060938F000895109293001092940023 61 | :1003C00010929100109292000895CF93C82FF4DFFD 62 | :1003D000C09396001092900010928F0010928E00A1 63 | :1003E00010928D00C29AC09ABA9AB89888EA8DB9CC 64 | :1003F00080EF8EB9CF910895BA98B8981DB880EF64 65 | :100400008EB90895909192009F5F9F702091910006 66 | :100410009217E1F3E92FF0E0EC54FF4F80839093C3 67 | :100420009200089590919300809194009817E1F3C1 68 | :10043000E0919300EF5FEF70E0939300F0E0EC55F4 69 | :10044000FF4F808108959091930080919400891BC3 70 | :100450008F70089590919200809191009F5F891B09 71 | :100460008F7008951F920F920FB60F9211240F9361 72 | :100470001F932F933F934F935F936F937F938F932C 73 | :100480009F93AF93BF93CF93EF93FF9300918D0012 74 | :1004900010918E000115110561F0C09194008091BA 75 | :1004A0009300C81731F0CFDF90E0F8010995C093B1 76 | :1004B000930010929500B898B29B04C0B09BFCCFFB 77 | :1004C00088EA01C088EF8DB980EF8EB9FF91EF9176 78 | :1004D000CF91BF91AF919F918F917F916F915F91DC 79 | :1004E0004F913F912F911F910F910F900FBE0F9041 80 | :1004F0001F9018951F920F920FB60F9211240F9311 81 | :100500001F932F933F934F935F936F937F938F939B 82 | :100510009F93AF93BF93CF93EF93FF9380919500F9 83 | :10052000823009F44CC028F4882359F0813051F10D 84 | :1005300083C0843009F449C010F1853009F464C0E7 85 | :100540007BC08FB1882331F08FB186959091960052 86 | :10055000891330C0789B0DC0E0918F00F09190001E 87 | :10056000309729F08091920080939100099581E065 88 | :1005700001C084E0809395001FB8B89A5BC08FB12A 89 | :10058000811118C09091910080919200981791F07C 90 | :10059000809191008F5F8F7080939100E091910026 91 | :1005A000F0E0EC54FF4F80818FB982E0809395009A 92 | :1005B000B89A03C0B89888EA8DB980E73CC083E058 93 | :1005C00080939500B8981FB835C085E0809395005A 94 | :1005D000B89880E78EB900918D0010918E000115BA 95 | :1005E000110551F1C091940080919300C81721F139 96 | :1005F0008EB18E7AE9F3759B1FC025DF90E0F8017C 97 | :100600000995C093930018C084E0809395009FB132 98 | :10061000809194008F5F8F7020919300821749F032 99 | :1006200080939400E0919400F0E0EC55FF4F9083AC 100 | :10063000A3CFB8988EE78EB9FF91EF91CF91BF917C 101 | :10064000AF919F918F917F916F915F914F913F916A 102 | :100650002F911F910F910F900FBE0F901F90189523 103 | :100660000895E0918600F09187000994E09184005C 104 | :10067000F09185000994E0918200F0918300099443 105 | :10068000E0918000F09181000994E0917E00F0916A 106 | :100690007F000994E0917C00F0917D0009941F9205 107 | :1006A0000F920FB60F9211242F933F934F935F93A6 108 | :1006B0006F937F938F939F93AF93BF93CF93EF935A 109 | :1006C000FF9326B3C0919900822F8C2790919700B9 110 | :1006D000922330919800C323C92BC82320939900FB 111 | :1006E000C0FDBFDFC1FDC2DFC2FDC5DFC3FDC8DF86 112 | :1006F000C4FDCBDFC5FDCEDFFF91EF91CF91BF9160 113 | :10070000AF919F918F917F916F915F914F913F91A9 114 | :100710002F910F900FBE0F901F901895811106C05A 115 | :1007200096B3E42FF0E0E756FF4F9083E82FF0E018 116 | :1007300085A9682B65AB2BB7359681E090E001C0A9 117 | :10074000880FEA95EAF7822B8BBF089590919A0063 118 | :100750009295990F990F907C8F70892B87B987B1EB 119 | :1007600090919A0092FB222720F930E094E0220F2A 120 | :10077000331F9A95E1F7282B27B9369A3699FECF81 121 | :1007800084B125B190E0922B0895813031F48AB57F 122 | :100790008F778ABD8AB58F7B07C0823039F48AB5DE 123 | :1007A0008F7D8ABD8AB58F7E8ABD0895833039F4E6 124 | :1007B00080B78F7D80BF80B78F7E80BF08958430E3 125 | :1007C00031F48CB58F7D8CBD8CB58F7E8CBD08953A 126 | :1007D000CF93DF9387FF11C08F7741F0813041F0D5 127 | :1007E000823041F0833041F08FEF07C085E005C0D3 128 | :1007F00082E003C084E001C083E090E0FC01EC5D96 129 | :10080000FF4F2491FC01E65DFF4F8491882361F145 130 | :1008100090E0880F991FFC01E45CFF4FC591D491D3 131 | :10082000FC01EA5CFF4FA591B491611109C09FB72B 132 | :10083000F8948881209582238883EC912E230BC025 133 | :10084000623061F49FB7F8948881322F309583230A 134 | :100850008883EC912E2B2C939FBF06C08FB7F89402 135 | :10086000E8812E2B28838FBFDF91CF910895CF93FE 136 | :10087000DF9387FF11C08F7741F0813041F08230E4 137 | :1008800041F0833041F08FEF07C085E005C082E082 138 | :1008900003C084E001C083E0282F30E0F901E25E6C 139 | :1008A000FF4F8491F901EC5DFF4FD491F901E65DB2 140 | :1008B000FF4FC491CC2389F0811167DFEC2FF0E06A 141 | :1008C000EE0FFF1FE05DFF4FA591B491EC91ED237A 142 | :1008D00081E090E021F480E002C080E090E0DF91D0 143 | :1008E000CF91089581B781BF5CD095DCCEDBFECF80 144 | :1008F00080B7807F80BF80B7806880BF8CB5806400 145 | :100900008CBD8FEF8DBD80B7876080BF08951F922B 146 | :100910000F920FB60F9211242F933F938F939F93B3 147 | :10092000AF93BF9380919C0090919D00A0919E00F9 148 | :10093000B0919F0030919B0026E0230F2D3730F0BF 149 | :1009400029E8230F0396A11DB11D03C00296A11D26 150 | :10095000B11D20939B0080939C0090939D00A093D9 151 | :100960009E00B0939F008091A0009091A100A09163 152 | :10097000A200B091A3000196A11DB11D8093A0001B 153 | :100980009093A100A093A200B093A300BF91AF9158 154 | :100990009F918F913F912F910F900FBE0F901F90BD 155 | :1009A00018958AB582608ABD8AB581608ABD83B791 156 | :1009B000887F836083BF789489B7826089BF98DF1E 157 | :1009C00086B18877866886B9379A0895E199FECF0F 158 | :1009D0009FBB8EBBE09A99278DB30895262FE1998E 159 | :1009E000FECF1CBA9FBB8EBB2DBB0FB6F894E29A0C 160 | :0C09F000E19A0FBE01960895F894FFCF25 161 | :1009FC0064006F00000000000000000001FFFF20F9 162 | :100A0C0002060000000000000020A40030033003A8 163 | :080A1C00300330033003300306 164 | :00000001FF 165 | -------------------------------------------------------------------------------- /Firmware/ATtiny85 Firmware/Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino: -------------------------------------------------------------------------------- 1 | /* 2 | An I2C based Thumb Joystick 3 | By: Nathan Seidle 4 | Modified by: Wes Furuya 5 | SparkFun Electronics 6 | Date: February 5, 2019 7 | License: This code is public domain but you buy me a beer if you use this and we meet someday (Beerware license). 8 | Qwiic Joystick is an I2C based thumb joystick that reports the joystick position and if the button is pressed. 9 | Feel like supporting our work? Buy a board from SparkFun! 10 | https://www.sparkfun.com/products/15168 11 | To install support for ATtiny84 in Arduino IDE: https://github.com/SpenceKonde/ATTinyCore/blob/master/Installation.md 12 | This core is installed from the Board Manager menu 13 | This core has built in support for I2C S/M and serial 14 | If you have Dave Mellis' ATtiny installed you may need to remove it from \Users\xx\AppData\Local\Arduino15\Packages 15 | To support 400kHz I2C communication reliably ATtiny84 needs to run at 8MHz. This requires user to 16 | click on 'Burn Bootloader' before code is loaded. 17 | */ 18 | 19 | #include 20 | #include 21 | #include "nvm.h" 22 | 23 | #if defined(__AVR_ATtiny85__) 24 | #include "PinChangeInterrupt.h" //Nico Hood's library: https://github.com/NicoHood/PinChangeInterrupt/ 25 | //Used for pin change interrupts on ATtinys (joystick button causes interrupt) 26 | //Note: To make this code work with Nico's library you have to comment out https://github.com/NicoHood/PinChangeInterrupt/blob/master/src/PinChangeInterruptSettings.h#L228 27 | #endif 28 | 29 | #include //Needed for sleep_mode 30 | #include //Needed for powering down perihperals such as the ADC/TWI and Timers 31 | 32 | #if defined(__AVR_ATmega328P__) 33 | //Hardware connections while developing with an Uno 34 | const byte Button_Pin = 2; 35 | const byte Vertical_Pin = A1; 36 | const byte Horizontal_Pin = A0; 37 | 38 | #elif defined(__AVR_ATtiny85__) 39 | ////For Debug Only 40 | //#include 41 | //#define TX 3 //P3, Pin 2 42 | //#define RX 4 //P4, Pin 3 43 | //SoftwareSerial TinySerial(RX, TX); 44 | 45 | //Hardware connections for the final design 46 | const byte Button_Pin = 1; 47 | const byte Vertical_Pin = 3; 48 | const byte Horizontal_Pin = 2; 49 | #endif 50 | 51 | //Global variables 52 | //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 53 | //Variables used in the I2C interrupt so we use volatile 54 | 55 | //This is the pseudo register map of the product. If user asks for 0x02 then get the 3rd 56 | //byte inside the register map. 57 | //5602/118 on ATtiny84 prior to conversion 58 | //Approximately 4276/156 on ATtiny84 after conversion 59 | struct memoryMap { 60 | byte id; // Reg: 0x00 - Default I2C Address 61 | byte firmwareMajor; // Reg: 0x01 - Firmware Number 62 | byte firmwareMinor; // Reg: 0x02 - Firmware Number 63 | byte X_MSB; // Reg: 0x03 - Current Joystick Horizontal Position (MSB) 64 | byte X_LSB; // Reg: 0x04 - Current Joystick Horizontal Position (LSB) 65 | byte Y_MSB; // Reg: 0x05 - Current Joystick Vertical Position (MSB) 66 | byte Y_LSB; // Reg: 0x06 - Current Joystick Vertical Position (LSB) 67 | byte Button_State; // Reg: 0x07 - Current Button State (clears Reg 0x08) 68 | byte Button_Status; // Reg: 0x08 - Indicator for if button was pressed since last 69 | // read of button state (Reg 0x07). Clears after read. 70 | byte i2cLock; // Reg: 0x09 - Must be changed to 0x13 before I2C address can be changed. 71 | byte i2cAddress; // Reg: 0x0A - Set I2C New Address (re-writable). Clears i2cLock. 72 | }; 73 | 74 | //These are the default values for all settings 75 | volatile memoryMap registerMap = { 76 | .id = I2C_ADDRESS_DEFAULT, //Default I2C Address (0x20) 77 | .firmwareMajor = 0x02, //Firmware version. Helpful for tech support. 78 | .firmwareMinor = 0x06, 79 | .X_MSB = 0, 80 | .X_LSB = 0, 81 | .Y_MSB = 0, 82 | .Y_LSB = 0, 83 | .Button_State = 0x00, 84 | .Button_Status = 0x00, 85 | .i2cLock = 0x00, 86 | .i2cAddress = I2C_ADDRESS_DEFAULT, 87 | }; 88 | 89 | //This defines which of the registers are read-only (0) vs read-write (1) 90 | memoryMap protectionMap = { 91 | .id = 0x00, 92 | .firmwareMajor = 0x00, 93 | .firmwareMinor = 0x00, 94 | .X_MSB = 0x00, 95 | .X_LSB = 0x00, 96 | .Y_MSB = 0x00, 97 | .Y_LSB = 0x00, 98 | .Button_State = 0x00, 99 | .Button_Status = 0x01, 100 | .i2cLock = 0xFF, 101 | .i2cAddress = 0xFF, 102 | }; 103 | 104 | //Cast 32bit address of the object registerMap with uint8_t so we can increment the pointer 105 | uint8_t *registerPointer = (uint8_t *)®isterMap; 106 | uint8_t *protectionPointer = (uint8_t *)&protectionMap; 107 | 108 | volatile byte registerNumber; //Gets set when user writes an address. We then serve the spot the user requested. 109 | 110 | //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 111 | 112 | 113 | void setup(void) 114 | { 115 | //Pin Definitions 116 | pinMode(Button_Pin, INPUT_PULLUP); 117 | pinMode(Vertical_Pin, INPUT); //No pull-up. External 10k 118 | pinMode(Horizontal_Pin, INPUT); //No pull-up. External 10k 119 | 120 | turnOffExtraBits(); //Turn off all unused peripherals 121 | readSystemSettings(); //Load all system settings from EEPROM 122 | setupInterrupts(); //Enable pin change interrupts for I2C and button 123 | startI2C(); //Determine the I2C address we should be using and begin listening on I2C bus 124 | 125 | #if defined(__AVR_ATmega328P__) 126 | Serial.begin(9600); 127 | Serial.println("Qwiic Joystick"); 128 | Serial.print("Address: 0x"); 129 | Serial.print(registerMap.i2cAddress, HEX); 130 | Serial.println(); 131 | //// For Debug 132 | //#else defined(__AVR_ATtiny85__) 133 | // TinySerial.begin(9600); 134 | // TinySerial.println("Qwiic Joystick"); 135 | // TinySerial.print("Address: 0x"); 136 | // TinySerial.print(registerMap.i2cAddress, HEX); 137 | // TinySerial.println(); 138 | #endif 139 | } 140 | 141 | void loop(void) 142 | { 143 | 144 | // Debug and Testing 145 | #if defined(__AVR_ATmega328P__) 146 | 147 | updateJoystick(); 148 | 149 | uint16_t X_Pos = ((registerMap.X_MSB<<8) | registerMap.X_LSB)>>6; 150 | uint16_t Y_Pos = ((registerMap.Y_MSB<<8) | registerMap.Y_LSB)>>6; 151 | 152 | Serial.print("X: "); 153 | Serial.print(X_Pos); 154 | 155 | Serial.print(" Y: "); 156 | Serial.print(Y_Pos); 157 | 158 | Serial.print(" Reg: "); 159 | Serial.print(registerMap.i2cAddress); 160 | 161 | Serial.print(" ID: "); 162 | Serial.print(registerMap.i2cLock); 163 | 164 | if (registerMap.Button_Status == 1) 165 | Serial.print(" Click"); 166 | 167 | 168 | // Serial.print(registerMap.id, HEX); 169 | // Serial.print(" "); 170 | // Serial.print(registerMap.firmwareMajor, HEX); 171 | // Serial.print("."); 172 | // Serial.print(registerMap.firmwareMinor, HEX); 173 | // Serial.print(" "); 174 | // Serial.print(registerMap.X_MSB); 175 | // Serial.print(registerMap.X_LSB, HEX); 176 | // Serial.print(" "); 177 | // Serial.print(registerMap.Y_MSB); 178 | // Serial.print(registerMap.Y_LSB, HEX); 179 | // Serial.print(" "); 180 | // Serial.print(registerMap.Button_State, HEX); 181 | // Serial.print(" "); 182 | // Serial.print(registerMap.Button_Status, HEX); 183 | // Serial.print(" "); 184 | // Serial.print(registerMap.i2cLock, HEX); 185 | // Serial.print(" "); 186 | // Serial.print(registerMap.i2cAddress, HEX); 187 | Serial.println(); 188 | delay(200); 189 | //#else defined(__AVR_ATtiny85__) 190 | // TinySerial.print(" Addr: "); 191 | // TinySerial.print(registerMap.i2cAddress); 192 | // 193 | // TinySerial.print(" Lock: "); 194 | // TinySerial.print(registerMap.i2cLock); 195 | // 196 | // TinySerial.println(); 197 | // delay(200); 198 | #endif 199 | 200 | //Sleep until interrupt 201 | //set_sleep_mode(SLEEP_MODE_IDLE); 202 | sleep_mode(); //Stop everything and go to sleep. Wake up from Button interrupts. 203 | } 204 | 205 | //If the current setting is different from that in EEPROM, update EEPROM 206 | void recordSystemSettings(void) 207 | { 208 | //I2C address is byte 209 | byte i2cAddr; 210 | 211 | //TinySerial.println("Set Registers"); //Debug message 212 | 213 | //Error check the current I2C address 214 | if (registerMap.i2cAddress < 0x08 || registerMap.i2cAddress > 0x77) 215 | { 216 | //User has set the address out of range 217 | //Go back to defaults 218 | registerMap.i2cAddress = I2C_ADDRESS_DEFAULT; 219 | } 220 | 221 | //TinySerial.println(" Check value is in range"); //Debug message 222 | 223 | 224 | //Read the value currently in EEPROM. If it's different from the memory map then record the memory map value to EEPROM. 225 | EEPROM.get(LOCATION_I2C_ADDRESS, i2cAddr); 226 | if (i2cAddr != registerMap.i2cAddress && registerMap.i2cLock == 0x13) 227 | { 228 | //TinySerial.print(registerMap.i2cLock, HEX); //Debug message 229 | registerMap.i2cLock = 0x00; 230 | //TinySerial.println(registerMap.i2cLock, HEX); //Debug message 231 | EEPROM.write(LOCATION_I2C_ADDRESS, registerMap.i2cAddress); 232 | startI2C(); //Determine the I2C address we should be using and begin listening on I2C bus 233 | //TinySerial.print("New Address: 0x"); //Debug message 234 | //TinySerial.println(registerMap.i2cAddress, HEX); //Debug message 235 | } 236 | } 237 | 238 | //Reads the current system settings from EEPROM 239 | //If anything looks weird, reset setting to default value 240 | void readSystemSettings(void) 241 | { 242 | //Read what I2C address we should use 243 | registerMap.i2cAddress = EEPROM.read(LOCATION_I2C_ADDRESS); 244 | 245 | //Error check I2C address we read from EEPROM 246 | if (registerMap.i2cAddress < 0x08 || registerMap.i2cAddress > 0x77) 247 | { 248 | //User has set the address out of range 249 | //Go back to defaults 250 | registerMap.i2cAddress = I2C_ADDRESS_DEFAULT; 251 | EEPROM.write(LOCATION_I2C_ADDRESS, registerMap.i2cAddress); 252 | } 253 | 254 | } 255 | 256 | //Turn off anything we aren't going to use 257 | void turnOffExtraBits() 258 | { 259 | // //Disable Brown-Out Detect 260 | // MCUCR = bit (BODS) | bit (BODSE); 261 | // MCUCR = bit (BODS); 262 | 263 | //Power down various bits of hardware to lower power usage 264 | //set_sleep_mode(SLEEP_MODE_PWR_DOWN); 265 | set_sleep_mode(SLEEP_MODE_IDLE); 266 | sleep_enable(); 267 | } 268 | 269 | 270 | //Begin listening on I2C bus as I2C slave using the global variable setting_i2c_address 271 | void startI2C() 272 | { 273 | Wire.end(); //Before we can change addresses we need to stop 274 | 275 | Wire.begin(registerMap.i2cAddress); //Start I2C and answer calls using address from EEPROM 276 | 277 | //The connections to the interrupts are severed when a Wire.begin occurs. So re-declare them. 278 | Wire.onReceive(receiveEvent); 279 | Wire.onRequest(requestEvent); 280 | } 281 | -------------------------------------------------------------------------------- /Firmware/ATtiny85 Firmware/Qwiic_Joystick_v26/Qwiic_Joystick_v26.lst: -------------------------------------------------------------------------------- 1 | 2 | C:\Users\WESLEY~1.FUR\AppData\Local\Temp\arduino_build_960033/Qwiic_Joystick_v26.ino.elf: file format elf32-avr 3 | 4 | 5 | Disassembly of section .text: 6 | 7 | 00000000 <__vectors>: 8 | __vectors(): 9 | 0: 20 c0 rjmp .+64 ; 0x42 <__ctors_end> 10 | 2: 3a c0 rjmp .+116 ; 0x78 <__bad_interrupt> 11 | 4: 4c c3 rjmp .+1688 ; 0x69e <__vector_2> 12 | 6: 38 c0 rjmp .+112 ; 0x78 <__bad_interrupt> 13 | 8: 37 c0 rjmp .+110 ; 0x78 <__bad_interrupt> 14 | a: 81 c4 rjmp .+2306 ; 0x90e <__vector_5> 15 | c: 35 c0 rjmp .+106 ; 0x78 <__bad_interrupt> 16 | e: 34 c0 rjmp .+104 ; 0x78 <__bad_interrupt> 17 | 10: 33 c0 rjmp .+102 ; 0x78 <__bad_interrupt> 18 | 12: 32 c0 rjmp .+100 ; 0x78 <__bad_interrupt> 19 | 14: 31 c0 rjmp .+98 ; 0x78 <__bad_interrupt> 20 | 16: 30 c0 rjmp .+96 ; 0x78 <__bad_interrupt> 21 | 18: 2f c0 rjmp .+94 ; 0x78 <__bad_interrupt> 22 | 1a: 24 c2 rjmp .+1096 ; 0x464 <__vector_13> 23 | 1c: 6b c2 rjmp .+1238 ; 0x4f4 <__vector_14> 24 | 25 | 0000001e <__trampolines_end>: 26 | __trampolines_start(): 27 | 1e: 01 02 muls r16, r17 28 | 20: 00 00 nop 29 | 22: 04 00 .word 0x0004 ; ???? 30 | 31 | 00000024 : 32 | 24: 01 02 04 08 10 20 ..... 33 | 34 | 0000002a : 35 | 2a: 02 02 02 02 02 02 ...... 36 | 37 | 00000030 : 38 | 30: 00 00 00 00 36 00 ....6. 39 | 40 | 00000036 : 41 | 36: 00 00 00 00 38 00 ....8. 42 | 43 | 0000003c : 44 | 3c: 00 00 00 00 37 00 ....7. 45 | 46 | 00000042 <__ctors_end>: 47 | __dtors_end(): 48 | 42: 11 24 eor r1, r1 49 | 44: 1f be out 0x3f, r1 ; 63 50 | 46: cf e5 ldi r28, 0x5F ; 95 51 | 48: d2 e0 ldi r29, 0x02 ; 2 52 | 4a: de bf out 0x3e, r29 ; 62 53 | 4c: cd bf out 0x3d, r28 ; 61 54 | 55 | 0000004e <__do_copy_data>: 56 | __do_copy_data(): 57 | /home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr25/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2410 58 | 4e: 10 e0 ldi r17, 0x00 ; 0 59 | /home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr25/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2411 60 | 50: a0 e6 ldi r26, 0x60 ; 96 61 | /home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr25/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2412 62 | 52: b0 e0 ldi r27, 0x00 ; 0 63 | /home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr25/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2413 64 | 54: ec ef ldi r30, 0xFC ; 252 65 | /home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr25/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2414 66 | 56: f9 e0 ldi r31, 0x09 ; 9 67 | /home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr25/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2415 68 | 58: 02 c0 rjmp .+4 ; 0x5e <__do_copy_data+0x10> 69 | /home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr25/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2418 70 | 5a: 05 90 lpm r0, Z+ 71 | /home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr25/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2423 72 | 5c: 0d 92 st X+, r0 73 | /home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr25/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2425 74 | 5e: a8 38 cpi r26, 0x88 ; 136 75 | /home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr25/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2426 76 | 60: b1 07 cpc r27, r17 77 | /home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr25/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2427 78 | 62: d9 f7 brne .-10 ; 0x5a <__do_copy_data+0xc> 79 | 80 | 00000064 <__do_clear_bss>: 81 | __do_clear_bss(): 82 | /home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr25/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2442 83 | 64: 20 e0 ldi r18, 0x00 ; 0 84 | /home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr25/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2443 85 | 66: a8 e8 ldi r26, 0x88 ; 136 86 | /home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr25/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2444 87 | 68: b0 e0 ldi r27, 0x00 ; 0 88 | /home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr25/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2445 89 | 6a: 01 c0 rjmp .+2 ; 0x6e <.do_clear_bss_start> 90 | 91 | 0000006c <.do_clear_bss_loop>: 92 | /home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr25/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2447 93 | 6c: 1d 92 st X+, r1 94 | 95 | 0000006e <.do_clear_bss_start>: 96 | /home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr25/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2449 97 | 6e: a4 3c cpi r26, 0xC4 ; 196 98 | /home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr25/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2450 99 | 70: b2 07 cpc r27, r18 100 | /home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr25/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2451 101 | 72: e1 f7 brne .-8 ; 0x6c <.do_clear_bss_loop> 102 | .do_clear_bss_start(): 103 | 74: 37 d4 rcall .+2158 ; 0x8e4
104 | 76: c0 c4 rjmp .+2432 ; 0x9f8 <_exit> 105 | 106 | 00000078 <__bad_interrupt>: 107 | __vector_1(): 108 | 78: c3 cf rjmp .-122 ; 0x0 <__vectors> 109 | 110 | 0000007a : 111 | _Z15buttonInterruptv(): 112 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:17 113 | 114 | 115 | //Called any time the pin changes state 116 | void buttonInterrupt() 117 | { 118 | if (digitalRead(Button_Pin) == LOW) //User has released the button, we have completed a click cycle 119 | 7a: 81 e0 ldi r24, 0x01 ; 1 120 | 7c: f8 d3 rcall .+2032 ; 0x86e 121 | 7e: 89 2b or r24, r25 122 | 80: 19 f4 brne .+6 ; 0x88 123 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:19 124 | { 125 | registerMap.Button_Status = 1; //Set the clicked bit 126 | 82: 81 e0 ldi r24, 0x01 ; 1 127 | 84: 80 93 77 00 sts 0x0077, r24 ; 0x800077 128 | 88: 08 95 ret 129 | 130 | 0000008a : 131 | loop(): 132 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino:202 133 | // delay(200); 134 | #endif 135 | 136 | //Sleep until interrupt 137 | //set_sleep_mode(SLEEP_MODE_IDLE); 138 | sleep_mode(); //Stop everything and go to sleep. Wake up from Button interrupts. 139 | 8a: 85 b7 in r24, 0x35 ; 53 140 | 8c: 80 62 ori r24, 0x20 ; 32 141 | 8e: 85 bf out 0x35, r24 ; 53 142 | 90: 88 95 sleep 143 | 92: 85 b7 in r24, 0x35 ; 53 144 | 94: 8f 7d andi r24, 0xDF ; 223 145 | 96: 85 bf out 0x35, r24 ; 53 146 | 98: 08 95 ret 147 | 148 | 0000009a : 149 | _ZNK5EERefdeEv(): 150 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\EEPROM/EEPROM.h:42 151 | 152 | EERef( const int index ) 153 | : index( index ) {} 154 | 155 | //Access/read members. 156 | uint8_t operator*() const { return eeprom_read_byte( (uint8_t*) index ); } 157 | 9a: 80 e0 ldi r24, 0x00 ; 0 158 | 9c: 90 e0 ldi r25, 0x00 ; 0 159 | 9e: 96 d4 rcall .+2348 ; 0x9cc 160 | _Z18readSystemSettingsv(): 161 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino:243 162 | //Reads the current system settings from EEPROM 163 | //If anything looks weird, reset setting to default value 164 | void readSystemSettings(void) 165 | { 166 | //Read what I2C address we should use 167 | registerMap.i2cAddress = EEPROM.read(LOCATION_I2C_ADDRESS); 168 | a0: 80 93 79 00 sts 0x0079, r24 ; 0x800079 169 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino:246 170 | 171 | //Error check I2C address we read from EEPROM 172 | if (registerMap.i2cAddress < 0x08 || registerMap.i2cAddress > 0x77) 173 | a4: 80 91 79 00 lds r24, 0x0079 ; 0x800079 174 | a8: 88 30 cpi r24, 0x08 ; 8 175 | aa: 20 f0 brcs .+8 ; 0xb4 176 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino:246 (discriminator 2) 177 | ac: 80 91 79 00 lds r24, 0x0079 ; 0x800079 178 | b0: 88 37 cpi r24, 0x78 ; 120 179 | b2: 40 f0 brcs .+16 ; 0xc4 180 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino:250 181 | { 182 | //User has set the address out of range 183 | //Go back to defaults 184 | registerMap.i2cAddress = I2C_ADDRESS_DEFAULT; 185 | b4: 80 e2 ldi r24, 0x20 ; 32 186 | b6: 80 93 79 00 sts 0x0079, r24 ; 0x800079 187 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino:251 188 | EEPROM.write(LOCATION_I2C_ADDRESS, registerMap.i2cAddress); 189 | ba: 60 91 79 00 lds r22, 0x0079 ; 0x800079 190 | _ZN5EERefaSEh(): 191 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\EEPROM/EEPROM.h:47 192 | operator uint8_t() const { return **this; } 193 | 194 | //Assignment/write members. 195 | EERef &operator=( const EERef &ref ) { return *this = *ref; } 196 | EERef &operator=( uint8_t in ) { return eeprom_write_byte( (uint8_t*) index, in ), *this; } 197 | be: 80 e0 ldi r24, 0x00 ; 0 198 | c0: 90 e0 ldi r25, 0x00 ; 0 199 | c2: 8c c4 rjmp .+2328 ; 0x9dc 200 | c4: 08 95 ret 201 | 202 | 000000c6 : 203 | _Z16turnOffExtraBitsv(): 204 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino:265 205 | // MCUCR = bit (BODS) | bit (BODSE); 206 | // MCUCR = bit (BODS); 207 | 208 | //Power down various bits of hardware to lower power usage 209 | //set_sleep_mode(SLEEP_MODE_PWR_DOWN); 210 | set_sleep_mode(SLEEP_MODE_IDLE); 211 | c6: 85 b7 in r24, 0x35 ; 53 212 | c8: 87 7e andi r24, 0xE7 ; 231 213 | ca: 85 bf out 0x35, r24 ; 53 214 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino:266 215 | sleep_enable(); 216 | cc: 85 b7 in r24, 0x35 ; 53 217 | ce: 80 62 ori r24, 0x20 ; 32 218 | d0: 85 bf out 0x35, r24 ; 53 219 | d2: 08 95 ret 220 | 221 | 000000d4 : 222 | _Z8startI2Cv(): 223 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino:273 224 | 225 | 226 | //Begin listening on I2C bus as I2C slave using the global variable setting_i2c_address 227 | void startI2C() 228 | { 229 | Wire.end(); //Before we can change addresses we need to stop 230 | d4: 89 e8 ldi r24, 0x89 ; 137 231 | d6: 90 e0 ldi r25, 0x00 ; 0 232 | d8: f3 d0 rcall .+486 ; 0x2c0 233 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino:275 234 | 235 | Wire.begin(registerMap.i2cAddress); //Start I2C and answer calls using address from EEPROM 236 | da: 60 91 79 00 lds r22, 0x0079 ; 0x800079 237 | de: 89 e8 ldi r24, 0x89 ; 137 238 | e0: 90 e0 ldi r25, 0x00 ; 0 239 | e2: ec d0 rcall .+472 ; 0x2bc 240 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino:278 241 | 242 | //The connections to the interrupts are severed when a Wire.begin occurs. So re-declare them. 243 | Wire.onReceive(receiveEvent); 244 | e4: 6c e9 ldi r22, 0x9C ; 156 245 | e6: 70 e0 ldi r23, 0x00 ; 0 246 | e8: 89 e8 ldi r24, 0x89 ; 137 247 | ea: 90 e0 ldi r25, 0x00 ; 0 248 | ec: 5b d1 rcall .+694 ; 0x3a4 249 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino:279 250 | Wire.onRequest(requestEvent); 251 | ee: 68 e4 ldi r22, 0x48 ; 72 252 | f0: 71 e0 ldi r23, 0x01 ; 1 253 | f2: 89 e8 ldi r24, 0x89 ; 137 254 | f4: 90 e0 ldi r25, 0x00 ; 0 255 | f6: 5b c1 rjmp .+694 ; 0x3ae 256 | 257 | 000000f8 : 258 | _Z20recordSystemSettingsv(): 259 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino:214 260 | byte i2cAddr; 261 | 262 | //TinySerial.println("Set Registers"); //Debug message 263 | 264 | //Error check the current I2C address 265 | if (registerMap.i2cAddress < 0x08 || registerMap.i2cAddress > 0x77) 266 | f8: 80 91 79 00 lds r24, 0x0079 ; 0x800079 267 | fc: 88 30 cpi r24, 0x08 ; 8 268 | fe: b8 f0 brcs .+46 ; 0x12e 269 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino:214 (discriminator 2) 270 | 100: 80 91 79 00 lds r24, 0x0079 ; 0x800079 271 | 104: 88 37 cpi r24, 0x78 ; 120 272 | 106: 98 f4 brcc .+38 ; 0x12e 273 | _ZNK5EERefdeEv(): 274 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\EEPROM/EEPROM.h:42 275 | 276 | EERef( const int index ) 277 | : index( index ) {} 278 | 279 | //Access/read members. 280 | uint8_t operator*() const { return eeprom_read_byte( (uint8_t*) index ); } 281 | 108: 80 e0 ldi r24, 0x00 ; 0 282 | 10a: 90 e0 ldi r25, 0x00 ; 0 283 | 10c: 5f d4 rcall .+2238 ; 0x9cc 284 | _Z20recordSystemSettingsv(): 285 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino:226 286 | //TinySerial.println(" Check value is in range"); //Debug message 287 | 288 | 289 | //Read the value currently in EEPROM. If it's different from the memory map then record the memory map value to EEPROM. 290 | EEPROM.get(LOCATION_I2C_ADDRESS, i2cAddr); 291 | if (i2cAddr != registerMap.i2cAddress && registerMap.i2cLock == 0x13) 292 | 10e: 90 91 79 00 lds r25, 0x0079 ; 0x800079 293 | 112: 98 17 cp r25, r24 294 | 114: 81 f0 breq .+32 ; 0x136 295 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino:226 (discriminator 1) 296 | 116: 80 91 78 00 lds r24, 0x0078 ; 0x800078 297 | 11a: 83 31 cpi r24, 0x13 ; 19 298 | 11c: 61 f4 brne .+24 ; 0x136 299 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino:229 300 | { 301 | //TinySerial.print(registerMap.i2cLock, HEX); //Debug message 302 | registerMap.i2cLock = 0x00; 303 | 11e: 10 92 78 00 sts 0x0078, r1 ; 0x800078 304 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino:231 305 | //TinySerial.println(registerMap.i2cLock, HEX); //Debug message 306 | EEPROM.write(LOCATION_I2C_ADDRESS, registerMap.i2cAddress); 307 | 122: 60 91 79 00 lds r22, 0x0079 ; 0x800079 308 | _ZN5EERefaSEh(): 309 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\EEPROM/EEPROM.h:47 310 | operator uint8_t() const { return **this; } 311 | 312 | //Assignment/write members. 313 | EERef &operator=( const EERef &ref ) { return *this = *ref; } 314 | EERef &operator=( uint8_t in ) { return eeprom_write_byte( (uint8_t*) index, in ), *this; } 315 | 126: 80 e0 ldi r24, 0x00 ; 0 316 | 128: 90 e0 ldi r25, 0x00 ; 0 317 | 12a: 58 d4 rcall .+2224 ; 0x9dc 318 | _Z20recordSystemSettingsv(): 319 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino:232 320 | startI2C(); //Determine the I2C address we should be using and begin listening on I2C bus 321 | 12c: d3 cf rjmp .-90 ; 0xd4 322 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino:218 323 | //Error check the current I2C address 324 | if (registerMap.i2cAddress < 0x08 || registerMap.i2cAddress > 0x77) 325 | { 326 | //User has set the address out of range 327 | //Go back to defaults 328 | registerMap.i2cAddress = I2C_ADDRESS_DEFAULT; 329 | 12e: 80 e2 ldi r24, 0x20 ; 32 330 | 130: 80 93 79 00 sts 0x0079, r24 ; 0x800079 331 | 134: e9 cf rjmp .-46 ; 0x108 332 | 136: 08 95 ret 333 | 334 | 00000138 : 335 | _Z12receiveEventi(): 336 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:65 337 | 338 | 339 | //When Qwiic Joystick receives data bytes from Master, this function is called as an interrupt 340 | //(Serves rewritable I2C address) 341 | void receiveEvent(int numberOfBytesReceived) 342 | { 343 | 138: ff 92 push r15 344 | 13a: 0f 93 push r16 345 | 13c: 1f 93 push r17 346 | 13e: cf 93 push r28 347 | 140: df 93 push r29 348 | 142: 8c 01 movw r16, r24 349 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:67 350 | //TinySerial.println("Start RX Event"); //Debug message 351 | registerNumber = Wire.read(); //Get the memory map offset from the user 352 | 144: 89 e8 ldi r24, 0x89 ; 137 353 | 146: 90 e0 ldi r25, 0x00 ; 0 354 | 148: 12 d1 rcall .+548 ; 0x36e 355 | 14a: 80 93 88 00 sts 0x0088, r24 ; 0x800088 <__data_end> 356 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:74 357 | 358 | 359 | 360 | //Begin recording the following incoming bytes to the temp memory map 361 | //starting at the registerNumber (the first byte received) 362 | for (byte x = 0 ; x < numberOfBytesReceived - 1 ; x++) 363 | 14e: f1 2c mov r15, r1 364 | 150: 01 50 subi r16, 0x01 ; 1 365 | 152: 11 09 sbc r17, r1 366 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:74 (discriminator 1) 367 | 154: cf 2d mov r28, r15 368 | 156: d0 e0 ldi r29, 0x00 ; 0 369 | 158: c0 17 cp r28, r16 370 | 15a: d1 07 cpc r29, r17 371 | 15c: 0c f0 brlt .+2 ; 0x160 372 | 15e: 41 c0 rjmp .+130 ; 0x1e2 373 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:76 374 | { 375 | byte temp = Wire.read(); //We might record it, we might throw it away 376 | 160: 89 e8 ldi r24, 0x89 ; 137 377 | 162: 90 e0 ldi r25, 0x00 ; 0 378 | 164: 04 d1 rcall .+520 ; 0x36e 379 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:78 380 | 381 | if ( (x + registerNumber) < sizeof(memoryMap)) 382 | 166: 90 91 88 00 lds r25, 0x0088 ; 0x800088 <__data_end> 383 | 16a: 9e 01 movw r18, r28 384 | 16c: 29 0f add r18, r25 385 | 16e: 31 1d adc r19, r1 386 | 170: 2b 30 cpi r18, 0x0B ; 11 387 | 172: 31 05 cpc r19, r1 388 | 174: a0 f5 brcc .+104 ; 0x1de 389 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:82 390 | { 391 | //Clense the incoming byte against the read only protected bits 392 | //Store the result into the register map 393 | *(registerPointer + registerNumber + x) &= ~*(protectionPointer + registerNumber + x); //Clear this register if needed 394 | 176: 90 91 88 00 lds r25, 0x0088 ; 0x800088 <__data_end> 395 | 17a: 20 91 88 00 lds r18, 0x0088 ; 0x800088 <__data_end> 396 | 17e: ae 01 movw r20, r28 397 | 180: 42 0f add r20, r18 398 | 182: 51 1d adc r21, r1 399 | 184: a0 91 62 00 lds r26, 0x0062 ; 0x800062 400 | 188: b0 91 63 00 lds r27, 0x0063 ; 0x800063 401 | 18c: a4 0f add r26, r20 402 | 18e: b5 1f adc r27, r21 403 | 190: e0 91 60 00 lds r30, 0x0060 ; 0x800060 <__data_start> 404 | 194: f0 91 61 00 lds r31, 0x0061 ; 0x800061 <__data_start+0x1> 405 | 198: ec 0f add r30, r28 406 | 19a: fd 1f adc r31, r29 407 | 19c: e9 0f add r30, r25 408 | 19e: f1 1d adc r31, r1 409 | 1a0: 90 81 ld r25, Z 410 | 1a2: 90 95 com r25 411 | 1a4: 2c 91 ld r18, X 412 | 1a6: 92 23 and r25, r18 413 | 1a8: 9c 93 st X, r25 414 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:83 415 | *(registerPointer + registerNumber + x) |= temp & *(protectionPointer + registerNumber + x); //Or in the user's request (clensed against protection bits) 416 | 1aa: 90 91 88 00 lds r25, 0x0088 ; 0x800088 <__data_end> 417 | 1ae: 20 91 88 00 lds r18, 0x0088 ; 0x800088 <__data_end> 418 | 1b2: ae 01 movw r20, r28 419 | 1b4: 42 0f add r20, r18 420 | 1b6: 51 1d adc r21, r1 421 | 1b8: e0 91 62 00 lds r30, 0x0062 ; 0x800062 422 | 1bc: f0 91 63 00 lds r31, 0x0063 ; 0x800063 423 | 1c0: e4 0f add r30, r20 424 | 1c2: f5 1f adc r31, r21 425 | 1c4: 20 91 60 00 lds r18, 0x0060 ; 0x800060 <__data_start> 426 | 1c8: 30 91 61 00 lds r19, 0x0061 ; 0x800061 <__data_start+0x1> 427 | 1cc: c2 0f add r28, r18 428 | 1ce: d3 1f adc r29, r19 429 | 1d0: c9 0f add r28, r25 430 | 1d2: d1 1d adc r29, r1 431 | 1d4: 98 81 ld r25, Y 432 | 1d6: 89 23 and r24, r25 433 | 1d8: 90 81 ld r25, Z 434 | 1da: 98 2b or r25, r24 435 | 1dc: 90 83 st Z, r25 436 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:74 (discriminator 2) 437 | 438 | 439 | 440 | //Begin recording the following incoming bytes to the temp memory map 441 | //starting at the registerNumber (the first byte received) 442 | for (byte x = 0 ; x < numberOfBytesReceived - 1 ; x++) 443 | 1de: f3 94 inc r15 444 | 1e0: b9 cf rjmp .-142 ; 0x154 445 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:89 446 | } 447 | } 448 | //TinySerial.println(" Read 4 Data"); //Debug message 449 | recordSystemSettings(); 450 | //TinySerial.println(" Data Saved"); //Debug message 451 | } 452 | 1e2: df 91 pop r29 453 | 1e4: cf 91 pop r28 454 | 1e6: 1f 91 pop r17 455 | 1e8: 0f 91 pop r16 456 | 1ea: ff 90 pop r15 457 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:87 458 | *(registerPointer + registerNumber + x) &= ~*(protectionPointer + registerNumber + x); //Clear this register if needed 459 | *(registerPointer + registerNumber + x) |= temp & *(protectionPointer + registerNumber + x); //Or in the user's request (clensed against protection bits) 460 | } 461 | } 462 | //TinySerial.println(" Read 4 Data"); //Debug message 463 | recordSystemSettings(); 464 | 1ec: 85 cf rjmp .-246 ; 0xf8 465 | 466 | 000001ee : 467 | _Z15setupInterruptsv(): 468 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt.h:434 469 | if (pcintNum == 0) 470 | callbackPCINT0 = userFunc; 471 | #endif 472 | #if (PCINT_USE_PCINT1 == true) 473 | if (pcintNum == 1) 474 | callbackPCINT1 = userFunc; 475 | 1ee: 8d e3 ldi r24, 0x3D ; 61 476 | 1f0: 90 e0 ldi r25, 0x00 ; 0 477 | 1f2: 90 93 85 00 sts 0x0085, r25 ; 0x800085 478 | 1f6: 80 93 84 00 sts 0x0084, r24 ; 0x800084 479 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt.h:600 480 | uint8_t pcintMask = (1 << pcintBit); 481 | uint8_t arrayPos = getArrayPosPCINT(pcintPort); 482 | 483 | // save settings related to mode and registers 484 | if (mode == CHANGE || mode == RISING) 485 | risingPorts[arrayPos] |= pcintMask; 486 | 1fa: 80 91 97 00 lds r24, 0x0097 ; 0x800097 487 | 1fe: 82 60 ori r24, 0x02 ; 2 488 | 200: 80 93 97 00 sts 0x0097, r24 ; 0x800097 489 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt.h:602 490 | if (mode == CHANGE || mode == FALLING) 491 | fallingPorts[arrayPos] |= pcintMask; 492 | 204: 80 91 98 00 lds r24, 0x0098 ; 0x800098 493 | 208: 82 60 ori r24, 0x02 ; 2 494 | 20a: 80 93 98 00 sts 0x0098, r24 ; 0x800098 495 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt.h:605 496 | 497 | // call the actual hardware attach function 498 | enablePinChangeInterruptHelper(pcintPort, pcintMask, arrayPos); 499 | 20e: 40 e0 ldi r20, 0x00 ; 0 500 | 210: 62 e0 ldi r22, 0x02 ; 2 501 | 212: 80 e0 ldi r24, 0x00 ; 0 502 | 214: 83 c2 rjmp .+1286 ; 0x71c 503 | 504 | 00000216 : 505 | setup(): 506 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino:116 507 | 508 | 509 | void setup(void) 510 | { 511 | //Pin Definitions 512 | pinMode(Button_Pin, INPUT_PULLUP); 513 | 216: 62 e0 ldi r22, 0x02 ; 2 514 | 218: 81 e0 ldi r24, 0x01 ; 1 515 | 21a: da d2 rcall .+1460 ; 0x7d0 516 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino:117 517 | pinMode(Vertical_Pin, INPUT); //No pull-up. External 10k 518 | 21c: 60 e0 ldi r22, 0x00 ; 0 519 | 21e: 83 e0 ldi r24, 0x03 ; 3 520 | 220: d7 d2 rcall .+1454 ; 0x7d0 521 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino:118 522 | pinMode(Horizontal_Pin, INPUT); //No pull-up. External 10k 523 | 222: 60 e0 ldi r22, 0x00 ; 0 524 | 224: 82 e0 ldi r24, 0x02 ; 2 525 | 226: d4 d2 rcall .+1448 ; 0x7d0 526 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino:120 527 | 528 | turnOffExtraBits(); //Turn off all unused peripherals 529 | 228: 4e df rcall .-356 ; 0xc6 530 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino:121 531 | readSystemSettings(); //Load all system settings from EEPROM 532 | 22a: 37 df rcall .-402 ; 0x9a 533 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino:122 534 | setupInterrupts(); //Enable pin change interrupts for I2C and button 535 | 22c: e0 df rcall .-64 ; 0x1ee 536 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/Qwiic_Joystick_v26.ino:123 537 | startI2C(); //Determine the I2C address we should be using and begin listening on I2C bus 538 | 22e: 52 cf rjmp .-348 ; 0xd4 539 | 540 | 00000230 : 541 | _Z14updateJoystickv(): 542 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:25 543 | } 544 | } 545 | 546 | 547 | //Called every time the joystick is moved 548 | void updateJoystick() { 549 | 230: 0f 93 push r16 550 | 232: 1f 93 push r17 551 | 234: cf 93 push r28 552 | 236: df 93 push r29 553 | 238: 00 d0 rcall .+0 ; 0x23a 554 | 23a: 00 d0 rcall .+0 ; 0x23c 555 | 23c: cd b7 in r28, 0x3d ; 61 556 | 23e: de b7 in r29, 0x3e ; 62 557 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:27 558 | //Bring up ADC 559 | ADCSRA |= (1 << ADEN); 560 | 240: 37 9a sbi 0x06, 7 ; 6 561 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:29 562 | 563 | int X_Pot = analogRead(Horizontal_Pin); 564 | 242: 82 e0 ldi r24, 0x02 ; 2 565 | 244: 83 d2 rcall .+1286 ; 0x74c 566 | 246: 8c 01 movw r16, r24 567 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:30 568 | int Y_Pot = analogRead(Vertical_Pin); 569 | 248: 83 e0 ldi r24, 0x03 ; 3 570 | 24a: 80 d2 rcall .+1280 ; 0x74c 571 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:37 572 | //Convert int value to a 16-bit integer by bitshitting it left by 6. 573 | //Example- 574 | //DEC: 630 575 | //BIN: 1001110110 576 | //Bitshift by 6: 1001110110000000 577 | uint16_t X_unit16 = X_Pot<<6; 578 | 24c: 26 e0 ldi r18, 0x06 ; 6 579 | 24e: 00 0f add r16, r16 580 | 250: 11 1f adc r17, r17 581 | 252: 2a 95 dec r18 582 | 254: e1 f7 brne .-8 ; 0x24e 583 | 256: 1c 83 std Y+4, r17 ; 0x04 584 | 258: 0b 83 std Y+3, r16 ; 0x03 585 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:38 586 | uint16_t Y_unit16 = Y_Pot<<6; 587 | 25a: 36 e0 ldi r19, 0x06 ; 6 588 | 25c: 88 0f add r24, r24 589 | 25e: 99 1f adc r25, r25 590 | 260: 3a 95 dec r19 591 | 262: e1 f7 brne .-8 ; 0x25c 592 | 264: 9a 83 std Y+2, r25 ; 0x02 593 | 266: 89 83 std Y+1, r24 ; 0x01 594 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:50 595 | //Split: 10011101 | 10000000 596 | 597 | byte * bytePointer; 598 | 599 | bytePointer = (byte*)&X_unit16; 600 | registerMap.X_MSB = bytePointer[1]; 601 | 268: 8c 81 ldd r24, Y+4 ; 0x04 602 | 26a: ef e6 ldi r30, 0x6F ; 111 603 | 26c: f0 e0 ldi r31, 0x00 ; 0 604 | 26e: 83 83 std Z+3, r24 ; 0x03 605 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:51 606 | registerMap.X_LSB = bytePointer[0]; 607 | 270: 8b 81 ldd r24, Y+3 ; 0x03 608 | 272: 84 83 std Z+4, r24 ; 0x04 609 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:54 610 | 611 | bytePointer = (byte*)&Y_unit16; 612 | registerMap.Y_MSB = bytePointer[1]; 613 | 274: 8a 81 ldd r24, Y+2 ; 0x02 614 | 276: 85 83 std Z+5, r24 ; 0x05 615 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:55 616 | registerMap.Y_LSB = bytePointer[0]; 617 | 278: 89 81 ldd r24, Y+1 ; 0x01 618 | 27a: 86 83 std Z+6, r24 ; 0x06 619 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:58 620 | 621 | //Shut off ADC 622 | ADCSRA &= ~(1 << ADEN); 623 | 27c: 37 98 cbi 0x06, 7 ; 6 624 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:59 625 | } 626 | 27e: 0f 90 pop r0 627 | 280: 0f 90 pop r0 628 | 282: 0f 90 pop r0 629 | 284: 0f 90 pop r0 630 | 286: df 91 pop r29 631 | 288: cf 91 pop r28 632 | 28a: 1f 91 pop r17 633 | 28c: 0f 91 pop r16 634 | 28e: 08 95 ret 635 | 636 | 00000290 : 637 | _Z12requestEventv(): 638 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:98 639 | //When Qwiic Joystick gets a request for data from the user, this function is called as an interrupt 640 | //The interrupt will respond with bytes starting from the last byte the user sent to us 641 | //While we are sending bytes we may have to do some calculations 642 | void requestEvent() 643 | { 644 | updateJoystick(); 645 | 290: cf df rcall .-98 ; 0x230 646 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:99 647 | registerMap.Button_State = digitalRead(Button_Pin); 648 | 292: 81 e0 ldi r24, 0x01 ; 1 649 | 294: ec d2 rcall .+1496 ; 0x86e 650 | 296: 80 93 76 00 sts 0x0076, r24 ; 0x800076 651 | C:\Users\wesley.furuya\Downloads\Qwiic_Joystick-master\Qwiic_Joystick-master\Firmware\ATtiny85 Firmware\Qwiic_Joystick_v26/interrupts.ino:104 652 | 653 | //This will write the entire contents of the register map struct starting from 654 | //the register the user requested, and when it reaches the end the master 655 | //will read 0xFFs. 656 | Wire.write((registerPointer + registerNumber), sizeof(memoryMap) - registerNumber); 657 | 29a: 90 91 88 00 lds r25, 0x0088 ; 0x800088 <__data_end> 658 | 29e: 80 91 88 00 lds r24, 0x0088 ; 0x800088 <__data_end> 659 | 2a2: 4b e0 ldi r20, 0x0B ; 11 660 | 2a4: 50 e0 ldi r21, 0x00 ; 0 661 | 2a6: 49 1b sub r20, r25 662 | 2a8: 51 09 sbc r21, r1 663 | 2aa: 60 91 62 00 lds r22, 0x0062 ; 0x800062 664 | 2ae: 70 91 63 00 lds r23, 0x0063 ; 0x800063 665 | 2b2: 68 0f add r22, r24 666 | 2b4: 71 1d adc r23, r1 667 | 2b6: 89 e8 ldi r24, 0x89 ; 137 668 | 2b8: 90 e0 ldi r25, 0x00 ; 0 669 | 2ba: 2a c0 rjmp .+84 ; 0x310 670 | 671 | 000002bc : 672 | _ZN7TwoWire5beginEh(): 673 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src/Wire.cpp:585 674 | } 675 | 676 | return value; 677 | } 678 | 679 | void TwoWire::flush(void) { 680 | 2bc: 86 2f mov r24, r22 681 | 2be: 85 c0 rjmp .+266 ; 0x3ca 682 | 683 | 000002c0 : 684 | _ZN7TwoWire3endEv(): 685 | 2c0: 9b c0 rjmp .+310 ; 0x3f8 686 | 687 | 000002c2 : 688 | _ZN7TwoWire5writeEh(): 689 | 2c2: cf 93 push r28 690 | 2c4: 80 91 8a 00 lds r24, 0x008A ; 0x80008a 691 | 2c8: 88 23 and r24, r24 692 | 2ca: c1 f0 breq .+48 ; 0x2fc 693 | 2cc: 80 91 8b 00 lds r24, 0x008B ; 0x80008b 694 | 2d0: 80 32 cpi r24, 0x20 ; 32 695 | 2d2: 18 f0 brcs .+6 ; 0x2da 696 | 2d4: 80 e0 ldi r24, 0x00 ; 0 697 | 2d6: 90 e0 ldi r25, 0x00 ; 0 698 | 2d8: 19 c0 rjmp .+50 ; 0x30c 699 | 2da: 80 91 8c 00 lds r24, 0x008C ; 0x80008c 700 | 2de: e0 91 7a 00 lds r30, 0x007A ; 0x80007a 701 | 2e2: f0 91 7b 00 lds r31, 0x007B ; 0x80007b 702 | 2e6: e8 0f add r30, r24 703 | 2e8: f1 1d adc r31, r1 704 | 2ea: 60 83 st Z, r22 705 | 2ec: 80 91 8c 00 lds r24, 0x008C ; 0x80008c 706 | 2f0: 8f 5f subi r24, 0xFF ; 255 707 | 2f2: 80 93 8c 00 sts 0x008C, r24 ; 0x80008c 708 | 2f6: 80 93 8b 00 sts 0x008B, r24 ; 0x80008b 709 | 2fa: 06 c0 rjmp .+12 ; 0x308 710 | 2fc: c6 2f mov r28, r22 711 | 2fe: aa d0 rcall .+340 ; 0x454 712 | 300: 88 23 and r24, r24 713 | 302: 41 f3 breq .-48 ; 0x2d4 714 | 304: 8c 2f mov r24, r28 715 | 306: 7e d0 rcall .+252 ; 0x404 716 | 308: 81 e0 ldi r24, 0x01 ; 1 717 | 30a: 90 e0 ldi r25, 0x00 ; 0 718 | 30c: cf 91 pop r28 719 | 30e: 08 95 ret 720 | 721 | 00000310 : 722 | _ZN7TwoWire5writeEPKhj(): 723 | 310: cf 92 push r12 724 | 312: df 92 push r13 725 | 314: ef 92 push r14 726 | 316: ff 92 push r15 727 | 318: 0f 93 push r16 728 | 31a: 1f 93 push r17 729 | 31c: cf 93 push r28 730 | 31e: df 93 push r29 731 | 320: 6c 01 movw r12, r24 732 | 322: eb 01 movw r28, r22 733 | 324: 7b 01 movw r14, r22 734 | 326: e4 0e add r14, r20 735 | 328: f5 1e adc r15, r21 736 | 32a: 00 e0 ldi r16, 0x00 ; 0 737 | 32c: 10 e0 ldi r17, 0x00 ; 0 738 | 32e: ce 15 cp r28, r14 739 | 330: df 05 cpc r29, r15 740 | 332: 31 f0 breq .+12 ; 0x340 741 | 334: 69 91 ld r22, Y+ 742 | 336: c6 01 movw r24, r12 743 | 338: c4 df rcall .-120 ; 0x2c2 744 | 33a: 08 0f add r16, r24 745 | 33c: 19 1f adc r17, r25 746 | 33e: f7 cf rjmp .-18 ; 0x32e 747 | 340: c8 01 movw r24, r16 748 | 342: df 91 pop r29 749 | 344: cf 91 pop r28 750 | 346: 1f 91 pop r17 751 | 348: 0f 91 pop r16 752 | 34a: ff 90 pop r15 753 | 34c: ef 90 pop r14 754 | 34e: df 90 pop r13 755 | 350: cf 90 pop r12 756 | 352: 08 95 ret 757 | 758 | 00000354 : 759 | _ZN7TwoWire9availableEv(): 760 | 354: 80 91 8b 00 lds r24, 0x008B ; 0x80008b 761 | 358: 88 23 and r24, r24 762 | 35a: 31 f0 breq .+12 ; 0x368 763 | 35c: 90 e0 ldi r25, 0x00 ; 0 764 | 35e: 20 91 8c 00 lds r18, 0x008C ; 0x80008c 765 | 362: 82 1b sub r24, r18 766 | 364: 91 09 sbc r25, r1 767 | 366: 08 95 ret 768 | 368: 6e d0 rcall .+220 ; 0x446 769 | 36a: 90 e0 ldi r25, 0x00 ; 0 770 | 36c: 08 95 ret 771 | 772 | 0000036e : 773 | _ZN7TwoWire4readEv(): 774 | 36e: f2 df rcall .-28 ; 0x354 775 | 370: 89 2b or r24, r25 776 | 372: a9 f0 breq .+42 ; 0x39e 777 | 374: 80 91 8b 00 lds r24, 0x008B ; 0x80008b 778 | 378: 88 23 and r24, r24 779 | 37a: 71 f0 breq .+28 ; 0x398 780 | 37c: 20 91 8c 00 lds r18, 0x008C ; 0x80008c 781 | 380: e0 91 7a 00 lds r30, 0x007A ; 0x80007a 782 | 384: f0 91 7b 00 lds r31, 0x007B ; 0x80007b 783 | 388: e2 0f add r30, r18 784 | 38a: f1 1d adc r31, r1 785 | 38c: 80 81 ld r24, Z 786 | 38e: 90 e0 ldi r25, 0x00 ; 0 787 | 390: 2f 5f subi r18, 0xFF ; 255 788 | 392: 20 93 8c 00 sts 0x008C, r18 ; 0x80008c 789 | 396: 08 95 ret 790 | 398: 45 d0 rcall .+138 ; 0x424 791 | 39a: 90 e0 ldi r25, 0x00 ; 0 792 | 39c: 08 95 ret 793 | 39e: 8f ef ldi r24, 0xFF ; 255 794 | 3a0: 9f ef ldi r25, 0xFF ; 255 795 | 3a2: 08 95 ret 796 | 797 | 000003a4 : 798 | _ZN7TwoWire9onReceiveEPFviE(): 799 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src/Wire.cpp:591 800 | // XXX: to be implemented. 801 | } 802 | 803 | // sets function called on slave write 804 | void TwoWire::onReceive( void (*function)(int) ) { 805 | USI_TWI_On_Slave_Receive = function; 806 | 3a4: 70 93 8e 00 sts 0x008E, r23 ; 0x80008e 807 | 3a8: 60 93 8d 00 sts 0x008D, r22 ; 0x80008d 808 | 3ac: 08 95 ret 809 | 810 | 000003ae : 811 | _ZN7TwoWire9onRequestEPFvvE(): 812 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src/Wire.cpp:596 813 | } 814 | 815 | // sets function called on slave read 816 | void TwoWire::onRequest( void (*function)(void) ) { 817 | USI_TWI_On_Slave_Transmit = function; 818 | 3ae: 70 93 90 00 sts 0x0090, r23 ; 0x800090 819 | 3b2: 60 93 8f 00 sts 0x008F, r22 ; 0x80008f 820 | 3b6: 08 95 ret 821 | 822 | 000003b8 : 823 | Flush_TWI_Buffers(): 824 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:153 825 | // Check if there is an active data session. 826 | unsigned char USI_TWI_Slave_Is_Active() 827 | { 828 | // Active if Overflow Interrupt is enabled and no Stop Condition occurred 829 | return (USICR & (1 << USIOIE)) && ((USISR & (1 << USIPF)) == 0); 830 | } 831 | 3b8: 10 92 93 00 sts 0x0093, r1 ; 0x800093 832 | 3bc: 10 92 94 00 sts 0x0094, r1 ; 0x800094 833 | 3c0: 10 92 91 00 sts 0x0091, r1 ; 0x800091 834 | 3c4: 10 92 92 00 sts 0x0092, r1 ; 0x800092 835 | 3c8: 08 95 ret 836 | 837 | 000003ca : 838 | USI_TWI_Slave_Initialise(): 839 | 3ca: cf 93 push r28 840 | 3cc: c8 2f mov r28, r24 841 | 3ce: f4 df rcall .-24 ; 0x3b8 842 | 3d0: c0 93 96 00 sts 0x0096, r28 ; 0x800096 843 | 3d4: 10 92 90 00 sts 0x0090, r1 ; 0x800090 844 | 3d8: 10 92 8f 00 sts 0x008F, r1 ; 0x80008f 845 | 3dc: 10 92 8e 00 sts 0x008E, r1 ; 0x80008e 846 | 3e0: 10 92 8d 00 sts 0x008D, r1 ; 0x80008d 847 | 3e4: c2 9a sbi 0x18, 2 ; 24 848 | 3e6: c0 9a sbi 0x18, 0 ; 24 849 | 3e8: ba 9a sbi 0x17, 2 ; 23 850 | 3ea: b8 98 cbi 0x17, 0 ; 23 851 | 3ec: 88 ea ldi r24, 0xA8 ; 168 852 | 3ee: 8d b9 out 0x0d, r24 ; 13 853 | 3f0: 80 ef ldi r24, 0xF0 ; 240 854 | 3f2: 8e b9 out 0x0e, r24 ; 14 855 | 3f4: cf 91 pop r28 856 | 3f6: 08 95 ret 857 | 858 | 000003f8 : 859 | USI_TWI_Slave_Disable(): 860 | 3f8: ba 98 cbi 0x17, 2 ; 23 861 | 3fa: b8 98 cbi 0x17, 0 ; 23 862 | 3fc: 1d b8 out 0x0d, r1 ; 13 863 | 3fe: 80 ef ldi r24, 0xF0 ; 240 864 | 400: 8e b9 out 0x0e, r24 ; 14 865 | 402: 08 95 ret 866 | 867 | 00000404 : 868 | USI_TWI_Transmit_Byte(): 869 | 404: 90 91 92 00 lds r25, 0x0092 ; 0x800092 870 | 408: 9f 5f subi r25, 0xFF ; 255 871 | 40a: 9f 70 andi r25, 0x0F ; 15 872 | 40c: 20 91 91 00 lds r18, 0x0091 ; 0x800091 873 | 410: 92 17 cp r25, r18 874 | 412: e1 f3 breq .-8 ; 0x40c 875 | 414: e9 2f mov r30, r25 876 | 416: f0 e0 ldi r31, 0x00 ; 0 877 | 418: ec 54 subi r30, 0x4C ; 76 878 | 41a: ff 4f sbci r31, 0xFF ; 255 879 | 41c: 80 83 st Z, r24 880 | 41e: 90 93 92 00 sts 0x0092, r25 ; 0x800092 881 | 422: 08 95 ret 882 | 883 | 00000424 : 884 | USI_TWI_Receive_Byte(): 885 | 424: 90 91 93 00 lds r25, 0x0093 ; 0x800093 886 | 428: 80 91 94 00 lds r24, 0x0094 ; 0x800094 887 | 42c: 98 17 cp r25, r24 888 | 42e: e1 f3 breq .-8 ; 0x428 889 | 430: e0 91 93 00 lds r30, 0x0093 ; 0x800093 890 | 434: ef 5f subi r30, 0xFF ; 255 891 | 436: ef 70 andi r30, 0x0F ; 15 892 | 438: e0 93 93 00 sts 0x0093, r30 ; 0x800093 893 | 43c: f0 e0 ldi r31, 0x00 ; 0 894 | 43e: ec 55 subi r30, 0x5C ; 92 895 | 440: ff 4f sbci r31, 0xFF ; 255 896 | 442: 80 81 ld r24, Z 897 | 444: 08 95 ret 898 | 899 | 00000446 : 900 | USI_TWI_Data_In_Receive_Buffer(): 901 | 446: 90 91 93 00 lds r25, 0x0093 ; 0x800093 902 | 44a: 80 91 94 00 lds r24, 0x0094 ; 0x800094 903 | 44e: 89 1b sub r24, r25 904 | 450: 8f 70 andi r24, 0x0F ; 15 905 | 452: 08 95 ret 906 | 907 | 00000454 : 908 | USI_TWI_Space_In_Transmission_Buffer(): 909 | 454: 90 91 92 00 lds r25, 0x0092 ; 0x800092 910 | 458: 80 91 91 00 lds r24, 0x0091 ; 0x800091 911 | 45c: 9f 5f subi r25, 0xFF ; 255 912 | 45e: 89 1b sub r24, r25 913 | 460: 8f 70 andi r24, 0x0F ; 15 914 | 462: 08 95 ret 915 | 916 | 00000464 <__vector_13>: 917 | __vector_13(): 918 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:165 919 | ISR(USI_START_VECTOR) 920 | #elif __ICCAVR__ 921 | #pragma vector = USI_START_VECTOR 922 | __interrupt void USI_Start_Condition_ISR(void) 923 | #endif 924 | { 925 | 464: 1f 92 push r1 926 | 466: 0f 92 push r0 927 | 468: 0f b6 in r0, 0x3f ; 63 928 | 46a: 0f 92 push r0 929 | 46c: 11 24 eor r1, r1 930 | 46e: 0f 93 push r16 931 | 470: 1f 93 push r17 932 | 472: 2f 93 push r18 933 | 474: 3f 93 push r19 934 | 476: 4f 93 push r20 935 | 478: 5f 93 push r21 936 | 47a: 6f 93 push r22 937 | 47c: 7f 93 push r23 938 | 47e: 8f 93 push r24 939 | 480: 9f 93 push r25 940 | 482: af 93 push r26 941 | 484: bf 93 push r27 942 | 486: cf 93 push r28 943 | 488: ef 93 push r30 944 | 48a: ff 93 push r31 945 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:169 946 | unsigned char tmpPin; // Temporary variable for pin state 947 | unsigned char tmpRxHead; // Temporary variable to store volatile 948 | // call slave receive callback on repeated start 949 | if (USI_TWI_On_Slave_Receive) { 950 | 48c: 00 91 8d 00 lds r16, 0x008D ; 0x80008d 951 | 490: 10 91 8e 00 lds r17, 0x008E ; 0x80008e 952 | 494: 01 15 cp r16, r1 953 | 496: 11 05 cpc r17, r1 954 | 498: 61 f0 breq .+24 ; 0x4b2 <__vector_13+0x4e> 955 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:170 956 | tmpRxHead = TWI_RxHead; 957 | 49a: c0 91 94 00 lds r28, 0x0094 ; 0x800094 958 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:171 959 | if (TWI_RxTail != tmpRxHead) { // data in receive buffer 960 | 49e: 80 91 93 00 lds r24, 0x0093 ; 0x800093 961 | 4a2: c8 17 cp r28, r24 962 | 4a4: 31 f0 breq .+12 ; 0x4b2 <__vector_13+0x4e> 963 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:172 964 | USI_TWI_On_Slave_Receive(USI_TWI_Data_In_Receive_Buffer()); 965 | 4a6: cf df rcall .-98 ; 0x446 966 | 4a8: 90 e0 ldi r25, 0x00 ; 0 967 | 4aa: f8 01 movw r30, r16 968 | 4ac: 09 95 icall 969 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:174 970 | // reset rx buffer 971 | TWI_RxTail = tmpRxHead; 972 | 4ae: c0 93 93 00 sts 0x0093, r28 ; 0x800093 973 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:178 974 | } 975 | } 976 | 977 | USI_TWI_Overflow_State = USI_SLAVE_CHECK_ADDRESS; 978 | 4b2: 10 92 95 00 sts 0x0095, r1 ; 0x800095 979 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:179 980 | DDR_USI &= ~(1 << PORT_USI_SDA); // Set SDA as input 981 | 4b6: b8 98 cbi 0x17, 0 ; 23 982 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:180 (discriminator 2) 983 | while ((tmpPin = (PIN_USI_CL & (1 << PORT_USI_SCL))) && ((PIN_USI & (1 << PIN_USI_SDA)) == 0)) 984 | 4b8: b2 9b sbis 0x16, 2 ; 22 985 | 4ba: 04 c0 rjmp .+8 ; 0x4c4 <__vector_13+0x60> 986 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:180 (discriminator 1) 987 | 4bc: b0 9b sbis 0x16, 0 ; 22 988 | 4be: fc cf rjmp .-8 ; 0x4b8 <__vector_13+0x54> 989 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:185 990 | ; // Wait for SCL to go low to ensure the "Start Condition" has completed. 991 | // If a Stop condition arises then leave the interrupt to prevent waiting forever. 992 | if (tmpPin) { 993 | // Stop Condition (waiting for next Start Condition) 994 | USICR = (1 << USISIE) | (0 << USIOIE) | // Enable Start Condition Interrupt. Disable Overflow Interrupt. 995 | 4c0: 88 ea ldi r24, 0xA8 ; 168 996 | 4c2: 01 c0 rjmp .+2 ; 0x4c6 <__vector_13+0x62> 997 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:192 998 | // to first Start Condition (potentail failure) 999 | (1 << USICS1) | (0 << USICS0) | (0 << USICLK) | // Shift Register Clock Source = External, positive edge 1000 | (0 << USITC); 1001 | } else { 1002 | // really Start Condition (Enable Overflow Interrupt) 1003 | USICR = (1 << USISIE) | (1 << USIOIE) 1004 | 4c4: 88 ef ldi r24, 0xF8 ; 248 1005 | 4c6: 8d b9 out 0x0d, r24 ; 13 1006 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:198 1007 | | // Enable Overflow and Start Condition Interrupt. (Keep StartCondInt to detect RESTART) 1008 | (1 << USIWM1) | (1 << USIWM0) | // Set USI in Two-wire mode. 1009 | (1 << USICS1) | (0 << USICS0) | (0 << USICLK) | // Shift Register Clock Source = External, positive edge 1010 | (0 << USITC); 1011 | } 1012 | USISR = (1 << USI_START_COND_INT) | (1 << USIOIF) | (1 << USIPF) | (1 << USIDC) | // Clear flags 1013 | 4c8: 80 ef ldi r24, 0xF0 ; 240 1014 | 4ca: 8e b9 out 0x0e, r24 ; 14 1015 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:200 1016 | (0x0 << USICNT0); // Set USI to sample 8 bits i.e. count 16 external pin toggles. 1017 | } 1018 | 4cc: ff 91 pop r31 1019 | 4ce: ef 91 pop r30 1020 | 4d0: cf 91 pop r28 1021 | 4d2: bf 91 pop r27 1022 | 4d4: af 91 pop r26 1023 | 4d6: 9f 91 pop r25 1024 | 4d8: 8f 91 pop r24 1025 | 4da: 7f 91 pop r23 1026 | 4dc: 6f 91 pop r22 1027 | 4de: 5f 91 pop r21 1028 | 4e0: 4f 91 pop r20 1029 | 4e2: 3f 91 pop r19 1030 | 4e4: 2f 91 pop r18 1031 | 4e6: 1f 91 pop r17 1032 | 4e8: 0f 91 pop r16 1033 | 4ea: 0f 90 pop r0 1034 | 4ec: 0f be out 0x3f, r0 ; 63 1035 | 4ee: 0f 90 pop r0 1036 | 4f0: 1f 90 pop r1 1037 | 4f2: 18 95 reti 1038 | 1039 | 000004f4 <__vector_14>: 1040 | __vector_14(): 1041 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:212 1042 | ISR(USI_OVERFLOW_VECTOR) 1043 | #elif __ICCAVR__ 1044 | #pragma vector = USI_OVERFLOW_VECTOR 1045 | __interrupt void USI_Counter_Overflow_ISR(void) 1046 | #endif 1047 | { 1048 | 4f4: 1f 92 push r1 1049 | 4f6: 0f 92 push r0 1050 | 4f8: 0f b6 in r0, 0x3f ; 63 1051 | 4fa: 0f 92 push r0 1052 | 4fc: 11 24 eor r1, r1 1053 | 4fe: 0f 93 push r16 1054 | 500: 1f 93 push r17 1055 | 502: 2f 93 push r18 1056 | 504: 3f 93 push r19 1057 | 506: 4f 93 push r20 1058 | 508: 5f 93 push r21 1059 | 50a: 6f 93 push r22 1060 | 50c: 7f 93 push r23 1061 | 50e: 8f 93 push r24 1062 | 510: 9f 93 push r25 1063 | 512: af 93 push r26 1064 | 514: bf 93 push r27 1065 | 516: cf 93 push r28 1066 | 518: ef 93 push r30 1067 | 51a: ff 93 push r31 1068 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:217 1069 | unsigned char tmpRxHead; 1070 | unsigned char tmpTxTail; // Temporary variables to store volatiles 1071 | unsigned char tmpUSIDR; 1072 | 1073 | switch (USI_TWI_Overflow_State) { 1074 | 51c: 80 91 95 00 lds r24, 0x0095 ; 0x800095 1075 | 520: 82 30 cpi r24, 0x02 ; 2 1076 | 522: 09 f4 brne .+2 ; 0x526 <__vector_14+0x32> 1077 | 524: 4c c0 rjmp .+152 ; 0x5be <__vector_14+0xca> 1078 | 526: 28 f4 brcc .+10 ; 0x532 <__vector_14+0x3e> 1079 | 528: 88 23 and r24, r24 1080 | 52a: 59 f0 breq .+22 ; 0x542 <__vector_14+0x4e> 1081 | 52c: 81 30 cpi r24, 0x01 ; 1 1082 | 52e: 51 f1 breq .+84 ; 0x584 <__vector_14+0x90> 1083 | 530: 83 c0 rjmp .+262 ; 0x638 <__vector_14+0x144> 1084 | 532: 84 30 cpi r24, 0x04 ; 4 1085 | 534: 09 f4 brne .+2 ; 0x538 <__vector_14+0x44> 1086 | 536: 49 c0 rjmp .+146 ; 0x5ca <__vector_14+0xd6> 1087 | 538: 10 f1 brcs .+68 ; 0x57e <__vector_14+0x8a> 1088 | 53a: 85 30 cpi r24, 0x05 ; 5 1089 | 53c: 09 f4 brne .+2 ; 0x540 <__vector_14+0x4c> 1090 | 53e: 64 c0 rjmp .+200 ; 0x608 <__vector_14+0x114> 1091 | 540: 7b c0 rjmp .+246 ; 0x638 <__vector_14+0x144> 1092 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:221 1093 | // ---------- Address mode ---------- 1094 | // Check address and send ACK (and next USI_SLAVE_SEND_DATA) if OK, else reset USI. 1095 | case USI_SLAVE_CHECK_ADDRESS: 1096 | if ((USIDR == 0) || ((USIDR >> 1) == TWI_slaveAddress)) { 1097 | 542: 8f b1 in r24, 0x0f ; 15 1098 | 544: 88 23 and r24, r24 1099 | 546: 31 f0 breq .+12 ; 0x554 <__vector_14+0x60> 1100 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:221 (discriminator 1) 1101 | 548: 8f b1 in r24, 0x0f ; 15 1102 | 54a: 86 95 lsr r24 1103 | 54c: 90 91 96 00 lds r25, 0x0096 ; 0x800096 1104 | 550: 89 13 cpse r24, r25 1105 | 552: 30 c0 rjmp .+96 ; 0x5b4 <__vector_14+0xc0> 1106 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:222 1107 | if (USIDR & 0x01) { 1108 | 554: 78 9b sbis 0x0f, 0 ; 15 1109 | 556: 0d c0 rjmp .+26 ; 0x572 <__vector_14+0x7e> 1110 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:223 1111 | if (USI_TWI_On_Slave_Transmit) { 1112 | 558: e0 91 8f 00 lds r30, 0x008F ; 0x80008f 1113 | 55c: f0 91 90 00 lds r31, 0x0090 ; 0x800090 1114 | 560: 30 97 sbiw r30, 0x00 ; 0 1115 | 562: 29 f0 breq .+10 ; 0x56e <__vector_14+0x7a> 1116 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:225 1117 | // reset tx buffer and call callback 1118 | tmpTxTail = TWI_TxHead; 1119 | 564: 80 91 92 00 lds r24, 0x0092 ; 0x800092 1120 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:226 1121 | TWI_TxTail = tmpTxTail; 1122 | 568: 80 93 91 00 sts 0x0091, r24 ; 0x800091 1123 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:227 1124 | USI_TWI_On_Slave_Transmit(); 1125 | 56c: 09 95 icall 1126 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:229 1127 | } 1128 | USI_TWI_Overflow_State = USI_SLAVE_SEND_DATA; 1129 | 56e: 81 e0 ldi r24, 0x01 ; 1 1130 | 570: 01 c0 rjmp .+2 ; 0x574 <__vector_14+0x80> 1131 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:231 1132 | } else { 1133 | USI_TWI_Overflow_State = USI_SLAVE_REQUEST_DATA; 1134 | 572: 84 e0 ldi r24, 0x04 ; 4 1135 | 574: 80 93 95 00 sts 0x0095, r24 ; 0x800095 1136 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:233 1137 | } 1138 | SET_USI_TO_SEND_ACK(); 1139 | 578: 1f b8 out 0x0f, r1 ; 15 1140 | 57a: b8 9a sbi 0x17, 0 ; 23 1141 | 57c: 5b c0 rjmp .+182 ; 0x634 <__vector_14+0x140> 1142 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:242 1143 | break; 1144 | 1145 | // ----- Master write data mode ------ 1146 | // Check reply and goto USI_SLAVE_SEND_DATA if OK, else reset USI. 1147 | case USI_SLAVE_CHECK_REPLY_FROM_SEND_DATA: 1148 | if (USIDR) // If NACK, the master does not want more data. 1149 | 57e: 8f b1 in r24, 0x0f ; 15 1150 | 580: 81 11 cpse r24, r1 1151 | 582: 18 c0 rjmp .+48 ; 0x5b4 <__vector_14+0xc0> 1152 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:253 1153 | 1154 | // Copy data from buffer to USIDR and set USI to shift byte. Next USI_SLAVE_REQUEST_REPLY_FROM_SEND_DATA 1155 | case USI_SLAVE_SEND_DATA: 1156 | 1157 | // Get data from Buffer 1158 | tmpTxTail = TWI_TxTail; // Not necessary, but prevents warnings 1159 | 584: 90 91 91 00 lds r25, 0x0091 ; 0x800091 1160 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:254 1161 | if (TWI_TxHead != tmpTxTail) { 1162 | 588: 80 91 92 00 lds r24, 0x0092 ; 0x800092 1163 | 58c: 98 17 cp r25, r24 1164 | 58e: 91 f0 breq .+36 ; 0x5b4 <__vector_14+0xc0> 1165 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:255 1166 | TWI_TxTail = (TWI_TxTail + 1) & TWI_TX_BUFFER_MASK; 1167 | 590: 80 91 91 00 lds r24, 0x0091 ; 0x800091 1168 | 594: 8f 5f subi r24, 0xFF ; 255 1169 | 596: 8f 70 andi r24, 0x0F ; 15 1170 | 598: 80 93 91 00 sts 0x0091, r24 ; 0x800091 1171 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:256 1172 | USIDR = TWI_TxBuf[TWI_TxTail]; 1173 | 59c: e0 91 91 00 lds r30, 0x0091 ; 0x800091 1174 | 5a0: f0 e0 ldi r31, 0x00 ; 0 1175 | 5a2: ec 54 subi r30, 0x4C ; 76 1176 | 5a4: ff 4f sbci r31, 0xFF ; 255 1177 | 5a6: 80 81 ld r24, Z 1178 | 5a8: 8f b9 out 0x0f, r24 ; 15 1179 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:262 1180 | } else // If the buffer is empty then: 1181 | { 1182 | SET_USI_TO_TWI_START_CONDITION_MODE(); 1183 | return; 1184 | } 1185 | USI_TWI_Overflow_State = USI_SLAVE_REQUEST_REPLY_FROM_SEND_DATA; 1186 | 5aa: 82 e0 ldi r24, 0x02 ; 2 1187 | 5ac: 80 93 95 00 sts 0x0095, r24 ; 0x800095 1188 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:263 1189 | SET_USI_TO_SEND_DATA(); 1190 | 5b0: b8 9a sbi 0x17, 0 ; 23 1191 | 5b2: 03 c0 rjmp .+6 ; 0x5ba <__vector_14+0xc6> 1192 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:259 1193 | if (TWI_TxHead != tmpTxTail) { 1194 | TWI_TxTail = (TWI_TxTail + 1) & TWI_TX_BUFFER_MASK; 1195 | USIDR = TWI_TxBuf[TWI_TxTail]; 1196 | } else // If the buffer is empty then: 1197 | { 1198 | SET_USI_TO_TWI_START_CONDITION_MODE(); 1199 | 5b4: b8 98 cbi 0x17, 0 ; 23 1200 | 5b6: 88 ea ldi r24, 0xA8 ; 168 1201 | 5b8: 8d b9 out 0x0d, r24 ; 13 1202 | 5ba: 80 e7 ldi r24, 0x70 ; 112 1203 | 5bc: 3c c0 rjmp .+120 ; 0x636 <__vector_14+0x142> 1204 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:268 1205 | SET_USI_TO_SEND_DATA(); 1206 | break; 1207 | 1208 | // Set USI to sample reply from master. Next USI_SLAVE_CHECK_REPLY_FROM_SEND_DATA 1209 | case USI_SLAVE_REQUEST_REPLY_FROM_SEND_DATA: 1210 | USI_TWI_Overflow_State = USI_SLAVE_CHECK_REPLY_FROM_SEND_DATA; 1211 | 5be: 83 e0 ldi r24, 0x03 ; 3 1212 | 5c0: 80 93 95 00 sts 0x0095, r24 ; 0x800095 1213 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:269 1214 | SET_USI_TO_READ_ACK(); 1215 | 5c4: b8 98 cbi 0x17, 0 ; 23 1216 | 5c6: 1f b8 out 0x0f, r1 ; 15 1217 | 5c8: 35 c0 rjmp .+106 ; 0x634 <__vector_14+0x140> 1218 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:275 1219 | break; 1220 | 1221 | // ----- Master read data mode ------ 1222 | // Set USI to sample data from master. Next USI_SLAVE_GET_DATA_AND_SEND_ACK. 1223 | case USI_SLAVE_REQUEST_DATA: 1224 | USI_TWI_Overflow_State = USI_SLAVE_GET_DATA_AND_SEND_ACK; 1225 | 5ca: 85 e0 ldi r24, 0x05 ; 5 1226 | 5cc: 80 93 95 00 sts 0x0095, r24 ; 0x800095 1227 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:276 1228 | SET_USI_TO_READ_DATA(); 1229 | 5d0: b8 98 cbi 0x17, 0 ; 23 1230 | 5d2: 80 e7 ldi r24, 0x70 ; 112 1231 | 5d4: 8e b9 out 0x0e, r24 ; 14 1232 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:278 1233 | // call slave receive callback on stop condition 1234 | if (USI_TWI_On_Slave_Receive) { 1235 | 5d6: 00 91 8d 00 lds r16, 0x008D ; 0x80008d 1236 | 5da: 10 91 8e 00 lds r17, 0x008E ; 0x80008e 1237 | 5de: 01 15 cp r16, r1 1238 | 5e0: 11 05 cpc r17, r1 1239 | 5e2: 51 f1 breq .+84 ; 0x638 <__vector_14+0x144> 1240 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:279 1241 | tmpRxHead = TWI_RxHead; 1242 | 5e4: c0 91 94 00 lds r28, 0x0094 ; 0x800094 1243 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:280 1244 | if (TWI_RxTail != tmpRxHead) { // data in receive buffer 1245 | 5e8: 80 91 93 00 lds r24, 0x0093 ; 0x800093 1246 | 5ec: c8 17 cp r28, r24 1247 | 5ee: 21 f1 breq .+72 ; 0x638 <__vector_14+0x144> 1248 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:282 (discriminator 1) 1249 | // check for stop Condition 1250 | while ((USISR & ((1 << USI_START_COND_INT) | (1 << USIPF) | (0xE << USICNT0))) == 0) 1251 | 5f0: 8e b1 in r24, 0x0e ; 14 1252 | 5f2: 8e 7a andi r24, 0xAE ; 174 1253 | 5f4: e9 f3 breq .-6 ; 0x5f0 <__vector_14+0xfc> 1254 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:285 1255 | ;// wait for either Start or Stop Condition 1256 | // cancel after one SCL cycle 1257 | if (USISR & (1 << USIPF)) { // Stop Condition 1258 | 5f6: 75 9b sbis 0x0e, 5 ; 14 1259 | 5f8: 1f c0 rjmp .+62 ; 0x638 <__vector_14+0x144> 1260 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:286 1261 | USI_TWI_On_Slave_Receive(USI_TWI_Data_In_Receive_Buffer()); 1262 | 5fa: 25 df rcall .-438 ; 0x446 1263 | 5fc: 90 e0 ldi r25, 0x00 ; 0 1264 | 5fe: f8 01 movw r30, r16 1265 | 600: 09 95 icall 1266 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:288 1267 | // reset rx buffer 1268 | TWI_RxTail = tmpRxHead; 1269 | 602: c0 93 93 00 sts 0x0093, r28 ; 0x800093 1270 | 606: 18 c0 rjmp .+48 ; 0x638 <__vector_14+0x144> 1271 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:297 1272 | break; 1273 | 1274 | // Copy data from USIDR and send ACK. Next USI_SLAVE_REQUEST_DATA 1275 | case USI_SLAVE_GET_DATA_AND_SEND_ACK: 1276 | // Put data into Buffer 1277 | USI_TWI_Overflow_State = USI_SLAVE_REQUEST_DATA; 1278 | 608: 84 e0 ldi r24, 0x04 ; 4 1279 | 60a: 80 93 95 00 sts 0x0095, r24 ; 0x800095 1280 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:298 1281 | tmpUSIDR = USIDR; // Not necessary, but prevents warnings 1282 | 60e: 9f b1 in r25, 0x0f ; 15 1283 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:299 1284 | tmpRxHead = (TWI_RxHead + 1) & TWI_RX_BUFFER_MASK; 1285 | 610: 80 91 94 00 lds r24, 0x0094 ; 0x800094 1286 | 614: 8f 5f subi r24, 0xFF ; 255 1287 | 616: 8f 70 andi r24, 0x0F ; 15 1288 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:300 1289 | if (TWI_RxTail != tmpRxHead) { 1290 | 618: 20 91 93 00 lds r18, 0x0093 ; 0x800093 1291 | 61c: 82 17 cp r24, r18 1292 | 61e: 49 f0 breq .+18 ; 0x632 <__vector_14+0x13e> 1293 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:301 1294 | TWI_RxHead = tmpRxHead; 1295 | 620: 80 93 94 00 sts 0x0094, r24 ; 0x800094 1296 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:302 1297 | TWI_RxBuf[TWI_RxHead] = tmpUSIDR; 1298 | 624: e0 91 94 00 lds r30, 0x0094 ; 0x800094 1299 | 628: f0 e0 ldi r31, 0x00 ; 0 1300 | 62a: ec 55 subi r30, 0x5C ; 92 1301 | 62c: ff 4f sbci r31, 0xFF ; 255 1302 | 62e: 90 83 st Z, r25 1303 | 630: a3 cf rjmp .-186 ; 0x578 <__vector_14+0x84> 1304 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:306 1305 | SET_USI_TO_SEND_ACK(); 1306 | } else // If the buffer is full then: 1307 | { 1308 | SET_USI_TO_SEND_NACK(); 1309 | 632: b8 98 cbi 0x17, 0 ; 23 1310 | 634: 8e e7 ldi r24, 0x7E ; 126 1311 | 636: 8e b9 out 0x0e, r24 ; 14 1312 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\libraries\Wire\src\USI_TWI_Slave/USI_TWI_Slave.c:310 1313 | } 1314 | break; 1315 | } 1316 | } 1317 | 638: ff 91 pop r31 1318 | 63a: ef 91 pop r30 1319 | 63c: cf 91 pop r28 1320 | 63e: bf 91 pop r27 1321 | 640: af 91 pop r26 1322 | 642: 9f 91 pop r25 1323 | 644: 8f 91 pop r24 1324 | 646: 7f 91 pop r23 1325 | 648: 6f 91 pop r22 1326 | 64a: 5f 91 pop r21 1327 | 64c: 4f 91 pop r20 1328 | 64e: 3f 91 pop r19 1329 | 650: 2f 91 pop r18 1330 | 652: 1f 91 pop r17 1331 | 654: 0f 91 pop r16 1332 | 656: 0f 90 pop r0 1333 | 658: 0f be out 0x3f, r0 ; 63 1334 | 65a: 0f 90 pop r0 1335 | 65c: 1f 90 pop r1 1336 | 65e: 18 95 reti 1337 | 1338 | 00000660 : 1339 | pcint_null_callback(): 1340 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt.cpp:85 1341 | 1342 | #endif // PCINT_INCLUDE_FROM_CPP 1343 | 1344 | // useless function for weak implemented/not used functions, extern c needed for the alias 1345 | extern "C" { 1346 | void pcint_null_callback(void) { 1347 | 660: 08 95 ret 1348 | 1349 | 00000662 : 1350 | _Z29PinChangeInterruptEventPCINT0v(): 1351 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt0.cpp:99 1352 | } 1353 | */ 1354 | #if (PCINT_USE_PCINT0 == true) 1355 | volatile callback callbackPCINT0 = pcint_null_callback; 1356 | void PinChangeInterruptEventPCINT0(void) { 1357 | callbackPCINT0(); 1358 | 662: e0 91 86 00 lds r30, 0x0086 ; 0x800086 1359 | 666: f0 91 87 00 lds r31, 0x0087 ; 0x800087 1360 | 66a: 09 94 ijmp 1361 | 1362 | 0000066c : 1363 | _Z29PinChangeInterruptEventPCINT1v(): 1364 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt0.cpp:105 1365 | } 1366 | #endif 1367 | #if (PCINT_USE_PCINT1 == true) 1368 | volatile callback callbackPCINT1 = pcint_null_callback; 1369 | void PinChangeInterruptEventPCINT1(void) { 1370 | callbackPCINT1(); 1371 | 66c: e0 91 84 00 lds r30, 0x0084 ; 0x800084 1372 | 670: f0 91 85 00 lds r31, 0x0085 ; 0x800085 1373 | 674: 09 94 ijmp 1374 | 1375 | 00000676 : 1376 | _Z29PinChangeInterruptEventPCINT2v(): 1377 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt0.cpp:111 1378 | } 1379 | #endif 1380 | #if (PCINT_USE_PCINT2 == true) 1381 | volatile callback callbackPCINT2 = pcint_null_callback; 1382 | void PinChangeInterruptEventPCINT2(void) { 1383 | callbackPCINT2(); 1384 | 676: e0 91 82 00 lds r30, 0x0082 ; 0x800082 1385 | 67a: f0 91 83 00 lds r31, 0x0083 ; 0x800083 1386 | 67e: 09 94 ijmp 1387 | 1388 | 00000680 : 1389 | _Z29PinChangeInterruptEventPCINT3v(): 1390 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt0.cpp:117 1391 | } 1392 | #endif 1393 | #if (PCINT_USE_PCINT3 == true) 1394 | volatile callback callbackPCINT3 = pcint_null_callback; 1395 | void PinChangeInterruptEventPCINT3(void) { 1396 | callbackPCINT3(); 1397 | 680: e0 91 80 00 lds r30, 0x0080 ; 0x800080 1398 | 684: f0 91 81 00 lds r31, 0x0081 ; 0x800081 1399 | 688: 09 94 ijmp 1400 | 1401 | 0000068a : 1402 | _Z29PinChangeInterruptEventPCINT4v(): 1403 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt0.cpp:123 1404 | } 1405 | #endif 1406 | #if (PCINT_USE_PCINT4 == true) 1407 | volatile callback callbackPCINT4 = pcint_null_callback; 1408 | void PinChangeInterruptEventPCINT4(void) { 1409 | callbackPCINT4(); 1410 | 68a: e0 91 7e 00 lds r30, 0x007E ; 0x80007e 1411 | 68e: f0 91 7f 00 lds r31, 0x007F ; 0x80007f 1412 | 692: 09 94 ijmp 1413 | 1414 | 00000694 : 1415 | _Z29PinChangeInterruptEventPCINT5v(): 1416 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt0.cpp:129 1417 | } 1418 | #endif 1419 | #if (PCINT_USE_PCINT5 == true) 1420 | volatile callback callbackPCINT5 = pcint_null_callback; 1421 | void PinChangeInterruptEventPCINT5(void) { 1422 | callbackPCINT5(); 1423 | 694: e0 91 7c 00 lds r30, 0x007C ; 0x80007c 1424 | 698: f0 91 7d 00 lds r31, 0x007D ; 0x80007d 1425 | 69c: 09 94 ijmp 1426 | 1427 | 0000069e <__vector_2>: 1428 | __vector_2(): 1429 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt0.cpp:40 1430 | 1431 | void attachPinChangeInterrupt0(void) { 1432 | // fake function to make the IDE link this file 1433 | } 1434 | 1435 | ISR(PCINT0_vect) { 1436 | 69e: 1f 92 push r1 1437 | 6a0: 0f 92 push r0 1438 | 6a2: 0f b6 in r0, 0x3f ; 63 1439 | 6a4: 0f 92 push r0 1440 | 6a6: 11 24 eor r1, r1 1441 | 6a8: 2f 93 push r18 1442 | 6aa: 3f 93 push r19 1443 | 6ac: 4f 93 push r20 1444 | 6ae: 5f 93 push r21 1445 | 6b0: 6f 93 push r22 1446 | 6b2: 7f 93 push r23 1447 | 6b4: 8f 93 push r24 1448 | 6b6: 9f 93 push r25 1449 | 6b8: af 93 push r26 1450 | 6ba: bf 93 push r27 1451 | 6bc: cf 93 push r28 1452 | 6be: ef 93 push r30 1453 | 6c0: ff 93 push r31 1454 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt0.cpp:42 1455 | // get the new and old pin states for port 1456 | uint8_t newPort = PCINT_INPUT_PORT0; 1457 | 6c2: 26 b3 in r18, 0x16 ; 22 1458 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt0.cpp:46 1459 | 1460 | // compare with the old value to detect a rising or falling 1461 | uint8_t arrayPos = getArrayPosPCINT(0); 1462 | uint8_t change = newPort ^ oldPorts[arrayPos]; 1463 | 6c4: c0 91 99 00 lds r28, 0x0099 ; 0x800099 1464 | 6c8: 82 2f mov r24, r18 1465 | 6ca: 8c 27 eor r24, r28 1466 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt0.cpp:53 1467 | uint8_t falling = change & oldPorts[arrayPos]; 1468 | 1469 | // check which pins are triggered, compared with the settings 1470 | uint8_t risingTrigger = rising & risingPorts[arrayPos]; 1471 | uint8_t fallingTrigger = falling & fallingPorts[arrayPos]; 1472 | uint8_t trigger = risingTrigger | fallingTrigger; 1473 | 6cc: 90 91 97 00 lds r25, 0x0097 ; 0x800097 1474 | 6d0: 92 23 and r25, r18 1475 | 6d2: 30 91 98 00 lds r19, 0x0098 ; 0x800098 1476 | 6d6: c3 23 and r28, r19 1477 | 6d8: c9 2b or r28, r25 1478 | 6da: c8 23 and r28, r24 1479 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt0.cpp:56 1480 | 1481 | // save the new state for next comparison 1482 | oldPorts[arrayPos] = newPort; 1483 | 6dc: 20 93 99 00 sts 0x0099, r18 ; 0x800099 1484 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt0.cpp:63 1485 | // Execute all functions that should be triggered 1486 | // This way we can exclude a single function 1487 | // and the calling is also much faster 1488 | // We may also reorder the pins for different priority 1489 | #if !defined(PCINT_CALLBACK_PORT0) 1490 | PCINT_CALLBACK(0, 0); 1491 | 6e0: c0 fd sbrc r28, 0 1492 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt0.cpp:63 (discriminator 1) 1493 | 6e2: bf df rcall .-130 ; 0x662 1494 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt0.cpp:64 1495 | PCINT_CALLBACK(1, 1); 1496 | 6e4: c1 fd sbrc r28, 1 1497 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt0.cpp:64 (discriminator 1) 1498 | 6e6: c2 df rcall .-124 ; 0x66c 1499 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt0.cpp:65 1500 | PCINT_CALLBACK(2, 2); 1501 | 6e8: c2 fd sbrc r28, 2 1502 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt0.cpp:65 (discriminator 1) 1503 | 6ea: c5 df rcall .-118 ; 0x676 1504 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt0.cpp:66 1505 | PCINT_CALLBACK(3, 3); 1506 | 6ec: c3 fd sbrc r28, 3 1507 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt0.cpp:66 (discriminator 1) 1508 | 6ee: c8 df rcall .-112 ; 0x680 1509 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt0.cpp:67 1510 | PCINT_CALLBACK(4, 4); 1511 | 6f0: c4 fd sbrc r28, 4 1512 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt0.cpp:67 (discriminator 1) 1513 | 6f2: cb df rcall .-106 ; 0x68a 1514 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt0.cpp:68 1515 | PCINT_CALLBACK(5, 5); 1516 | 6f4: c5 fd sbrc r28, 5 1517 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt0.cpp:68 (discriminator 1) 1518 | 6f6: ce df rcall .-100 ; 0x694 1519 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt0.cpp:74 1520 | PCINT_CALLBACK(6, 6); 1521 | PCINT_CALLBACK(7, 7); 1522 | #else 1523 | PCINT_CALLBACK_PORT0 1524 | #endif 1525 | } 1526 | 6f8: ff 91 pop r31 1527 | 6fa: ef 91 pop r30 1528 | 6fc: cf 91 pop r28 1529 | 6fe: bf 91 pop r27 1530 | 700: af 91 pop r26 1531 | 702: 9f 91 pop r25 1532 | 704: 8f 91 pop r24 1533 | 706: 7f 91 pop r23 1534 | 708: 6f 91 pop r22 1535 | 70a: 5f 91 pop r21 1536 | 70c: 4f 91 pop r20 1537 | 70e: 3f 91 pop r19 1538 | 710: 2f 91 pop r18 1539 | 712: 0f 90 pop r0 1540 | 714: 0f be out 0x3f, r0 ; 63 1541 | 716: 0f 90 pop r0 1542 | 718: 1f 90 pop r1 1543 | 71a: 18 95 reti 1544 | 1545 | 0000071c : 1546 | _Z30enablePinChangeInterruptHelperhhh(): 1547 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt.cpp:101 1548 | uint8_t fallingPorts[PCINT_NUM_USED_PORTS] = { 0 }; 1549 | uint8_t risingPorts[PCINT_NUM_USED_PORTS] = { 0 }; 1550 | 1551 | void enablePinChangeInterruptHelper(const uint8_t pcintPort, const uint8_t pcintMask, const uint8_t arrayPos){ 1552 | // Update the old state to the actual state 1553 | switch(pcintPort){ 1554 | 71c: 81 11 cpse r24, r1 1555 | 71e: 06 c0 rjmp .+12 ; 0x72c 1556 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt.cpp:104 1557 | #ifdef PCINT_INPUT_PORT0_USED 1558 | case 0: 1559 | oldPorts[arrayPos] = PCINT_INPUT_PORT0; 1560 | 720: 96 b3 in r25, 0x16 ; 22 1561 | 722: e4 2f mov r30, r20 1562 | 724: f0 e0 ldi r31, 0x00 ; 0 1563 | 726: e7 56 subi r30, 0x67 ; 103 1564 | 728: ff 4f sbci r31, 0xFF ; 255 1565 | 72a: 90 83 st Z, r25 1566 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt.cpp:160 1567 | #endif 1568 | } 1569 | } 1570 | #endif 1571 | #elif defined(PCMSK) 1572 | *(&PCMSK + pcintPort) |= pcintMask; 1573 | 72c: e8 2f mov r30, r24 1574 | 72e: f0 e0 ldi r31, 0x00 ; 0 1575 | 730: 85 a9 ldd r24, Z+53 ; 0x35 1576 | 732: 68 2b or r22, r24 1577 | 734: 65 ab std Z+53, r22 ; 0x35 1578 | C:\Users\wesley.furuya\Documents\Arduino\libraries\PinChangeInterrupt-master\src/PinChangeInterrupt.cpp:171 1579 | #elif defined(GICR) /* e.g. ATmega162 */ 1580 | GICR |= (1 << (pcintPort + PCIE0)); 1581 | #elif defined(GIMSK) && defined(PCIE0) /* e.g. ATtiny X4 */ 1582 | GIMSK |= (1 << (pcintPort + PCIE0)); 1583 | #elif defined(GIMSK) && defined(PCIE) /* e.g. ATtiny X5 */ 1584 | GIMSK |= (1 << (pcintPort + PCIE)); 1585 | 736: 2b b7 in r18, 0x3b ; 59 1586 | 738: 35 96 adiw r30, 0x05 ; 5 1587 | 73a: 81 e0 ldi r24, 0x01 ; 1 1588 | 73c: 90 e0 ldi r25, 0x00 ; 0 1589 | 73e: 01 c0 rjmp .+2 ; 0x742 1590 | 740: 88 0f add r24, r24 1591 | 742: ea 95 dec r30 1592 | 744: ea f7 brpl .-6 ; 0x740 1593 | 746: 82 2b or r24, r18 1594 | 748: 8b bf out 0x3b, r24 ; 59 1595 | 74a: 08 95 ret 1596 | 1597 | 0000074c : 1598 | analogRead(): 1599 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring_analog.c:72 1600 | #ifndef ADCSRA 1601 | return digitalRead(analogInputToDigitalPin(pin)) ? 1023 : 0; //No ADC, so read as a digital pin instead. 1602 | #endif 1603 | 1604 | #if defined(ADMUX) 1605 | ADMUX = ((analog_reference & ADMUX_REFS_MASK) << REFS0) | ((pin & ADMUX_MUX_MASK) << MUX0); //select the channel and reference 1606 | 74c: 90 91 9a 00 lds r25, 0x009A ; 0x80009a 1607 | 750: 92 95 swap r25 1608 | 752: 99 0f add r25, r25 1609 | 754: 99 0f add r25, r25 1610 | 756: 90 7c andi r25, 0xC0 ; 192 1611 | 758: 8f 70 andi r24, 0x0F ; 15 1612 | 75a: 89 2b or r24, r25 1613 | 75c: 87 b9 out 0x07, r24 ; 7 1614 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring_analog.c:74 1615 | #if defined(REFS2) 1616 | ADMUX |= (((analog_reference & 0x04) >> 2) << REFS2); //some have an extra reference bit in a weird position. 1617 | 75e: 87 b1 in r24, 0x07 ; 7 1618 | 760: 90 91 9a 00 lds r25, 0x009A ; 0x80009a 1619 | 764: 92 fb bst r25, 2 1620 | 766: 22 27 eor r18, r18 1621 | 768: 20 f9 bld r18, 0 1622 | 76a: 30 e0 ldi r19, 0x00 ; 0 1623 | 76c: 94 e0 ldi r25, 0x04 ; 4 1624 | 76e: 22 0f add r18, r18 1625 | 770: 33 1f adc r19, r19 1626 | 772: 9a 95 dec r25 1627 | 774: e1 f7 brne .-8 ; 0x76e 1628 | 776: 28 2b or r18, r24 1629 | 778: 27 b9 out 0x07, r18 ; 7 1630 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring_analog.c:79 1631 | #endif 1632 | #endif 1633 | 1634 | #if defined(HAVE_ADC) && HAVE_ADC 1635 | sbi(ADCSRA, ADSC); //Start conversion 1636 | 77a: 36 9a sbi 0x06, 6 ; 6 1637 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring_analog.c:81 (discriminator 1) 1638 | 1639 | while(ADCSRA & (1< 1642 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring_analog.c:83 1643 | 1644 | uint8_t low = ADCL; 1645 | 780: 84 b1 in r24, 0x04 ; 4 1646 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring_analog.c:84 1647 | uint8_t high = ADCH; 1648 | 782: 25 b1 in r18, 0x05 ; 5 1649 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring_analog.c:85 1650 | return (high << 8) | low; 1651 | 784: 90 e0 ldi r25, 0x00 ; 0 1652 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring_analog.c:89 1653 | #else 1654 | return LOW; 1655 | #endif 1656 | } 1657 | 786: 92 2b or r25, r18 1658 | 788: 08 95 ret 1659 | 1660 | 0000078a : 1661 | turnOffPWM(): 1662 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring_digital.c:163 1663 | uint8_t oldSREG = SREG; 1664 | cli(); 1665 | *out |= bit; 1666 | SREG = oldSREG; 1667 | } 1668 | } 1669 | 78a: 81 30 cpi r24, 0x01 ; 1 1670 | 78c: 31 f4 brne .+12 ; 0x79a 1671 | 78e: 8a b5 in r24, 0x2a ; 42 1672 | 790: 8f 77 andi r24, 0x7F ; 127 1673 | 792: 8a bd out 0x2a, r24 ; 42 1674 | 794: 8a b5 in r24, 0x2a ; 42 1675 | 796: 8f 7b andi r24, 0xBF ; 191 1676 | 798: 07 c0 rjmp .+14 ; 0x7a8 1677 | 79a: 82 30 cpi r24, 0x02 ; 2 1678 | 79c: 39 f4 brne .+14 ; 0x7ac 1679 | 79e: 8a b5 in r24, 0x2a ; 42 1680 | 7a0: 8f 7d andi r24, 0xDF ; 223 1681 | 7a2: 8a bd out 0x2a, r24 ; 42 1682 | 7a4: 8a b5 in r24, 0x2a ; 42 1683 | 7a6: 8f 7e andi r24, 0xEF ; 239 1684 | 7a8: 8a bd out 0x2a, r24 ; 42 1685 | 7aa: 08 95 ret 1686 | 7ac: 83 30 cpi r24, 0x03 ; 3 1687 | 7ae: 39 f4 brne .+14 ; 0x7be 1688 | 7b0: 80 b7 in r24, 0x30 ; 48 1689 | 7b2: 8f 7d andi r24, 0xDF ; 223 1690 | 7b4: 80 bf out 0x30, r24 ; 48 1691 | 7b6: 80 b7 in r24, 0x30 ; 48 1692 | 7b8: 8f 7e andi r24, 0xEF ; 239 1693 | 7ba: 80 bf out 0x30, r24 ; 48 1694 | 7bc: 08 95 ret 1695 | 7be: 84 30 cpi r24, 0x04 ; 4 1696 | 7c0: 31 f4 brne .+12 ; 0x7ce 1697 | 7c2: 8c b5 in r24, 0x2c ; 44 1698 | 7c4: 8f 7d andi r24, 0xDF ; 223 1699 | 7c6: 8c bd out 0x2c, r24 ; 44 1700 | 7c8: 8c b5 in r24, 0x2c ; 44 1701 | 7ca: 8f 7e andi r24, 0xEF ; 239 1702 | 7cc: 8c bd out 0x2c, r24 ; 44 1703 | 7ce: 08 95 ret 1704 | 1705 | 000007d0 : 1706 | pinMode(): 1707 | 7d0: cf 93 push r28 1708 | 7d2: df 93 push r29 1709 | 7d4: 87 ff sbrs r24, 7 1710 | 7d6: 11 c0 rjmp .+34 ; 0x7fa 1711 | 7d8: 8f 77 andi r24, 0x7F ; 127 1712 | 7da: 41 f0 breq .+16 ; 0x7ec 1713 | 7dc: 81 30 cpi r24, 0x01 ; 1 1714 | 7de: 41 f0 breq .+16 ; 0x7f0 1715 | 7e0: 82 30 cpi r24, 0x02 ; 2 1716 | 7e2: 41 f0 breq .+16 ; 0x7f4 1717 | 7e4: 83 30 cpi r24, 0x03 ; 3 1718 | 7e6: 41 f0 breq .+16 ; 0x7f8 1719 | 7e8: 8f ef ldi r24, 0xFF ; 255 1720 | 7ea: 07 c0 rjmp .+14 ; 0x7fa 1721 | 7ec: 85 e0 ldi r24, 0x05 ; 5 1722 | 7ee: 05 c0 rjmp .+10 ; 0x7fa 1723 | 7f0: 82 e0 ldi r24, 0x02 ; 2 1724 | 7f2: 03 c0 rjmp .+6 ; 0x7fa 1725 | 7f4: 84 e0 ldi r24, 0x04 ; 4 1726 | 7f6: 01 c0 rjmp .+2 ; 0x7fa 1727 | 7f8: 83 e0 ldi r24, 0x03 ; 3 1728 | 7fa: 90 e0 ldi r25, 0x00 ; 0 1729 | 7fc: fc 01 movw r30, r24 1730 | 7fe: ec 5d subi r30, 0xDC ; 220 1731 | 800: ff 4f sbci r31, 0xFF ; 255 1732 | 802: 24 91 lpm r18, Z 1733 | 804: fc 01 movw r30, r24 1734 | 806: e6 5d subi r30, 0xD6 ; 214 1735 | 808: ff 4f sbci r31, 0xFF ; 255 1736 | 80a: 84 91 lpm r24, Z 1737 | 80c: 88 23 and r24, r24 1738 | 80e: 61 f1 breq .+88 ; 0x868 1739 | 810: 90 e0 ldi r25, 0x00 ; 0 1740 | 812: 88 0f add r24, r24 1741 | 814: 99 1f adc r25, r25 1742 | 816: fc 01 movw r30, r24 1743 | 818: e4 5c subi r30, 0xC4 ; 196 1744 | 81a: ff 4f sbci r31, 0xFF ; 255 1745 | 81c: c5 91 lpm r28, Z+ 1746 | 81e: d4 91 lpm r29, Z 1747 | 820: fc 01 movw r30, r24 1748 | 822: ea 5c subi r30, 0xCA ; 202 1749 | 824: ff 4f sbci r31, 0xFF ; 255 1750 | 826: a5 91 lpm r26, Z+ 1751 | 828: b4 91 lpm r27, Z 1752 | 82a: 61 11 cpse r22, r1 1753 | 82c: 09 c0 rjmp .+18 ; 0x840 1754 | 82e: 9f b7 in r25, 0x3f ; 63 1755 | 830: f8 94 cli 1756 | 832: 88 81 ld r24, Y 1757 | 834: 20 95 com r18 1758 | 836: 82 23 and r24, r18 1759 | 838: 88 83 st Y, r24 1760 | 83a: ec 91 ld r30, X 1761 | 83c: 2e 23 and r18, r30 1762 | 83e: 0b c0 rjmp .+22 ; 0x856 1763 | 840: 62 30 cpi r22, 0x02 ; 2 1764 | 842: 61 f4 brne .+24 ; 0x85c 1765 | 844: 9f b7 in r25, 0x3f ; 63 1766 | 846: f8 94 cli 1767 | 848: 88 81 ld r24, Y 1768 | 84a: 32 2f mov r19, r18 1769 | 84c: 30 95 com r19 1770 | 84e: 83 23 and r24, r19 1771 | 850: 88 83 st Y, r24 1772 | 852: ec 91 ld r30, X 1773 | 854: 2e 2b or r18, r30 1774 | 856: 2c 93 st X, r18 1775 | 858: 9f bf out 0x3f, r25 ; 63 1776 | 85a: 06 c0 rjmp .+12 ; 0x868 1777 | 85c: 8f b7 in r24, 0x3f ; 63 1778 | 85e: f8 94 cli 1779 | 860: e8 81 ld r30, Y 1780 | 862: 2e 2b or r18, r30 1781 | 864: 28 83 st Y, r18 1782 | 866: 8f bf out 0x3f, r24 ; 63 1783 | 868: df 91 pop r29 1784 | 86a: cf 91 pop r28 1785 | 86c: 08 95 ret 1786 | 1787 | 0000086e : 1788 | digitalRead(): 1789 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring_digital.c:166 1790 | 1791 | int digitalRead(uint8_t pin) 1792 | { 1793 | 86e: cf 93 push r28 1794 | 870: df 93 push r29 1795 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring_digital.c:167 1796 | if (pin&128) {pin=analogInputToDigitalPin((pin&127));} 1797 | 872: 87 ff sbrs r24, 7 1798 | 874: 11 c0 rjmp .+34 ; 0x898 1799 | 876: 8f 77 andi r24, 0x7F ; 127 1800 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring_digital.c:167 (discriminator 1) 1801 | 878: 41 f0 breq .+16 ; 0x88a 1802 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring_digital.c:167 (discriminator 2) 1803 | 87a: 81 30 cpi r24, 0x01 ; 1 1804 | 87c: 41 f0 breq .+16 ; 0x88e 1805 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring_digital.c:167 (discriminator 4) 1806 | 87e: 82 30 cpi r24, 0x02 ; 2 1807 | 880: 41 f0 breq .+16 ; 0x892 1808 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring_digital.c:167 (discriminator 6) 1809 | 882: 83 30 cpi r24, 0x03 ; 3 1810 | 884: 41 f0 breq .+16 ; 0x896 1811 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring_digital.c:167 1812 | 886: 8f ef ldi r24, 0xFF ; 255 1813 | 888: 07 c0 rjmp .+14 ; 0x898 1814 | 88a: 85 e0 ldi r24, 0x05 ; 5 1815 | 88c: 05 c0 rjmp .+10 ; 0x898 1816 | 88e: 82 e0 ldi r24, 0x02 ; 2 1817 | 890: 03 c0 rjmp .+6 ; 0x898 1818 | 892: 84 e0 ldi r24, 0x04 ; 4 1819 | 894: 01 c0 rjmp .+2 ; 0x898 1820 | 896: 83 e0 ldi r24, 0x03 ; 3 1821 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring_digital.c:168 1822 | uint8_t timer = digitalPinToTimer(pin); 1823 | 898: 28 2f mov r18, r24 1824 | 89a: 30 e0 ldi r19, 0x00 ; 0 1825 | 89c: f9 01 movw r30, r18 1826 | 89e: e2 5e subi r30, 0xE2 ; 226 1827 | 8a0: ff 4f sbci r31, 0xFF ; 255 1828 | 8a2: 84 91 lpm r24, Z 1829 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring_digital.c:169 1830 | uint8_t bit = digitalPinToBitMask(pin); 1831 | 8a4: f9 01 movw r30, r18 1832 | 8a6: ec 5d subi r30, 0xDC ; 220 1833 | 8a8: ff 4f sbci r31, 0xFF ; 255 1834 | 8aa: d4 91 lpm r29, Z 1835 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring_digital.c:170 1836 | uint8_t port = digitalPinToPort(pin); 1837 | 8ac: f9 01 movw r30, r18 1838 | 8ae: e6 5d subi r30, 0xD6 ; 214 1839 | 8b0: ff 4f sbci r31, 0xFF ; 255 1840 | 8b2: c4 91 lpm r28, Z 1841 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring_digital.c:172 1842 | 1843 | if (port == NOT_A_PIN) return LOW; 1844 | 8b4: cc 23 and r28, r28 1845 | 8b6: 89 f0 breq .+34 ; 0x8da 1846 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring_digital.c:176 1847 | 1848 | // If the pin that support PWM output, we need to turn it off 1849 | // before getting a digital reading. 1850 | if (timer != NOT_ON_TIMER) turnOffPWM(timer); 1851 | 8b8: 81 11 cpse r24, r1 1852 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring_digital.c:176 (discriminator 1) 1853 | 8ba: 67 df rcall .-306 ; 0x78a 1854 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring_digital.c:178 1855 | 1856 | if (*portInputRegister(port) & bit) return HIGH; 1857 | 8bc: ec 2f mov r30, r28 1858 | 8be: f0 e0 ldi r31, 0x00 ; 0 1859 | 8c0: ee 0f add r30, r30 1860 | 8c2: ff 1f adc r31, r31 1861 | 8c4: e0 5d subi r30, 0xD0 ; 208 1862 | 8c6: ff 4f sbci r31, 0xFF ; 255 1863 | 8c8: a5 91 lpm r26, Z+ 1864 | 8ca: b4 91 lpm r27, Z 1865 | 8cc: ec 91 ld r30, X 1866 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring_digital.c:172 1867 | if (pin&128) {pin=analogInputToDigitalPin((pin&127));} 1868 | uint8_t timer = digitalPinToTimer(pin); 1869 | uint8_t bit = digitalPinToBitMask(pin); 1870 | uint8_t port = digitalPinToPort(pin); 1871 | 1872 | if (port == NOT_A_PIN) return LOW; 1873 | 8ce: ed 23 and r30, r29 1874 | 8d0: 81 e0 ldi r24, 0x01 ; 1 1875 | 8d2: 90 e0 ldi r25, 0x00 ; 0 1876 | 8d4: 21 f4 brne .+8 ; 0x8de 1877 | 8d6: 80 e0 ldi r24, 0x00 ; 0 1878 | 8d8: 02 c0 rjmp .+4 ; 0x8de 1879 | 8da: 80 e0 ldi r24, 0x00 ; 0 1880 | 8dc: 90 e0 ldi r25, 0x00 ; 0 1881 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring_digital.c:180 1882 | // before getting a digital reading. 1883 | if (timer != NOT_ON_TIMER) turnOffPWM(timer); 1884 | 1885 | if (*portInputRegister(port) & bit) return HIGH; 1886 | return LOW; 1887 | } 1888 | 8de: df 91 pop r29 1889 | 8e0: cf 91 pop r28 1890 | 8e2: 08 95 ret 1891 | 1892 | 000008e4
: 1893 | main(): 1894 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/main.cpp:6 1895 | #include 1896 | 1897 | int main(void) 1898 | { 1899 | #ifdef TUNED_OSCCAL_VALUE 1900 | OSCCAL = TUNED_OSCCAL_VALUE; //set the oscillator calibration value based on the pins_arduino.h file. If this is not set, it will be optimised away 1901 | 8e4: 81 b7 in r24, 0x31 ; 49 1902 | 8e6: 81 bf out 0x31, r24 ; 49 1903 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/main.cpp:8 1904 | #endif 1905 | init(); 1906 | 8e8: 5c d0 rcall .+184 ; 0x9a2 1907 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/main.cpp:10 1908 | 1909 | setup(); 1910 | 8ea: 95 dc rcall .-1750 ; 0x216 1911 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/main.cpp:13 (discriminator 1) 1912 | 1913 | for (;;) 1914 | loop(); 1915 | 8ec: ce db rcall .-2148 ; 0x8a 1916 | 8ee: fe cf rjmp .-4 ; 0x8ec 1917 | 1918 | 000008f0 : 1919 | initToneTimerInternal(): 1920 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring.c:590 1921 | PLLCSR |= PCKE; 1922 | } 1923 | #endif 1924 | #if INITIALIZE_SECONDARY_TIMERS 1925 | // Prepare the timer for PWM 1926 | initToneTimerInternal(); 1927 | 8f0: 80 b7 in r24, 0x30 ; 48 1928 | 8f2: 80 7f andi r24, 0xF0 ; 240 1929 | 8f4: 80 bf out 0x30, r24 ; 48 1930 | 8f6: 80 b7 in r24, 0x30 ; 48 1931 | 8f8: 80 68 ori r24, 0x80 ; 128 1932 | 8fa: 80 bf out 0x30, r24 ; 48 1933 | 8fc: 8c b5 in r24, 0x2c ; 44 1934 | 8fe: 80 64 ori r24, 0x40 ; 64 1935 | 900: 8c bd out 0x2c, r24 ; 44 1936 | 902: 8f ef ldi r24, 0xFF ; 255 1937 | 904: 8d bd out 0x2d, r24 ; 45 1938 | 906: 80 b7 in r24, 0x30 ; 48 1939 | 908: 87 60 ori r24, 0x07 ; 7 1940 | 90a: 80 bf out 0x30, r24 ; 48 1941 | 90c: 08 95 ret 1942 | 1943 | 0000090e <__vector_5>: 1944 | __vector_5(): 1945 | 90e: 1f 92 push r1 1946 | 910: 0f 92 push r0 1947 | 912: 0f b6 in r0, 0x3f ; 63 1948 | 914: 0f 92 push r0 1949 | 916: 11 24 eor r1, r1 1950 | 918: 2f 93 push r18 1951 | 91a: 3f 93 push r19 1952 | 91c: 8f 93 push r24 1953 | 91e: 9f 93 push r25 1954 | 920: af 93 push r26 1955 | 922: bf 93 push r27 1956 | 924: 80 91 9c 00 lds r24, 0x009C ; 0x80009c 1957 | 928: 90 91 9d 00 lds r25, 0x009D ; 0x80009d 1958 | 92c: a0 91 9e 00 lds r26, 0x009E ; 0x80009e 1959 | 930: b0 91 9f 00 lds r27, 0x009F ; 0x80009f 1960 | 934: 30 91 9b 00 lds r19, 0x009B ; 0x80009b 1961 | 938: 26 e0 ldi r18, 0x06 ; 6 1962 | 93a: 23 0f add r18, r19 1963 | 93c: 2d 37 cpi r18, 0x7D ; 125 1964 | 93e: 30 f0 brcs .+12 ; 0x94c <__vector_5+0x3e> 1965 | 940: 29 e8 ldi r18, 0x89 ; 137 1966 | 942: 23 0f add r18, r19 1967 | 944: 03 96 adiw r24, 0x03 ; 3 1968 | 946: a1 1d adc r26, r1 1969 | 948: b1 1d adc r27, r1 1970 | 94a: 03 c0 rjmp .+6 ; 0x952 <__vector_5+0x44> 1971 | 94c: 02 96 adiw r24, 0x02 ; 2 1972 | 94e: a1 1d adc r26, r1 1973 | 950: b1 1d adc r27, r1 1974 | 952: 20 93 9b 00 sts 0x009B, r18 ; 0x80009b 1975 | 956: 80 93 9c 00 sts 0x009C, r24 ; 0x80009c 1976 | 95a: 90 93 9d 00 sts 0x009D, r25 ; 0x80009d 1977 | 95e: a0 93 9e 00 sts 0x009E, r26 ; 0x80009e 1978 | 962: b0 93 9f 00 sts 0x009F, r27 ; 0x80009f 1979 | 966: 80 91 a0 00 lds r24, 0x00A0 ; 0x8000a0 1980 | 96a: 90 91 a1 00 lds r25, 0x00A1 ; 0x8000a1 1981 | 96e: a0 91 a2 00 lds r26, 0x00A2 ; 0x8000a2 1982 | 972: b0 91 a3 00 lds r27, 0x00A3 ; 0x8000a3 1983 | 976: 01 96 adiw r24, 0x01 ; 1 1984 | 978: a1 1d adc r26, r1 1985 | 97a: b1 1d adc r27, r1 1986 | 97c: 80 93 a0 00 sts 0x00A0, r24 ; 0x8000a0 1987 | 980: 90 93 a1 00 sts 0x00A1, r25 ; 0x8000a1 1988 | 984: a0 93 a2 00 sts 0x00A2, r26 ; 0x8000a2 1989 | 988: b0 93 a3 00 sts 0x00A3, r27 ; 0x8000a3 1990 | 98c: bf 91 pop r27 1991 | 98e: af 91 pop r26 1992 | 990: 9f 91 pop r25 1993 | 992: 8f 91 pop r24 1994 | 994: 3f 91 pop r19 1995 | 996: 2f 91 pop r18 1996 | 998: 0f 90 pop r0 1997 | 99a: 0f be out 0x3f, r0 ; 63 1998 | 99c: 0f 90 pop r0 1999 | 99e: 1f 90 pop r1 2000 | 9a0: 18 95 reti 2001 | 2002 | 000009a2 : 2003 | init(): 2004 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring.c:753 2005 | #endif 2006 | #endif 2007 | 2008 | // Use the Millis Timer for fast PWM (unless it doesn't have an output). 2009 | #if (TIMER_TO_USE_FOR_MILLIS == 0) && defined(WGM01) 2010 | sbi(TCCR0A, WGM01); 2011 | 9a2: 8a b5 in r24, 0x2a ; 42 2012 | 9a4: 82 60 ori r24, 0x02 ; 2 2013 | 9a6: 8a bd out 0x2a, r24 ; 42 2014 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring.c:754 2015 | sbi(TCCR0A, WGM00); 2016 | 9a8: 8a b5 in r24, 0x2a ; 42 2017 | 9aa: 81 60 ori r24, 0x01 ; 1 2018 | 9ac: 8a bd out 0x2a, r24 ; 42 2019 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring.c:777 2020 | #endif 2021 | 2022 | // Millis timer is always processor clock divided by MillisTimer_Prescale_Value (64) 2023 | #if (TIMER_TO_USE_FOR_MILLIS == 0) 2024 | #ifdef TCCR0B 2025 | TCCR0B = (TCCR0B & ~((1< 2054 | C:\Users\wesley.furuya\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.2.3\cores\tiny/wiring.c:813 2055 | 2056 | // Initialize the ADC 2057 | #if defined( INITIALIZE_ANALOG_TO_DIGITAL_CONVERTER ) && INITIALIZE_ANALOG_TO_DIGITAL_CONVERTER 2058 | #if defined(ADCSRA) 2059 | // set a2d prescale factor 2060 | ADCSRA = (ADCSRA & ~((1<: 2072 | eeprom_read_byte(): 2073 | 9cc: e1 99 sbic 0x1c, 1 ; 28 2074 | 9ce: fe cf rjmp .-4 ; 0x9cc 2075 | 9d0: 9f bb out 0x1f, r25 ; 31 2076 | 9d2: 8e bb out 0x1e, r24 ; 30 2077 | 9d4: e0 9a sbi 0x1c, 0 ; 28 2078 | 9d6: 99 27 eor r25, r25 2079 | 9d8: 8d b3 in r24, 0x1d ; 29 2080 | 9da: 08 95 ret 2081 | 2082 | 000009dc : 2083 | eeprom_write_byte(): 2084 | 9dc: 26 2f mov r18, r22 2085 | 2086 | 000009de : 2087 | 9de: e1 99 sbic 0x1c, 1 ; 28 2088 | 9e0: fe cf rjmp .-4 ; 0x9de 2089 | 9e2: 1c ba out 0x1c, r1 ; 28 2090 | 9e4: 9f bb out 0x1f, r25 ; 31 2091 | 9e6: 8e bb out 0x1e, r24 ; 30 2092 | 9e8: 2d bb out 0x1d, r18 ; 29 2093 | 9ea: 0f b6 in r0, 0x3f ; 63 2094 | 9ec: f8 94 cli 2095 | 9ee: e2 9a sbi 0x1c, 2 ; 28 2096 | 9f0: e1 9a sbi 0x1c, 1 ; 28 2097 | 9f2: 0f be out 0x3f, r0 ; 63 2098 | 9f4: 01 96 adiw r24, 0x01 ; 1 2099 | 9f6: 08 95 ret 2100 | 2101 | 000009f8 <_exit>: 2102 | exit(): 2103 | /home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr25/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2279 2104 | 9f8: f8 94 cli 2105 | 2106 | 000009fa <__stop_program>: 2107 | __stop_program(): 2108 | /home/jenkins-mingw32/workspace/avr-gcc-staging/label/Ubuntu14.04x64-mingw32/gcc-build/avr/avr25/libgcc/../../../../gcc/libgcc/config/avr/lib1funcs.S:2281 2109 | 9fa: ff cf rjmp .-2 ; 0x9fa <__stop_program> 2110 | -------------------------------------------------------------------------------- /Firmware/ATtiny85 Firmware/Qwiic_Joystick_v26/interrupts.ino: -------------------------------------------------------------------------------- 1 | //Turn on interrupt for the button 2 | void setupInterrupts() 3 | { 4 | //Attach interrupt to button 5 | #if defined(__AVR_ATmega328P__) 6 | attachInterrupt(digitalPinToInterrupt(Button_Pin), buttonInterrupt, CHANGE); 7 | 8 | #elif defined(__AVR_ATtiny85__) 9 | attachPCINT(digitalPinToPCINT(Button_Pin), buttonInterrupt, CHANGE); 10 | #endif 11 | } 12 | 13 | 14 | //Called any time the pin changes state 15 | void buttonInterrupt() 16 | { 17 | if (digitalRead(Button_Pin) == LOW) //User has released the button, we have completed a click cycle 18 | { 19 | registerMap.Button_Status = 1; //Set the clicked bit 20 | } 21 | } 22 | 23 | 24 | //Called every time the joystick is moved 25 | void updateJoystick() { 26 | //Bring up ADC 27 | ADCSRA |= (1 << ADEN); 28 | 29 | int X_Pot = analogRead(Horizontal_Pin); 30 | int Y_Pot = analogRead(Vertical_Pin); 31 | 32 | //Convert int value to a 16-bit integer by bitshitting it left by 6. 33 | //Example- 34 | //DEC: 630 35 | //BIN: 1001110110 36 | //Bitshift by 6: 1001110110000000 37 | uint16_t X_unit16 = X_Pot<<6; 38 | uint16_t Y_unit16 = Y_Pot<<6; 39 | 40 | //Split the bitshifted word into the MSB and LSB parts 41 | //Continuing from the example above... 42 | //DEC: 630 43 | //BIN: 10011101 10 44 | //Bitshift by 6: 10011101 10000000 45 | //Split: 10011101 | 10000000 46 | 47 | byte * bytePointer; 48 | 49 | bytePointer = (byte*)&X_unit16; 50 | registerMap.X_MSB = bytePointer[1]; 51 | registerMap.X_LSB = bytePointer[0]; 52 | 53 | bytePointer = (byte*)&Y_unit16; 54 | registerMap.Y_MSB = bytePointer[1]; 55 | registerMap.Y_LSB = bytePointer[0]; 56 | 57 | //Shut off ADC 58 | ADCSRA &= ~(1 << ADEN); 59 | } 60 | 61 | 62 | //When Qwiic Joystick receives data bytes from Master, this function is called as an interrupt 63 | //(Serves rewritable I2C address) 64 | void receiveEvent(int numberOfBytesReceived) 65 | { 66 | //TinySerial.println("Start RX Event"); //Debug message 67 | registerNumber = Wire.read(); //Get the memory map offset from the user 68 | //TinySerial.println(" Read 4 Register"); //Debug message 69 | 70 | 71 | 72 | //Begin recording the following incoming bytes to the temp memory map 73 | //starting at the registerNumber (the first byte received) 74 | for (byte x = 0 ; x < numberOfBytesReceived - 1 ; x++) 75 | { 76 | byte temp = Wire.read(); //We might record it, we might throw it away 77 | 78 | if ( (x + registerNumber) < sizeof(memoryMap)) 79 | { 80 | //Clense the incoming byte against the read only protected bits 81 | //Store the result into the register map 82 | *(registerPointer + registerNumber + x) &= ~*(protectionPointer + registerNumber + x); //Clear this register if needed 83 | *(registerPointer + registerNumber + x) |= temp & *(protectionPointer + registerNumber + x); //Or in the user's request (clensed against protection bits) 84 | } 85 | } 86 | //TinySerial.println(" Read 4 Data"); //Debug message 87 | recordSystemSettings(); 88 | //TinySerial.println(" Data Saved"); //Debug message 89 | } 90 | 91 | 92 | //Respond to GET commands 93 | //When Qwiic Joystick gets a request for data from the user, this function is called as an interrupt 94 | //The interrupt will respond with bytes starting from the last byte the user sent to us 95 | //While we are sending bytes we may have to do some calculations 96 | void requestEvent() 97 | { 98 | updateJoystick(); 99 | registerMap.Button_State = digitalRead(Button_Pin); 100 | 101 | //This will write the entire contents of the register map struct starting from 102 | //the register the user requested, and when it reaches the end the master 103 | //will read 0xFFs. 104 | Wire.write((registerPointer + registerNumber), sizeof(memoryMap) - registerNumber); 105 | } 106 | -------------------------------------------------------------------------------- /Firmware/ATtiny85 Firmware/Qwiic_Joystick_v26/nvm.h: -------------------------------------------------------------------------------- 1 | //Location in EEPROM for each thing we want to store between power cycles 2 | enum eepromLocations { 3 | LOCATION_I2C_ADDRESS = 0, //Device's address 4 | LOCATION_FIRMWARE_MAJOR, 5 | LOCATION_FIRMWARE_MINOR, 6 | //LOCATION_X_POS, 7 | //LOCATION_Y_POS, 8 | }; 9 | 10 | //Defaults for the I2C address 11 | const byte I2C_ADDRESS_DEFAULT = 0x20; 12 | -------------------------------------------------------------------------------- /Firmware/Python Examples/Example 1 - Basic Readings/Qwiic_Joystick.py: -------------------------------------------------------------------------------- 1 | import smbus, time 2 | bus = smbus.SMBus(1) 3 | addr = 0x20 4 | 5 | def main(): 6 | global bus_data, X, Y 7 | while True: 8 | qwiicjoystick() 9 | 10 | 11 | def qwiicjoystick(): 12 | global bus_data, X, Y 13 | 14 | 15 | try: 16 | bus_data = bus.read_i2c_block_data(addr, 0x03, 5) 17 | #X_MSB = bus.read_byte_data(addr, 0x03) # Reads MSB for horizontal joystick position 18 | #X_LSB = bus.read_byte_data(addr, 0x04) # Reads LSB for horizontal joystick position 19 | 20 | #Y_MSB = bus.read_byte_data(addr, 0x05) # Reads MSB for vertical joystick position 21 | #Y_LSB = bus.read_byte_data(addr, 0x06) # Reads LSB for vertical joystick position 22 | 23 | #Select_Button = bus.read_byte_data(addr, 0x07) # Reads button position 24 | except Exception as e: 25 | print(e) 26 | 27 | X = (bus_data[0]<<8 | bus_data[1])>>6 28 | Y = (bus_data[2]<<8 | bus_data[3])>>6 29 | 30 | print(X, Y, " Button = ", bus_data[4]) 31 | 32 | time.sleep(.05) 33 | #if X < 450: 34 | #direction = RIGHT 35 | #elif 575 < X: 36 | #direction = LEFT 37 | 38 | 39 | #if Y< 450: 40 | #direction = DOWN 41 | #elif 575 < Y: 42 | #direction = UP 43 | 44 | #if Select_Button == 1: 45 | #terminate() 46 | 47 | if __name__ == '__main__': 48 | main() 49 | -------------------------------------------------------------------------------- /Firmware/Python Examples/Example 2 - Snake Game/Pixel-flame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparkfun/Qwiic_Joystick/872ce30c7db70375220e67d78398a19f7c60b9ab/Firmware/Python Examples/Example 2 - Snake Game/Pixel-flame.png -------------------------------------------------------------------------------- /Firmware/Python Examples/Example 2 - Snake Game/snakedemo.py: -------------------------------------------------------------------------------- 1 | # Wormy (a Nibbles clone) 2 | # By Al Sweigart al@inventwithpython.com 3 | # http://inventwithpython.com/pygame 4 | # Released under a "Simplified BSD" license 5 | 6 | #KRT 14/06/2012 modified Start Screen and Game Over screen to cope with mouse events 7 | #KRT 14/06/2012 Added a non-busy wait to Game Over screen to reduce processor loading from near 100% 8 | import random, pygame, sys, smbus, time 9 | from pygame.locals import * 10 | 11 | FPS = 15 12 | MULTIPLIER = 18 13 | WINDOWWIDTH = 96*MULTIPLIER 14 | WINDOWHEIGHT = 54*MULTIPLIER 15 | CELLSIZE = 3*MULTIPLIER 16 | assert WINDOWWIDTH % CELLSIZE == 0, "Window width must be a multiple of cell size." 17 | assert WINDOWHEIGHT % CELLSIZE == 0, "Window height must be a multiple of cell size." 18 | CELLWIDTH = int(WINDOWWIDTH / CELLSIZE) 19 | CELLHEIGHT = int(WINDOWHEIGHT / CELLSIZE) 20 | 21 | 22 | # R G B 23 | WHITE = (255, 255, 255) 24 | BLACK = ( 0, 0, 0) 25 | RED = (255, 0, 0) 26 | DARKRED = (155, 0, 0) 27 | GREEN = ( 0, 255, 0) 28 | DARKGREEN = ( 0, 155, 0) 29 | DARKGRAY = ( 40, 40, 40) 30 | BGCOLOR = BLACK 31 | 32 | UP = 'up' 33 | DOWN = 'down' 34 | LEFT = 'left' 35 | RIGHT = 'right' 36 | 37 | HEAD = 0 # syntactic sugar: index of the worm's head 38 | 39 | def main(): 40 | global FPSCLOCK, DISPLAYSURF, BASICFONT, flamecell, bus_data, X, Y 41 | 42 | pygame.init() 43 | FPSCLOCK = pygame.time.Clock() 44 | DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT)) 45 | BASICFONT = pygame.font.Font('freesansbold.ttf', 18) 46 | pygame.display.set_caption('Snake- Qwiic Joystick') 47 | flamefile = 'Pixel-flame.png' 48 | flame = pygame.image.load(flamefile).convert_alpha() 49 | flamecell = pygame.transform.scale(flame,(CELLSIZE,CELLSIZE)) 50 | 51 | showStartScreen() 52 | while True: 53 | runGame() 54 | showGameOverScreen() 55 | 56 | 57 | def runGame(): 58 | global bus_data, X, Y 59 | 60 | ## I2C bus start 61 | bus = smbus.SMBus(1) 62 | addr = 0x20 63 | 64 | 65 | # Set a random start point. 66 | startx = random.randint(5, CELLWIDTH - 6) 67 | starty = random.randint(5, CELLHEIGHT - 6) 68 | wormCoords = [{'x': startx, 'y': starty}, 69 | {'x': startx - 1, 'y': starty}, 70 | {'x': startx - 2, 'y': starty}] 71 | direction = RIGHT 72 | 73 | # Start the apple in a random place. 74 | apple = getRandomLocation() 75 | 76 | 77 | while True: # main game loop 78 | for event in pygame.event.get(): # event handling loop 79 | if event.type == QUIT: 80 | terminate() 81 | elif event.type == KEYDOWN: 82 | if (event.key == K_LEFT or event.key == K_a) and direction != RIGHT: 83 | direction = LEFT 84 | elif (event.key == K_RIGHT or event.key == K_d) and direction != LEFT: 85 | direction = RIGHT 86 | elif (event.key == K_UP or event.key == K_w) and direction != DOWN: 87 | direction = UP 88 | elif (event.key == K_DOWN or event.key == K_s) and direction != UP: 89 | direction = DOWN 90 | elif event.key == K_ESCAPE: 91 | terminate() 92 | 93 | # Reads Qwiic Joystick 94 | try: 95 | bus_data = bus.read_i2c_block_data(addr, 0x03, 5) 96 | except Exception as e: 97 | print(e) 98 | X = (bus_data[0]<<8 | bus_data[1])>>6 99 | Y = (bus_data[2]<<8 | bus_data[3])>>6 100 | if X < 450: 101 | direction = RIGHT 102 | elif 575 < X: 103 | direction = LEFT 104 | elif Y < 450: 105 | direction = DOWN 106 | elif 575 < Y: 107 | direction = UP 108 | 109 | 110 | # check if the worm has hit itself or the edge 111 | if wormCoords[HEAD]['x'] == -1 or wormCoords[HEAD]['x'] == CELLWIDTH or wormCoords[HEAD]['y'] == -1 or wormCoords[HEAD]['y'] == CELLHEIGHT: 112 | return # game over 113 | for wormBody in wormCoords[1:]: 114 | if wormBody['x'] == wormCoords[HEAD]['x'] and wormBody['y'] == wormCoords[HEAD]['y']: 115 | return # game over 116 | 117 | # check if worm has eaten an apply 118 | if wormCoords[HEAD]['x'] == apple['x'] and wormCoords[HEAD]['y'] == apple['y']: 119 | # don't remove worm's tail segment 120 | apple = getRandomLocation() # set a new apple somewhere 121 | else: 122 | del wormCoords[-1] # remove worm's tail segment 123 | 124 | 125 | # move the worm by adding a segment in the direction it is moving 126 | if direction == UP: 127 | newHead = {'x': wormCoords[HEAD]['x'], 'y': wormCoords[HEAD]['y'] - 1} 128 | elif direction == DOWN: 129 | newHead = {'x': wormCoords[HEAD]['x'], 'y': wormCoords[HEAD]['y'] + 1} 130 | elif direction == LEFT: 131 | newHead = {'x': wormCoords[HEAD]['x'] - 1, 'y': wormCoords[HEAD]['y']} 132 | elif direction == RIGHT: 133 | newHead = {'x': wormCoords[HEAD]['x'] + 1, 'y': wormCoords[HEAD]['y']} 134 | wormCoords.insert(0, newHead) 135 | DISPLAYSURF.fill(BGCOLOR) 136 | drawGrid() 137 | drawWorm(wormCoords) 138 | drawApple(apple) 139 | drawScore(len(wormCoords) - 3) 140 | pygame.display.update() 141 | FPSCLOCK.tick(FPS) 142 | 143 | def drawPressKeyMsg(): 144 | pressKeySurf = BASICFONT.render('Press a key to play.', True, DARKGRAY) 145 | pressKeyRect = pressKeySurf.get_rect() 146 | pressKeyRect.topleft = (WINDOWWIDTH - 20*MULTIPLIER, WINDOWHEIGHT - 3*MULTIPLIER) 147 | DISPLAYSURF.blit(pressKeySurf, pressKeyRect) 148 | 149 | 150 | 151 | # KRT 14/06/2012 rewrite event detection to deal with mouse use 152 | def checkForKeyPress(): 153 | global bus_data 154 | 155 | for event in pygame.event.get(): 156 | if event.type == QUIT: #event is quit 157 | terminate() 158 | elif event.type == KEYDOWN: 159 | if event.key == K_ESCAPE: #event is escape key 160 | terminate() 161 | else: 162 | return event.key #key found return with it 163 | # no quit or key events in queue so return None 164 | 165 | ## I2C bus start 166 | bus = smbus.SMBus(1) 167 | addr = 0x20 168 | 169 | # Reads Qwiic Joystick 170 | try: 171 | bus_data = bus.read_i2c_block_data(addr, 0x03, 5) 172 | except Exception as e: 173 | print(e) 174 | 175 | if bus_data[4] == 0: 176 | return True 177 | 178 | return None 179 | 180 | 181 | def showStartScreen(): 182 | #titleFont = pygame.font.Font('freesansbold.ttf', 10*MULTIPLIER) 183 | #titleSurf1 = titleFont.render('Wormy!', True, WHITE, DARKGREEN) 184 | #titleSurf2 = titleFont.render('Wormy!', True, GREEN) 185 | 186 | #degrees1 = 0 187 | #degrees2 = 0 188 | 189 | #KRT 14/06/2012 rewrite event detection to deal with mouse use 190 | pygame.event.get() #clear out event queue 191 | 192 | while True: 193 | #DISPLAYSURF.fill(BGCOLOR) 194 | #rotatedSurf1 = pygame.transform.rotate(titleSurf1, degrees1) 195 | #rotatedRect1 = rotatedSurf1.get_rect() 196 | #rotatedRect1.center = (WINDOWWIDTH / 2, WINDOWHEIGHT / 2) 197 | #DISPLAYSURF.blit(rotatedSurf1, rotatedRect1) 198 | 199 | #rotatedSurf2 = pygame.transform.rotate(titleSurf2, degrees2) 200 | #rotatedRect2 = rotatedSurf2.get_rect() 201 | #rotatedRect2.center = (WINDOWWIDTH / 2, WINDOWHEIGHT / 2) 202 | #DISPLAYSURF.blit(rotatedSurf2, rotatedRect2) 203 | 204 | drawPressKeyMsg() 205 | #KRT 14/06/2012 rewrite event detection to deal with mouse use 206 | if checkForKeyPress(): 207 | return 208 | pygame.display.update() 209 | FPSCLOCK.tick(FPS) 210 | #degrees1 += 3 # rotate by 3 degrees each frame 211 | #degrees2 += 7 # rotate by 7 degrees each frame 212 | 213 | 214 | def terminate(): 215 | pygame.quit() 216 | sys.exit() 217 | 218 | 219 | def getRandomLocation(): 220 | return {'x': random.randint(0, CELLWIDTH - 1), 'y': random.randint(0, CELLHEIGHT - 1)} 221 | 222 | 223 | def showGameOverScreen(): 224 | gameOverFont = pygame.font.Font('freesansbold.ttf', 15*MULTIPLIER) 225 | gameSurf = gameOverFont.render('Game', True, WHITE) 226 | overSurf = gameOverFont.render('Over', True, WHITE) 227 | gameRect = gameSurf.get_rect() 228 | overRect = overSurf.get_rect() 229 | gameRect.midtop = (WINDOWWIDTH / 2, 10) 230 | overRect.midtop = (WINDOWWIDTH / 2, gameRect.height + 10 + 25) 231 | 232 | DISPLAYSURF.blit(gameSurf, gameRect) 233 | DISPLAYSURF.blit(overSurf, overRect) 234 | drawPressKeyMsg() 235 | pygame.display.update() 236 | pygame.time.wait(500) 237 | #KRT 14/06/2012 rewrite event detection to deal with mouse use 238 | pygame.event.get() #clear out event queue 239 | while True: 240 | if checkForKeyPress(): 241 | return 242 | #KRT 12/06/2012 reduce processor loading in gameover screen. 243 | pygame.time.wait(100) 244 | 245 | def drawScore(score): 246 | scoreSurf = BASICFONT.render('Score: %s' % (score), True, WHITE) 247 | scoreRect = scoreSurf.get_rect() 248 | scoreRect.topleft = (WINDOWWIDTH - 12*MULTIPLIER, 1*MULTIPLIER) 249 | DISPLAYSURF.blit(scoreSurf, scoreRect) 250 | 251 | 252 | def drawWorm(wormCoords): 253 | for coord in wormCoords: 254 | x = coord['x'] * CELLSIZE 255 | y = coord['y'] * CELLSIZE 256 | wormSegmentRect = pygame.Rect(x, y, CELLSIZE, CELLSIZE) 257 | pygame.draw.rect(DISPLAYSURF, DARKRED, wormSegmentRect) 258 | wormInnerSegmentRect = pygame.Rect(x + 4, y + 4, CELLSIZE - 8, CELLSIZE - 8) 259 | pygame.draw.rect(DISPLAYSURF, RED, wormInnerSegmentRect) 260 | 261 | 262 | def drawApple(coord): 263 | x = coord['x'] * CELLSIZE 264 | y = coord['y'] * CELLSIZE 265 | DISPLAYSURF.blit(flamecell, (x,y)) 266 | 267 | 268 | def drawGrid(): 269 | for x in range(0, WINDOWWIDTH, CELLSIZE): # draw vertical lines 270 | pygame.draw.line(DISPLAYSURF, DARKGRAY, (x, 0), (x, WINDOWHEIGHT)) 271 | for y in range(0, WINDOWHEIGHT, CELLSIZE): # draw horizontal lines 272 | pygame.draw.line(DISPLAYSURF, DARKGRAY, (0, y), (WINDOWWIDTH, y)) 273 | 274 | 275 | if __name__ == '__main__': 276 | main() 277 | -------------------------------------------------------------------------------- /Hardware/Panel/joystiicv1.1_panel-B.Mask.gbs: -------------------------------------------------------------------------------- 1 | G04 #@! TF.FileFunction,Soldermask,Bot* 2 | %FSLAX46Y46*% 3 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 4 | G04 Created by KiCad (PCBNEW 4.0.6) date 02/21/18 15:23:47* 5 | %MOMM*% 6 | %LPD*% 7 | G01* 8 | G04 APERTURE LIST* 9 | %ADD10C,0.100000*% 10 | %ADD11R,0.838200X1.473200*% 11 | %ADD12C,1.981200*% 12 | %ADD13C,2.489200*% 13 | %ADD14C,1.219200*% 14 | %ADD15C,2.082800*% 15 | G04 APERTURE END LIST* 16 | D10* 17 | D11* 18 | X163830000Y-100812600D03* 19 | X164846000Y-100812600D03* 20 | X165862000Y-100812600D03* 21 | X137922000Y-100812600D03* 22 | X138938000Y-100812600D03* 23 | X139954000Y-100812600D03* 24 | X112014000Y-100812600D03* 25 | X113030000Y-100812600D03* 26 | X114046000Y-100812600D03* 27 | X86106000Y-100812600D03* 28 | X87122000Y-100812600D03* 29 | X88138000Y-100812600D03* 30 | X60198000Y-100812600D03* 31 | X61214000Y-100812600D03* 32 | X62230000Y-100812600D03* 33 | X163830000Y-49504600D03* 34 | X164846000Y-49504600D03* 35 | X165862000Y-49504600D03* 36 | X137922000Y-49504600D03* 37 | X138938000Y-49504600D03* 38 | X139954000Y-49504600D03* 39 | X112014000Y-49504600D03* 40 | X113030000Y-49504600D03* 41 | X114046000Y-49504600D03* 42 | X86106000Y-49504600D03* 43 | X87122000Y-49504600D03* 44 | X88138000Y-49504600D03* 45 | D12* 46 | X161671000Y-117881400D03* 47 | X168021000Y-117881400D03* 48 | X161671000Y-122961400D03* 49 | X168021000Y-122961400D03* 50 | X162306000Y-140741400D03* 51 | X164846000Y-140741400D03* 52 | X167386000Y-140741400D03* 53 | D13* 54 | X157226000Y-123913900D03* 55 | X157226000Y-137248900D03* 56 | X172466000Y-137248900D03* 57 | X172466000Y-123913900D03* 58 | D12* 59 | X154686000Y-128041400D03* 60 | X154686000Y-130581400D03* 61 | X154686000Y-133121400D03* 62 | X135763000Y-117881400D03* 63 | X142113000Y-117881400D03* 64 | X135763000Y-122961400D03* 65 | X142113000Y-122961400D03* 66 | X136398000Y-140741400D03* 67 | X138938000Y-140741400D03* 68 | X141478000Y-140741400D03* 69 | D13* 70 | X131318000Y-123913900D03* 71 | X131318000Y-137248900D03* 72 | X146558000Y-137248900D03* 73 | X146558000Y-123913900D03* 74 | D12* 75 | X128778000Y-128041400D03* 76 | X128778000Y-130581400D03* 77 | X128778000Y-133121400D03* 78 | X109855000Y-117881400D03* 79 | X116205000Y-117881400D03* 80 | X109855000Y-122961400D03* 81 | X116205000Y-122961400D03* 82 | X110490000Y-140741400D03* 83 | X113030000Y-140741400D03* 84 | X115570000Y-140741400D03* 85 | D13* 86 | X105410000Y-123913900D03* 87 | X105410000Y-137248900D03* 88 | X120650000Y-137248900D03* 89 | X120650000Y-123913900D03* 90 | D12* 91 | X102870000Y-128041400D03* 92 | X102870000Y-130581400D03* 93 | X102870000Y-133121400D03* 94 | X83947000Y-117881400D03* 95 | X90297000Y-117881400D03* 96 | X83947000Y-122961400D03* 97 | X90297000Y-122961400D03* 98 | X84582000Y-140741400D03* 99 | X87122000Y-140741400D03* 100 | X89662000Y-140741400D03* 101 | D13* 102 | X79502000Y-123913900D03* 103 | X79502000Y-137248900D03* 104 | X94742000Y-137248900D03* 105 | X94742000Y-123913900D03* 106 | D12* 107 | X76962000Y-128041400D03* 108 | X76962000Y-130581400D03* 109 | X76962000Y-133121400D03* 110 | X58039000Y-117881400D03* 111 | X64389000Y-117881400D03* 112 | X58039000Y-122961400D03* 113 | X64389000Y-122961400D03* 114 | X58674000Y-140741400D03* 115 | X61214000Y-140741400D03* 116 | X63754000Y-140741400D03* 117 | D13* 118 | X53594000Y-123913900D03* 119 | X53594000Y-137248900D03* 120 | X68834000Y-137248900D03* 121 | X68834000Y-123913900D03* 122 | D12* 123 | X51054000Y-128041400D03* 124 | X51054000Y-130581400D03* 125 | X51054000Y-133121400D03* 126 | X161671000Y-66573400D03* 127 | X168021000Y-66573400D03* 128 | X161671000Y-71653400D03* 129 | X168021000Y-71653400D03* 130 | X162306000Y-89433400D03* 131 | X164846000Y-89433400D03* 132 | X167386000Y-89433400D03* 133 | D13* 134 | X157226000Y-72605900D03* 135 | X157226000Y-85940900D03* 136 | X172466000Y-85940900D03* 137 | X172466000Y-72605900D03* 138 | D12* 139 | X154686000Y-76733400D03* 140 | X154686000Y-79273400D03* 141 | X154686000Y-81813400D03* 142 | X135763000Y-66573400D03* 143 | X142113000Y-66573400D03* 144 | X135763000Y-71653400D03* 145 | X142113000Y-71653400D03* 146 | X136398000Y-89433400D03* 147 | X138938000Y-89433400D03* 148 | X141478000Y-89433400D03* 149 | D13* 150 | X131318000Y-72605900D03* 151 | X131318000Y-85940900D03* 152 | X146558000Y-85940900D03* 153 | X146558000Y-72605900D03* 154 | D12* 155 | X128778000Y-76733400D03* 156 | X128778000Y-79273400D03* 157 | X128778000Y-81813400D03* 158 | X109855000Y-66573400D03* 159 | X116205000Y-66573400D03* 160 | X109855000Y-71653400D03* 161 | X116205000Y-71653400D03* 162 | X110490000Y-89433400D03* 163 | X113030000Y-89433400D03* 164 | X115570000Y-89433400D03* 165 | D13* 166 | X105410000Y-72605900D03* 167 | X105410000Y-85940900D03* 168 | X120650000Y-85940900D03* 169 | X120650000Y-72605900D03* 170 | D12* 171 | X102870000Y-76733400D03* 172 | X102870000Y-79273400D03* 173 | X102870000Y-81813400D03* 174 | X83947000Y-66573400D03* 175 | X90297000Y-66573400D03* 176 | X83947000Y-71653400D03* 177 | X90297000Y-71653400D03* 178 | X84582000Y-89433400D03* 179 | X87122000Y-89433400D03* 180 | X89662000Y-89433400D03* 181 | D13* 182 | X79502000Y-72605900D03* 183 | X79502000Y-85940900D03* 184 | X94742000Y-85940900D03* 185 | X94742000Y-72605900D03* 186 | D12* 187 | X76962000Y-76733400D03* 188 | X76962000Y-79273400D03* 189 | X76962000Y-81813400D03* 190 | D14* 191 | X167386000Y-109905800D03* 192 | X167386000Y-112445800D03* 193 | X164846000Y-109905800D03* 194 | X164846000Y-112445800D03* 195 | X162306000Y-109905800D03* 196 | X162306000Y-112445800D03* 197 | X141478000Y-109905800D03* 198 | X141478000Y-112445800D03* 199 | X138938000Y-109905800D03* 200 | X138938000Y-112445800D03* 201 | X136398000Y-109905800D03* 202 | X136398000Y-112445800D03* 203 | X115570000Y-109905800D03* 204 | X115570000Y-112445800D03* 205 | X113030000Y-109905800D03* 206 | X113030000Y-112445800D03* 207 | X110490000Y-109905800D03* 208 | X110490000Y-112445800D03* 209 | X89662000Y-109905800D03* 210 | X89662000Y-112445800D03* 211 | X87122000Y-109905800D03* 212 | X87122000Y-112445800D03* 213 | X84582000Y-109905800D03* 214 | X84582000Y-112445800D03* 215 | X63754000Y-109905800D03* 216 | X63754000Y-112445800D03* 217 | X61214000Y-109905800D03* 218 | X61214000Y-112445800D03* 219 | X58674000Y-109905800D03* 220 | X58674000Y-112445800D03* 221 | X167386000Y-58597800D03* 222 | X167386000Y-61137800D03* 223 | X164846000Y-58597800D03* 224 | X164846000Y-61137800D03* 225 | X162306000Y-58597800D03* 226 | X162306000Y-61137800D03* 227 | X141478000Y-58597800D03* 228 | X141478000Y-61137800D03* 229 | X138938000Y-58597800D03* 230 | X138938000Y-61137800D03* 231 | X136398000Y-58597800D03* 232 | X136398000Y-61137800D03* 233 | X115570000Y-58597800D03* 234 | X115570000Y-61137800D03* 235 | X113030000Y-58597800D03* 236 | X113030000Y-61137800D03* 237 | X110490000Y-58597800D03* 238 | X110490000Y-61137800D03* 239 | X89662000Y-58597800D03* 240 | X89662000Y-61137800D03* 241 | X87122000Y-58597800D03* 242 | X87122000Y-61137800D03* 243 | X84582000Y-58597800D03* 244 | X84582000Y-61137800D03* 245 | D15* 246 | X161036000Y-94259400D03* 247 | X163576000Y-94259400D03* 248 | X166116000Y-94259400D03* 249 | X168656000Y-94259400D03* 250 | X135128000Y-94259400D03* 251 | X137668000Y-94259400D03* 252 | X140208000Y-94259400D03* 253 | X142748000Y-94259400D03* 254 | X109220000Y-94259400D03* 255 | X111760000Y-94259400D03* 256 | X114300000Y-94259400D03* 257 | X116840000Y-94259400D03* 258 | X83312000Y-94259400D03* 259 | X85852000Y-94259400D03* 260 | X88392000Y-94259400D03* 261 | X90932000Y-94259400D03* 262 | X57404000Y-94259400D03* 263 | X59944000Y-94259400D03* 264 | X62484000Y-94259400D03* 265 | X65024000Y-94259400D03* 266 | X161036000Y-42951400D03* 267 | X163576000Y-42951400D03* 268 | X166116000Y-42951400D03* 269 | X168656000Y-42951400D03* 270 | X135128000Y-42951400D03* 271 | X137668000Y-42951400D03* 272 | X140208000Y-42951400D03* 273 | X142748000Y-42951400D03* 274 | X109220000Y-42951400D03* 275 | X111760000Y-42951400D03* 276 | X114300000Y-42951400D03* 277 | X116840000Y-42951400D03* 278 | X83312000Y-42951400D03* 279 | X85852000Y-42951400D03* 280 | X88392000Y-42951400D03* 281 | X90932000Y-42951400D03* 282 | D12* 283 | X58039000Y-66573400D03* 284 | X64389000Y-66573400D03* 285 | X58039000Y-71653400D03* 286 | X64389000Y-71653400D03* 287 | X58674000Y-89433400D03* 288 | X61214000Y-89433400D03* 289 | X63754000Y-89433400D03* 290 | D13* 291 | X53594000Y-72605900D03* 292 | X53594000Y-85940900D03* 293 | X68834000Y-85940900D03* 294 | X68834000Y-72605900D03* 295 | D12* 296 | X51054000Y-76733400D03* 297 | X51054000Y-79273400D03* 298 | X51054000Y-81813400D03* 299 | D15* 300 | X57404000Y-42951400D03* 301 | X59944000Y-42951400D03* 302 | X62484000Y-42951400D03* 303 | X65024000Y-42951400D03* 304 | D14* 305 | X63754000Y-58597800D03* 306 | X63754000Y-61137800D03* 307 | X61214000Y-58597800D03* 308 | X61214000Y-61137800D03* 309 | X58674000Y-58597800D03* 310 | X58674000Y-61137800D03* 311 | D11* 312 | X60198000Y-49504600D03* 313 | X61214000Y-49504600D03* 314 | X62230000Y-49504600D03* 315 | M02* 316 | -------------------------------------------------------------------------------- /Hardware/Panel/joystiicv1.1_panel-Edge.Cuts.gm1: -------------------------------------------------------------------------------- 1 | G04 #@! TF.FileFunction,Profile,NP* 2 | %FSLAX46Y46*% 3 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 4 | G04 Created by KiCad (PCBNEW 4.0.6) date 02/21/18 15:23:47* 5 | %MOMM*% 6 | %LPD*% 7 | G01* 8 | G04 APERTURE LIST* 9 | %ADD10C,0.100000*% 10 | %ADD11C,0.150000*% 11 | G04 APERTURE END LIST* 12 | D10* 13 | D11* 14 | X31750000Y-92202000D02* 15 | X195580000Y-92202000D01* 16 | X151892000Y-27940000D02* 17 | X151892000Y-162052000D01* 18 | X125984000Y-27940000D02* 19 | X125984000Y-162052000D01* 20 | X100076000Y-27940000D02* 21 | X100076000Y-162052000D01* 22 | X74168000Y-27940000D02* 23 | X74168000Y-162052000D01* 24 | X177546000Y-92481400D02* 25 | X177546000Y-117881400D01* 26 | X151638000Y-92481400D02* 27 | X151638000Y-117881400D01* 28 | X125730000Y-92481400D02* 29 | X125730000Y-117881400D01* 30 | X99822000Y-92481400D02* 31 | X99822000Y-117881400D01* 32 | X73914000Y-92481400D02* 33 | X73914000Y-117881400D01* 34 | X177546000Y-41173400D02* 35 | X177546000Y-66573400D01* 36 | X151638000Y-41173400D02* 37 | X151638000Y-66573400D01* 38 | X125730000Y-41173400D02* 39 | X125730000Y-66573400D01* 40 | X99822000Y-41173400D02* 41 | X99822000Y-66573400D01* 42 | X152146000Y-117881400D02* 43 | X152146000Y-143281400D01* 44 | X126238000Y-117881400D02* 45 | X126238000Y-143281400D01* 46 | X100330000Y-117881400D02* 47 | X100330000Y-143281400D01* 48 | X74422000Y-117881400D02* 49 | X74422000Y-143281400D01* 50 | X48514000Y-117881400D02* 51 | X48514000Y-143281400D01* 52 | X152146000Y-66573400D02* 53 | X152146000Y-91973400D01* 54 | X126238000Y-66573400D02* 55 | X126238000Y-91973400D01* 56 | X100330000Y-66573400D02* 57 | X100330000Y-91973400D01* 58 | X74422000Y-66573400D02* 59 | X74422000Y-91973400D01* 60 | X152146000Y-92481400D02* 61 | X177546000Y-92481400D01* 62 | X126238000Y-92481400D02* 63 | X151638000Y-92481400D01* 64 | X100330000Y-92481400D02* 65 | X125730000Y-92481400D01* 66 | X74422000Y-92481400D02* 67 | X99822000Y-92481400D01* 68 | X48514000Y-92481400D02* 69 | X73914000Y-92481400D01* 70 | X152146000Y-41173400D02* 71 | X177546000Y-41173400D01* 72 | X126238000Y-41173400D02* 73 | X151638000Y-41173400D01* 74 | X100330000Y-41173400D02* 75 | X125730000Y-41173400D01* 76 | X74422000Y-41173400D02* 77 | X99822000Y-41173400D01* 78 | X177546000Y-143281400D02* 79 | X177546000Y-117881400D01* 80 | X151638000Y-143281400D02* 81 | X151638000Y-117881400D01* 82 | X125730000Y-143281400D02* 83 | X125730000Y-117881400D01* 84 | X99822000Y-143281400D02* 85 | X99822000Y-117881400D01* 86 | X73914000Y-143281400D02* 87 | X73914000Y-117881400D01* 88 | X177546000Y-91973400D02* 89 | X177546000Y-66573400D01* 90 | X151638000Y-91973400D02* 91 | X151638000Y-66573400D01* 92 | X125730000Y-91973400D02* 93 | X125730000Y-66573400D01* 94 | X99822000Y-91973400D02* 95 | X99822000Y-66573400D01* 96 | X177546000Y-143281400D02* 97 | X152146000Y-143281400D01* 98 | X151638000Y-143281400D02* 99 | X126238000Y-143281400D01* 100 | X125730000Y-143281400D02* 101 | X100330000Y-143281400D01* 102 | X99822000Y-143281400D02* 103 | X74422000Y-143281400D01* 104 | X73914000Y-143281400D02* 105 | X48514000Y-143281400D01* 106 | X177546000Y-91973400D02* 107 | X152146000Y-91973400D01* 108 | X151638000Y-91973400D02* 109 | X126238000Y-91973400D01* 110 | X125730000Y-91973400D02* 111 | X100330000Y-91973400D01* 112 | X99822000Y-91973400D02* 113 | X74422000Y-91973400D01* 114 | X152146000Y-117881400D02* 115 | X152146000Y-92481400D01* 116 | X126238000Y-117881400D02* 117 | X126238000Y-92481400D01* 118 | X100330000Y-117881400D02* 119 | X100330000Y-92481400D01* 120 | X74422000Y-117881400D02* 121 | X74422000Y-92481400D01* 122 | X48514000Y-117881400D02* 123 | X48514000Y-92481400D01* 124 | X152146000Y-66573400D02* 125 | X152146000Y-41173400D01* 126 | X126238000Y-66573400D02* 127 | X126238000Y-41173400D01* 128 | X100330000Y-66573400D02* 129 | X100330000Y-41173400D01* 130 | X74422000Y-66573400D02* 131 | X74422000Y-41173400D01* 132 | X73914000Y-91973400D02* 133 | X73914000Y-66573400D01* 134 | X48514000Y-66573400D02* 135 | X48514000Y-91973400D01* 136 | X73914000Y-91973400D02* 137 | X48514000Y-91973400D01* 138 | X73914000Y-41173400D02* 139 | X73914000Y-66573400D01* 140 | X48514000Y-41173400D02* 141 | X73914000Y-41173400D01* 142 | X48514000Y-66573400D02* 143 | X48514000Y-41173400D01* 144 | M02* 145 | -------------------------------------------------------------------------------- /Hardware/Panel/joystiicv1.1_panel-F.Mask.gts: -------------------------------------------------------------------------------- 1 | G04 #@! TF.FileFunction,Soldermask,Top* 2 | %FSLAX46Y46*% 3 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 4 | G04 Created by KiCad (PCBNEW 4.0.6) date 02/21/18 15:23:47* 5 | %MOMM*% 6 | %LPD*% 7 | G01* 8 | G04 APERTURE LIST* 9 | %ADD10C,0.100000*% 10 | %ADD11R,1.201420X1.303020*% 11 | %ADD12R,0.950000X0.950000*% 12 | %ADD13C,1.150000*% 13 | %ADD14C,1.981200*% 14 | %ADD15C,2.489200*% 15 | %ADD16R,1.303020X1.201420*% 16 | %ADD17R,2.150000X1.350000*% 17 | %ADD18R,1.500000X0.750000*% 18 | %ADD19R,1.674000X0.912000*% 19 | %ADD20C,1.219200*% 20 | %ADD21C,2.082800*% 21 | G04 APERTURE END LIST* 22 | D10* 23 | D11* 24 | X172262800Y-119420640D03* 25 | X172262800Y-121117360D03* 26 | X146354800Y-119420640D03* 27 | X146354800Y-121117360D03* 28 | X120446800Y-119420640D03* 29 | X120446800Y-121117360D03* 30 | X94538800Y-119420640D03* 31 | X94538800Y-121117360D03* 32 | X68630800Y-119420640D03* 33 | X68630800Y-121117360D03* 34 | X172262800Y-68112640D03* 35 | X172262800Y-69809360D03* 36 | X146354800Y-68112640D03* 37 | X146354800Y-69809360D03* 38 | X120446800Y-68112640D03* 39 | X120446800Y-69809360D03* 40 | X94538800Y-68112640D03* 41 | X94538800Y-69809360D03* 42 | D12* 43 | X174294800Y-121119800D03* 44 | X174294800Y-119519800D03* 45 | X148386800Y-121119800D03* 46 | X148386800Y-119519800D03* 47 | X122478800Y-121119800D03* 48 | X122478800Y-119519800D03* 49 | X96570800Y-121119800D03* 50 | X96570800Y-119519800D03* 51 | X70662800Y-121119800D03* 52 | X70662800Y-119519800D03* 53 | X174294800Y-69811800D03* 54 | X174294800Y-68211800D03* 55 | X148386800Y-69811800D03* 56 | X148386800Y-68211800D03* 57 | X122478800Y-69811800D03* 58 | X122478800Y-68211800D03* 59 | X96570800Y-69811800D03* 60 | X96570800Y-68211800D03* 61 | D13* 62 | X153162000Y-142265400D03* 63 | X127254000Y-142265400D03* 64 | X101346000Y-142265400D03* 65 | X75438000Y-142265400D03* 66 | X49530000Y-142265400D03* 67 | X153162000Y-90957400D03* 68 | X127254000Y-90957400D03* 69 | X101346000Y-90957400D03* 70 | X75438000Y-90957400D03* 71 | D14* 72 | X161671000Y-117881400D03* 73 | X168021000Y-117881400D03* 74 | X161671000Y-122961400D03* 75 | X168021000Y-122961400D03* 76 | X162306000Y-140741400D03* 77 | X164846000Y-140741400D03* 78 | X167386000Y-140741400D03* 79 | D15* 80 | X157226000Y-123913900D03* 81 | X157226000Y-137248900D03* 82 | X172466000Y-137248900D03* 83 | X172466000Y-123913900D03* 84 | D14* 85 | X154686000Y-128041400D03* 86 | X154686000Y-130581400D03* 87 | X154686000Y-133121400D03* 88 | X135763000Y-117881400D03* 89 | X142113000Y-117881400D03* 90 | X135763000Y-122961400D03* 91 | X142113000Y-122961400D03* 92 | X136398000Y-140741400D03* 93 | X138938000Y-140741400D03* 94 | X141478000Y-140741400D03* 95 | D15* 96 | X131318000Y-123913900D03* 97 | X131318000Y-137248900D03* 98 | X146558000Y-137248900D03* 99 | X146558000Y-123913900D03* 100 | D14* 101 | X128778000Y-128041400D03* 102 | X128778000Y-130581400D03* 103 | X128778000Y-133121400D03* 104 | X109855000Y-117881400D03* 105 | X116205000Y-117881400D03* 106 | X109855000Y-122961400D03* 107 | X116205000Y-122961400D03* 108 | X110490000Y-140741400D03* 109 | X113030000Y-140741400D03* 110 | X115570000Y-140741400D03* 111 | D15* 112 | X105410000Y-123913900D03* 113 | X105410000Y-137248900D03* 114 | X120650000Y-137248900D03* 115 | X120650000Y-123913900D03* 116 | D14* 117 | X102870000Y-128041400D03* 118 | X102870000Y-130581400D03* 119 | X102870000Y-133121400D03* 120 | X83947000Y-117881400D03* 121 | X90297000Y-117881400D03* 122 | X83947000Y-122961400D03* 123 | X90297000Y-122961400D03* 124 | X84582000Y-140741400D03* 125 | X87122000Y-140741400D03* 126 | X89662000Y-140741400D03* 127 | D15* 128 | X79502000Y-123913900D03* 129 | X79502000Y-137248900D03* 130 | X94742000Y-137248900D03* 131 | X94742000Y-123913900D03* 132 | D14* 133 | X76962000Y-128041400D03* 134 | X76962000Y-130581400D03* 135 | X76962000Y-133121400D03* 136 | X58039000Y-117881400D03* 137 | X64389000Y-117881400D03* 138 | X58039000Y-122961400D03* 139 | X64389000Y-122961400D03* 140 | X58674000Y-140741400D03* 141 | X61214000Y-140741400D03* 142 | X63754000Y-140741400D03* 143 | D15* 144 | X53594000Y-123913900D03* 145 | X53594000Y-137248900D03* 146 | X68834000Y-137248900D03* 147 | X68834000Y-123913900D03* 148 | D14* 149 | X51054000Y-128041400D03* 150 | X51054000Y-130581400D03* 151 | X51054000Y-133121400D03* 152 | X161671000Y-66573400D03* 153 | X168021000Y-66573400D03* 154 | X161671000Y-71653400D03* 155 | X168021000Y-71653400D03* 156 | X162306000Y-89433400D03* 157 | X164846000Y-89433400D03* 158 | X167386000Y-89433400D03* 159 | D15* 160 | X157226000Y-72605900D03* 161 | X157226000Y-85940900D03* 162 | X172466000Y-85940900D03* 163 | X172466000Y-72605900D03* 164 | D14* 165 | X154686000Y-76733400D03* 166 | X154686000Y-79273400D03* 167 | X154686000Y-81813400D03* 168 | X135763000Y-66573400D03* 169 | X142113000Y-66573400D03* 170 | X135763000Y-71653400D03* 171 | X142113000Y-71653400D03* 172 | X136398000Y-89433400D03* 173 | X138938000Y-89433400D03* 174 | X141478000Y-89433400D03* 175 | D15* 176 | X131318000Y-72605900D03* 177 | X131318000Y-85940900D03* 178 | X146558000Y-85940900D03* 179 | X146558000Y-72605900D03* 180 | D14* 181 | X128778000Y-76733400D03* 182 | X128778000Y-79273400D03* 183 | X128778000Y-81813400D03* 184 | X109855000Y-66573400D03* 185 | X116205000Y-66573400D03* 186 | X109855000Y-71653400D03* 187 | X116205000Y-71653400D03* 188 | X110490000Y-89433400D03* 189 | X113030000Y-89433400D03* 190 | X115570000Y-89433400D03* 191 | D15* 192 | X105410000Y-72605900D03* 193 | X105410000Y-85940900D03* 194 | X120650000Y-85940900D03* 195 | X120650000Y-72605900D03* 196 | D14* 197 | X102870000Y-76733400D03* 198 | X102870000Y-79273400D03* 199 | X102870000Y-81813400D03* 200 | X83947000Y-66573400D03* 201 | X90297000Y-66573400D03* 202 | X83947000Y-71653400D03* 203 | X90297000Y-71653400D03* 204 | X84582000Y-89433400D03* 205 | X87122000Y-89433400D03* 206 | X89662000Y-89433400D03* 207 | D15* 208 | X79502000Y-72605900D03* 209 | X79502000Y-85940900D03* 210 | X94742000Y-85940900D03* 211 | X94742000Y-72605900D03* 212 | D14* 213 | X76962000Y-76733400D03* 214 | X76962000Y-79273400D03* 215 | X76962000Y-81813400D03* 216 | D16* 217 | X163997640Y-100558600D03* 218 | X165694360Y-100558600D03* 219 | X138089640Y-100558600D03* 220 | X139786360Y-100558600D03* 221 | X112181640Y-100558600D03* 222 | X113878360Y-100558600D03* 223 | X86273640Y-100558600D03* 224 | X87970360Y-100558600D03* 225 | X60365640Y-100558600D03* 226 | X62062360Y-100558600D03* 227 | X163997640Y-49250600D03* 228 | X165694360Y-49250600D03* 229 | X138089640Y-49250600D03* 230 | X139786360Y-49250600D03* 231 | X112181640Y-49250600D03* 232 | X113878360Y-49250600D03* 233 | X86273640Y-49250600D03* 234 | X87970360Y-49250600D03* 235 | D17* 236 | X153551000Y-102381400D03* 237 | X153551000Y-107981400D03* 238 | D18* 239 | X157226000Y-103681400D03* 240 | X157226000Y-104681400D03* 241 | X157226000Y-105681400D03* 242 | X157226000Y-106681400D03* 243 | D17* 244 | X127643000Y-102381400D03* 245 | X127643000Y-107981400D03* 246 | D18* 247 | X131318000Y-103681400D03* 248 | X131318000Y-104681400D03* 249 | X131318000Y-105681400D03* 250 | X131318000Y-106681400D03* 251 | D17* 252 | X101735000Y-102381400D03* 253 | X101735000Y-107981400D03* 254 | D18* 255 | X105410000Y-103681400D03* 256 | X105410000Y-104681400D03* 257 | X105410000Y-105681400D03* 258 | X105410000Y-106681400D03* 259 | D17* 260 | X75827000Y-102381400D03* 261 | X75827000Y-107981400D03* 262 | D18* 263 | X79502000Y-103681400D03* 264 | X79502000Y-104681400D03* 265 | X79502000Y-105681400D03* 266 | X79502000Y-106681400D03* 267 | D17* 268 | X49919000Y-102381400D03* 269 | X49919000Y-107981400D03* 270 | D18* 271 | X53594000Y-103681400D03* 272 | X53594000Y-104681400D03* 273 | X53594000Y-105681400D03* 274 | X53594000Y-106681400D03* 275 | D17* 276 | X153551000Y-51073400D03* 277 | X153551000Y-56673400D03* 278 | D18* 279 | X157226000Y-52373400D03* 280 | X157226000Y-53373400D03* 281 | X157226000Y-54373400D03* 282 | X157226000Y-55373400D03* 283 | D17* 284 | X127643000Y-51073400D03* 285 | X127643000Y-56673400D03* 286 | D18* 287 | X131318000Y-52373400D03* 288 | X131318000Y-53373400D03* 289 | X131318000Y-54373400D03* 290 | X131318000Y-55373400D03* 291 | D17* 292 | X101735000Y-51073400D03* 293 | X101735000Y-56673400D03* 294 | D18* 295 | X105410000Y-52373400D03* 296 | X105410000Y-53373400D03* 297 | X105410000Y-54373400D03* 298 | X105410000Y-55373400D03* 299 | D17* 300 | X75827000Y-51073400D03* 301 | X75827000Y-56673400D03* 302 | D18* 303 | X79502000Y-52373400D03* 304 | X79502000Y-53373400D03* 305 | X79502000Y-54373400D03* 306 | X79502000Y-55373400D03* 307 | D19* 308 | X161188400Y-103111300D03* 309 | X161188400Y-104381300D03* 310 | X161188400Y-105651300D03* 311 | X161188400Y-106921300D03* 312 | X168597580Y-106921300D03* 313 | X168597580Y-105651300D03* 314 | X168597580Y-104381300D03* 315 | X168597580Y-103111300D03* 316 | X135280400Y-103111300D03* 317 | X135280400Y-104381300D03* 318 | X135280400Y-105651300D03* 319 | X135280400Y-106921300D03* 320 | X142689580Y-106921300D03* 321 | X142689580Y-105651300D03* 322 | X142689580Y-104381300D03* 323 | X142689580Y-103111300D03* 324 | X109372400Y-103111300D03* 325 | X109372400Y-104381300D03* 326 | X109372400Y-105651300D03* 327 | X109372400Y-106921300D03* 328 | X116781580Y-106921300D03* 329 | X116781580Y-105651300D03* 330 | X116781580Y-104381300D03* 331 | X116781580Y-103111300D03* 332 | X83464400Y-103111300D03* 333 | X83464400Y-104381300D03* 334 | X83464400Y-105651300D03* 335 | X83464400Y-106921300D03* 336 | X90873580Y-106921300D03* 337 | X90873580Y-105651300D03* 338 | X90873580Y-104381300D03* 339 | X90873580Y-103111300D03* 340 | X57556400Y-103111300D03* 341 | X57556400Y-104381300D03* 342 | X57556400Y-105651300D03* 343 | X57556400Y-106921300D03* 344 | X64965580Y-106921300D03* 345 | X64965580Y-105651300D03* 346 | X64965580Y-104381300D03* 347 | X64965580Y-103111300D03* 348 | X161188400Y-51803300D03* 349 | X161188400Y-53073300D03* 350 | X161188400Y-54343300D03* 351 | X161188400Y-55613300D03* 352 | X168597580Y-55613300D03* 353 | X168597580Y-54343300D03* 354 | X168597580Y-53073300D03* 355 | X168597580Y-51803300D03* 356 | X135280400Y-51803300D03* 357 | X135280400Y-53073300D03* 358 | X135280400Y-54343300D03* 359 | X135280400Y-55613300D03* 360 | X142689580Y-55613300D03* 361 | X142689580Y-54343300D03* 362 | X142689580Y-53073300D03* 363 | X142689580Y-51803300D03* 364 | X109372400Y-51803300D03* 365 | X109372400Y-53073300D03* 366 | X109372400Y-54343300D03* 367 | X109372400Y-55613300D03* 368 | X116781580Y-55613300D03* 369 | X116781580Y-54343300D03* 370 | X116781580Y-53073300D03* 371 | X116781580Y-51803300D03* 372 | X83464400Y-51803300D03* 373 | X83464400Y-53073300D03* 374 | X83464400Y-54343300D03* 375 | X83464400Y-55613300D03* 376 | X90873580Y-55613300D03* 377 | X90873580Y-54343300D03* 378 | X90873580Y-53073300D03* 379 | X90873580Y-51803300D03* 380 | D16* 381 | X158917640Y-100507800D03* 382 | X160614360Y-100507800D03* 383 | X133009640Y-100507800D03* 384 | X134706360Y-100507800D03* 385 | X107101640Y-100507800D03* 386 | X108798360Y-100507800D03* 387 | X81193640Y-100507800D03* 388 | X82890360Y-100507800D03* 389 | X55285640Y-100507800D03* 390 | X56982360Y-100507800D03* 391 | X158917640Y-49199800D03* 392 | X160614360Y-49199800D03* 393 | X133009640Y-49199800D03* 394 | X134706360Y-49199800D03* 395 | X107101640Y-49199800D03* 396 | X108798360Y-49199800D03* 397 | X81193640Y-49199800D03* 398 | X82890360Y-49199800D03* 399 | D20* 400 | X167386000Y-109905800D03* 401 | X167386000Y-112445800D03* 402 | X164846000Y-109905800D03* 403 | X164846000Y-112445800D03* 404 | X162306000Y-109905800D03* 405 | X162306000Y-112445800D03* 406 | X141478000Y-109905800D03* 407 | X141478000Y-112445800D03* 408 | X138938000Y-109905800D03* 409 | X138938000Y-112445800D03* 410 | X136398000Y-109905800D03* 411 | X136398000Y-112445800D03* 412 | X115570000Y-109905800D03* 413 | X115570000Y-112445800D03* 414 | X113030000Y-109905800D03* 415 | X113030000Y-112445800D03* 416 | X110490000Y-109905800D03* 417 | X110490000Y-112445800D03* 418 | X89662000Y-109905800D03* 419 | X89662000Y-112445800D03* 420 | X87122000Y-109905800D03* 421 | X87122000Y-112445800D03* 422 | X84582000Y-109905800D03* 423 | X84582000Y-112445800D03* 424 | X63754000Y-109905800D03* 425 | X63754000Y-112445800D03* 426 | X61214000Y-109905800D03* 427 | X61214000Y-112445800D03* 428 | X58674000Y-109905800D03* 429 | X58674000Y-112445800D03* 430 | X167386000Y-58597800D03* 431 | X167386000Y-61137800D03* 432 | X164846000Y-58597800D03* 433 | X164846000Y-61137800D03* 434 | X162306000Y-58597800D03* 435 | X162306000Y-61137800D03* 436 | X141478000Y-58597800D03* 437 | X141478000Y-61137800D03* 438 | X138938000Y-58597800D03* 439 | X138938000Y-61137800D03* 440 | X136398000Y-58597800D03* 441 | X136398000Y-61137800D03* 442 | X115570000Y-58597800D03* 443 | X115570000Y-61137800D03* 444 | X113030000Y-58597800D03* 445 | X113030000Y-61137800D03* 446 | X110490000Y-58597800D03* 447 | X110490000Y-61137800D03* 448 | X89662000Y-58597800D03* 449 | X89662000Y-61137800D03* 450 | X87122000Y-58597800D03* 451 | X87122000Y-61137800D03* 452 | X84582000Y-58597800D03* 453 | X84582000Y-61137800D03* 454 | D16* 455 | X169077640Y-100507800D03* 456 | X170774360Y-100507800D03* 457 | X143169640Y-100507800D03* 458 | X144866360Y-100507800D03* 459 | X117261640Y-100507800D03* 460 | X118958360Y-100507800D03* 461 | X91353640Y-100507800D03* 462 | X93050360Y-100507800D03* 463 | X65445640Y-100507800D03* 464 | X67142360Y-100507800D03* 465 | X169077640Y-49199800D03* 466 | X170774360Y-49199800D03* 467 | X143169640Y-49199800D03* 468 | X144866360Y-49199800D03* 469 | X117261640Y-49199800D03* 470 | X118958360Y-49199800D03* 471 | X91353640Y-49199800D03* 472 | X93050360Y-49199800D03* 473 | D13* 474 | X172466000Y-93497400D03* 475 | X146558000Y-93497400D03* 476 | X120650000Y-93497400D03* 477 | X94742000Y-93497400D03* 478 | X68834000Y-93497400D03* 479 | X172466000Y-42189400D03* 480 | X146558000Y-42189400D03* 481 | X120650000Y-42189400D03* 482 | X94742000Y-42189400D03* 483 | D16* 484 | X165694360Y-98628200D03* 485 | X163997640Y-98628200D03* 486 | X139786360Y-98628200D03* 487 | X138089640Y-98628200D03* 488 | X113878360Y-98628200D03* 489 | X112181640Y-98628200D03* 490 | X87970360Y-98628200D03* 491 | X86273640Y-98628200D03* 492 | X62062360Y-98628200D03* 493 | X60365640Y-98628200D03* 494 | X165694360Y-47320200D03* 495 | X163997640Y-47320200D03* 496 | X139786360Y-47320200D03* 497 | X138089640Y-47320200D03* 498 | X113878360Y-47320200D03* 499 | X112181640Y-47320200D03* 500 | X87970360Y-47320200D03* 501 | X86273640Y-47320200D03* 502 | D17* 503 | X176141000Y-107981400D03* 504 | X176141000Y-102381400D03* 505 | D18* 506 | X172466000Y-106681400D03* 507 | X172466000Y-105681400D03* 508 | X172466000Y-104681400D03* 509 | X172466000Y-103681400D03* 510 | D17* 511 | X150233000Y-107981400D03* 512 | X150233000Y-102381400D03* 513 | D18* 514 | X146558000Y-106681400D03* 515 | X146558000Y-105681400D03* 516 | X146558000Y-104681400D03* 517 | X146558000Y-103681400D03* 518 | D17* 519 | X124325000Y-107981400D03* 520 | X124325000Y-102381400D03* 521 | D18* 522 | X120650000Y-106681400D03* 523 | X120650000Y-105681400D03* 524 | X120650000Y-104681400D03* 525 | X120650000Y-103681400D03* 526 | D17* 527 | X98417000Y-107981400D03* 528 | X98417000Y-102381400D03* 529 | D18* 530 | X94742000Y-106681400D03* 531 | X94742000Y-105681400D03* 532 | X94742000Y-104681400D03* 533 | X94742000Y-103681400D03* 534 | D17* 535 | X72509000Y-107981400D03* 536 | X72509000Y-102381400D03* 537 | D18* 538 | X68834000Y-106681400D03* 539 | X68834000Y-105681400D03* 540 | X68834000Y-104681400D03* 541 | X68834000Y-103681400D03* 542 | D17* 543 | X176141000Y-56673400D03* 544 | X176141000Y-51073400D03* 545 | D18* 546 | X172466000Y-55373400D03* 547 | X172466000Y-54373400D03* 548 | X172466000Y-53373400D03* 549 | X172466000Y-52373400D03* 550 | D17* 551 | X150233000Y-56673400D03* 552 | X150233000Y-51073400D03* 553 | D18* 554 | X146558000Y-55373400D03* 555 | X146558000Y-54373400D03* 556 | X146558000Y-53373400D03* 557 | X146558000Y-52373400D03* 558 | D17* 559 | X124325000Y-56673400D03* 560 | X124325000Y-51073400D03* 561 | D18* 562 | X120650000Y-55373400D03* 563 | X120650000Y-54373400D03* 564 | X120650000Y-53373400D03* 565 | X120650000Y-52373400D03* 566 | D17* 567 | X98417000Y-56673400D03* 568 | X98417000Y-51073400D03* 569 | D18* 570 | X94742000Y-55373400D03* 571 | X94742000Y-54373400D03* 572 | X94742000Y-53373400D03* 573 | X94742000Y-52373400D03* 574 | D21* 575 | X161036000Y-94259400D03* 576 | X163576000Y-94259400D03* 577 | X166116000Y-94259400D03* 578 | X168656000Y-94259400D03* 579 | X135128000Y-94259400D03* 580 | X137668000Y-94259400D03* 581 | X140208000Y-94259400D03* 582 | X142748000Y-94259400D03* 583 | X109220000Y-94259400D03* 584 | X111760000Y-94259400D03* 585 | X114300000Y-94259400D03* 586 | X116840000Y-94259400D03* 587 | X83312000Y-94259400D03* 588 | X85852000Y-94259400D03* 589 | X88392000Y-94259400D03* 590 | X90932000Y-94259400D03* 591 | X57404000Y-94259400D03* 592 | X59944000Y-94259400D03* 593 | X62484000Y-94259400D03* 594 | X65024000Y-94259400D03* 595 | X161036000Y-42951400D03* 596 | X163576000Y-42951400D03* 597 | X166116000Y-42951400D03* 598 | X168656000Y-42951400D03* 599 | X135128000Y-42951400D03* 600 | X137668000Y-42951400D03* 601 | X140208000Y-42951400D03* 602 | X142748000Y-42951400D03* 603 | X109220000Y-42951400D03* 604 | X111760000Y-42951400D03* 605 | X114300000Y-42951400D03* 606 | X116840000Y-42951400D03* 607 | X83312000Y-42951400D03* 608 | X85852000Y-42951400D03* 609 | X88392000Y-42951400D03* 610 | X90932000Y-42951400D03* 611 | D12* 612 | X70662800Y-69811800D03* 613 | X70662800Y-68211800D03* 614 | D14* 615 | X58039000Y-66573400D03* 616 | X64389000Y-66573400D03* 617 | X58039000Y-71653400D03* 618 | X64389000Y-71653400D03* 619 | X58674000Y-89433400D03* 620 | X61214000Y-89433400D03* 621 | X63754000Y-89433400D03* 622 | D15* 623 | X53594000Y-72605900D03* 624 | X53594000Y-85940900D03* 625 | X68834000Y-85940900D03* 626 | X68834000Y-72605900D03* 627 | D14* 628 | X51054000Y-76733400D03* 629 | X51054000Y-79273400D03* 630 | X51054000Y-81813400D03* 631 | D16* 632 | X62062360Y-47320200D03* 633 | X60365640Y-47320200D03* 634 | D17* 635 | X72509000Y-56673400D03* 636 | X72509000Y-51073400D03* 637 | D18* 638 | X68834000Y-55373400D03* 639 | X68834000Y-54373400D03* 640 | X68834000Y-53373400D03* 641 | X68834000Y-52373400D03* 642 | D17* 643 | X49919000Y-51073400D03* 644 | X49919000Y-56673400D03* 645 | D18* 646 | X53594000Y-52373400D03* 647 | X53594000Y-53373400D03* 648 | X53594000Y-54373400D03* 649 | X53594000Y-55373400D03* 650 | D13* 651 | X49530000Y-90957400D03* 652 | X68834000Y-42189400D03* 653 | D16* 654 | X65445640Y-49199800D03* 655 | X67142360Y-49199800D03* 656 | D21* 657 | X57404000Y-42951400D03* 658 | X59944000Y-42951400D03* 659 | X62484000Y-42951400D03* 660 | X65024000Y-42951400D03* 661 | D20* 662 | X63754000Y-58597800D03* 663 | X63754000Y-61137800D03* 664 | X61214000Y-58597800D03* 665 | X61214000Y-61137800D03* 666 | X58674000Y-58597800D03* 667 | X58674000Y-61137800D03* 668 | D16* 669 | X55285640Y-49199800D03* 670 | X56982360Y-49199800D03* 671 | X60365640Y-49250600D03* 672 | X62062360Y-49250600D03* 673 | D11* 674 | X68630800Y-68112640D03* 675 | X68630800Y-69809360D03* 676 | D19* 677 | X57556400Y-51803300D03* 678 | X57556400Y-53073300D03* 679 | X57556400Y-54343300D03* 680 | X57556400Y-55613300D03* 681 | X64965580Y-55613300D03* 682 | X64965580Y-54343300D03* 683 | X64965580Y-53073300D03* 684 | X64965580Y-51803300D03* 685 | M02* 686 | -------------------------------------------------------------------------------- /Hardware/Panel/joystiicv1.1_panel-F.Paste.gtp: -------------------------------------------------------------------------------- 1 | G04 #@! TF.FileFunction,Paste,Top* 2 | %FSLAX46Y46*% 3 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 4 | G04 Created by KiCad (PCBNEW 4.0.6) date 02/21/18 15:23:46* 5 | %MOMM*% 6 | %LPD*% 7 | G01* 8 | G04 APERTURE LIST* 9 | %ADD10C,0.100000*% 10 | %ADD11R,0.998220X1.099820*% 11 | %ADD12R,0.800000X0.800000*% 12 | %ADD13R,1.099820X0.998220*% 13 | %ADD14R,2.000000X1.200000*% 14 | %ADD15R,1.350000X0.600000*% 15 | %ADD16R,1.524000X0.762000*% 16 | G04 APERTURE END LIST* 17 | D10* 18 | D11* 19 | X172262800Y-119420640D03* 20 | X172262800Y-121117360D03* 21 | X146354800Y-119420640D03* 22 | X146354800Y-121117360D03* 23 | X120446800Y-119420640D03* 24 | X120446800Y-121117360D03* 25 | X94538800Y-119420640D03* 26 | X94538800Y-121117360D03* 27 | X68630800Y-119420640D03* 28 | X68630800Y-121117360D03* 29 | X172262800Y-68112640D03* 30 | X172262800Y-69809360D03* 31 | X146354800Y-68112640D03* 32 | X146354800Y-69809360D03* 33 | X120446800Y-68112640D03* 34 | X120446800Y-69809360D03* 35 | X94538800Y-68112640D03* 36 | X94538800Y-69809360D03* 37 | D12* 38 | X174294800Y-121119800D03* 39 | X174294800Y-119519800D03* 40 | X148386800Y-121119800D03* 41 | X148386800Y-119519800D03* 42 | X122478800Y-121119800D03* 43 | X122478800Y-119519800D03* 44 | X96570800Y-121119800D03* 45 | X96570800Y-119519800D03* 46 | X70662800Y-121119800D03* 47 | X70662800Y-119519800D03* 48 | X174294800Y-69811800D03* 49 | X174294800Y-68211800D03* 50 | X148386800Y-69811800D03* 51 | X148386800Y-68211800D03* 52 | X122478800Y-69811800D03* 53 | X122478800Y-68211800D03* 54 | X96570800Y-69811800D03* 55 | X96570800Y-68211800D03* 56 | D13* 57 | X163997640Y-100558600D03* 58 | X165694360Y-100558600D03* 59 | X138089640Y-100558600D03* 60 | X139786360Y-100558600D03* 61 | X112181640Y-100558600D03* 62 | X113878360Y-100558600D03* 63 | X86273640Y-100558600D03* 64 | X87970360Y-100558600D03* 65 | X60365640Y-100558600D03* 66 | X62062360Y-100558600D03* 67 | X163997640Y-49250600D03* 68 | X165694360Y-49250600D03* 69 | X138089640Y-49250600D03* 70 | X139786360Y-49250600D03* 71 | X112181640Y-49250600D03* 72 | X113878360Y-49250600D03* 73 | X86273640Y-49250600D03* 74 | X87970360Y-49250600D03* 75 | D14* 76 | X153551000Y-102381400D03* 77 | X153551000Y-107981400D03* 78 | D15* 79 | X157226000Y-103681400D03* 80 | X157226000Y-104681400D03* 81 | X157226000Y-105681400D03* 82 | X157226000Y-106681400D03* 83 | D14* 84 | X127643000Y-102381400D03* 85 | X127643000Y-107981400D03* 86 | D15* 87 | X131318000Y-103681400D03* 88 | X131318000Y-104681400D03* 89 | X131318000Y-105681400D03* 90 | X131318000Y-106681400D03* 91 | D14* 92 | X101735000Y-102381400D03* 93 | X101735000Y-107981400D03* 94 | D15* 95 | X105410000Y-103681400D03* 96 | X105410000Y-104681400D03* 97 | X105410000Y-105681400D03* 98 | X105410000Y-106681400D03* 99 | D14* 100 | X75827000Y-102381400D03* 101 | X75827000Y-107981400D03* 102 | D15* 103 | X79502000Y-103681400D03* 104 | X79502000Y-104681400D03* 105 | X79502000Y-105681400D03* 106 | X79502000Y-106681400D03* 107 | D14* 108 | X49919000Y-102381400D03* 109 | X49919000Y-107981400D03* 110 | D15* 111 | X53594000Y-103681400D03* 112 | X53594000Y-104681400D03* 113 | X53594000Y-105681400D03* 114 | X53594000Y-106681400D03* 115 | D14* 116 | X153551000Y-51073400D03* 117 | X153551000Y-56673400D03* 118 | D15* 119 | X157226000Y-52373400D03* 120 | X157226000Y-53373400D03* 121 | X157226000Y-54373400D03* 122 | X157226000Y-55373400D03* 123 | D14* 124 | X127643000Y-51073400D03* 125 | X127643000Y-56673400D03* 126 | D15* 127 | X131318000Y-52373400D03* 128 | X131318000Y-53373400D03* 129 | X131318000Y-54373400D03* 130 | X131318000Y-55373400D03* 131 | D14* 132 | X101735000Y-51073400D03* 133 | X101735000Y-56673400D03* 134 | D15* 135 | X105410000Y-52373400D03* 136 | X105410000Y-53373400D03* 137 | X105410000Y-54373400D03* 138 | X105410000Y-55373400D03* 139 | D14* 140 | X75827000Y-51073400D03* 141 | X75827000Y-56673400D03* 142 | D15* 143 | X79502000Y-52373400D03* 144 | X79502000Y-53373400D03* 145 | X79502000Y-54373400D03* 146 | X79502000Y-55373400D03* 147 | D16* 148 | X161188400Y-103111300D03* 149 | X161188400Y-104381300D03* 150 | X161188400Y-105651300D03* 151 | X161188400Y-106921300D03* 152 | X168597580Y-106921300D03* 153 | X168597580Y-105651300D03* 154 | X168597580Y-104381300D03* 155 | X168597580Y-103111300D03* 156 | X135280400Y-103111300D03* 157 | X135280400Y-104381300D03* 158 | X135280400Y-105651300D03* 159 | X135280400Y-106921300D03* 160 | X142689580Y-106921300D03* 161 | X142689580Y-105651300D03* 162 | X142689580Y-104381300D03* 163 | X142689580Y-103111300D03* 164 | X109372400Y-103111300D03* 165 | X109372400Y-104381300D03* 166 | X109372400Y-105651300D03* 167 | X109372400Y-106921300D03* 168 | X116781580Y-106921300D03* 169 | X116781580Y-105651300D03* 170 | X116781580Y-104381300D03* 171 | X116781580Y-103111300D03* 172 | X83464400Y-103111300D03* 173 | X83464400Y-104381300D03* 174 | X83464400Y-105651300D03* 175 | X83464400Y-106921300D03* 176 | X90873580Y-106921300D03* 177 | X90873580Y-105651300D03* 178 | X90873580Y-104381300D03* 179 | X90873580Y-103111300D03* 180 | X57556400Y-103111300D03* 181 | X57556400Y-104381300D03* 182 | X57556400Y-105651300D03* 183 | X57556400Y-106921300D03* 184 | X64965580Y-106921300D03* 185 | X64965580Y-105651300D03* 186 | X64965580Y-104381300D03* 187 | X64965580Y-103111300D03* 188 | X161188400Y-51803300D03* 189 | X161188400Y-53073300D03* 190 | X161188400Y-54343300D03* 191 | X161188400Y-55613300D03* 192 | X168597580Y-55613300D03* 193 | X168597580Y-54343300D03* 194 | X168597580Y-53073300D03* 195 | X168597580Y-51803300D03* 196 | X135280400Y-51803300D03* 197 | X135280400Y-53073300D03* 198 | X135280400Y-54343300D03* 199 | X135280400Y-55613300D03* 200 | X142689580Y-55613300D03* 201 | X142689580Y-54343300D03* 202 | X142689580Y-53073300D03* 203 | X142689580Y-51803300D03* 204 | X109372400Y-51803300D03* 205 | X109372400Y-53073300D03* 206 | X109372400Y-54343300D03* 207 | X109372400Y-55613300D03* 208 | X116781580Y-55613300D03* 209 | X116781580Y-54343300D03* 210 | X116781580Y-53073300D03* 211 | X116781580Y-51803300D03* 212 | X83464400Y-51803300D03* 213 | X83464400Y-53073300D03* 214 | X83464400Y-54343300D03* 215 | X83464400Y-55613300D03* 216 | X90873580Y-55613300D03* 217 | X90873580Y-54343300D03* 218 | X90873580Y-53073300D03* 219 | X90873580Y-51803300D03* 220 | D13* 221 | X158917640Y-100507800D03* 222 | X160614360Y-100507800D03* 223 | X133009640Y-100507800D03* 224 | X134706360Y-100507800D03* 225 | X107101640Y-100507800D03* 226 | X108798360Y-100507800D03* 227 | X81193640Y-100507800D03* 228 | X82890360Y-100507800D03* 229 | X55285640Y-100507800D03* 230 | X56982360Y-100507800D03* 231 | X158917640Y-49199800D03* 232 | X160614360Y-49199800D03* 233 | X133009640Y-49199800D03* 234 | X134706360Y-49199800D03* 235 | X107101640Y-49199800D03* 236 | X108798360Y-49199800D03* 237 | X81193640Y-49199800D03* 238 | X82890360Y-49199800D03* 239 | X169077640Y-100507800D03* 240 | X170774360Y-100507800D03* 241 | X143169640Y-100507800D03* 242 | X144866360Y-100507800D03* 243 | X117261640Y-100507800D03* 244 | X118958360Y-100507800D03* 245 | X91353640Y-100507800D03* 246 | X93050360Y-100507800D03* 247 | X65445640Y-100507800D03* 248 | X67142360Y-100507800D03* 249 | X169077640Y-49199800D03* 250 | X170774360Y-49199800D03* 251 | X143169640Y-49199800D03* 252 | X144866360Y-49199800D03* 253 | X117261640Y-49199800D03* 254 | X118958360Y-49199800D03* 255 | X91353640Y-49199800D03* 256 | X93050360Y-49199800D03* 257 | X165694360Y-98628200D03* 258 | X163997640Y-98628200D03* 259 | X139786360Y-98628200D03* 260 | X138089640Y-98628200D03* 261 | X113878360Y-98628200D03* 262 | X112181640Y-98628200D03* 263 | X87970360Y-98628200D03* 264 | X86273640Y-98628200D03* 265 | X62062360Y-98628200D03* 266 | X60365640Y-98628200D03* 267 | X165694360Y-47320200D03* 268 | X163997640Y-47320200D03* 269 | X139786360Y-47320200D03* 270 | X138089640Y-47320200D03* 271 | X113878360Y-47320200D03* 272 | X112181640Y-47320200D03* 273 | X87970360Y-47320200D03* 274 | X86273640Y-47320200D03* 275 | D14* 276 | X176141000Y-107981400D03* 277 | X176141000Y-102381400D03* 278 | D15* 279 | X172466000Y-106681400D03* 280 | X172466000Y-105681400D03* 281 | X172466000Y-104681400D03* 282 | X172466000Y-103681400D03* 283 | D14* 284 | X150233000Y-107981400D03* 285 | X150233000Y-102381400D03* 286 | D15* 287 | X146558000Y-106681400D03* 288 | X146558000Y-105681400D03* 289 | X146558000Y-104681400D03* 290 | X146558000Y-103681400D03* 291 | D14* 292 | X124325000Y-107981400D03* 293 | X124325000Y-102381400D03* 294 | D15* 295 | X120650000Y-106681400D03* 296 | X120650000Y-105681400D03* 297 | X120650000Y-104681400D03* 298 | X120650000Y-103681400D03* 299 | D14* 300 | X98417000Y-107981400D03* 301 | X98417000Y-102381400D03* 302 | D15* 303 | X94742000Y-106681400D03* 304 | X94742000Y-105681400D03* 305 | X94742000Y-104681400D03* 306 | X94742000Y-103681400D03* 307 | D14* 308 | X72509000Y-107981400D03* 309 | X72509000Y-102381400D03* 310 | D15* 311 | X68834000Y-106681400D03* 312 | X68834000Y-105681400D03* 313 | X68834000Y-104681400D03* 314 | X68834000Y-103681400D03* 315 | D14* 316 | X176141000Y-56673400D03* 317 | X176141000Y-51073400D03* 318 | D15* 319 | X172466000Y-55373400D03* 320 | X172466000Y-54373400D03* 321 | X172466000Y-53373400D03* 322 | X172466000Y-52373400D03* 323 | D14* 324 | X150233000Y-56673400D03* 325 | X150233000Y-51073400D03* 326 | D15* 327 | X146558000Y-55373400D03* 328 | X146558000Y-54373400D03* 329 | X146558000Y-53373400D03* 330 | X146558000Y-52373400D03* 331 | D14* 332 | X124325000Y-56673400D03* 333 | X124325000Y-51073400D03* 334 | D15* 335 | X120650000Y-55373400D03* 336 | X120650000Y-54373400D03* 337 | X120650000Y-53373400D03* 338 | X120650000Y-52373400D03* 339 | D14* 340 | X98417000Y-56673400D03* 341 | X98417000Y-51073400D03* 342 | D15* 343 | X94742000Y-55373400D03* 344 | X94742000Y-54373400D03* 345 | X94742000Y-53373400D03* 346 | X94742000Y-52373400D03* 347 | D12* 348 | X70662800Y-69811800D03* 349 | X70662800Y-68211800D03* 350 | D13* 351 | X62062360Y-47320200D03* 352 | X60365640Y-47320200D03* 353 | D14* 354 | X72509000Y-56673400D03* 355 | X72509000Y-51073400D03* 356 | D15* 357 | X68834000Y-55373400D03* 358 | X68834000Y-54373400D03* 359 | X68834000Y-53373400D03* 360 | X68834000Y-52373400D03* 361 | D14* 362 | X49919000Y-51073400D03* 363 | X49919000Y-56673400D03* 364 | D15* 365 | X53594000Y-52373400D03* 366 | X53594000Y-53373400D03* 367 | X53594000Y-54373400D03* 368 | X53594000Y-55373400D03* 369 | D13* 370 | X65445640Y-49199800D03* 371 | X67142360Y-49199800D03* 372 | X55285640Y-49199800D03* 373 | X56982360Y-49199800D03* 374 | X60365640Y-49250600D03* 375 | X62062360Y-49250600D03* 376 | D11* 377 | X68630800Y-68112640D03* 378 | X68630800Y-69809360D03* 379 | D16* 380 | X57556400Y-51803300D03* 381 | X57556400Y-53073300D03* 382 | X57556400Y-54343300D03* 383 | X57556400Y-55613300D03* 384 | X64965580Y-55613300D03* 385 | X64965580Y-54343300D03* 386 | X64965580Y-53073300D03* 387 | X64965580Y-51803300D03* 388 | M02* 389 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | SparkFun License Information 2 | ============================ 3 | 4 | SparkFun uses two different licenses for our files — one for hardware and one for code. 5 | 6 | Hardware 7 | --------- 8 | 9 | **SparkFun hardware is released under [Creative Commons Share-alike 4.0 International](http://creativecommons.org/licenses/by-sa/4.0/).** 10 | 11 | Note: This is a human-readable summary of (and not a substitute for) the [license](http://creativecommons.org/licenses/by-sa/4.0/legalcode). 12 | 13 | You are free to: 14 | 15 | Share — copy and redistribute the material in any medium or format 16 | Adapt — remix, transform, and build upon the material 17 | for any purpose, even commercially. 18 | The licensor cannot revoke these freedoms as long as you follow the license terms. 19 | Under the following terms: 20 | 21 | Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use. 22 | ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original. 23 | No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. 24 | Notices: 25 | 26 | You do not have to comply with the license for elements of the material in the public domain or where your use is permitted by an applicable exception or limitation. 27 | No warranties are given. The license may not give you all of the permissions necessary for your intended use. For example, other rights such as publicity, privacy, or moral rights may limit how you use the material. 28 | 29 | 30 | Code 31 | -------- 32 | 33 | **SparkFun code, firmware, and software is released under the MIT License(http://opensource.org/licenses/MIT).** 34 | 35 | The MIT License (MIT) 36 | 37 | Copyright (c) 2016 SparkFun Electronics 38 | 39 | Permission is hereby granted, free of charge, to any person obtaining a copy 40 | of this software and associated documentation files (the "Software"), to deal 41 | in the Software without restriction, including without limitation the rights 42 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 43 | copies of the Software, and to permit persons to whom the Software is 44 | furnished to do so, subject to the following conditions: 45 | 46 | The above copyright notice and this permission notice shall be included in all 47 | copies or substantial portions of the Software. 48 | 49 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 50 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 51 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 52 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 53 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 54 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 55 | SOFTWARE. 56 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | SparkFun Qwiic Joystick 2 | ======================================== 3 | 4 | ![SparkFun Qwiic Joystick](https://cdn.sparkfun.com/assets/parts/1/3/5/5/8/15168-SparkFun_Qwiic_Joystick-01.jpg) 5 | 6 | [*SparkFun Qwiic Joystick (COM-15168)*](https://www.sparkfun.com/products/15168) 7 | 8 | Now, you can easily add an HID/controller to your project! The [SparkFun Qwiic Joystick](https://www.sparkfun.com/products/15168) combines the convenience of the Qwiic connection system and an analog joystick that feels reminiscent of the _thumbstick_ from a PlayStation 2 controller. 9 | 10 | Thanks to an ATtiny85 on the [Qwiic Joystick](https://www.sparkfun.com/products/15168), all the necessary bits are taken care of and your microcontroller only needs to look for your inputs in the registers of the I2C device. 11 | 12 |

Factory Default I2C Slave Address: 0x20

13 | 14 |

I2C Registers


15 | 16 | | Address | Contents | 17 | | ------- | -------- | 18 | | 0x00 | Default I2C Address | 19 | | 0x01-0x02 | Firmware Version | 20 | | 0x03-0x04 | Horizontal Position (MSB First) | 21 | | 0x05-0x06 | Vertical Position (MSB First) | 22 | | 0x07 | Button Position; clears after read. | 23 | | 0x08 | Button Status: Indicates if button was pressed since last read of button state (i.e. last time reg `0x07` was read). | 24 | | 0x09 | Lock Register for I2C Address Change | 25 | | 0x0A | Current I2C Slave Address. Can only be changed once Lock Register is set to 0x13, then it clears the Lock Register. | 26 | 27 | In the registers for the joystick position, the MSB contains the first 8 bits of the 10-bit ADC value and the LSB contains the last two bits. As an example, this is how the library converts the two registers back to a 10-bit value. 28 | 29 | `uint_16t full10bitvalue = (MSB | LSB)>>6;` 30 | 31 | You could potentially only look at the MSB and get an 8-bit (256 position) reading. The firmware was intentionally written this way in the hopes that it would be useful for customers who don't need the full resolution of the joystick position. 32 | 33 | Repository Contents 34 | ------------------- 35 | 36 | * **/Firmware** - Firmware for ATtiny85 and Python Example Code 37 | * **/Hardware** - Eagle design files (.brd, .sch) 38 | 39 | Documentation 40 | -------------- 41 | * **[Library](https://github.com/sparkfun/SparkFun_Qwiic_Joystick_Arduino_Library)** - Arduino library for the Qwiic Joystick. 42 | * **[Hookup Guide](https://learn.sparkfun.com/tutorials/qwiic-joystick-hookup-guide)** - Basic hookup guide for the Qwiic Joystick. 43 | 44 | Product Versions 45 | ---------------- 46 | * [COM-15168](https://www.sparkfun.com/products/15168)- Retail packaging of standard description here 47 | 48 | Version History 49 | --------------- 50 | * [SparkFun Qwiic Joystick COM-15168](https://www.sparkfun.com/products/15168) - Firmware was update so that the board acts like a *normal* I2C slave device, the silk screen was changed to follow retail product guidelines, and the ISP pins were reconfigured for programming on a test bed. 51 | * [SparkX Qwiic Joystiic v1.1 SPX-14656](https://www.sparkfun.com/products/14656) - Version 1.1 is a minor revision which adds a power LED and corrects the wide IC footprint. It's functionally identical to the previous version. 52 | * [SparkX Qwiic Joystiic SPX-14619](https://www.sparkfun.com/products/retired/14619) - Original SparkX Joystiic. 53 | 54 | License Information 55 | ------------------- 56 | 57 | This product is _**open source**_! 58 | 59 | Please review the LICENSE.md file for license information. 60 | 61 | If you have any questions or concerns on licensing, please visit the [SparkFun Forum](https://forum.sparkfun.com/index.php) and post a topic. For more general questions related to our qwiic system, please visit this section of the forum: [SparkFun Forums: QWIIC SYSTEMS](https://forum.sparkfun.com/viewforum.php?f=105) 62 | 63 | Distributed as-is; no warranty is given. 64 | 65 | - Your friends at SparkFun. 66 | --------------------------------------------------------------------------------