attiny40.pp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. unit ATtiny40;
  2. interface
  3. var
  4. // WATCHDOG
  5. WDTCSR : byte absolute $00+$31; // Watchdog Timer Control and Status Register
  6. // AD_CONVERTER
  7. ADMUX : byte absolute $00+$10; // The ADC multiplexer Selection Register
  8. ADCSRA : byte absolute $00+$12; // The ADC Control and Status register
  9. ADC : word absolute $00+$0E; // ADC Data Register Bytes
  10. ADCL : byte absolute $00+$0E; // ADC Data Register Bytes
  11. ADCH : byte absolute $00+$0E+1; // ADC Data Register Bytes
  12. ADCSRB : byte absolute $00+$11; // ADC Control and Status Register B
  13. DIDR0 : byte absolute $00+$0D; // Digital Input Disable Register 0
  14. // ANALOG_COMPARATOR
  15. ACSRB : byte absolute $00+$13; // Analog Comparator Control And Status Register B
  16. ACSRA : byte absolute $00+$14; // Analog Comparator Control And Status Register A
  17. // TWI
  18. TWSCRA : byte absolute $00+$2D; // TWI Slave Control Register A
  19. TWSCRB : byte absolute $00+$2C; // TWI Slave Control Register B
  20. TWSSRA : byte absolute $00+$2B; // TWI Slave Status Register A
  21. TWSA : byte absolute $00+$2A; // TWI Slave Address Register
  22. TWSD : byte absolute $00+$28; // TWI Slave Data Register
  23. TWSAM : byte absolute $00+$29; // TWI Slave Address Mask Register
  24. // CPU
  25. CCP : byte absolute $00+$3C; // Configuration Change Protection
  26. SP : word absolute $00+$3D; // Stack Pointer
  27. SPL : byte absolute $00+$3D; // Stack Pointer
  28. SPH : byte absolute $00+$3D+1; // Stack Pointer
  29. SREG : byte absolute $00+$3F; // Status Register
  30. CLKMSR : byte absolute $00+$37; // Clock Main Settings Register
  31. CLKPSR : byte absolute $00+$36; // Clock Prescale Register
  32. OSCCAL : byte absolute $00+$39; // Oscillator Calibration Value
  33. PRR : byte absolute $00+$35; // Power Reduction Register
  34. RSTFLR : byte absolute $00+$3B; // Reset Flag Register
  35. NVMCSR : byte absolute $00+$32; // Non-Volatile Memory Control and Status Register
  36. NVMCMD : byte absolute $00+$33; // Non-Volatile Memory Command
  37. MCUCR : byte absolute $00+$3A; // MCU Control Register
  38. GIMSK : byte absolute $00+$0C; // General Interrupt Mask Register
  39. GIFR : byte absolute $00+$0B; // General Interrupt Flag Register
  40. RAMAR : byte absolute $00+$20; // RAM Address Register
  41. RAMDR : byte absolute $00+$1F; // RAM Data Register
  42. // EXTERNAL_INTERRUPT
  43. PCMSK2 : byte absolute $00+$1A; // Pin Change Mask Register 2
  44. PCMSK1 : byte absolute $00+$0A; // Pin Change Mask Register 1
  45. PCMSK0 : byte absolute $00+$09; // Pin Change Mask Register 0
  46. // PORTB
  47. PORTCR : byte absolute $00+$08; // Port Control Register
  48. PUEB : byte absolute $00+$07; // Pull-up Enable Control Register
  49. DDRB : byte absolute $00+$05; // Data Direction Register, Port B
  50. PINB : byte absolute $00+$04; // Port B Data register
  51. PORTB : byte absolute $00+$06; // Input Pins, Port B
  52. // PORTC
  53. PUEC : byte absolute $00+$1E; // Pull-up Enable Control Register
  54. PORTC : byte absolute $00+$1D; // Port C Data Register
  55. DDRC : byte absolute $00+$1C; // Data Direction Register, Port C
  56. PINC : byte absolute $00+$1B; // Port C Input Pins
  57. // TIMER_COUNTER_0
  58. TCCR0A : byte absolute $00+$19; // Timer/Counter 0 Control Register A
  59. TCCR0B : byte absolute $00+$18; // Timer/Counter 0 Control Register B
  60. TCCR1A : byte absolute $00+$24; // Timer/Counter1 Control Register A
  61. TCNT1H : byte absolute $00+$27; // Timer/Counter1 High
  62. TCNT1L : byte absolute $00+$23; // Timer/Counter1 Low
  63. OCR1A : byte absolute $00+$22; // Timer/Counter 1 Output Compare Register A
  64. OCR1B : byte absolute $00+$21; // Timer/Counter 1 Output Compare Register B
  65. TIMSK : byte absolute $00+$26; // Timer Interrupt Mask Register
  66. TIFR : byte absolute $00+$25; // Overflow Interrupt Enable
  67. TCNT0 : byte absolute $00+$17; // Timer/Counter0
  68. OCR0A : byte absolute $00+$16; // Timer/Counter0 Output Compare Register
  69. OCR0B : byte absolute $00+$15; // Timer/Counter0 Output Compare Register
  70. // PORTA
  71. PUEA : byte absolute $00+$03; // Pull-up Enable Control Register
  72. PORTA : byte absolute $00+$02; // Port A Data Register
  73. DDRA : byte absolute $00+$01; // Data Direction Register, Port A
  74. PINA : byte absolute $00+$00; // Port A Input Pins
  75. // SPI
  76. SPCR : byte absolute $00+$30; // SPI Control Register
  77. SPSR : byte absolute $00+$2F; // SPI Status Register
  78. SPDR : byte absolute $00+$2E; // SPI Data Register
  79. const
  80. // WDTCSR
  81. WDIF = 7; // Watchdog Timer Interrupt Flag
  82. WDIE = 6; // Watchdog Timer Interrupt Enable
  83. WDP = 0; // Watchdog Timer Prescaler Bits
  84. WDE = 3; // Watch Dog Enable
  85. // ADMUX
  86. REFS = 6; // Reference Selection Bit
  87. MUX = 0; // Analog Channel and Gain Selection Bits
  88. // ADCSRA
  89. ADEN = 7; // ADC Enable
  90. ADSC = 6; // ADC Start Conversion
  91. ADATE = 5; // ADC Auto Trigger Enable
  92. ADIF = 4; // ADC Interrupt Flag
  93. ADIE = 3; // ADC Interrupt Enable
  94. ADPS = 0; // ADC Prescaler Select Bits
  95. // ADCSRB
  96. ADLAR = 3; //
  97. ADTS = 0; // ADC Auto Trigger Sources
  98. // DIDR0
  99. ADC7D = 7; // ADC6 Digital input Disable
  100. ADC6D = 6; // ADC5 Digital input Disable
  101. ADC5D = 5; // ADC4 Digital input Disable
  102. ADC4D = 4; // ADC3 Digital input Disable
  103. ADC3D = 3; // AREF Digital Input Disable
  104. ADC2D = 2; // ADC2 Digital input Disable
  105. ADC1D = 1; // ADC1 Digital input Disable
  106. ADC0D = 0; // ADC0 Digital input Disable
  107. // ACSRB
  108. HSEL = 7; // Hysteresis Select
  109. HLEV = 6; // Hysteresis Level
  110. ACME = 2; // Analog Comparator Multiplexer Enable
  111. // ACSRA
  112. ACD = 7; // Analog Comparator Disable
  113. ACBG = 6; // Analog Comparator Bandgap Select
  114. ACO = 5; // Analog Compare Output
  115. ACI = 4; // Analog Comparator Interrupt Flag
  116. ACIE = 3; // Analog Comparator Interrupt Enable
  117. ACIC = 2; // Analog Comparator Input Capture Enable
  118. ACIS = 0; // Analog Comparator Interrupt Mode Select bits
  119. // TWSCRA
  120. TWSHE = 7; // TWI SDA Hold Time Enable
  121. TWDIE = 5; // TWI Data Interrupt Enable
  122. TWASIE = 4; // TWI Address/Stop Interrupt Enable
  123. TWEN = 3; // Two-Wire Interface Enable
  124. TWSIE = 2; // TWI Stop Interrupt Enable
  125. TWPME = 1; // TWI Promiscuous Mode Enable
  126. TWSME = 0; // TWI Smart Mode Enable
  127. // TWSCRB
  128. TWAA = 2; // TWI Acknowledge Action
  129. TWCMD = 0; //
  130. // TWSA
  131. // TWSD
  132. // SREG
  133. I = 7; // Global Interrupt Enable
  134. T = 6; // Bit Copy Storage
  135. H = 5; // Half Carry Flag
  136. S = 4; // Sign Bit
  137. V = 3; // Two's Complement Overflow Flag
  138. N = 2; // Negative Flag
  139. Z = 1; // Zero Flag
  140. C = 0; // Carry Flag
  141. // CLKMSR
  142. CLKMS = 0; // Clock Main Select Bits
  143. // CLKPSR
  144. CLKPS = 0; // Clock Prescaler Select Bits
  145. // PRR
  146. PRTWI = 4; // Power Reduction TWI
  147. PRSPI = 3; // Power Reduction Serial Peripheral Interface
  148. PRTIM1 = 2; // Power Reduction Timer/Counter1
  149. PRTIM0 = 1; // Power Reduction Timer/Counter0
  150. PRADC = 0; // Power Reduction ADC
  151. // RSTFLR
  152. WDRF = 3; // Watchdog Reset Flag
  153. EXTRF = 1; // External Reset Flag
  154. PORF = 0; // Power-on Reset Flag
  155. // NVMCSR
  156. NVMBSY = 7; // Non-Volatile Memory Busy
  157. // PCMSK2
  158. PCINT = 0; // Pin Change Enable Mask 3
  159. // PCMSK1
  160. // PCMSK0
  161. // PORTCR
  162. ADC11D = 7; //
  163. ADC10D = 6; //
  164. ADC9D = 5; //
  165. ADC8D = 4; //
  166. BBMC = 2; // Break-Before-Make Mode Enable
  167. BBMB = 1; // Break-Before-Make Mode Enable
  168. BBMA = 0; // Break-Before-Make Mode Enable
  169. // PORTCR
  170. // TCCR0A
  171. COM0A = 6; // Compare Output Mode for Channel A bits
  172. COM0B = 4; // Compare Output Mode for Channel B bits
  173. WGM0 = 0; // Waveform Generation Mode
  174. // TCCR0B
  175. FOC0A = 7; // Force Output Compare A
  176. FOC0B = 6; // Force Output Compare B
  177. TSM = 5; // Timer/Counter Synchronization Mode
  178. PSR = 4; // Prescaler Reset Timer/Counter
  179. WGM02 = 3; // Waveform Generation Mode
  180. CS0 = 0; // Clock Select
  181. // TCCR1A
  182. TCW1 = 7; // Timer/Counter1 Width
  183. ICEN1 = 6; // Input Capture Mode Enable
  184. ICNC1 = 5; // : Input Capture Noise Canceler
  185. ICES1 = 4; // Input Capture Edge Select
  186. CTC1 = 3; // Waveform Generation Mode
  187. CS1 = 0; // The Clock Select1 bits 2, 1, and 0 define the prescaling source of Timer1.
  188. // TIMSK
  189. ICIE1 = 7; // Input Capture Interrupt Enable
  190. OCIE1B = 5; // Output Compare B Match Interrupt Enable
  191. OCIE1A = 4; // Output Compare A Match Interrupt Enable
  192. TOIE = 0; // Overflow Interrupt Enable
  193. OCIE0B = 2; // Timer/Counter Output Compare Match B Interrupt Enable
  194. OCIE0A = 1; // Timer/Counter0 Output Compare Match A Interrupt Enable
  195. // TIFR
  196. ICF1 = 7; // Input Capture Flag
  197. OCF1B = 5; // Timer Output Compare Flag 1B
  198. OCF1A = 4; // Timer Output Compare Flag 1A
  199. TOV = 0; // Timer Overflow Flag
  200. OCF0B = 2; // Output Compare Flag 0 B
  201. OCF0A = 1; // Output Compare Flag 0 A
  202. // PORTCR
  203. // SPCR
  204. SPIE = 7; // SPI Interrupt Enable
  205. SPE = 6; // SPI Enable
  206. DORD = 5; // Data Order
  207. MSTR = 4; // Master/Slave Select
  208. CPOL = 3; // Clock polarity
  209. CPHA = 2; // Clock Phase
  210. SPR = 0; // SPI Clock Rate Selects
  211. // SPSR
  212. SPIF = 7; // SPI Interrupt Flag
  213. WCOL = 6; // Write Collision Flag
  214. SPI2X = 0; // Double SPI Speed Bit
  215. implementation
  216. {$define RELBRANCHES}
  217. {$i avrcommon.inc}
  218. procedure INT0_ISR; external name 'INT0_ISR'; // Interrupt 1 External Interrupt Request 0
  219. procedure PCINT0_ISR; external name 'PCINT0_ISR'; // Interrupt 2 Pin Change Interrupt Request 0
  220. procedure PCINT1_ISR; external name 'PCINT1_ISR'; // Interrupt 3 Pin Change Interrupt Request 1
  221. procedure WDT_ISR; external name 'WDT_ISR'; // Interrupt 4 Watchdog Time-out
  222. procedure TIM1_CAPT_ISR; external name 'TIM1_CAPT_ISR'; // Interrupt 5 Timer/Counter1 Input Capture
  223. procedure TIM1_COMPA_ISR; external name 'TIM1_COMPA_ISR'; // Interrupt 6 Timer/Counter1 Compare Match A
  224. procedure TIM1_COMPB_ISR; external name 'TIM1_COMPB_ISR'; // Interrupt 7 Timer/Counter1 Compare Match B
  225. procedure TIM1_OVF_ISR; external name 'TIM1_OVF_ISR'; // Interrupt 8 Timer/Counter1 Overflow
  226. procedure TIM0_COMPA_ISR; external name 'TIM0_COMPA_ISR'; // Interrupt 9 Timer/Counter0 Compare Match A
  227. procedure TIM0_COMPB_ISR; external name 'TIM0_COMPB_ISR'; // Interrupt 10 Timer/Counter0 Compare Match B
  228. procedure TIM0_OVF_ISR; external name 'TIM0_OVF_ISR'; // Interrupt 11 Timer/Counter0 Overflow
  229. procedure ANA_COMP_ISR; external name 'ANA_COMP_ISR'; // Interrupt 12 Analog Comparator
  230. procedure ADC_ADC_ISR; external name 'ADC_ADC_ISR'; // Interrupt 13 Conversion Complete
  231. procedure TWI_SLAVE_ISR; external name 'TWI_SLAVE_ISR'; // Interrupt 14 Two-Wire Interface
  232. procedure SPI_ISR; external name 'SPI_ISR'; // Interrupt 15 Serial Peripheral Interface
  233. procedure QTRIP_ISR; external name 'QTRIP_ISR'; // Interrupt 16 Touch Sensing
  234. procedure _FPC_start; assembler; nostackframe; noreturn; public name '_START'; section '.init';
  235. asm
  236. rjmp __dtors_end
  237. rjmp INT0_ISR
  238. rjmp PCINT0_ISR
  239. rjmp PCINT1_ISR
  240. rjmp WDT_ISR
  241. rjmp TIM1_CAPT_ISR
  242. rjmp TIM1_COMPA_ISR
  243. rjmp TIM1_COMPB_ISR
  244. rjmp TIM1_OVF_ISR
  245. rjmp TIM0_COMPA_ISR
  246. rjmp TIM0_COMPB_ISR
  247. rjmp TIM0_OVF_ISR
  248. rjmp ANA_COMP_ISR
  249. rjmp ADC_ADC_ISR
  250. rjmp TWI_SLAVE_ISR
  251. rjmp SPI_ISR
  252. rjmp QTRIP_ISR
  253. .weak INT0_ISR
  254. .weak PCINT0_ISR
  255. .weak PCINT1_ISR
  256. .weak WDT_ISR
  257. .weak TIM1_CAPT_ISR
  258. .weak TIM1_COMPA_ISR
  259. .weak TIM1_COMPB_ISR
  260. .weak TIM1_OVF_ISR
  261. .weak TIM0_COMPA_ISR
  262. .weak TIM0_COMPB_ISR
  263. .weak TIM0_OVF_ISR
  264. .weak ANA_COMP_ISR
  265. .weak ADC_ADC_ISR
  266. .weak TWI_SLAVE_ISR
  267. .weak SPI_ISR
  268. .weak QTRIP_ISR
  269. .set INT0_ISR, Default_IRQ_handler
  270. .set PCINT0_ISR, Default_IRQ_handler
  271. .set PCINT1_ISR, Default_IRQ_handler
  272. .set WDT_ISR, Default_IRQ_handler
  273. .set TIM1_CAPT_ISR, Default_IRQ_handler
  274. .set TIM1_COMPA_ISR, Default_IRQ_handler
  275. .set TIM1_COMPB_ISR, Default_IRQ_handler
  276. .set TIM1_OVF_ISR, Default_IRQ_handler
  277. .set TIM0_COMPA_ISR, Default_IRQ_handler
  278. .set TIM0_COMPB_ISR, Default_IRQ_handler
  279. .set TIM0_OVF_ISR, Default_IRQ_handler
  280. .set ANA_COMP_ISR, Default_IRQ_handler
  281. .set ADC_ADC_ISR, Default_IRQ_handler
  282. .set TWI_SLAVE_ISR, Default_IRQ_handler
  283. .set SPI_ISR, Default_IRQ_handler
  284. .set QTRIP_ISR, Default_IRQ_handler
  285. end;
  286. end.