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?
Bauteile nach Datenblatt beschalten. Und poste mal Schaltplan und Source-Code, dann kann Dir vielleicht geholfen werden.
http://marco-difeo.de/2013/02/21/drive-max7219max7221-with-common-anode-displays/ ja, und poste deinen Schaltplan!!!
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.