1 | #define F_CPU 16000000UL
|
2 |
|
3 | #include<avr/io.h>
|
4 | #include<util/delay.h>
|
5 | #include<inttypes.h>
|
6 | #include "lcd4b.h"
|
7 | #include <stdint.h> // für my_uitoa(uint32_t zahl, char* string)
|
8 |
|
9 | void my_uitoa(uint32_t zahl, char* string);
|
10 | void TWI_start(void);
|
11 | void TWI_repeated_start(void);
|
12 | void TWI_init_master(void);
|
13 | void TWI_write_address(unsigned char);
|
14 | void TWI_read_address(unsigned char);
|
15 | void TWI_write_data(unsigned char);
|
16 | void TWI_read_data(void);
|
17 | void TWI_stop(void);
|
18 |
|
19 | #define consthigh 0b00010000 // Betrieb mit 1 Lux Auflösung
|
20 | #define constlow 0b00100011 // Betreib mit 4 Lux Auflösung
|
21 | #define adr_wr 0b01000110 // Adresse mit r/w-Bit auf schreiben
|
22 | #define adr_rd 0b01000111 // Adresse mit r/w-Bit auf lesen
|
23 |
|
24 | unsigned recv_data;
|
25 |
|
26 | int main(void)
|
27 | {
|
28 | DDRA |= 0b11111100; //Pins 2-7 als Ausgänge //Jumper DB4-DB7 (der Rest raus)), RS auf PA2, E auf PA3, R/W auf GND,
|
29 | char text[3];
|
30 | char high;
|
31 | char low;
|
32 | unsigned int ergebnis=0;
|
33 |
|
34 | lcd_linit();
|
35 | lcd_clear();
|
36 | TWI_init_master();
|
37 |
|
38 | while(1)
|
39 | {
|
40 | TWI_start(); // Startbedingung senden
|
41 | TWI_write_address(adr_wr); // Adresse und Datenrichtung=schreiben senden
|
42 |
|
43 | TWI_write_data(constlow); // Messung auslösen
|
44 | TWI_stop(); // Stoppbedingung senden
|
45 |
|
46 | _delay_ms(24); // Messung abwarten
|
47 |
|
48 | TWI_start();
|
49 | TWI_read_address(adr_rd); // Adresse und Datenrichtung=lesen senden
|
50 | TWI_read_data(); // Daten empfangen
|
51 | high=recv_data;
|
52 | TWI_read_data(); // Daten empfangen
|
53 | TWI_stop();
|
54 | low=recv_data;
|
55 |
|
56 | lcd_clear();
|
57 |
|
58 | itoa(low,text,10);
|
59 | lcd_command(line1);
|
60 | lcd_out(text);
|
61 |
|
62 | itoa(high,text,10);
|
63 | lcd_command(line2);
|
64 | lcd_out(text);
|
65 |
|
66 | _delay_ms(100);
|
67 | }
|
68 | }
|
69 |
|
70 | void TWI_init_master(void) // Function to initialize master
|
71 | {
|
72 | TWBR=0xFF; // Bit rate
|
73 | TWSR=(0<<TWPS1)|(0<<TWPS0); // Setting prescalar bits
|
74 | // SCL freq= F_CPU/(16+2(TWBR).4^TWPS)
|
75 | }
|
76 |
|
77 | void TWI_start(void)
|
78 | {
|
79 | // Clear TWI interrupt flag, Put start condition on SDA, Enable TWI
|
80 | TWCR= (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
|
81 | while(!(TWCR & (1<<TWINT))); // Wait till start condition is transmitted
|
82 | while((TWSR & 0xF8)!= 0x08); // Check for the acknowledgement
|
83 | }
|
84 |
|
85 | void TWI_repeated_start(void)
|
86 | {
|
87 | // Clear TWI interrupt flag, Put start condition on SDA, Enable TWI
|
88 | TWCR= (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
|
89 | while(!(TWCR & (1<<TWINT))); // wait till restart condition is transmitted
|
90 | while((TWSR & 0xF8)!= 0x10); // Check for the acknoledgement
|
91 | }
|
92 |
|
93 | void TWI_write_address(unsigned char data)
|
94 | {
|
95 | TWDR=data; // Address and write instruction
|
96 | TWCR=(1<<TWINT)|(1<<TWEN); // Clear TWI interrupt flag,Enable TWI
|
97 | while (!(TWCR & (1<<TWINT))); // Wait till complete TWDR byte transmitted
|
98 | while((TWSR & 0xF8)!= 0x18); // Check for the acknoledgement
|
99 | }
|
100 |
|
101 | void TWI_read_address(unsigned char data)
|
102 | {
|
103 | TWDR=data; // Address and read instruction
|
104 | TWCR=(1<<TWINT)|(1<<TWEN); // Clear TWI interrupt flag,Enable TWI
|
105 | while (!(TWCR & (1<<TWINT))); // Wait till complete TWDR byte received
|
106 | while((TWSR & 0xF8)!= 0x40); // Check for the acknoledgement
|
107 | }
|
108 |
|
109 | void TWI_write_data(unsigned char data)
|
110 | {
|
111 | TWDR=data; // put data in TWDR
|
112 | TWCR=(1<<TWINT)|(1<<TWEN); // Clear TWI interrupt flag,Enable TWI
|
113 | while (!(TWCR & (1<<TWINT))); // Wait till complete TWDR byte transmitted
|
114 | while((TWSR & 0xF8) != 0x28); // Check for the acknoledgement
|
115 | }
|
116 |
|
117 | void TWI_read_data(void)
|
118 | {
|
119 | TWCR=(1<<TWINT)|(1<<TWEN); // Clear TWI interrupt flag,Enable TWI
|
120 | while (!(TWCR & (1<<TWINT))); // Wait till complete TWDR byte transmitted
|
121 | while((TWSR & 0xF8) != 0x58); // Check for the acknoledgement
|
122 | recv_data=TWDR;
|
123 |
|
124 | }
|
125 |
|
126 | void TWI_stop(void)
|
127 | {
|
128 | // Clear TWI interrupt flag, Put stop condition on SDA, Enable TWI
|
129 | TWCR= (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
|
130 | while(!(TWCR & (1<<TWSTO))); // Wait till stop condition is transmitted
|
131 | }
|