Hallo! ich habe eine schaltung mit einem mega88 und einen 74HC595 (NXP), die 3 7-segment anzeigen steuern. Die einzelnen 7-segment-anzeigen werden per transistor einzeln der reihe nach geschaltet (f=125 Hz). Das merkwürdige ist, dass der 74HC595 die daten nur annimmt, wenn meine Finger sich in der nähe der 3 Leitungen (SH_CP, ST_CP, DS) zwischen AVR und 74HC959 aufhalten. Die Übertragung habe ich in software gemacht (also kein SPI oder so). Ich habe als probe die datenleitung (DS) immer auf 1 gelassen, und nur die takte für SH_CP und ST_CP generiert. Der storage register wird alle 8 bits angesteuert und !OE ist auf VCC. Auf dem oszi sieht alles so aus wie es soll. Hat jemand eine idee, woran das liegen mag? Gruß Raphael.
Vermutlich irgendwas in dieser Richtung: - offener Eingang - Timingprobleme - Übersprechen - unsaubere Spannungen
Und was ist mit !MR? Der Master Reset sollte doch wohl über Pull-Up auf Vcc liegen, oder auch mit dem Atmel verbunden sein, der da während der Arbeit ein High-Level ausgibt. Tschau
Also erstmal vielen Dank für die vielen tips! Ich kann sie leider erst heute abend ausprobieren. Um die fragen zu beantworten: - !MR ist mit pull-up (10k) auf VCC. - !OE ist direkt mit GND festgebunden. - nur Q7' ist nicht verbunden. - spannungsversorgung hat 10mV ripple. Ich werde also wohl die massen überprüfen und mich wieder melden, wenn das getan ist. Danke! Raphael.
Ich tippe du schiebst die Daten auf der flaschen Clockflanke raus. Mit deinem Finger (Kapazität) veerschiebst du den Clock minimal und dadurch werden die Setup-Hold Zeiten knapp eingehalten.
Was meinst du genau? Der 74HC595 kann immerhin 100MHz. Und mein mega88 läuft auf dem internen oszillator (8 MHz). Falls es hilft, hier ist der code:
1 | void send_byte(uint8_t b) |
2 | {
|
3 | uint8_t i; |
4 | |
5 | for(i=0;i<8;i++){ |
6 | |
7 | if(b & 1) |
8 | SIPO_PORT |= 1<<DS_PIN; // set |
9 | else
|
10 | SIPO_PORT &= ~(1<<DS_PIN); // clear |
11 | |
12 | b >>= 1; |
13 | |
14 | SIPO_PORT |= 1<<SH_CP_PIN; // set SH_CP |
15 | SIPO_PORT &= ~(1<<SH_CP_PIN); // clear SH_CP |
16 | }
|
17 | |
18 | SIPO_PORT |= 1<<ST_CP_PIN; // set ST_CP |
19 | SIPO_PORT &= ~(1<<ST_CP_PIN); // clear ST_CP |
20 | }
|
-Raphael.
Also, die Lösung meines problems war noch viel einfacher als erwartet: ein paar copy-paste fehler hatten sich im code eingeschlichen! Der port für den schieberegister war als eingang initialisiert! Manchmal, aber manchmal... Vielen Dank an alle! Raphael.
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.