mikrocontroller.net

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


Autor: Der Flins (flins)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Der Flins (flins)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da sind es aber PNP

Otto

Autor: holger (Gast)
Datum:

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

Autor: Matthias Lipinsky (lippy)
Datum:

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

Hat er gemacht, ist aber Unsinn.

Autor: Der Flins (flins)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann musst Du aber eine einzelne "1" für die Anoden ausgeben.....

Otto

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
NE NE!

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

Was denn nun??

Autor: Der Flins (flins)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Der Flins (flins)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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:
DDRD = ~(1<<PD3)

>mit einer Bit-Maske gehn?

Yo.
if (  (PIND & (1<<PD3)  )
{
 // mach was, wenn Pin HIGH
}
oder so:
if (  !(PIND & (1<<PD3)  )
{
 // mach was, wenn Pin LOW
}

Autor: Der Flins (flins)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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:
DDRD = (1<<PD3) ;
//wird mit
#define PD3    3       // steht in der h-Datei für dein AVR
// zu:
DDRD = (1<<3);

Also:

Nimm eine Eins und verschiebe sie um 3Stellen(Bit) nach links.

Jetzt aber: GN8

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.