MAX7219 an USI (Attiny2313)

OP #3617313
Lesenswert?

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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren