Guest User

Untitled

a guest
Dec 13th, 2015
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.  
  3. INS MAIN PROGRAMM MUSS:
  4.  - IIC INIT
  5.  - ARBEITSREGISTER ALS "DATA" DEFINIEREN (HIER KOMMEN EIN-/AUSGABEDATEN HIN)
  6.  - ARBEITSREGISTER temp1, temp2 und temp3 DEFINIEREN
  7.  - SLA_W UND SLA_R DEFINIEREN (SLAVE ADDR)
  8.  
  9.  
  10.  Das TWIE Bit im TWCR wird nicht gesetzt. Das heisst das TWI arbeitet nicht mit Interrupts!
  11.  -> TWINT (Das Interrupt-Flag) muss gepollt werden.
  12.  Wenn TWINT auf 1 gesetzt wird, wird das TWI-flag gecleart.
  13.  Es wird keine Operation ausgeführt, solange TWINT nicht gesetzt ist.
  14.  TWSR enthält dann den aktuellen Status des Buses.
  15.  
  16.  WICHTIG: Die empfangenen Daten werden ins DATA Register geschrieben.
  17.  welches das ist, muss im Mainprogramm definiert werden.
  18. */
  19.  
  20.  
  21.  
  22. .equ    TWSR_START                  =   0x08
  23. .equ    TWSR_REPEAT_START           =   0x10
  24. .equ    TWSR_SLAW_ACK               =   0x18
  25. .equ    TWSR_SLAR_ACK               =   0x40
  26. .equ    TWSR_WRITE_ACK              =   0x28
  27. .equ    TWSR_DATA_REC_ACK           =   0x50
  28. .equ    TWSR_DATA_REC_NACK          =   0x58
  29.  
  30. //############################################################################
  31. //                  MASTER START
  32. //############################################################################
  33.  
  34. TWI_START:
  35. /* TWI Control Register (TWCR) beschreiben.
  36. TWINT: TWI-Schnittstelle freigeben
  37. TWSTA: START senden
  38. TWEN: TWINT freigeben
  39. */
  40. ldi temp1, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
  41. out TWCR, temp1
  42. /*
  43. Sobald TWINT gesetzt wurde, beginnt der Controller mit der Übertragung
  44. Der Controller wartet jetzt bis der Bus frei ist und sendet dann START
  45. */
  46. rcall   WAIT_TWINT
  47. //Status Code auswerten
  48. //Dazu Status-Code übergeben
  49. ldi temp3, TWSR_START
  50. rcall   TWI_STATUS
  51. ret
  52.  
  53.  
  54. //############################################################################
  55. //                  MASTER REPEAT START
  56. //############################################################################
  57.  
  58. TWI_REPEAT_START:
  59. /* TWI Control Register (TWCR) beschreiben.
  60. TWINT: TWI-Schnittstelle freigeben
  61. TWSTA: START senden
  62. TWEN: TWINT freigeben
  63. */
  64. ldi temp1, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
  65. out TWCR, temp1
  66. /*
  67. Sobald TWINT gesetzt wurde, beginnt der Controller mit der Übertragung
  68. Der Controller wartet jetzt bis der Bus frei ist und sendet dann START
  69. */
  70. rcall   WAIT_TWINT
  71. //Status Code auswerten
  72. //Dazu Status-Code übergeben
  73. ldi temp3, TWSR_REPEAT_START
  74. rcall   TWI_STATUS
  75. ret
  76.  
  77. //############################################################################
  78. //                  MASTER WRITE TO SLAVE
  79. //############################################################################
  80.  
  81. TWI_SLAW:
  82. //Slave ansprechen und WRITE initiieren
  83. ldi temp1, SLA_W
  84. out TWDR, temp1
  85. ldi temp1, (1<<TWINT)|(1<<TWEN)
  86. out TWCR, temp1
  87. // TWINT Bit gesetzt -> Flag gelöscht -> Kommunikation angestoßen
  88. rcall   WAIT_TWINT
  89. //Status Code auswerten
  90. //Dazu Status-Code übergeben
  91. ldi temp3, TWSR_SLAW_ACK
  92. rcall   TWI_STATUS
  93. ret
  94.  
  95. //############################################################################
  96. //                  WRITE
  97. //############################################################################
  98.  
  99. TWI_WRITE:
  100. // Zu übermittelnde Daten senden
  101. mov temp1, DATA
  102. out TWDR, temp1
  103. ldi temp1, (1<<TWINT) | (1<<TWEN)
  104. out TWCR, temp1
  105.  
  106. rcall   WAIT_TWINT
  107.  
  108. //Status Code auswerten
  109. //Dazu Status-Code übergeben
  110. ldi temp3, TWSR_WRITE_ACK
  111. rcall   TWI_STATUS
  112. ret
  113.  
  114. //############################################################################
  115. //                  MASTER READ FROM SLAVE
  116. //############################################################################
  117.  
  118. TWI_SLAR:
  119. //Slave ansprechen und READ initiieren
  120. ldi temp1, SLA_R
  121. out TWDR, temp1
  122. ldi temp1, (1<<TWINT)|(1<<TWEN)
  123. out TWCR, temp1
  124.  
  125. rcall   WAIT_TWINT
  126.  
  127. //Status Code auswerten
  128. //Dazu Status-Code übergeben
  129. ldi temp3, TWSR_SLAR_ACK
  130. rcall   TWI_STATUS
  131. ret
  132.  
  133. //############################################################################
  134. //                  ERWARTE NOCH MEHRERE BYTES
  135. //############################################################################
  136. TWI_DATA_IN:
  137. rcall   TWI_ACK
  138. rcall   Wait_TWINT
  139. //Status Code auswerten
  140. //Dazu Status-Code übergeben
  141. ldi temp3, TWSR_DATA_REC_ACK
  142. rcall   TWI_STATUS
  143. ;Daten einlesen
  144. in DATA, TWDR
  145. ret
  146.  
  147. //############################################################################
  148. //                  ERWARTE NOCH GENAU EIN BYTE
  149. //############################################################################
  150. TWI_DATA_IN_LAST:
  151. rcall   TWI_NACK
  152. rcall   Wait_TWINT
  153. //Status Code auswerten
  154. //Dazu Status-Code übergeben
  155. ldi temp3, TWSR_DATA_REC_NACK
  156. rcall   TWI_STATUS
  157. ;Daten einlesen
  158. in DATA, TWDR
  159. ret
  160.  
  161. //############################################################################
  162. //                  MASTER STOP
  163. //############################################################################
  164.  
  165. TWI_STOP:
  166.  
  167. //STOP senden
  168. ldi temp1, (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
  169. out TWCR, temp1
  170. ret
  171.  
  172. //############################################################################
  173. //                  NACK
  174. //############################################################################
  175. TWI_NACK:
  176. // TWEA = 0 sendet NACK
  177. ldi temp1, (1<<TWINT | 0<<TWEA  | 1<<TWEN )
  178. out TWCR, temp1
  179. ret
  180.  
  181. //############################################################################
  182. //                  ACK
  183. //############################################################################
  184. TWI_ACK:
  185. // TWEA = 1 sendet ACK
  186. ldi temp1, (1<<TWINT | 1<<TWEA  | 1<<TWEN )
  187. out TWCR, temp1
  188. ret
  189.  
  190.  
  191.  
  192. //############################################################################
  193. //                  STATUSCODE AUSLESEN
  194. //############################################################################
  195. TWI_STATUS:
  196. //Dazu Stauts-Register einlesen
  197. in  temp1, TWSR
  198. //Statusregister enthält Prescaler Bits, diese werden weg maskiert
  199. ldi temp2, 0b11111000
  200. and temp1, temp2
  201. //Jetzt mir erwartetem Wert vergleichen.
  202. sub temp1, temp3
  203. //Falls ungleich, springe zu ERROR
  204. brne    ERROR
  205.  
  206. //############################################################################
  207. //                  WAIT TWINT FLAG
  208. //############################################################################
  209.  
  210. Wait_TWINT:
  211. // Warten darauf, dass das Twint-Flag gesetzt wurde.
  212. // Das TWINT-Flag wird nach jeder Übetragung gesetzt.
  213. //Dazu Controll-Register einlesen
  214. in  temp1, TWCR
  215. sbrs    temp1, TWINT
  216. //rjmp Befehl skippen, wenn TWINT gesetzt ist
  217. rjmp    Wait_TWINT
  218. ret
  219.  
  220. //############################################################################
  221. //                  ERROR
  222. //############################################################################
  223.  
  224. ERROR:
  225.  
  226. rjmp    ERROR
Advertisement
Add Comment
Please, Sign In to add comment