Ich proviere jetzt seit ein paar tagen meinen max zum laufen zu bringen,
allerdings funktioniert das nur nach einem reset: Ich lege die Spanung
an den Atmega an, drücke reset und erst dann leuchten alle segmente.
Aufjedenfall mit diesem Code:
1
#include <avr/io.h>
2
3
#ifndef F_CPU
4
/* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert
5
(z.B. durch Übergabe als Parameter zum Compiler innerhalb
6
des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die
7
"nachträgliche" Definition hinweist */
8
#warning "F_CPU war noch nicht definiert, wird nun mit 8000000 definiert"
9
#define F_CPU 8000000UL /* Quarz mit 8 Mhz */
10
#endif
11
#include <util/delay.h>
12
#include <stdlib.h>
13
14
void transmit(unsigned char, char);
15
16
void Load_Low()
17
{
18
PORTB &= ~(1 << PB2);
19
}
20
21
void Load_High()
22
{
23
PORTB |= (1 << PB2);
24
}
25
26
27
void SPI_MasterInit(void) {
28
29
DDRB = (1<<PB2)|(1<<PB3)|(1<<PB5); // set PB2(SS), PB3 (MOSI) and PB5 (SCK) output, all others input
while(!(SPSR & (1<<SPIF))); // Wait for transmission complete
40
41
asm volatile("nop");
42
43
SPDR = data; // Start transmission
44
while(!(SPSR & (1<<SPIF))); // Wait for transmission complete
45
}
46
47
void test_Init(void)
48
{
49
Load_Low();
50
for (int i = 0; i < 3; i++)
51
{
52
transmit(0x0C,0x01); // normal mode transmit(0x0C,0x01);
53
}
54
Load_High();
55
}
56
57
int main()
58
{
59
60
SPI_MasterInit();
61
_delay_ms(10);
62
test_Init();
63
64
//tu was....
65
66
while (1)
67
{
68
69
_delay_ms(10);
70
71
}
72
73
return 0;
74
75
}
Mit diesem hier geht es nur nach mehrmaligem reset:
http://www.mikrocontroller.net/attachment/7274/Max7219_Test.bas
Mit dem C Code war es früher genauso, bis ich die Wartezeit am Anfang
auf 10ms von 10µs erhöht habe (so reicht es aufjedenfall).
Kann es sein, dass ich noch irgendwo Wartezeiten einbauen muss?
Sam schrieb:> for (int i = 0; i < 3; i++)
Die Anzahl der Stellen(bzw. MAX7219) ist richtig?
Du solltest mehr Informationen über deinen Hardwareaufbau geben.
Du hast zwingend einen 10µF und parallel dazu einen 0,1µF direkt an
den Spannungversorgungs-Pins des/r MAX7219 gegen GND angeschlossen?
> Du hast zwingend einen 10µF und parallel dazu einen 0,1µF direkt an> den Spannungversorgungs-Pins des/r MAX7219 gegen GND angeschlossen?
Du meinst einfach Kondensator zw. GND und VCC, oder?
Nein, ist vom usbasp vom USB anschluss. Also müsste das stabil sein.
> Sam schrieb:>> for (int i = 0; i < 3; i++)>> Die Anzahl der Stellen(bzw. MAX7219) ist richtig?
da ich das erst mal testen wollte, hab ich einfach die digits 1 - 4 an
die Pins 2,3,7 und 6 angeschlossen. Später änder ich natürlich die
Reihenfolge.
Das gleiche auch bei den Segmenten, Zahlen könnte man nicht lesen. Aber
es geht ja erstmal darum, das ich den Mega starte und alle Segmente
leuchten sofort.
Sam schrieb:> Nein, ist vom usbasp vom USB anschluss. Also müsste das stabil sein.
Beratungs-Resistent?
Ob du deine Spannungsversorgung von sonst wo beziehst ist vollkommen
egal. An die Versorgungsspannungsanschlüsse des 7219 gehören die oben
bezeichneten Kondensatoren dran, sonst macht das Teil was es will.
Der Code oben ist von mir und ist gedacht für mehrere 7219 in Serie
geschaltet und für 8x8-Matrix-Betrieb gedacht.
Wenn du jetzt nur einen 7219 in 7-Segment-Mode betreiben willst musst du
ihn anders initialisieren. Schau dir mal das Datenblatt an.
... schrieb:> nn du jetzt nur einen 7219 in 7-Segment-Mode betreiben willst musst du> ihn anders initialisieren. Schau dir mal das Datenblatt an.
Ja, aber ich möchte auch Zeichen anzeigen, von dem her werde ich die
Zahlen per Software erzeugen.
Kondensator hat bisher noch nicht geholfen, ich glaub die müssen wie
beim Mega nah an den Max dran (ist auf dem Steckbrett grad ein bisschen
schwierig). Muss man ein bisschen rumstecken.
Sam schrieb:> ich glaub die müssen wie> beim Mega nah an den Max dran
Hatte ich so geschrieben. Aber den Code wirst du auch ändern müssen,
siehe oben.
Sam schrieb:> von dem her werde ich die> Zahlen per Software erzeugen.
Nö, du musst nur den entsprechenden Registenr des 7219 die passenden
Werte übergeben.
Sam schrieb:> void test_Init(void)> {> Load_Low();> {> transmit(0x0F,0x01); // Display Test-Mode transmit(0x0F,0x01);> }> Load_High();> }
ohne Klammern halt, ok jetzt hab ich das verstanden.
Ich bau die Schaltung jetzt erst mal auf ne Platine. Ich glaub da sind
irgendwo Wackelkontakte.
... schrieb:> Sam schrieb:>> von dem her werde ich die>> Zahlen per Software erzeugen.>> Nö, du musst nur den entsprechenden Registenr des 7219 die passenden> Werte übergeben.
ich möchte aber auch ein paar buchstaben schreiben, daher die direkte
ansteuerung ohne decoder.
Sam schrieb:> ch möchte aber auch ein paar buchstaben schreiben, daher die direkte> ansteuerung ohne decoder.
ok, dann muss das Decode-Mode Register 0x09 als erstes den Wert 0x00
bekommen.
Der Test-Mode von oben ist im Übrigen so lange wirksam bis du den wieder
zurückstellst auf Normal Mode.
Danke ... oder wie ich dich nennen soll ,lag tatsächlich am Steckbrett.
Ich hab jetzt ein 100nF im IC-Sockel vergraben, näher gehts nicht. auf
den 10µF hab ich verzichtet. Die Spannung vom PC sollte stabil genug
sein und der ist ja für gröbere dinge da. Netzbetrieb ist eh nicht
vorgesehen, eher mit Batterie.
Sam schrieb:> Wie funktioniert das genau mit dem Low and High.> Muss man vor jedem Befehl das machen?
In deinem Fall vor und nach jedem "transmit", wie im Beispiel.
... schrieb:> In deinem Fall vor und nach jedem "transmit", wie im Beispiel
Danke hab ich jetzt auch in einem anderen Codebeispiel gesehen.
Der Max hat allerdings doch nicht richtig funktioniert, jetzt
funktioniert er aber. Ich hab ausversehen Pin 4 und 8 statt 4 und 9 mit
GND verbunden. Außerdem den reset Taster um 90° falsch herum eingebaut,
somit awr Reset die ganze zeit auf GND. Ich hoffe ich hab jetzt nicht
schon irgendwie geschrottet wie damals mein tba820 als verstärker. Die
Schaltung war richtig, der tba kaputt, verstärkte nicht richtig und
rauschte.
Trotzdem klappt es nicht die Anzeige an und auszuschalten.
Hab ich vielleicht mein Prog falsch geschrieben? Wenn ich ihn anschalte
leuchten alle Ziffern mehr nicht.
... schrieb:> as war ja auch mit dem Testcode von oben so gewollt.
Sorry.
Ich hab vergessen mein neuen Code hochzuladen.
Das Prog sollte jetzt 0 1 0 1 usw. anzeigen.
Mode ist unsigned (ich habs früher immer bool gennant bis ich Avrs
programmierte und haufen fehlermeldungen bekam, dass der avr das nicht
kennt).
MAX_MODE ist in der .h Datei definiert.
Ich schreib mal die Befehle raus:
1
DDRB = (1<<PB2)|(1<<PB3)|(1<<PB5); // set PB2(SS), PB3 (MOSI) and PB5 (SCK) output, all others input
was ich meinte ist dies hier:
transmit(0x0C,1);
transmit(0x09,0);
da sollte stehen:
transmit(0x0C,0x01);
transmit(0x09,0x00);
Außerdem solltest du alle Register erst mal initialisieren.
... schrieb:> was ich meinte ist dies hier:>> transmit(0x0C,1);> transmit(0x09,0);>> da sollte stehen:>> transmit(0x0C,0x01);> transmit(0x09,0x00);>
Das ist doch genau das selbe, oder?
> Außerdem solltest du alle Register erst mal initialisieren.
Reicht 0x0C 0x01 nicht?
Im Datenblatt hab ich nichts dergleichen gesehen. Kannst du mir
vielleicht ein Beispiel geben.
Sam schrieb:> Das ist doch genau das selbe, oder?
nur wenn du es als uint8 definierst hast.
Sam schrieb:> Im Datenblatt hab ich nichts dergleichen gesehen. Kannst du mir> vielleicht ein Beispiel geben.
Ich hab CS mit CLK vertauscht???
Wie konnte das mir passieren?
Also es klappt nun wirklich. Danke für deine Mühe ... ...wenn ich ein
bisschen mehr aufgepasst hätte hätte ich deine Hilfe nicht beanspruchen
müssen.