Moin Moin^^
Sitze nun schon länger an einer "einfachen" Realisierung eines LED
Lauflichtes... Das ich gerne in C verwirklichen will...
leider komme ich nicht zum gewünschen Ergebniss...
Ich benutze
Atmega32 / 16MHz
2 x 74HCT595
Verdrahtung stimmt soweit...
Belegung...
// Enable = Low
// Data <--> PORTA.4
// SCK <--> PORTA.5
// SCL / MR <--> PORTA.1
// RCK <--> PORTA.0
// OE <--> PORTA.2
hat jemand vill. eine Testsoftware die Funktioniert ?!
Zeig halt mal deine her.
Dann ist es auch leichter, das Niveau der Antwort an deine Fähigkeiten
anzupassen.
Was genau funktioniert denn nicht.
WEnn es kein Lauflicht wäre, könntest du gezielt eine einzelne LED, die
an einem Pin des 595 hängt einschalten?
leider funktioniert das auch nicht !
ich habe mal die "Software" mit Schaltplan der CPU Platine +
Schieberegisterplatine mit angehangen...
Edit: AUf Wunsch des TO gelöscht
> leider funktioniert das auch nicht !
Andere Leute Code sollte man nicht nur 'ausleihen' sondern auch
verstehen. Schaug Dir z.B. mal com74hc595_out() an.
Und dann entsorg auch noch gleich die Warnungen die Dir der Compiler um
die Ohren haut, die sind entgegen landläufiger Meinung nicht dazu da um
ignoriert zu werden.
Helge.S schrieb:> leider funktioniert das auch nicht !
Dann leg erst mal das Luflicht ad acta.
Du hast einen uint8_t und der muss an das Schieberegister ausgegeben
werden, so dass die Pins dort genau den Bits in diesem uint8_t
entsprechen.
So, und jetzt such ich mir mal die Tools zusammen, um das RAR-File zu
entpacken. Zip wär mit einem Mausklick drauf gegangen, aber bei RAR
wirds ein bischen aufwändiger. Nein, das soll kein Meckern sein, es soll
dich nur zum Nachdenken bringen, welche Fileformate du in Zukunft
verwenden willst.
okay sorry :(
für das nächste mal weiß ich bescheid ;)
wenn ich die ganze ausgänge des schieberegisters setzen oder löschen
will brauche ich doch nicht den "out" befehl...
Helge.S schrieb:> okay sorry :(> für das nächste mal weiß ich bescheid ;)>> wenn ich die ganze ausgänge des schieberegisters setzen oder löschen> will brauche ich doch nicht den "out" befehl...
Doch.
Die Set Funktionen bzw. Unset Funktionen setzen bzw. löschen die Bits in
einem im AVR vorgehaltenen Speicher. Erst ein Aufruf der out Funktion
befördert die dann nach draussen zum 595.
Liest du denn den Code nicht? Oder wenigstens die Kommentare im Header
File?
Helge.S schrieb:> PORTA = 0b00000010; //Master Reset auf High
Was soll das?
OE vom 595 ist Low-Active. D.h. da muss eine 0 sein, damit das
Schieberegister auf die Ausgänge durchschaltet.
Im übrigen brauchst du dich nicht darum kümmern. Das können die
Ausgabefunktionen nämlich auch für dich erledigen.
1
...
2
#ifdef WITH_OE
3
PORT_com74hc595&=~(1<<PORT_OE);
4
#endif
5
...
alles was es dazu braucht, ist ein
1
#define WITH_OE
irgendwo am Anfang des C-Files mit den 595 Routinen oder im Header File.
Und siehe da. Im Header File steht
1
// use with /OE
2
//#define WITH_OE
Also: einfach auskommentieren und sich darüber freuen, dass der Autor
mitgedacht hat.
Was hast du eigentlich mit dem Clear Eingang des SChieberegisters
gemacht? Der muss high sein. Ich hab jetzt aber keine Lust, mir das aus
der Platine rauszusuchen, ob du den Pin angeschlossen hast oder nicht.
Helge.S schrieb:> habt ihr euch den Quellcode mal angeschaut> ?!
Ja.
Der sieht anders aus, als der den du hier gepostet hast.
Im main vom RAR File ist dann sogar der Aufruf von com74hc595_init();
drinnen, der hier in deinem geposteten Code fehlt.
>> PORTA = 0b00000010; //Master Reset auf High>> Was soll das?
Das dürfte /SCLR ('shift clear' - welcher Hersteller nennt das 'master
reset'?..) sein, nicht /OE, sollte also passen. Fehlt also nur der von
Dir angespochene Rest (/OE mit eincompilieren).
g457 schrieb:>>> PORTA = 0b00000010; //Master Reset auf High>>>> Was soll das?>> Das dürfte /SCLR ('shift clear' - welcher Hersteller nennt das 'master> reset'?..) sein, nicht /OE,
Ah, da hab ich mich vertan.
Da hab ich ihm jetzt Unrecht getan. Ich nehms zurück.
WITH_OE muss trotzdem im Header File auskommentiert werden.
Karl Heinz schrieb:> Ah, da hab ich mich vertan.> Da hab ich ihm jetzt Unrecht getan. Ich nehms zurück.> WITH_OE muss trotzdem im Header File auskommentiert werden.
Das habe ich getan, immer noch das selbe
Helge.S schrieb:> Karl Heinz schrieb:>> Ah, da hab ich mich vertan.>> Da hab ich ihm jetzt Unrecht getan. Ich nehms zurück.>> WITH_OE muss trotzdem im Header File auskommentiert werden.>> Das habe ich getan, immer noch das selbe
Wie sieht das Programm jetzt aus?
Das hier
1
intmain(void)
2
{
3
DDRA=0xFF;
4
PORTA=0b00000010;//Master Reset auf High com74hc595_init(); // Initalisiert die Ports
5
com74hc595_setall();// Setzt alle Ausgänge auf High
6
com74hc595_out();// Ausgabe
7
8
...
kann es nicht sein. Da fehlt der Aufruf von com74hc595_init
ok, wenn alles neu compiliert wurde, dann ist das Programm soweit erst
mal OK.
Wenden wir uns der Hardware zu.
Ich hab hier kein Eagle auf der Maschine. Kannst du den Schaltplan mal
als Bild posten?
Karl Heinz schrieb:> ok, wenn alles neu compiliert wurde, dann ist das Programm soweit erst> mal OK.
d.h. wenn ich mal grundsätzlich davon ausgehe, dass die
Ansteuer-Funktionen korrekt sind. Der Code sieht gut und aufgeräumt aus
- ich denke man kann dem original Autor vertrauen.
Karl Heinz schrieb:> ok.> Laut Schaltplan müssten hiemit> com74hc595_setall(); // Setzt alle Ausgänge auf High>> alle LED aus gehen.> Tun sie das?
NEIN :( Es passiert leider gar nichts :(((
ich verzweifel langsam... :(
Helge.S schrieb:> Karl Heinz schrieb:>> ok.>> Laut Schaltplan müssten hiemit>> com74hc595_setall(); // Setzt alle Ausgänge auf High>>>> alle LED aus gehen.>> Tun sie das?>> NEIN :( Es passiert leider gar nichts :(((
was heisst gar nichts?
leuchten sie oder leuchten sie nicht?
Bitte denk daran: ich kann dir nicht über die Schultern schauen. Ich
muss mir mein Bild dessen, was passiert alleine danach bilden, was du
schreibst. Also: sei eindeutig.
Karl Heinz schrieb:> Helge.S schrieb:>> Karl Heinz schrieb:>>> ok.>>> Laut Schaltplan müssten hiemit>>> com74hc595_setall(); // Setzt alle Ausgänge auf High>>>>>> alle LED aus gehen.>>> Tun sie das?>>>> NEIN :( Es passiert leider gar nichts :(((>> was heisst gar nichts?>> leuchten sie oder leuchten sie nicht!
Sie leuchten alle! Ich kann sie mit Enable High / Enable Low alle auf
einmal ausschalten...
nur das will ich ja gar nicht :D enable sollte ja dauerhaft auf low
liegen...
Helge.S schrieb:> Sie leuchten alle!
ok. Das wollte ich wissen. Also führen die Pins am 595 einen 0 Pegel.
Wie können eines tun
Das hier
1
voidcom74hc595_out()
2
{
3
unsignedcharanz=com74hc595_SIZE;
4
unsignedchar*serp=com74hc595+com74hc595_SIZE;
5
6
do
7
{
8
unsignedcharbits;
9
unsignedchardata=*--serp;
10
11
/* 8 Bits per Byte to 74HC595 */
12
for(bits=8;bits>0;bits--)
13
{
14
PORT_com74hc595&=~(1<<PORT_SER);
15
if(data&0x80)
16
{
17
PORT_com74hc595|=(1<<PORT_SER);
18
};
19
20
data<<=1;
21
/* Strobe on SCK to shift the bit into 74HC595 */
22
PORT_com74hc595&=~(1<<PORT_SCK);
23
PORT_com74hc595|=(1<<PORT_SCK);
24
}
25
}
26
while(--anz>0);
27
28
/* Strobe on RCK for out on 74HC595 */
29
PORT_com74hc595&=~(1<<PORT_RCK);
30
PORT_com74hc595|=(1<<PORT_RCK);
31
}
ist die zentrale Ausgabefunktion.
Man kann da mal ein paar delay_ms einbauen, zb mit 1000ms und dann ein
paar LED an die 3 wichtigen 595 Leitungen klemmen. Da müsste man dann
die Ansteuerung des 595 quasi in Zeitlupe mitverfolgen können.
Ich wollte ja nur wissen ob die Software "richtig" ist...
Es hätte ja sein können das jemand hier eine kleine Testsoftware hat
damit ich das fix ausprobieren kann... aber wenn die Software soweit
okay ist kann es ja nur an der Hardware liegen....
Karl Heinz schrieb:>> Man kann da mal ein paar delay_ms einbauen, zb mit 1000ms und dann ein> paar LED an die 3 wichtigen 595 Leitungen klemmen. Da müsste man dann> die Ansteuerung des 595 quasi in Zeitlupe mitverfolgen können.
Das sieht dann so aus
1
voidcom74hc595_out()
2
{
3
unsignedcharanz=com74hc595_SIZE;
4
unsignedchar*serp=com74hc595+com74hc595_SIZE;
5
6
do
7
{
8
unsignedcharbits;
9
unsignedchardata=*--serp;
10
11
/* 8 Bits per Byte to 74HC595 */
12
for(bits=8;bits>0;bits--)
13
{
14
PORT_com74hc595&=~(1<<PORT_SER);
15
if(data&0x80)
16
{
17
PORT_com74hc595|=(1<<PORT_SER);
18
};
19
_delay_ms(1000);
20
21
data<<=1;
22
/* Strobe on SCK to shift the bit into 74HC595 */
23
PORT_com74hc595&=~(1<<PORT_SCK);
24
_delay_ms(1000);
25
PORT_com74hc595|=(1<<PORT_SCK);
26
_delay_ms(1000);
27
}
28
}
29
while(--anz>0);
30
31
/* Strobe on RCK for out on 74HC595 */
32
PORT_com74hc595&=~(1<<PORT_RCK);
33
_delay_ms(1000);
34
PORT_com74hc595|=(1<<PORT_RCK);
35
_delay_ms(1000);
36
}
Aber achtung:
Die out Funktion wird auch von init aus aufgerufen. Entweder du nimmst
den Aufruf dort mal raus, oder du zählst die Blinker auf der SCK Leitung
mit, oder du wartest bis du das erste mal den Puls an RCK siehst.
WEnn sich gar nichts an den 3 Kontrolleds an DATA, SCK bzw. RCK tut,
dann stimmt an deiner Verkabelung was nicht.
Was müsstest du sehen.
Ich geh mal davon aus, dass
die 3 Kontrolled direkt an den Eingängen des ersten 595 sitzen und so
angebracht sind, dass sie leuchten, wenn der Pegel der Leitung eine 1
ist.
WEiters geh ich davon aus, dass du den ersten out Aufruf in init drinnen
gelassen hast.
Du müsstest sehen
* die Datenleitung muss auf 0 gehen. Also LED an der Datenleitung aus
* die SCK Leitung hat als Ruhepegel eine 1 eingestellt d.h. die leuchtet
von Anfang an. Detto die RCK Leitung
* aber das ändert sich gleich.
* mit der LED an der Datenleitung auf aus, müssten jetzt die SCK-LED 16
mal aus und wieder ein gehen.
* Nach dem 16.ten Blinker ist SCK wieder auf 1 (LED leuchtet) und dafür
geht RCK auf aus und wieder ein.
In dem Moment müssten auf jeden Fall ALLE Led an den Ausgängen des 595
anfangen zu leuchten. Selbst wenn einige davon nicht von Anfang an
geleuchtet haben.
Damit ist die Initialisierungssequenz durch.
Jetzt komme den setall und wieder ein Aufruf von out
Im Prinzip ist alles gleich wie vorher, nur dass diesemal die LED an der
Datenleitung leuchten müsste. Schliesslich werden ja lauter 1-er
rausgetaktet.
Also Datenleitung auf 1 und wieder müssen 16 Blinker an der SCK Leitung
zu sehen sein, ehe dann ein abschliessender Blinker an der RCK Leitung
kommt.
Und dann sollten die LED an den Ausgängen eigentlich ausgehen.
Wenn der Ablauf nicht so ist und du zb überhaupt keine Veränderungen
siehst (durch die _delay_ms hast du genügend Zeit die Umschaltungen zu
sehen), dann sind deine Schieberegister nicht korrekt angeschlossen.
Helge.S schrieb:> ich habe nun an DATA & SCK & RCK Led´s angelötet...>> die Leuchten... obwohl in der While... nichts läuft... ist das richtig> 0.o?
Ja.
Aber du müsstest die Anfangssequenz sehen können. Ein einziger Aufruf
von out dauert durch die _delay_ms( 1000 ) jetzt 50 Sekunden. Das kannst
du gar nicht übersehen, dass die Leitungen die Pegel wechseln.
(ok, delay_ms(500) hätte es auch getan)
Helge.S schrieb:> Ich glaube es nicht :D> Mit deinem Code geht es aufeinmal...> Es liegt glaube ich wirklich an den 100nF!
Könnte sein.
Der verzögert und verschleift natürlich die Flanken an der Datenleitung.
Wenn die nicht korrekt steht und der SCK Puls zu früh kommt, dann liest
das 595 Bullshit von der Datenleitung ein.
Karl Heinz schrieb:> Helge.S schrieb:>> Ich glaube es nicht :D>> Mit deinem Code geht es aufeinmal...>> Es liegt glaube ich wirklich an den 100nF!>> Könnte sein.> Der verzögert und verschleift natürlich die Flanken an der Datenleitung.> Wenn die nicht korrekt steht und der SCK Puls zu früh kommt, dann liest> das 595 Bullshit von der Datenleitung ein.
Wenn du ihn rausnehmen kannst, dann nimm ihn raus (wozu soll der
überhaupt gut sein?).
Wenn das nicht möglich ist, dann baust du hier
1
voidcom74hc595_out()
2
{
3
unsignedcharanz=com74hc595_SIZE;
4
unsignedchar*serp=com74hc595+com74hc595_SIZE;
5
6
do
7
{
8
unsignedcharbits;
9
unsignedchardata=*--serp;
10
11
/* 8 Bits per Byte to 74HC595 */
12
for(bits=8;bits>0;bits--)
13
{
14
PORT_com74hc595&=~(1<<PORT_SER);
15
if(data&0x80)
16
{
17
PORT_com74hc595|=(1<<PORT_SER);
18
};
19
20
//
21
// <-------------
22
//
23
data<<=1;
24
/* Strobe on SCK to shift the bit into 74HC595 */
25
PORT_com74hc595&=~(1<<PORT_SCK);
26
...
mit einem _delay_us eine kleine Verzögerung ein. Fang mit grossen Werten
an und verringere den Wert, solange bis die korrekte Funktion aufhört.
Dann gehst du noch mal ein kleines bischen höher.
Zum testen auch mal ein Muster aus abwechselnd 0 und 1 in die
Schieberegister schreiben lassen.
nur was ich jetzt nicht verstehe...
ich kann mit...
com74hc595_setall();
com74hc595_out(); // Ausgabe
alle ausmachen...
möchte ich jededoch nur eine Led ausmachen funzt das nicht...
com74hc595_setBit(11111110);
com74hc595_out(); // Ausgabe
Helge.S schrieb:> com74hc595_setBit(11111110);
Seit wann hast du 11 Millionen (und ein paar Zerquetschte) LED?
Code studieren!
bei SetBit gibst du die NUmmer des Ausgangs an. Dsa ist bei dir eine
Zahl zwischen 0 und 15
Drum heisst das Argument für die Funktion
Karl Heinz schrieb:> Wenn du ihn rausnehmen kannst, dann nimm ihn raus (wozu soll der> überhaupt gut sein?).
Ah, mir schwant etwas.
Da sind RC-Glieder und die Anschlüsse sind auf der Platine zusätzlich
mit KEY1 und KEY2 beschriftet.
Das war wohl mal eine Hardware-Entprellung von Tastern (noch dazu eine
untaugliche).
Tja. Jetzt weißt du, warum wir uns hier im Forum den Mund fusselig
reden, dass man Tastenentprellung mit Software macht und nicht mit
Hardware. Zum einen funktioniert das besser (und universeller), zum
anderen braucht man weniger Bauteile, und last but not least, kann man
den Müll auch nicht vergessen zu entfernen, wenn man die Pins für etwas
anderes benutzt.
will 2 Argumente.
Port könnte man als die Nummer des Bausteins ansehen (bei dir 0 oder 1),
Bits ist das Bitmuster, welches in diesen Baustein soll.
Nö.
01010101
ist eine Oktalzahl. Was du wahrscheinlich wolltest, ist 0b01010101. Und
das ist was anderes.
1
23 Dezimalzahl
2
023 Oktalzahl (weil sie mit einer 0 beginnt)
3
0x23 Hexadezimalzahl
4
0b10101111 Binärzahl (gcc spezifische Erweiterung von C)
Hallo nochmal :-P
ich habe gestern nicht wirklich drauf geachtet was ich tu :(
könntest du bitte die .rar Datei löschen?!
Sie sollte eigentlich gar nicht an die Öffentlichkeit gelangen!
Das währe sehr nett
Es dreht sich eigentlich nur um den Schaltplan + Layout von der CPU...
das sollte entfernt werden