Guten Abend! Ich stehe am Anfang meiner uC-Karriere und habe mich heute mal an ein 7-Segment Display mit drei gemultiplexten Stellen gewagt. Angeschlossen ist alles an einen Attiny2313. -Port B ist mit den Balken a-g und Dezimalpunkt verbunden. -Die Anoden jeweils über Transistor an Port D(Pin 4,5,6) Im Anhang befindet sich die aktuelle Version meines Programms. Sinn dabei ist es vorerst, eine Zahl, die in "zahl" gespeichert wird, auf dem Display anzuzeigen. der einfachheit halber Beispiele, bei denen es funktioniert oder eben nicht. Funktioniert: -"Schnapszahlen" anzeigen (111,222,333...) -(durch verändern des Codes) Anzeigen eines einzelnen Zeichens (7 nix nix, nix 3 nix,...) Einen Fehler in der Hardware schließe ich hiermit aus. Funktioniert nicht: -Beim anzeigen einer beliebigen 3-stelligen Zahl überlagern sich diese. Das heißt bei der Zahl 123 würde auf Anzeige 1 eine 1 und 2 angezeigt, auf Anzeige 2 eine 2 und 3, usw. Meine Versuche den Fehler zu beheben: -Ich habe den Multiplex-Takt heruntergesetzt auf ~3Hz, um zu sehen was geschieht. Und es geschieht genau das was ich vermutet habe. Es werden zwei Zeichen abwechselnd angezeigt und somit überlagert. Dass das Display zu langsam ist, wäre damit ausgeschlossen.(Habe ja auch noch nichts von einer Reaktionszeit bei Leds gehört...) -In mein Programm habe ich "Pausen" eingebaut, die alle Leds beim Wechsel der Anzeigen für 1ms ausschalten. Daran tüftle ich schon den ganzen Tag und komme auf keinen grünen Zweig. Wäre nett wenn ihr mal ein Auge auf das Programm sehen könntet, vielleicht entdeckt ihr einen Fehler. Vielen Dank. MfG Dominic
Hallo Dominic, 1. "Die Anoden jeweils über Transistor an Port D(Pin 4,5,6)" Verwendest Du PNP-Transistoren und wie steuerst Du diese an ? Gruss Otto
Hallo nochmals. Ich verwende NPN Transistoren (BC548). Angeschlossen über 1K an den jeweiligen Port. Anschluss wie im Tutorial auf mikrocontroller.net "AVR-Tutorial: 7-Segment-Anzeige" MfG Dominic
Zeige uns trotzdem mal den Schaltplan, auf den ersten Bilck kann ich im Prg nicht falsches erkennen. >Ich verwende NPN Transistoren (BC548). Angeschlossen über 1K an den >jeweiligen Port. >Anschluss wie im Tutorial auf mikrocontroller.net "AVR-Tutorial: >7-Segment-Anzeige" Dort sind aber PNP's dargestellt. Das würde auch sinn machen (pnp) weil: laut deiner code-tabelle arbeiten deine Segmente LOW-aktiv. Weiterhin steuerst du die Spalten ebenfalls LOW-aktiv an, weil du immer nur ein LOW ausgibst...
Alle Segmente kurz ausschalten bevor eine neue Zahl ausgegeben wird. Sonst kommt es zu Geisterbildern.
>Alle Segmente kurz ausschalten bevor eine neue Zahl >ausgegeben wird. Sonst kommt es zu Geisterbildern. Hat er gemacht, ist aber Unsinn.
Habe jetzt den im Tutorial gezeigten Schaltplan auf meinen Fall angepasst. Grob zumindest. Sollte aber fürs Verständnis ausreichen. Muss nochmal dazu sagen, dass ich den Aufbau, speziell die Transistoren, Aufgrund von Bauteilemangels auf die einzigen vorrätigen und passenden umgestellt hab. und das waren BC 548. Mein Aufbau scheint ja auch zu funktionieren. Ich bin sogar davon überzeugt dass er soweit richtig ist(ob schön, professionell oder doch verbesserungswürdig ist momentan egal). Wie schon am Anfang geschrieben, einzelne anzeigen ansprechen und Schnapszahlen darstellen geht. Danke schonmal für eure Mühen. MfG Dominic
Dann musst Du aber eine einzelne "1" für die Anoden ausgeben..... Otto
Die Werte die in Port D geschrieben werden sind falsch. z.B. setzt 0XB0 2 Bits (Bit 7 und Bit 6). Besser als (1<<4), (1<<5), (1<<6) schreiben, dann weiß man auch gleich was gemeint ist.
NE NE! Entweder hast du BC548 (wie geschrieben) verbaut, oder du hast PNP (wie gemalt) verbaut. Was denn nun??
Ja...Gut...genau...Hätte ich pnp Transitoren verwendet, hätte das mit der "0" an den Transistor wohl die Anode mit Strom versorgt... Bei npn Brauche ich eine "1"... Ganz logisch. Ganz einfach. Habe es geändert (Port D nicht mehr mit B0,D0,E0 sondern mit 40,20,10 beschrieben). Und siehe da, es funktioniert. Unfassbar wie blöd man manchmal ist. Ich danke euch auf jeden Fall für eure Hilfe, besonders Otto. MfG Dominic PS.: Verbaut sind BC548. Ich hatte ja gewarnt, dass ich es nur grob geändert habe. Danke auch für den Hinweis mit dem Bitshift anstatt hex-zahlen. Klingt vernünftig.
Kleiner Tip: Tausche E und C bei den Transistoren aus, als C an 5V und E an CA von 7Seg. Die Basiswiderstände kannst du dann weglassen. Funktioniert besser.
Ich frage hier mal gleich weiter, will jetzt kein eigenes Thema aufmachen. Meine Anzeige zeigt jetzt das an, das ich will. jetzt habe ich mit einer Schleife einen Zäher programmiert, der von 0 bis 999 hoch zählt, was ungefähr 0 bis 99,9sek entspricht. jetzt kam mit die idee eine stopuhr zu schreiben. Ein entsprechender Taster ist an PD3(Pin 7) mitsamt Pulldown angeschlossen. Die Richtung der Pins von Port D kann ich ja mit DDRD einstellen. Entsprechend von 0xFF auf 0x07 geändert. Somit ist PD3 ein Eingang.(Irrtum meinerseits als ausgeschlossen vorausgesetzt) Aber wie kann ich jetzt am einfachsten diesen Pin auf 0 oder 1 abfragen? Hat da jemand einen Tip? Denn Eingänge habe ich noch gar nicht abgefragt. Vielen Dank MfG Dominic PS.:Mein Blick fiel gerade auf meinen Informatik-Ordner(Studium). Würde das vielleicht mit einer Bit-Maske gehn? Erinnere mich da an eine &-Verknüpfung...
>Entsprechend von 0xFF auf 0x07 geändert. Somit ist PD3 ein >Eingang. Nein. Wenn PD3 Eingang bleiben soll, alle anderen Ausgang, musst du das so schreiben:
1 | DDRD = ~(1<<PD3) |
>mit einer Bit-Maske gehn?
Yo.
1 | if ( (PIND & (1<<PD3) ) |
2 | {
|
3 | // mach was, wenn Pin HIGH
|
4 | }
|
oder so:
1 | if ( !(PIND & (1<<PD3) ) |
2 | {
|
3 | // mach was, wenn Pin LOW
|
4 | }
|
Wenn man sich etwas mehr wie "Lass eine Led blinken" mit uC beschäftigt, machen die Bitshifts immer mehr Sinn. Ist wirklich übersichtlicher als meine Hex-Zahlen. Bin ja zum Lernen hier, nicht zum Abkupfern. Bitte verbessere mich wenn ich etwas falsch verstehe. DDRD = ~(1<<PD3) heißt: DDRD = (nimm eine 1, verschiebe sie bis PD3, und invertiere das ganze) Danke nochmals! MfG Dominic
>DDRD = (nimm eine 1, verschiebe sie bis PD3, und invertiere das ganze)
nicht ganz. Es bedeutet nicht, "..verschiebe bis PD3", sondern
verschiebe um 3 Stellen nach rechts:
1 | DDRD = (1<<PD3) ; |
2 | //wird mit
|
3 | #define PD3 3 // steht in der h-Datei für dein AVR
|
4 | // zu:
|
5 | DDRD = (1<<3); |
Also: Nimm eine Eins und verschiebe sie um 3Stellen(Bit) nach links. Jetzt aber: GN8
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.