Forum: Mikrocontroller und Digitale Elektronik MAX7219 Problem


von Draco (Gast)


Lesenswert?

Ich habe hier noch einige Max7219 am rumfliegen, nun stehe ich aber vor 
einem Problem.

Ich möchte über den Max7219 eine 3 stellige 7-Segementanzeige ansteuern. 
Die ISP Verbindung funktioniert auch absolut tadellos und der Max7219 
nimmt die Befehle entgegen.

Nun stand ich aber vor dem Problem das alle Segmente der Anzeige 
leuchten. (Wie im Testmode). Nun hab ich mir ne Schleife geschrieben die 
mir den Testmode ein und ausschaltet, das geht auch. Ich messe im 
aktiven Testmode von Dig0 zu SegA -5V. Nicht im Testmode messe ich von 
Dig0 zu SegA 0,45V und eine Freq von 6Khz.

Jedoch alles was ich mache, ändert in keinster Weise die Segmentanzeige 
- sie bleibt Stur an :D

Ich hab dann mal die Datenblätter gewälzt. Als Anzeigen nutze ich 
HDSP-5501 - mit common-anode, der Max7219 möchte aber ja gerne 
common-cathode. Was mich dann halt wundert ist ja, das selbst dann im 
Testmode ja eigentlich die Anzeige ausgehen müsste oder?! Wenn es doch 
daran liegt, gibt es eine Möglichkeit dennoch die common-anode Anzeigen 
(denn davon hab ich noch reichlich) an den Max7219 zu betreiben (denn 
davon hab ich auch noch reichlich)?!

Hat da jemand nen Rat?

von Pete K. (pete77)


Lesenswert?

Bauteile nach Datenblatt beschalten.

Und poste mal Schaltplan und Source-Code, dann kann Dir vielleicht 
geholfen werden.

von JoJoBa (Gast)


Lesenswert?


von Draco (Gast)


Lesenswert?

Vielen Dank für diesen Link!!!! :D

Code füge ich mal an, Schaltplan muss ich noch zeichnen.
1
/*
2
 * Attiny2313 SPI Interface.c
3
 *
4
 * Created: 17.01.2016 08:04:52
5
 * Author : Rene
6
 */ 
7
#define F_CPU 8000000
8
9
#include <avr/io.h>
10
#include <inttypes.h>
11
#include <util/delay.h>
12
13
//***** Load / LOAD defines************
14
#define LOAD_LOW PORTB &= ~(1 << PB0)
15
#define LOAD_HIGH PORTB |= (1 << PB0)
16
17
#define DOUT  6
18
#define SCK    7
19
#define SPIPORT  PORTB
20
21
22
void spi_out( unsigned char val )  
23
{
24
  unsigned char i;
25
26
  for( i = 8; i; i-- ){
27
    SPIPORT &= ~(1<<DOUT);  
28
    if( val & 0x80 )
29
    SPIPORT |= 1<<DOUT;  
30
    val <<= 1;
31
    SPIPORT |= 1<<SCK;    
32
    SPIPORT &= ~(1<<SCK);
33
  }
34
}
35
36
void MAX_send( unsigned char Adress, unsigned char Data )
37
{
38
  LOAD_LOW;
39
  spi_out(Adress);
40
  spi_out(Data);
41
  LOAD_HIGH;
42
}
43
44
void SPI_setup(void)
45
{
46
  DDRB |= (1<<PB0);    // as output (LOAD)
47
  DDRB |= (1<<PB6);    // as output (DOUT)
48
  DDRB |= (1<<PB7);    // as output (SCK)
49
}
50
51
int main(void)
52
{
53
        SPI_setup();
54
      
55
      MAX_send(0x09,0x07);  //Digit to 3x7seg
56
      MAX_send(0x0b,0x02);  //BCD Decode to seg 0-1 
57
  
58
    while (1) 
59
    {
60
61
    MAX_send(0xff,0x01);      //Testmode on    
62
    
63
    _delay_ms(3000);  
64
    
65
    MAX_send(0xff,0x00);    //Testmode off  
66
    
67
    _delay_ms(3000);
68
    
69
    MAX_send(0x01,0x00);      //Dig0 set to "0"  
70
    
71
    _delay_ms(3000);
72
73
    MAX_send(0x01,0xff);    //Dig0 set to clear
74
    
75
    _delay_ms(3000);          
76
    }
77
}

Aber wie gesagt, der Code funktioniert ja - die Daten kommen an und der 
Max verarbeitet sie auch. Nur halt nicht so wie ich das möchte :)

Ich werde mir mal den Link zu gemüht führen und auch mal nen Schaltplan 
malen.

von Georg (Gast)


Lesenswert?

Draco schrieb:
> Wenn es doch
> daran liegt, gibt es eine Möglichkeit dennoch die common-anode Anzeigen
> (denn davon hab ich noch reichlich) an den Max7219 zu betreiben (denn
> davon hab ich auch noch reichlich)?!

Man kann natürlich Treiber nachschalten, aber der Aufwand ist blödsinnig 
verglichen damit, einfach die richtigen Displays anzuschliessen.

Georg

von Michael B. (laberkopp)


Lesenswert?

Draco schrieb:
> Als Anzeigen nutze ich HDSP-5501 - mit common-anode,
> der Max7219 möchte aber ja gerne common-cathode.

Aha.

Da liegt natürlich nicht dein Problem.

Georg schrieb:
> Man kann natürlich Treiber nachschalten, aber der Aufwand ist blödsinnig
> verglichen damit, einfach die richtigen Displays anzuschliessen.

Man kann sogar die 'falschen' an den 7219 anschliessen, schliesslich 
kann der eine 8x8 Matrix und es ist egal, ob man davon 3x8 oder 8x3 
nutzt.

Aber das kann Draco offenbar nicht.

Klar ist, daß man bei den 'falschen' Displays nicht alle Segmente einer 
Stelle in einem Byte hat, sondern die A-Segment der 3 Stellen, und im 
anderen Byte dann die B-Segmente etc.

von Draco (Gast)


Lesenswert?

Michael B. schrieb:
> Aber das kann Draco offenbar nicht.

Wieso sollte ich das nicht können?! Wie kommst du auf solch eine Idee?

(my2cent)
Warum müssen hier eigentlich alle immer so großkotzig sein und die 
Weißheit mit dem Löffel gefressen haben?! Ich würde ja echt gerne mal 
sehen ob ihr in eurem Freundeskreis (so delle diejenigen überhaupt einen 
haben) genauso seid!? Schlimm......
(/my2cent)

Hab jetzt die Segmente über die Spalten laufen und die Spalten über die 
Segmente. Quasi das die Flußrichtung durch die LEDs laufen. Ist nun 
natürlich ein viel größerer Programmieraufwand - so das sich ein Einsatz 
des Treibers nun nicht so wirklich rendiert (Mal vom Multiplexing, den 
wenigeren Hühnerfutter mal abgesehen, aber das kann ich auch über einen 
µC machen), aber es funktioniert.

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.