Forum: Mikrocontroller und Digitale Elektronik Arduino Max7221 7-Segment Anzeige


von Dan0207 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich möchte mit einem MAX7219 ein 7-Segment-Display steuern.
Angeschlossen hab ich alles wie im Plan oben.
Displayangaben sind UF = 2.2V und IF= 20mA, daher der 30k Widerstand.

Als Script habe ich schon diverse Beispielscripte genommen, ua ganz 
simpel:
1
#include "LedControl.h"
2
LedControl lc=LedControl(22,24,23,1);
3
4
void setup()
5
{
6
 // Initialize the MAX7219 device
7
  lc.shutdown(0,false);   // Enable display
8
  lc.setIntensity(0,15);  // Set brightness level (0 is min, 15 is max)
9
  lc.clearDisplay(0);     // Clear display register
10
}
11
void loop()
12
{
13
  lc.setDigit(0, 0, (byte)8, false);
14
  delay(1000);
15
}

Jedoch leuchtet kein einziges Segment.
Beim messen der Spannung an den einzelnen Segmenten werden auch nur 
0.43V angezeigt.

Weiß jemand weiter? In der Suchmaschine hab ich leider nichts passendes 
gefunden..

Gruß

von Gerald B. (gerald_b)


Lesenswert?

Anzeige mit gemeinsamer Kathode?
Anders, als die meisten anderen ICs, wünscht der MAX Anzeigen mit 
gemeinsamer Kathode.
Ist der MAX7219 ein Original, oder eine Chinafälschung? Kann 
funktionieren, muß aber nicht. Von 2. Wahl über umgelabelten Chips bis 
zum Leergehäuse kann alles dabei sein.

von Dan0207 (Gast)


Lesenswert?

Ja, Display ist mit gemeinsamer Kathode.
Naja, hab den IC von einem deutschen Händler aus der Bucht gekauft.

Gruß

von Gerald B. (gerald_b)


Lesenswert?

Dan0207 schrieb:
> Ja, Display ist mit gemeinsamer Kathode.
> Naja, hab den IC von einem deutschen Händler aus der Bucht gekauft.
>
> Gruß

Alles was nicht vom Distributor kommt und unter 5€ p. Stück kostet, ist 
schon mal verdächtig. Guck mal hier, da sind Fotos der Logos von 
Original und Fälschung: http://forum.arduino.cc/index.php?topic=233109.0

von Dan0207 (Gast)


Lesenswert?

Okay, dann gehe ich mal von Fake ICs aus, dafür waren meine viel zu 
billig..

Ich möchte eigentlich nur einen Temperaturwert (max 3 Ziffern), der dann 
auch auf einem Server und von dort per Website anzeigbar ist, direkt am 
Gehäuse anzeigen.
Dachte dafür wäre ein Segment Display die beste Sache,
wo bekomme ich denn schnellstmöglich und garantiert einen Originalen 
(und am besten auch ohne dass ich für den Versand nochmal genauso viel 
zahle) her?

von Thomas S. (thomas_s72)


Lesenswert?

Hallo,
hab mal die Funktion betrachtet und das Beispiel hier gefunden:

/*
 * Now we create a new LedControl.
 * We use pins 12,11 and 10 on the Arduino for the SPI interface
 * Pin 12 is connected to the DATA IN-pin of the first MAX7221
 * Pin 11 is connected to the CLK-pin of the first MAX7221
 * Pin 10 is connected to the LOAD(/CS)-pin of the first MAX7221
 * There will only be a single MAX7221 attached to the arduino
 */
LedControl lc1=LedControl(12,11,10,1);

Wenn ich den Schaltplan richtig lese so ist Pin13 an D23 (clock) und 
Pin12 an D24 (Load) und Pin1 and D22 (Data).

Sollte es also dann nicht so heißen:

LedControl lc=LedControl(22,23,24,1);

und nicht

LedControl lc=LedControl(22,24,23,1);

Oder hab ich da etwas falsch verstanden? Ich selbst hab an die 100 von 
solchen Dingern schon verbaut, die sind für kleines Geld aus China und 
funzen ALLE!

Gruß
Thomas

von Peter D. (peda)


Lesenswert?

Dan0207 schrieb:
> Okay, dann gehe ich mal von Fake ICs aus, dafür waren meine viel zu
> billig..

Ich würde zu 99,99% die Software in Verdacht haben oder einen 
Verdrahtungsfehler.
Ist das eine original Arduino-Lib und hast Du die Doku dazu gelesen und 
verstanden?
Wenn es aber eine Lib eines anderen Users ist, weißt Du nicht, welche 
Qualität die Lib hat.
Gerade Anfänger programmieren oft nach trial&error und nicht nach 
Datenblatt, d.h. deren Libs sind nur sehr eingeschränkt nachnutzbar.

