attiny102.pp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. unit ATtiny102;
  2. {$goto on}
  3. interface
  4. var
  5. PINA: byte absolute $00; // Input Pins, Port A
  6. DDRA: byte absolute $01; // Data Direction Register, Port A
  7. PORTA: byte absolute $02; // Port A Data register
  8. PUEA: byte absolute $03; // Pull-up Enable Control Register for PORTA
  9. PINB: byte absolute $04; // Input Pins, Port B
  10. DDRB: byte absolute $05; // Data Direction Register, Port B
  11. PORTB: byte absolute $06; // Port B Data register
  12. PUEB: byte absolute $07; // Pull-up Enable Control Register for PORTB
  13. UDR: byte absolute $08; // USART I/O Data Register
  14. UBRR: word absolute $09; // USART Baud Rate Register Bytes
  15. UBRRL: byte absolute $09; // USART Baud Rate Register Bytes
  16. UBRRH: byte absolute $0A; // USART Baud Rate Register Bytes;
  17. UCSRD: byte absolute $0B; // USART Control and Status Register D
  18. UCSRC: byte absolute $0C; // USART Control and Status Register C
  19. UCSRB: byte absolute $0D; // USART Control and Status Register B
  20. UCSRA: byte absolute $0E; // USART Control and Status Register A
  21. PCMSK0: byte absolute $0F; // Pin Change Mask Register 0
  22. PCMSK1: byte absolute $10; // Pin Change Mask Register 1
  23. PCIFR: byte absolute $11; // Pin Change Interrupt Flag Register
  24. PCICR: byte absolute $12; // Pin Change Interrupt Control Register
  25. EIMSK: byte absolute $13; // External Interrupt Mask register
  26. EIFR: byte absolute $14; // External Interrupt Flag register
  27. EICRA: byte absolute $15; // External Interrupt Control Register A
  28. PORTCR: byte absolute $16; // Port Control Register
  29. DIDR0: byte absolute $17;
  30. ADCL: byte absolute $19; // ADC Data Register Low
  31. ADCH: byte absolute $1A; // ADC Data Register High
  32. ADMUX: byte absolute $1B; // The ADC multiplexer Selection Register
  33. ADCSRB: byte absolute $1C; // The ADC Control and Status register B
  34. ADCSRA: byte absolute $1D; // The ADC Control and Status register A
  35. ACSRB: byte absolute $1E; // Analog Comparator Control And Status Register B
  36. ACSRA: byte absolute $1F; // Analog Comparator Control And Status Register A
  37. ICR0: word absolute $22; // Input Capture Register Bytes
  38. ICR0L: byte absolute $22; // Input Capture Register Bytes
  39. ICR0H: byte absolute $23; // Input Capture Register Bytes;
  40. OCR0B: word absolute $24; // Timer/Counter0 Output Compare Register B
  41. OCR0BL: byte absolute $24; // Timer/Counter0 Output Compare Register B
  42. OCR0BH: byte absolute $25; // Timer/Counter0 Output Compare Register B ;
  43. OCR0A: word absolute $26; // Timer/Counter 0 Output Compare Register A
  44. OCR0AL: byte absolute $26; // Timer/Counter 0 Output Compare Register A
  45. OCR0AH: byte absolute $27; // Timer/Counter 0 Output Compare Register A ;
  46. TCNT0: word absolute $28; // Timer/Counter0
  47. TCNT0L: byte absolute $28; // Timer/Counter0
  48. TCNT0H: byte absolute $29; // Timer/Counter0 ;
  49. TIFR0: byte absolute $2A; // Overflow Interrupt Enable
  50. TIMSK0: byte absolute $2B; // Timer Interrupt Mask Register 0
  51. TCCR0C: byte absolute $2C; // Timer/Counter 0 Control Register C
  52. TCCR0B: byte absolute $2D; // Timer/Counter 0 Control Register B
  53. TCCR0A: byte absolute $2E; // Timer/Counter 0 Control Register A
  54. GTCCR: byte absolute $2F; // General Timer/Counter Control Register
  55. WDTCSR: byte absolute $31; // Watchdog Timer Control and Status Register
  56. NVMCSR: byte absolute $32; // Non-Volatile Memory Control and Status Register
  57. NVMCMD: byte absolute $33; // Non-Volatile Memory Command
  58. VLMCSR: byte absolute $34; // Vcc Level Monitoring Control and Status Register
  59. PRR: byte absolute $35; // Power Reduction Register
  60. CLKPSR: byte absolute $36; // Clock Prescale Register
  61. CLKMSR: byte absolute $37; // Clock Main Settings Register
  62. OSCCAL: byte absolute $39; // Oscillator Calibration Value
  63. SMCR: byte absolute $3A; // Sleep Mode Control Register
  64. RSTFLR: byte absolute $3B; // Reset Flag Register
  65. CCP: byte absolute $3C; // Configuration Change Protection
  66. SP: word absolute $3D; // Stack Pointer
  67. SPL: byte absolute $3D; // Stack Pointer
  68. SPH: byte absolute $3E; // Stack Pointer ;
  69. SREG: byte absolute $3F; // Status Register
  70. const
  71. // Port A Data register
  72. PA0 = $00;
  73. PA1 = $01;
  74. PA2 = $02;
  75. // Port B Data register
  76. PB1 = $01;
  77. PB2 = $02;
  78. PB3 = $03;
  79. // USART Control and Status Register D
  80. SFDE = $05;
  81. RXS = $06;
  82. RXSIE = $07;
  83. // USART Control and Status Register C
  84. UCPOL = $00;
  85. UCSZ0 = $01; // Character Size
  86. UCSZ1 = $02; // Character Size
  87. USBS = $03;
  88. UPM0 = $04; // Parity Mode Bits
  89. UPM1 = $05; // Parity Mode Bits
  90. UMSEL0 = $06; // USART Mode Select
  91. UMSEL1 = $07; // USART Mode Select
  92. // USART Control and Status Register B
  93. TXB8 = $00;
  94. RXB8 = $01;
  95. UCSZ2 = $02;
  96. TXEN = $03;
  97. RXEN = $04;
  98. UDRIE = $05;
  99. TXCIE = $06;
  100. RXCIE = $07;
  101. // USART Control and Status Register A
  102. MPCM = $00;
  103. U2X = $01;
  104. UPE = $02;
  105. DOR = $03;
  106. FE = $04;
  107. UDRE = $05;
  108. TXC = $06;
  109. RXC = $07;
  110. // Pin Change Mask Register 0
  111. PCINT0 = $00;
  112. PCINT1 = $01;
  113. PCINT2 = $02;
  114. PCINT3 = $03;
  115. PCINT4 = $04;
  116. PCINT5 = $05;
  117. PCINT6 = $06;
  118. PCINT7 = $07;
  119. // Pin Change Mask Register 1
  120. PCINT8 = $00;
  121. PCINT9 = $01;
  122. PCINT10 = $02;
  123. PCINT11 = $03;
  124. // Pin Change Interrupt Flag Register
  125. PCIF0 = $00;
  126. PCIF1 = $01;
  127. // Pin Change Interrupt Control Register
  128. PCIE0 = $00;
  129. PCIE1 = $01;
  130. // External Interrupt Mask register
  131. INT0 = $00;
  132. // External Interrupt Flag register
  133. INTF0 = $00;
  134. // External Interrupt Control Register A
  135. ISC00 = $00;
  136. ISC01 = $01;
  137. // Port Control Register
  138. BBMA = $00;
  139. BBMB = $01;
  140. ADC0D = $00;
  141. AIN0D = $00;
  142. ADC1D = $01;
  143. AIN1D = $01;
  144. ADC2D = $02;
  145. ADC3D = $03;
  146. ADC4D = $04;
  147. ADC5D = $05;
  148. ADC6D = $06;
  149. ADC7D = $07;
  150. // The ADC multiplexer Selection Register
  151. MUX0 = $00; // Analog Channel Selection Bits
  152. MUX1 = $01; // Analog Channel Selection Bits
  153. MUX2 = $02; // Analog Channel Selection Bits
  154. REFS0 = $06; // Analog Reference voltage Selection Bits
  155. REFS1 = $07; // Analog Reference voltage Selection Bits
  156. // The ADC Control and Status register B
  157. ADTS0 = $00; // ADC Auto Trigger Source bits
  158. ADTS1 = $01; // ADC Auto Trigger Source bits
  159. ADTS2 = $02; // ADC Auto Trigger Source bits
  160. ADLAR = $07;
  161. // The ADC Control and Status register A
  162. ADPS0 = $00; // ADC Prescaler Select Bits
  163. ADPS1 = $01; // ADC Prescaler Select Bits
  164. ADPS2 = $02; // ADC Prescaler Select Bits
  165. ADIE = $03;
  166. ADIF = $04;
  167. ADATE = $05;
  168. ADSC = $06;
  169. ADEN = $07;
  170. // Analog Comparator Control And Status Register B
  171. ACPMUX = $00;
  172. ACOE = $01;
  173. // Analog Comparator Control And Status Register A
  174. ACIS0 = $00; // Analog Comparator Interrupt Mode Select bits
  175. ACIS1 = $01; // Analog Comparator Interrupt Mode Select bits
  176. ACIC = $02;
  177. ACIE = $03;
  178. ACI = $04;
  179. ACO = $05;
  180. ACBG = $06;
  181. ACD = $07;
  182. // Overflow Interrupt Enable
  183. TOV0 = $00;
  184. OCF0A = $01;
  185. OCF0B = $02;
  186. ICF0 = $05;
  187. // Timer Interrupt Mask Register 0
  188. TOIE0 = $00;
  189. OCIE0A = $01;
  190. OCIE0B = $02;
  191. ICIE0 = $05;
  192. // Timer/Counter 0 Control Register C
  193. FOC0B = $06;
  194. FOC0A = $07;
  195. // Timer/Counter 0 Control Register B
  196. CS00 = $00; // Clock Select
  197. CS01 = $01; // Clock Select
  198. CS02 = $02; // Clock Select
  199. ICES0 = $06;
  200. ICNC0 = $07;
  201. // Timer/Counter 0 Control Register A
  202. WGM00 = $00; // Waveform Generation Mode
  203. WGM01 = $01; // Waveform Generation Mode
  204. COM0B0 = $04; // Compare Output Mode for Channel B bits
  205. COM0B1 = $05; // Compare Output Mode for Channel B bits
  206. COM0A0 = $06; // Compare Output Mode for Channel A bits
  207. COM0A1 = $07; // Compare Output Mode for Channel A bits
  208. // General Timer/Counter Control Register
  209. PSR = $00;
  210. REMAP = $01;
  211. TSM = $07;
  212. // Watchdog Timer Control and Status Register
  213. WDE = $03;
  214. WDP0 = $00; // Watchdog Timer Prescaler Bits
  215. WDP1 = $01; // Watchdog Timer Prescaler Bits
  216. WDP2 = $02; // Watchdog Timer Prescaler Bits
  217. WDP3 = $05; // Watchdog Timer Prescaler Bits
  218. WDIE = $06;
  219. WDIF = $07;
  220. // Non-Volatile Memory Control and Status Register
  221. NVMBSY = $07;
  222. // Vcc Level Monitoring Control and Status Register
  223. VLM0 = $00; // Trigger Level of Voltage Level Monitor bits
  224. VLM1 = $01; // Trigger Level of Voltage Level Monitor bits
  225. VLM2 = $02; // Trigger Level of Voltage Level Monitor bits
  226. VLMIE = $06;
  227. VLMF = $07;
  228. // Power Reduction Register
  229. PRTIM0 = $00;
  230. PRADC = $01;
  231. PRUSART = $02;
  232. // Clock Prescale Register
  233. CLKPS0 = $00; // Clock Prescaler Select Bits
  234. CLKPS1 = $01; // Clock Prescaler Select Bits
  235. CLKPS2 = $02; // Clock Prescaler Select Bits
  236. CLKPS3 = $03; // Clock Prescaler Select Bits
  237. // Clock Main Settings Register
  238. CLKMS0 = $00; // Clock Main Select Bits
  239. CLKMS1 = $01; // Clock Main Select Bits
  240. // Sleep Mode Control Register
  241. SE = $00;
  242. SM0 = $01; // Sleep Mode Select Bits
  243. SM1 = $02; // Sleep Mode Select Bits
  244. SM2 = $03; // Sleep Mode Select Bits
  245. // Reset Flag Register
  246. PORF = $00;
  247. EXTRF = $01;
  248. WDRF = $03;
  249. // Configuration Change Protection
  250. CCP0 = $00; // CCP signature
  251. CCP1 = $01; // CCP signature
  252. CCP2 = $02; // CCP signature
  253. CCP3 = $03; // CCP signature
  254. CCP4 = $04; // CCP signature
  255. CCP5 = $05; // CCP signature
  256. CCP6 = $06; // CCP signature
  257. CCP7 = $07; // CCP signature
  258. // Status Register
  259. C = $00;
  260. Z = $01;
  261. N = $02;
  262. V = $03;
  263. S = $04;
  264. H = $05;
  265. T = $06;
  266. I = $07;
  267. implementation
  268. {$define RELBRANCHES}
  269. {$i avrcommon.inc}
  270. procedure INT0_ISR; external name 'INT0_ISR'; // Interrupt 1 External Interrupt Request 0
  271. procedure PCINT0_ISR; external name 'PCINT0_ISR'; // Interrupt 2 Pin Change Interrupt Request 0
  272. procedure PCINT1_ISR; external name 'PCINT1_ISR'; // Interrupt 3 Pin Change Interrupt Request 1
  273. procedure TIM0_CAPT_ISR; external name 'TIM0_CAPT_ISR'; // Interrupt 4 Timer/Counter0 Input Capture
  274. procedure TIM0_OVF_ISR; external name 'TIM0_OVF_ISR'; // Interrupt 5 Timer/Counter0 Overflow
  275. procedure TIM0_COMPA_ISR; external name 'TIM0_COMPA_ISR'; // Interrupt 6 Timer/Counter Compare Match A
  276. procedure TIM0_COMPB_ISR; external name 'TIM0_COMPB_ISR'; // Interrupt 7 Timer/Counter Compare Match B
  277. procedure ANA_COMP_ISR; external name 'ANA_COMP_ISR'; // Interrupt 8 Analog Comparator
  278. procedure WDT_ISR; external name 'WDT_ISR'; // Interrupt 9 Watchdog Time-out
  279. procedure VLM_ISR; external name 'VLM_ISR'; // Interrupt 10 Vcc Voltage Level Monitor
  280. procedure ADC_ISR; external name 'ADC_ISR'; // Interrupt 11 ADC Conversion complete
  281. procedure USART_RXS_ISR; external name 'USART_RXS_ISR'; // Interrupt 12 USART RX Start
  282. procedure USART_RXC_ISR; external name 'USART_RXC_ISR'; // Interrupt 13 USART RX Complete
  283. procedure USART_DRE_ISR; external name 'USART_DRE_ISR'; // Interrupt 14 USART Data register empty
  284. procedure USART_TXC_ISR; external name 'USART_TXC_ISR'; // Interrupt 15 USART Tx Complete
  285. procedure _FPC_start; assembler; nostackframe;
  286. label
  287. _start;
  288. asm
  289. .init
  290. .globl _start
  291. rjmp _start
  292. rjmp INT0_ISR
  293. rjmp PCINT0_ISR
  294. rjmp PCINT1_ISR
  295. rjmp TIM0_CAPT_ISR
  296. rjmp TIM0_OVF_ISR
  297. rjmp TIM0_COMPA_ISR
  298. rjmp TIM0_COMPB_ISR
  299. rjmp ANA_COMP_ISR
  300. rjmp WDT_ISR
  301. rjmp VLM_ISR
  302. rjmp ADC_ISR
  303. rjmp USART_RXS_ISR
  304. rjmp USART_RXC_ISR
  305. rjmp USART_DRE_ISR
  306. rjmp USART_TXC_ISR
  307. {$i start.inc}
  308. .weak INT0_ISR
  309. .weak PCINT0_ISR
  310. .weak PCINT1_ISR
  311. .weak TIM0_CAPT_ISR
  312. .weak TIM0_OVF_ISR
  313. .weak TIM0_COMPA_ISR
  314. .weak TIM0_COMPB_ISR
  315. .weak ANA_COMP_ISR
  316. .weak WDT_ISR
  317. .weak VLM_ISR
  318. .weak ADC_ISR
  319. .weak USART_RXS_ISR
  320. .weak USART_RXC_ISR
  321. .weak USART_DRE_ISR
  322. .weak USART_TXC_ISR
  323. .set INT0_ISR, Default_IRQ_handler
  324. .set PCINT0_ISR, Default_IRQ_handler
  325. .set PCINT1_ISR, Default_IRQ_handler
  326. .set TIM0_CAPT_ISR, Default_IRQ_handler
  327. .set TIM0_OVF_ISR, Default_IRQ_handler
  328. .set TIM0_COMPA_ISR, Default_IRQ_handler
  329. .set TIM0_COMPB_ISR, Default_IRQ_handler
  330. .set ANA_COMP_ISR, Default_IRQ_handler
  331. .set WDT_ISR, Default_IRQ_handler
  332. .set VLM_ISR, Default_IRQ_handler
  333. .set ADC_ISR, Default_IRQ_handler
  334. .set USART_RXS_ISR, Default_IRQ_handler
  335. .set USART_RXC_ISR, Default_IRQ_handler
  336. .set USART_DRE_ISR, Default_IRQ_handler
  337. .set USART_TXC_ISR, Default_IRQ_handler
  338. end;
  339. end.