Hallo Leute,
nachdem ich mit dem 74HC595 am USI erfolgreich war, will ich es mit dem
MAX7291 und zwei 7-Segment Anzeigen versuchen. Leider habe ich nach
einigem Probieren noch keinen Erfolg.
Die Schaltung habe ich mehrfach überprüft. Habe auch Pull-Ups und
Pull-Downs, wo sinnvoll, versucht. Der Code macht für mich auch Sinn.
Auf dem Oszilloskop sehe ich, dass ich 16 Clock Impulse pro USI_send()
bekomme und auch die Daten scheinen sinnvoll raus zu kommen. Auf den
Anzeigen aber leider keine Regung... Hat irgend Jemand eine Idee?
1 | #include <avr/io.h>
|
2 | #include <util/delay.h>
|
3 |
|
4 | // MAX7219 am USI Port, mit 2 7-Segment Anzeigen
|
5 |
|
6 | #define SCK PB7 // USI Clock
|
7 | #define DO PB6 // USI Serial Out
|
8 | #define LD PB5 // MAX7219 LD
|
9 |
|
10 |
|
11 |
|
12 | #define DEBUG_DELAY 1 // Clock Delay in µs (vorrübergehend, zum Messen)
|
13 | #define DATA_DELAY 1 // Delay zwischen einzelnen Bytes (ms)
|
14 |
|
15 |
|
16 |
|
17 | void USI_init(void);
|
18 | void USI_send(uint8_t, uint8_t);
|
19 |
|
20 |
|
21 | int main( void )
|
22 | {
|
23 | USI_init();
|
24 |
|
25 | // Soll "64" anzeigen:
|
26 |
|
27 | // Adress , Data
|
28 | //-------------------------------
|
29 |
|
30 | USI_send(0b10001001, 0b00000011); // BCD Code aktiviert für Digit 0 und 1
|
31 |
|
32 | _delay_ms(DATA_DELAY);
|
33 |
|
34 | USI_send(0b00001010, 0b00000111); // Intensity mittel (15/32)
|
35 |
|
36 | _delay_ms(DATA_DELAY);
|
37 |
|
38 | USI_send(0b00001011, 0b00000001); // Scan Limit auf Digit 0 und 1
|
39 |
|
40 | _delay_ms(DATA_DELAY);
|
41 |
|
42 | USI_send(0b00000001, 6); // Digit 0
|
43 |
|
44 | _delay_ms(DATA_DELAY);
|
45 |
|
46 | USI_send(0b00000010, 4); // Digit 1
|
47 |
|
48 | return 0;
|
49 | }
|
50 |
|
51 |
|
52 |
|
53 |
|
54 | void USI_init(void)
|
55 | {
|
56 | PORTB &= ~(1 << SCK) | (1 << DO) | (1 << LD); // Outputs auf low
|
57 | DDRB |= (1 << SCK) | (1 << DO) | (1 << LD); // SCK, DO und LD auf Ausgang
|
58 | USICR = (1 << USIWM0) | (1 << USICS1) | (1 << USICLK); // Three-Wire-Mode / Software Clock => USITC
|
59 |
|
60 | return;
|
61 | }
|
62 |
|
63 | void USI_send(uint8_t Adress, uint8_t Data)
|
64 | {
|
65 | USIDR = Adress;
|
66 | USISR |= (1 << USIOIF); // Counter Overflow Zurücksetzen
|
67 |
|
68 | while(!(USISR & (1 << USIOIF))) // takten bis zum 1. Counter Overflow
|
69 | {
|
70 | USICR |= (1 << USITC);
|
71 | _delay_us(DEBUG_DELAY);
|
72 | }
|
73 |
|
74 | USIDR = Data;
|
75 | USISR |= (1 << USIOIF); // Counter Overflow Zurücksetzen
|
76 |
|
77 | while(!(USISR & (1 << USIOIF))) // takten bis zum 2. Counter Overflow
|
78 | {
|
79 | USICR |= (1 << USITC);
|
80 | _delay_us(DEBUG_DELAY);
|
81 | }
|
82 |
|
83 | PORTB |= (1 << LD); // LD high
|
84 | _delay_us(1);
|
85 | PORTB &= ~(1 << LD); // LD low
|
86 |
|
87 |
|
88 | return;
|
89 | }
|