1 | /* I2C-Master-Routinen von Peter Fleury verwenden siehe: http://homepage.hispeed.ch/peterfleury/avr-software.html#libs */
|
2 | /* Abgestimmt auf meine Hardware P30, D2, P52, NT2, 2xP20
|
3 | Bedienung:
|
4 | Slave - Port B Anzeige welche LED, T2 Umschaltung der Sende byte, L2 und L4 Anzeige der Sende byte
|
5 | Master - T1 und T3 sende byte zum Slave, T2 hole byte vom Slave, Anzeige am Port A */
|
6 |
|
7 | #include <stdbool.h>
|
8 | #include <avr/pgmspace.h>
|
9 | #include "main.h"
|
10 | #include <util/delay.h>
|
11 | #include "i2clcd.h"
|
12 | #include "i2cmaster.h"
|
13 | #include "avr/io.h"
|
14 | #include "util/delay.h"
|
15 | #include "avr/interrupt.h"
|
16 |
|
17 | #define slave_adresse 0x52 // Slave Adresse schreiben
|
18 | #define slave_adresse_r 0x53 // Slave Adresse lesen
|
19 |
|
20 | uint8_t ret; // Kontrollvariable ob Slave vorhanden
|
21 | uint8_t byte1, byte2; // Daten zum Senden vom Master zu Slave
|
22 | uint8_t byte3, byte4;
|
23 | uint8_t byte10; // Daten zum holen vom Slave zu Master
|
24 | ///////////////////////////////////////////////////////////////////////////////////////////////////
|
25 | void startanzeige() // Titelbild
|
26 | {
|
27 | lcd_command(LCD_CLEAR); // Leere Display
|
28 | _delay_ms(2); // Warte 2ms
|
29 | lcd_printlc(1,2,"USI Bus M-Prg1"); // Zeile 1
|
30 | lcd_printlc(2,2,"Verbindung von"); // Zeile 2
|
31 | lcd_printlc(3,2,"Prz ueber I2C "); // Zeile 3
|
32 | lcd_printlc(4,2,"(by P.)"); // Zeile 4
|
33 | _delay_ms(3000); // Warte 5000ms
|
34 | }
|
35 | ///////////////////////////////////////////////////////////////////////////////////////////////////
|
36 | void slavetest() // Abfrage Slave, Fehlermeldung und Anzeige
|
37 | { // Abfarge ob Slave vorhanden ist
|
38 | ret = i2c_start(slave_adresse); // Start i2C mit Adresse Slave
|
39 | i2c_write(0x00); // Sende Daten
|
40 | i2c_stop(); // I2C Stop
|
41 | if (ret == 0) // Bus ok - 0, kein Bus 1
|
42 | { // Anzeige Slave ok
|
43 | lcd_command(LCD_CLEAR); // Leere Display
|
44 | _delay_ms(2); // Warte 2ms
|
45 | lcd_printlc(2,4,"Slave ist "); // Ausgabe Text
|
46 | lcd_printlc(3,5,"OK !!!!!"); // Slave OK
|
47 | _delay_ms(2000); // Warte 2s
|
48 | }
|
49 | else // Fehlermeldung
|
50 | { // Anzeige Slave nicht ok
|
51 | lcd_command(LCD_CLEAR); // Leere Display
|
52 | _delay_ms(2); // Warte 2ms
|
53 | lcd_printlc(2,5,"Slave ist"); // Ausgabe Schrift
|
54 | lcd_printlc(3,5,"Nicht OK"); // Slave Nicht O
|
55 | _delay_ms(1000); // Warte 2s
|
56 | }
|
57 | }
|
58 | /////////////////////////////////////////////////////////////////////////////////////////////////////
|
59 | void s_write1 (void) // schreibe Daten 1 von Master zu Slave
|
60 | {
|
61 | i2c_start(slave_adresse); // Slave ist bereit zum Schreiben
|
62 | i2c_write(0x00); // Buffer Startadresse setzen
|
63 | i2c_write(42); // Drei Bytes schreiben...
|
64 | i2c_stop(); // Zugriff beenden
|
65 | }
|
66 | //////////////////////////////////////////////////////////////////////////////////////////
|
67 | void s_write2 (void) // schreibe Daten 2 von Master zu Slave
|
68 | {
|
69 | i2c_start(slave_adresse); // Slave ist bereit zum Schreiben
|
70 | i2c_write(0x00); // Buffer Startadresse setzen
|
71 | i2c_write(43); // Drei Bytes schreiben...
|
72 | i2c_stop(); // Zugriff beenden
|
73 | }
|
74 | /////////////////////////////////////////////////////////////////////////////////////////////////
|
75 | void s_read1() // lese Slave1
|
76 | {
|
77 | i2c_start(slave_adresse); // Start Bus schreiben
|
78 | i2c_write(0x00);
|
79 | i2c_rep_start(slave_adresse); // starte Slave lesen
|
80 | byte3=i2c_readAck(); // 2. Byte lesen und in "gelesen" ablegen
|
81 | byte4=i2c_readNak(); // letztes Byte lesen, darum kein ACK
|
82 | i2c_stop(); // Zugriff beenden
|
83 | }
|
84 | //////////////////////////////////////////////////////////////////////////
|
85 | int main(void)
|
86 | {
|
87 | cli(); // Interrupts deaktiviert
|
88 | i2c_init(); // Starte I2C Bus
|
89 | lcd_init(); // Starte I2CLCD
|
90 | // Display Befehle
|
91 | lcd_command(LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKINGOFF);
|
92 | lcd_light(0); // Licht an
|
93 | startanzeige();
|
94 | lcd_command(LCD_CLEAR); // Leere Display
|
95 | _delay_ms(2); // Warte 2ms
|
96 | slavetest();
|
97 | _delay_ms(2);
|
98 |
|
99 | DDRC=0b01100000; //Taster // setzt Port C auf Ausgang, PC5 und PC6
|
100 | //DDRA=0b11111111; //LED // setzt Port A auf Ausgang, PC5 und PC6
|
101 |
|
102 | PORTC|=0b01001111; //Taster // Deaktiviere Ports C5-6 (LEDs aus)
|
103 | //PORTA|=0b11111111; //LED // Deaktiviere Pins A0-7 (LEDs aus)
|
104 |
|
105 | while(1)
|
106 | {
|
107 | // ========>> AUF GELESENE DATEN REAGIEREN
|
108 | s_read1();
|
109 |
|
110 | if (byte4 == 30)
|
111 | { // Wenn Wert 30 gelesen wurde...
|
112 | PORTC &= ~( (1<<PINC5)); // schalte Port A6
|
113 | PORTC |=(1<<PINC6); // wenn nicht lösche Port A6
|
114 | }
|
115 | else
|
116 | {
|
117 | PORTC |=(1<<PINC5); // wenn nicht lösche Port A6
|
118 | PORTC &= ~( (1<<PINC6)); // schalte Port A6
|
119 | }
|
120 | ///////////////////////////////////////////////////////////////////////////////////////////////
|
121 | // ========>> TASTENEINGABEN
|
122 | if (!(PINC & (1<<PINC2)) ) // Taster T1
|
123 | { // Wenn T1 gedrückt...
|
124 | PORTA &=~(1<<PINA1); // LED 2 A1 ein
|
125 | s_write1(); // Schreib 1 Funktion aufrufen
|
126 | }
|
127 | else
|
128 | {
|
129 | PORTA |=(1<<PINA1); // sonst LED 2 A1 aus
|
130 | }
|
131 | // ========>> TASTENEINGABEN
|
132 | if (!(PINC & (1<<PINC4)) ) // Taster T 3
|
133 | { // Wenn T1 gedrückt...
|
134 | PORTA &=~(1<<PINA2); // LED 3 A2 ein
|
135 | s_write2(); // Schreib 2 Funktion aufrufen
|
136 | }
|
137 | else
|
138 | {
|
139 | PORTA |=(1<<PINA2); // sonst LED 3 aus
|
140 | }
|
141 |
|
142 | }
|
143 | }
|