Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- INS MAIN PROGRAMM MUSS:
- - IIC INIT
- - ARBEITSREGISTER ALS "DATA" DEFINIEREN (HIER KOMMEN EIN-/AUSGABEDATEN HIN)
- - ARBEITSREGISTER temp1, temp2 und temp3 DEFINIEREN
- - SLA_W UND SLA_R DEFINIEREN (SLAVE ADDR)
- Das TWIE Bit im TWCR wird nicht gesetzt. Das heisst das TWI arbeitet nicht mit Interrupts!
- -> TWINT (Das Interrupt-Flag) muss gepollt werden.
- Wenn TWINT auf 1 gesetzt wird, wird das TWI-flag gecleart.
- Es wird keine Operation ausgeführt, solange TWINT nicht gesetzt ist.
- TWSR enthält dann den aktuellen Status des Buses.
- WICHTIG: Die empfangenen Daten werden ins DATA Register geschrieben.
- welches das ist, muss im Mainprogramm definiert werden.
- */
- .equ TWSR_START = 0x08
- .equ TWSR_REPEAT_START = 0x10
- .equ TWSR_SLAW_ACK = 0x18
- .equ TWSR_SLAR_ACK = 0x40
- .equ TWSR_WRITE_ACK = 0x28
- .equ TWSR_DATA_REC_ACK = 0x50
- .equ TWSR_DATA_REC_NACK = 0x58
- //############################################################################
- // MASTER START
- //############################################################################
- TWI_START:
- /* TWI Control Register (TWCR) beschreiben.
- TWINT: TWI-Schnittstelle freigeben
- TWSTA: START senden
- TWEN: TWINT freigeben
- */
- ldi temp1, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
- out TWCR, temp1
- /*
- Sobald TWINT gesetzt wurde, beginnt der Controller mit der Übertragung
- Der Controller wartet jetzt bis der Bus frei ist und sendet dann START
- */
- rcall WAIT_TWINT
- //Status Code auswerten
- //Dazu Status-Code übergeben
- ldi temp3, TWSR_START
- rcall TWI_STATUS
- ret
- //############################################################################
- // MASTER REPEAT START
- //############################################################################
- TWI_REPEAT_START:
- /* TWI Control Register (TWCR) beschreiben.
- TWINT: TWI-Schnittstelle freigeben
- TWSTA: START senden
- TWEN: TWINT freigeben
- */
- ldi temp1, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
- out TWCR, temp1
- /*
- Sobald TWINT gesetzt wurde, beginnt der Controller mit der Übertragung
- Der Controller wartet jetzt bis der Bus frei ist und sendet dann START
- */
- rcall WAIT_TWINT
- //Status Code auswerten
- //Dazu Status-Code übergeben
- ldi temp3, TWSR_REPEAT_START
- rcall TWI_STATUS
- ret
- //############################################################################
- // MASTER WRITE TO SLAVE
- //############################################################################
- TWI_SLAW:
- //Slave ansprechen und WRITE initiieren
- ldi temp1, SLA_W
- out TWDR, temp1
- ldi temp1, (1<<TWINT)|(1<<TWEN)
- out TWCR, temp1
- // TWINT Bit gesetzt -> Flag gelöscht -> Kommunikation angestoßen
- rcall WAIT_TWINT
- //Status Code auswerten
- //Dazu Status-Code übergeben
- ldi temp3, TWSR_SLAW_ACK
- rcall TWI_STATUS
- ret
- //############################################################################
- // WRITE
- //############################################################################
- TWI_WRITE:
- // Zu übermittelnde Daten senden
- mov temp1, DATA
- out TWDR, temp1
- ldi temp1, (1<<TWINT) | (1<<TWEN)
- out TWCR, temp1
- rcall WAIT_TWINT
- //Status Code auswerten
- //Dazu Status-Code übergeben
- ldi temp3, TWSR_WRITE_ACK
- rcall TWI_STATUS
- ret
- //############################################################################
- // MASTER READ FROM SLAVE
- //############################################################################
- TWI_SLAR:
- //Slave ansprechen und READ initiieren
- ldi temp1, SLA_R
- out TWDR, temp1
- ldi temp1, (1<<TWINT)|(1<<TWEN)
- out TWCR, temp1
- rcall WAIT_TWINT
- //Status Code auswerten
- //Dazu Status-Code übergeben
- ldi temp3, TWSR_SLAR_ACK
- rcall TWI_STATUS
- ret
- //############################################################################
- // ERWARTE NOCH MEHRERE BYTES
- //############################################################################
- TWI_DATA_IN:
- rcall TWI_ACK
- rcall Wait_TWINT
- //Status Code auswerten
- //Dazu Status-Code übergeben
- ldi temp3, TWSR_DATA_REC_ACK
- rcall TWI_STATUS
- ;Daten einlesen
- in DATA, TWDR
- ret
- //############################################################################
- // ERWARTE NOCH GENAU EIN BYTE
- //############################################################################
- TWI_DATA_IN_LAST:
- rcall TWI_NACK
- rcall Wait_TWINT
- //Status Code auswerten
- //Dazu Status-Code übergeben
- ldi temp3, TWSR_DATA_REC_NACK
- rcall TWI_STATUS
- ;Daten einlesen
- in DATA, TWDR
- ret
- //############################################################################
- // MASTER STOP
- //############################################################################
- TWI_STOP:
- //STOP senden
- ldi temp1, (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
- out TWCR, temp1
- ret
- //############################################################################
- // NACK
- //############################################################################
- TWI_NACK:
- // TWEA = 0 sendet NACK
- ldi temp1, (1<<TWINT | 0<<TWEA | 1<<TWEN )
- out TWCR, temp1
- ret
- //############################################################################
- // ACK
- //############################################################################
- TWI_ACK:
- // TWEA = 1 sendet ACK
- ldi temp1, (1<<TWINT | 1<<TWEA | 1<<TWEN )
- out TWCR, temp1
- ret
- //############################################################################
- // STATUSCODE AUSLESEN
- //############################################################################
- TWI_STATUS:
- //Dazu Stauts-Register einlesen
- in temp1, TWSR
- //Statusregister enthält Prescaler Bits, diese werden weg maskiert
- ldi temp2, 0b11111000
- and temp1, temp2
- //Jetzt mir erwartetem Wert vergleichen.
- sub temp1, temp3
- //Falls ungleich, springe zu ERROR
- brne ERROR
- //############################################################################
- // WAIT TWINT FLAG
- //############################################################################
- Wait_TWINT:
- // Warten darauf, dass das Twint-Flag gesetzt wurde.
- // Das TWINT-Flag wird nach jeder Übetragung gesetzt.
- //Dazu Controll-Register einlesen
- in temp1, TWCR
- sbrs temp1, TWINT
- //rjmp Befehl skippen, wenn TWINT gesetzt ist
- rjmp Wait_TWINT
- ret
- //############################################################################
- // ERROR
- //############################################################################
- ERROR:
- rjmp ERROR
Advertisement
Add Comment
Please, Sign In to add comment