Forum: Mikrocontroller und Digitale Elektronik MAX7219 an USI (Attiny2313)


von Adrian E. (ahsd)


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
}

: Bearbeitet durch User
von Adrian E. (ahsd)


Lesenswert?

Tut mir leid, einen etwas unnötigen Thread gestartet zu haben. Das 
Problem lag daran, dass der MAX7219 im Shutdown Mode startet und ich ihn 
nicht "aufgeweckt" habe.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.