Schick mal den Display-Test Befehl an den MAX7221.

von Dan0207 (Gast)


Lesenswert?

Hallo,

also ich hab nochmal alles mögliche probiert und getestet.
Meine Displays sind sicher mit gemeinsamer Kathode (gemeinsamer 
Anschluss an GND, + über Vorwiderstand an die einzelnen Segmente -> LED 
leuchtet).
Meine Anschlüsse hab ich nun an folgendes Script angepasst:
1
/*
2
  Basic code for using Maxim MAX7219/MAX7221 with Arduino.
3
  Wire the Arduino and the MAX7219/MAX7221 together as follows:
4
  | Arduino   | MAX7219/MAX7221 |
5
  | --------- | --------------- |
6
  | MOSI (11) | DIN (1)         |
7
  | SCK (13)  | CLK (13)        |
8
  | I/O (7)*  | LOAD/CS (12)    |
9
    * - This should match the LOAD_PIN constant defined below.
10
  
11
  For the rest of the wiring follow the wiring diagram found in the datasheet.
12
  
13
  Datasheet: http://datasheets.maximintegrated.com/en/ds/MAX7219-MAX7221.pdf
14
  Author:  Nicholas Dobie <nick@nickdobie.com>
15
  Date:    30 December 2013
16
  License: WTFPL (http://www.wtfpl.net/)
17
 */
18
#include <SPI.h>
19
20
// What pin on the Arduino connects to the LOAD/CS pin on the MAX7219/MAX7221
21
#define LOAD_PIN 7
22
23
/**
24
 * Transfers data to a MAX7219/MAX7221 register.
25
 * 
26
 * @param address The register to load data into
27
 * @param value   Value to store in the register
28
 */
29
void maxTransfer(uint8_t address, uint8_t value) {
30
31
  // Ensure LOAD/CS is LOW
32
  digitalWrite(LOAD_PIN, LOW);
33
34
  // Send the register address
35
  SPI.transfer(address);
36
37
  // Send the value
38
  SPI.transfer(value);
39
40
  // Tell chip to load in data
41
  digitalWrite(LOAD_PIN, HIGH);
42
}
43
  
44
45
void setup() {
46
  
47
  // Set load pin to output
48
  pinMode(LOAD_PIN, OUTPUT);
49
50
  // Reverse the SPI transfer to send the MSB first  
51
  SPI.setBitOrder(MSBFIRST);
52
  
53
  // Start SPI
54
  SPI.begin();
55
56
  // Run test
57
  // All LED segments should light up
58
  maxTransfer(0x0F, 0x01);
59
  delay(1000);
60
  maxTransfer(0x0F, 0x00);
61
  
62
  // Enable mode B
63
  maxTransfer(0x09, 0xFF);
64
  
65
  // Use lowest intensity
66
  maxTransfer(0x0A, 0x00);
67
  
68
  // Only scan one digit
69
  maxTransfer(0x0B, 0x00);
70
  
71
  // Turn on chip
72
  maxTransfer(0x0C, 0x01);
73
  
74
  
75
  
76
}
77
78
void loop() {
79
  
80
  // Loop through each code
81
  for (uint8_t i = 0; i < 0x10; ++i)
82
  {
83
    maxTransfer(0x01, i);
84
    delay(500);
85
  }
86
  
87
}

Funktioniert immer noch nicht..

Danach hab ich nur eine einzelne LED an den MAX angeschlossen, Anode an 
SegA und Kathode an Dig0. Hat genauso nicht geleuchtet.
Dann hab ich die LED umgedreht nun blinkt sie. Mit Anode an Dig0 und 
Kathode an SegA. Sollte doch eigentlich andersrum sein oder?

Gruß

von Gerald B. (gerald_b)


Lesenswert?

Dan0207 schrieb:
> Mit Anode an Dig0 und
> Kathode an SegA. Sollte doch eigentlich andersrum sein oder?

Bist du nach Drahtlänge gegangen, oder hast du die Polung elektrisch 
ausgetestet? Es gibt auch LEDs, die sich nicht an den ungeschriebenen 
Standard halten.

von Harry (Gast)


Lesenswert?

Hast du die entsprechenden Pins auf Out gestellt?
Nein Arduino kenn ich nicht, nur ne Frage.

von Dan0207 (Gast)


Lesenswert?

Gerald B. schrieb:
> Bist du nach Drahtlänge gegangen, oder hast du die Polung elektrisch
> ausgetestet? Es gibt auch LEDs, die sich nicht an den ungeschriebenen
> Standard halten.

Hab es getestet. Die LED ist richtig herum angeschlossen.

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.