Hallo zusammen, Ich versuche gerade eine OLED mit SSD1306 Controller mittels Bit-Banging an einem XMega 32A4U zum Laufen zu bekommen. Hardware SPI kann ich nicht nutzen, da das Display auf dem Board (XProtolab) fest verdrahtet ist (s. Bild). Ich versuche seit Tagen, das Display zumindest an zu bekommen aber will einfach nicht klappen aber ich finde den Fehler nicht! Der XMega läuft auf dem internen Osci mit 32 MHz. Hier mal mein Code zum Resetten des Displays und zum senden eines Bytes. In der Reset wird nur versucht, das Display anzuschalten (0xAF) und alle Pixel anzuschalten (0xA5). Vielleicht seht ihr was, was ich nicht sehe. Ich bin auf jeden Fall für jeden Hinweis dankbar! ---------------------------------------------------------
1 | #define F_CPU 32000000UL
|
2 | // Chip Select
|
3 | #define CS_EN PORTB.OUTCLR = PIN0_bm
|
4 | #define CS_DIS PORTB.OUTCLR = PIN0_bm
|
5 | // SDIN
|
6 | #define DATA_HI PORTD.OUTSET = PIN3_bm
|
7 | #define DATA_LOW PORTD.OUTCLR = PIN3_bm
|
8 | // Clock
|
9 | #define CKL_HI PORTD.OUTSET = PIN1_bm
|
10 | #define CKL_LOW PORTD.OUTCLR = PIN1_bm
|
11 | // Reset
|
12 | #define RES_EN PORTB.OUTCLR = PIN1_bm
|
13 | #define RES_DIS PORTB.OUTSET = PIN1_bm
|
14 | // Data / Command
|
15 | #define DC_HI PORTB.OUTSET = PIN3_bm
|
16 | #define DC_LOW PORTB.OUTCLR = PIN3_bm
|
17 | |
18 | |
19 | #include <avr/io.h> |
20 | #include <util/delay.h> |
21 | #include "display.h" |
22 | #include <avr/interrupt.h> |
23 | |
24 | void OLED_start() |
25 | {
|
26 | //cli();
|
27 | RES_EN; |
28 | _delay_us(10); |
29 | RES_DIS; |
30 | DC_LOW; |
31 | CS_DIS; |
32 | CKL_LOW; |
33 | _delay_us(100); |
34 | //OLED_data(0xAE);
|
35 | OLED_data(0xAF); |
36 | _delay_ms(150); |
37 | OLED_data(0xA5); |
38 | //sei();
|
39 | }
|
40 | |
41 | // transmit byte serially, MSB first
|
42 | void OLED_data(unsigned char data) |
43 | {
|
44 | int i; |
45 | |
46 | // select device
|
47 | CS_EN; |
48 | // wait 62,5ns
|
49 | asm volatile ("nop"); |
50 | asm volatile ("nop"); |
51 | |
52 | // send bits 7..0
|
53 | for (i = 0; i < 8; i++) |
54 | {
|
55 | // consider leftmost bit
|
56 | // set line high if bit is 1, low if bit is 0
|
57 | if (data & 0x80) |
58 | {
|
59 | DATA_HI; |
60 | }
|
61 | else
|
62 | {
|
63 | DATA_LOW; |
64 | }
|
65 | asm volatile ("nop"); |
66 | asm volatile ("nop"); |
67 | |
68 | // pulse clock to indicate that bit value should be read
|
69 | CKL_HI; |
70 | asm volatile ("nop"); // 31.25 nS |
71 | asm volatile ("nop"); |
72 | CKL_LOW; |
73 | asm volatile ("nop"); // 31.25 nS |
74 | asm volatile ("nop"); |
75 | |
76 | // shift byte left so next bit will be leftmost
|
77 | data <<= 1; |
78 | }
|
79 | |
80 | // deselect device
|
81 | CS_DIS; |
82 | DATA_LOW; |
83 | }
|
--------------------------------------------------------- Gruß und Danke Manu