Hallo, ich habe folgendes Problem: ich habe an einem Atmega48 den Decoder 74LS47 angeschlossen (2 Stück). Die 7 Segment-Anzeige ist eine MAN6610. Des weiteren sind 3 Taster über externe Pull-Up-Widerstände angeschlossen. Leider leuchten die ausgeschalteten Segmente der Anzeige trotzdem schwach, was die Lesbarkeit sehr beeinträchtigt. Die gemeinsame Anode der Anzeige liegt auf +5 Volt, als Vorwiderstand habe ich 150 Ohm gewählt. Es macht auch keinen Unterschied, ob ich zwischen Atmega und Decoder Vorwiderstände und Pull-Down-Widerstände benutze oder nicht. Dazu kommt, dass beim betätigen des Tasters die Anzeige auf einmal richtig leuchtet. Alle Segmente sind dann richtig eingeschaltet bzw. ausgeschaltet (kein schwaches leuchten). Kann mir jemand einen Tipp geben, an was das liegen könnte? Die Pegel am Atmega stimmen, aber anscheinend sperren die Open-Collector-Ausgänge des 74LS47 nicht richtig, auch wenn ein Pegel von 0 Volt anliegt. Gruß Paul
paul schrieb: > trotzdem schwach, was die Lesbarkeit sehr beeinträchtigt. Die gemeinsame > Anode der Anzeige liegt auf +5 Volt, als Vorwiderstand habe ich 150 Ohm > gewählt. 1 Vorwiderstand oder mehrere? > Es macht auch keinen Unterschied, ob ich zwischen Atmega und > Decoder Vorwiderstände und Pull-Down-Widerstände benutze oder nicht. Logisch. Da laufen Digitalsignale. Durch Widerstände ist alles was du erreichst, dass der Decoder nicht mehr 5V als logisch 1 kriegt sondern etwas weniger. Der Decoder dürfte sich aber daran nicht sonderlich stören, solange der Pegel hoch genug ist um als 1 erkannt zu werden. > Dazu kommt, dass beim betätigen des Tasters die Anzeige auf einmal > richtig leuchtet. Wie ist der Taster verschaltet? > Alle Segmente sind dann richtig eingeschaltet bzw. > ausgeschaltet (kein schwaches leuchten). Kann mir jemand einen Tipp > geben, an was das liegen könnte? Schaltplan, Programm > Die Pegel am Atmega stimmen, aber > anscheinend sperren die Open-Collector-Ausgänge des 74LS47 nicht > richtig, auch wenn ein Pegel von 0 Volt anliegt. Unwahrscheinlich. Du hast irgend einen Fehler gemacht. Der 7447 ist sicherlich in Ordnung (auch wenn in Wirklichkeit kein Mensch diesen Baustein an einem µC mehr braucht)
> Dazu kommt, dass beim betätigen des Tasters die Anzeige auf einmal > richtig leuchtet. Was macht deine Software in diesem Zustand? Ich würde sagen, du schaltest die meiste Zeit die LEDs aus und nur immer mal kurz ein. Und wenn du die Taste drückst, dann unterbrichst du den ganzen Ablauf (und so auch das dauernde Abschalten).
So hier mal mein Code. Das mit dem Ein- und Ausschalten könnte natürlich sein. Meiner Meinung dürfte dies nicht der Fall sein, ich lass mich aber gerne eines besseren belehren :-) Zum Programm: durch zwei Taster kann ein Spannungswert höher oder niedriger eingestellt werden. Dieser wird dann auf insgesamt drei 7 Segment-Anzeigen dargestellt (die Nachkommastelle wird mit Hilfe von zwei Transistoren ohne Decoder angesteuert; funktioniert auch). Beim betätgigen des dritten Tasters wird der Spannungswert über UART bzw. RS232 gesendet (noch nicht fertig programmiert). Außerdem wird eine LED umgeschaltet, was auch funktionert und denke nichts mit dem Problem zu tun hat.
paul schrieb: > So hier mal mein Code. Das mit dem Ein- und Ausschalten könnte natürlich > sein. Meiner Meinung dürfte dies nicht der Fall sein, ich lass mich aber > gerne eines besseren belehren :-) Doch, genau das tust du.
1 | void Display_V(uint16_t Voltage){ |
Hier schaltest du aus (bzw. auf 0)
1 | K_Port &= ~((1<<Komma0) | (1<<Komma5) ); |
2 | Z1_Port = 0; |
3 | Z2_Port = 0; |
um kurz drauf wieder einzuschalten :
1 | switch (Voltage){ |
2 | |
3 | case 80: Z1_Port = 0; |
4 | Z2_Port = 8; |
5 | K_Port |= (1<<Komma0); |
6 | |
7 | break; |
Übrigens. Du kennst doch Division, oder nicht? mittels / und % könnte man den ganzen langen switch/case auf <10 Zeilen eindampfen. / ... Division % ... Rest bei einer Division.
Mann, das ist aber ein starkes Stück SW...
> Das mit dem Ein- und Ausschalten könnte natürlich sein.
Ja, genau so ist es:
1 | Z1_Port = 0; // Ausschalten !!! |
2 | Z2_Port = 0; |
3 | |
4 | switch (Voltage){ |
5 | |
6 | case 80: Z1_Port = 0; // Einschalten |
7 | Z2_Port = 8; |
8 | K_Port |= (1<<Komma0); |
9 | break; |
Kommentier die ersten beiden Zeilen mal raus. Wenn du keine Taste drückst, dann wird das nicht ausgeführt:
1 | inline uint8_t debounce(volatile uint8_t *port, uint8_t pin) |
2 | :
|
3 | _delay_ms(50); << nur bei Tastendruck |
4 | :
|
Und das verändert das Zeitverhältnis zwischen Ausschalten und Einschalten :-o EDIT: Pech, Zweiter... ;-)
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.