attiny40.pp 12 KB

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