TWI_DATASHEET.asm


1
; Sebastian Schreiner 14.05.2007
2
; Basierend auf Datenblatt: "2486Q-AVR-10/06" von ATMEL
3
; Als iO-Meldung wird PortB.2 gesetzt
4
; Als niO-Meldung wird PortB.0 gesetzt
5
6
7
.include "m8def.inc"
8
9
.def temp1 = r16
10
.def temp2 = r17
11
 
12
  ldi temp1, LOW(RAMEND)    ; LOW-Byte der obersten RAM-Adresse
13
  out SPL, temp1
14
  ldi temp1, HIGH(RAMEND)    ; HIGH-Byte der obersten RAM-Adresse
15
  out SPH, temp1
16
 
17
   ldi temp1, 0xFF      ; Port B als Ausgang schalten
18
  out DDRB, temp1
19
20
  ldi temp1, 12       ; Bitrate einstellen
21
  out TWBR, temp1
22
23
  ldi temp1, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
24
  out TWCR, temp1        ; Start condition senden
25
26
wait1:
27
  in temp1,TWCR        ; Warten bis TWINT Flag gesetzt
28
  sbrs temp1,TWINT      
29
  rjmp wait1
30
31
  in temp1,TWSR        ; TWI Statusregister abfragen 
32
  andi temp1, 0xF8      ; Prescalerbits maskieren
33
  cpi temp1, 0x08        ; Startcondition prüfen (Datenblatt: Tabelle 66)
34
  brne ERROR
35
36
  ldi temp1, 0x40        ; Zieladresse in TWDR laden (RW=0)
37
  out TWDR, temp1        
38
  ldi temp1, (1<<TWINT) | (1<<TWEN)  ; TWINT löschen um Übertragung zu starten
39
  out TWCR, temp1
40
41
wait2:
42
  in temp1,TWCR        ; Warten bis TWINT Flag gesetzt
43
  sbrs temp1,TWINT
44
  rjmp wait2
45
46
  in temp1,TWSR        ; TWSR Status prüfen
47
  andi temp1, 0xF8      ; Prescalerbits maskieren
48
  cpi temp1, 0x18        ; TWSR mit MT_SLA_ACK vergleichen (Datenblatt: Tabelle 66)
49
  brne ERROR
50
51
  ldi temp1, 85        ; Daten in TWDR laden
52
  out TWDR, temp1        
53
  ldi temp1, (1<<TWINT) | (1<<TWEN)  ; TWINT löschen um Übertragung zu starten
54
  out TWCR, temp1        
55
56
wait3:
57
  in temp1,TWCR        ; Warten bis TWINT Flag gesetzt
58
  sbrs temp1,TWINT      
59
  rjmp wait3
60
61
  in temp1,TWSR        ; TWSR Status prüfen
62
  andi temp1, 0xF8      ; Prescaler maskieren
63
  cpi temp1, 0x28        ; TWSR mit MT_DATA_ACK vergleichen (Datenblatt: Tabelle 66)
64
  brne ERROR
65
66
  ldi temp1, (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)  ; Stop condition senden
67
  out TWCR, temp1
68
69
main:
70
  ldi temp1, 0x04        ; Indikator Ausgang für main-Schleifen
71
  out PORTB, temp1      ; iO
72
  rjmp main
73
74
ERROR:
75
  ldi temp1, 0x01        ; Indikator Ausgang für ERROE-Schleife
76
  out PORTB, temp1      ; niO
77
  rjmp ERROR