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
|