Forum: Mikrocontroller und Digitale Elektronik Fehler bei 7-Seg. LED Display mit Attiny 2313


von Der F. (flins)


Angehängte Dateien:

Lesenswert?

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

von Otto (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?


von Der F. (flins)


Lesenswert?

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

von Matthias L. (Gast)


Lesenswert?

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...

von Otto (Gast)


Lesenswert?

Da sind es aber PNP

Otto

von holger (Gast)


Lesenswert?

Alle Segmente kurz ausschalten bevor eine neue Zahl
ausgegeben wird. Sonst kommt es zu Geisterbildern.

von Matthias L. (Gast)


Lesenswert?

>Alle Segmente kurz ausschalten bevor eine neue Zahl
>ausgegeben wird. Sonst kommt es zu Geisterbildern.

Hat er gemacht, ist aber Unsinn.

von Der F. (flins)


Angehängte Dateien:

Lesenswert?

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

von Otto (Gast)


Lesenswert?

Dann musst Du aber eine einzelne "1" für die Anoden ausgeben.....

Otto

von Ulrich (Gast)


Lesenswert?

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.

von Matthias L. (Gast)


Lesenswert?

NE NE!

Entweder hast du BC548 (wie geschrieben) verbaut, oder du hast PNP (wie 
gemalt) verbaut.

Was denn nun??

von Der F. (flins)


Lesenswert?

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.

von Matthias L. (Gast)


Lesenswert?

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.

von Der F. (flins)


Lesenswert?

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...

von Matthias L. (Gast)


Lesenswert?

>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
}

von Der F. (flins)


Lesenswert?

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

von Matthias L. (Gast)


Lesenswert?

>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

von Falk B. (falk)


Lesenswert?


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
Noch kein Account? Hier anmelden.