Ich habe das ganze jetzt mal auf I2C-Umgestrickt:
1 | /*
|
2 | * DisplayTestI2C.c
|
3 | *
|
4 | * Created: 01.03.2016 19:30:26
|
5 | */
|
6 |
|
7 | #include <avr/io.h>
|
8 | #include "global.h"
|
9 | #include "EDIP.h"
|
10 | #include "I2C.h"
|
11 | #include <util/delay.h>
|
12 | #include <stdio.h>
|
13 | #include <string.h>
|
14 |
|
15 |
|
16 | int main(void)
|
17 | {
|
18 | uint8_t cnt = 0;
|
19 | char msgBuf[20];
|
20 |
|
21 | // Initialize I2C-Interface
|
22 | init_I2C();
|
23 |
|
24 | // Transmit message to display
|
25 | sprintf(msgBuf, "Hello World!");
|
26 | LCD_Puts(msgBuf, strlen(msgBuf), 0x00, 0x00, 'L');
|
27 |
|
28 | while(1)
|
29 | {
|
30 | // Wait until next transmission
|
31 | _delay_ms(1000);
|
32 | sprintf(msgBuf, "Counter: %d", cnt);
|
33 | LCD_Puts(msgBuf, strlen(msgBuf), 0x00, 0x0E, 'L');
|
34 | cnt++;
|
35 | }
|
36 | }
|
1 | /*
|
2 | * EDIP.c
|
3 | *
|
4 | * Created: 01.03.2016 19:31:25
|
5 | */
|
6 |
|
7 | #include <stdio.h>
|
8 | #include "global.h"
|
9 | #include "EDIP.h"
|
10 | #include "I2C.h"
|
11 | #include <util/delay.h>
|
12 | #include <stdlib.h>
|
13 |
|
14 |
|
15 | void LCD_Puts(char *buf, uint8_t len, uint8_t xpos, uint8_t ypos, uint8_t align)
|
16 | {
|
17 | uint8_t cnt = 0;
|
18 | uint8_t bcc, ack;
|
19 |
|
20 | /********Transmit message*******/
|
21 |
|
22 | // Transmit I2C start-sign
|
23 | I2C_start();
|
24 | _delay_us(200);
|
25 |
|
26 |
|
27 | // Transmit I2C-Slave address
|
28 | I2C_slvaddr(0xDE);
|
29 | _delay_us(200);
|
30 |
|
31 |
|
32 | // Transmit DC1
|
33 | I2C_transbyte(0x11);
|
34 | bcc = 0x11;
|
35 | _delay_us(200);
|
36 |
|
37 |
|
38 | // Transmit data length
|
39 | len += 6; // + ESC + Z + Align+ xpos + ypos + \0
|
40 | I2C_transbyte(len);
|
41 | bcc += len;
|
42 | _delay_us(200);
|
43 |
|
44 |
|
45 | // Transmit ESC
|
46 | I2C_transbyte(0x1B);
|
47 | bcc += 0x1B;
|
48 | _delay_us(200);
|
49 |
|
50 | // Transmit text command
|
51 | I2C_transbyte('Z');
|
52 | bcc += 'Z';
|
53 | _delay_us(200);
|
54 |
|
55 | // Transmit alignment of text
|
56 | I2C_transbyte(align);
|
57 | bcc += align;
|
58 | _delay_us(200);
|
59 |
|
60 | // Transmit x position
|
61 | I2C_transbyte(xpos);
|
62 | bcc += xpos;
|
63 | _delay_us(200);
|
64 |
|
65 | // Transmit y position
|
66 | I2C_transbyte(ypos);
|
67 | bcc += ypos;
|
68 | _delay_us(200);
|
69 |
|
70 | // Transmit data via I2C-Interface
|
71 | for(cnt = 0; cnt < (len - 5); cnt++)
|
72 | {
|
73 | I2C_transbyte(buf[cnt]);
|
74 | bcc += buf[cnt];
|
75 | _delay_us(200);
|
76 | }
|
77 |
|
78 |
|
79 | // Transmit bcc
|
80 | I2C_transbyte(bcc);
|
81 | _delay_us(200);
|
82 |
|
83 |
|
84 | // Transmit I2C stop-sign
|
85 | I2C_stop();
|
86 | _delay_us(200);
|
87 |
|
88 |
|
89 | /********Read acknowledge*******/
|
90 |
|
91 | // Transmit I2C start-sign
|
92 | I2C_start();
|
93 | _delay_us(200);
|
94 |
|
95 |
|
96 | // Transmit I2C-Slave address
|
97 | I2C_slvaddr(0xDF);
|
98 | _delay_us(200);
|
99 |
|
100 |
|
101 | // Read acknowledge
|
102 | ack = I2C_rec();
|
103 | _delay_us(200);
|
104 |
|
105 |
|
106 | // Transmit I2C stop-sign
|
107 | I2C_stop();
|
108 | _delay_us(200);
|
109 | }
|
Also "Hello World!" und "Counter: 0" zeigt er an, aber danach ist
schicht im Schacht. Auf dem LA sehe ich, dass das zum "Counter: 0"
gehörige ACK noch empfangen wird, aber dann bleibt die SDA-Leitung low
(Pull-Ups sind dran ;-) )