www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 2x 7 Segment Multiplexen mit ATmega32 - Grundlagenproblem


Autor: Frank Thetank (franktank87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo allerseits!

Ich möchte gerne (später) 2 sieben Segment anzeigen benutzen um 
zweistellige Zahlen anzeigen zu können. Leider bin ich ein ziemlicher 
Neuling auf dem AVR Gebiet und bitte daher um ein wenig milde falls ich 
Dinge nicht auf anhieb verstehe... :)

Ich habe mein Steckboard erstmal gemäß des Tutorials aufgebaut, sodass 
eine einzelne 7-Segment-Anzeige funktioniert:

http://www.mikrocontroller.net/articles/AVR-Tutori...

Die Anzeige ist an PortD, PD0 bis PD6 angeschlossen und ein Testprogramm 
was von 0-9 zählt funktioniert auch.

Um mich an das Multiplexing heranzutasten habe ich nun eine zweite 
7-Segment-Anzeige angeschlossen (wie das Schaltbild im Tutorial sagt) 
und zwischen Anzeigen und Vcc jeweils einen Bipolartransistor 
angeschlossen. Die Basis der Transistoren über einen 1k Widerstand an 
PC5 und PC4 angeschlossen.

Ich möchte nun zunächst die Anzeigen erstmal ohne "richtiges" 
Multiplexen seperat ansteuern. Ganz simpel:

Anzeige A anschalten
Anzeige A soll Zahl anzeigen
Anzeige A ausschalten

Anzeige B anschalten
Anzeige B soll Zahl anzeigen
Anzeige B ausschalten

Nun habe ich ein wenig rumprobiert aber es funktioniert leider 
garnichts. Unabhängig vom Zustand von PC4 / PC5 bleiben beide Anzeigen 
aus. Wenn ich nun die Transistoren wieder rausbaue, dann zeigen beide 
Anzeigen (gleichzeitig) die Zahl an, die ich an PORTD rausschicke.

Woran könnte es liegen, bzw. was mach ich falsch?
Danke schonmal für jede Hilfe :)

Gruß,
Frank

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank Thetank schrieb:
> Woran könnte es liegen, bzw. was mach ich falsch?

Transistoren falsch angeschlossen?

Gruß Anja

Autor: Joachim K. (minifloat)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falsche Transistoren angeschlossen?
Port C ist als Ausgang konfiguriert?
mf

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

JTAG-Fuse abgeschaltet?

MfG Spess

Autor: Frank Thetank (franktank87)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Den Anschluss der Transistoren habe ich aus unserem Schaltplan für unser 
Lern-Board im 2. Semester abgeguckt. Die Transistoren müssten baugleich 
mit denen vom Plan sein, da ich einen von der Uni vorgefertigten 
Warenkorb zum Nachbau eben jenen Boards bestellt habe.

Ausschnitt im Anhang

Hier mal mein Code. Meines Verständnisses nach müsste die Anzeige, die 
an PC5 hängt eigentlich funktionieren. Leider tut sich aber garnichts.
 
#include <avr/io.h>

void sevenseg_show(int number);

void main(void) {

  int i = 0;
  int j = 0;

  DDRD = 0xff;
  PORTD = 0xff;

  DDRC = 0xff;
  PORTC &= ~(1<<PC4);
  PORTC |= (1<<PC5);

  while(1) {
      for (j = 0; j < 10; j++) {
        for (i = 0; i < 5000; i++) {}
        sevenseg_show(j);
      }
  }
}

void sevenseg_show(int number) {

  static int numbers[] = {0x6f, 0x21, 0x5D, 0x79, 0x33, 0x7A, 0x7E, 0x29, 0x7f, 0x7B};

  PORTD = 0xff;
  PORTD &= ~(numbers[number]);

  return;
}



Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank Thetank schrieb:
> Hallo!
>
> Den Anschluss der Transistoren habe ich aus unserem Schaltplan für unser
> Lern-Board im 2. Semester abgeguckt. Die Transistoren müssten baugleich
> mit denen vom Plan sein, da ich einen von der Uni vorgefertigten
> Warenkorb zum Nachbau eben jenen Boards bestellt habe.

Da sind mir zuviele 'müsste' in deinem Satz enthalten :-)
Lieber nachmessen.

Hast du darauf geachtet, dass JTAG per Fuse abzuschalten?

Schreib dir ein Testprogramm, mit dem du nur die Pins am Port C 
ansteuerst. Und zwar gaaaaanz langsam ansteuern. Mit dem Voltmeter 
kannst du dann kontrollieren, ob die Pins auch wirklich auf 0 bzw. 1 
gehen. Dann misst du weiter: nach dem Basiswiderstand an der Basis der 
Transistoren: ist dort 0 und 1 immer noch vorhanden.

Immer in kleinen Schritten arbeiten. Nichts als gegeben voraussetzen. 
Immer überlegen: welche Voraussetzungen müssen gegeben sein und (ganz 
wichtig) wie kann ich die überprüfen?

Wenn du nicht weißt, ob die Pins am Port C richtig funktionieren, dann 
muss man sich eben ein Verfahren dafür ausdenken, wie man das 
feststellen kann. Wenn du keine Messgeräte hast um schnelle Pulse zu 
messen (Osziloskop), dann muss man eben die Pulse soweit verlangsam, 
dass man mit dem vorhandenen Voltmeter die Pulse sehen kann. Hat man 
kein Voltmeter dann muss eben eine einzelne Led (+ Vorwiderstand) diese 
Aufgabe übernehmen. Dank Digitaltechnik kann der Ausgang ja nur +5V oder 
0V haben, also: Led leuchtet oder Led leuchtet nicht.
Beim Nachmessen immer bei der Quelle anfangen. Bei dir: an den µC-Pins. 
Wenn dort schon die Signale nicht stimmen, kann hinten nach nichts 
richtiges mehr rauskommen.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Hier mal mein Code. Meines Verständnisses nach müsste die Anzeige, die
>an PC5 hängt eigentlich funktionieren.

Wenn du das JTAG-Interface nicht ausgeschaltet hast, nein.

MfG Spess

Autor: Frank Thetank (franktank87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

--
Hast du darauf geachtet, dass JTAG per Fuse abzuschalten?
--

Leider hab ich keine Ahnung was ein JTAG Fuse ist bzw. wie ich es 
abschalte.
Ich arbeite mit AVR Studio 4.18, flashe mit einem AVRISP mkII, der uC 
ist ein ATmega32.
Angeschlossen ist bis auf die 7-Segment-Anzeigen und der Anschluss für 
den ISP nichts weiter.

Zum testen habe ich jetzt mal eine einzelne LED angeschlossen (Vcc => 
LED => 1k Widerstand => PC5). Den Code habe ich dann auf folgendes 
reduziert:

  DDRC = 0xff;
  PORTC &= ~(1<<PC5);
  PORTC |= (1<<PC4);


Leider geht die LED nicht.

Was mache ich nun?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JTAG abschalten

In deinem Brennprogramm gibt es irgendwo einen Punkt mit dem man die 
'Fuses' einlesen und brennen kann

Fuses einlesen
JTAGEN  abschalten
Fuses brennen

und dann sollte der Spuk vorbei sein.

Hier noch einmal genauer
http://www.mikrocontroller.net/articles/AVR_Fuses

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Leider hab ich keine Ahnung was ein JTAG Fuse ist bzw. wie ich es
>abschalte.

Am PortC befindet sich das JTAG-Intercace. Das ist werksmässig 
eingeschaltet und blockiert etliche Pins von Port C.

Siehe Datenblatt:

JTAG Interface and On-chip Debug System

MfG Spess

Autor: Frank Thetank (franktank87)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich habe nun im AVR Studio eine Funktion unter "Auto-Connect => 
Fuses..." gefunden (siehe Screenshot). Nachdem ich JTAGEN deaktiviert 
habe, funktioniert jetzt die 7 Segment Anzeige an PC4 auch mit dem 
Transistor.
Allerdings geht die an PC5 nicht. Folgender Code soll beide Anzeigen 
abwechselnd von 0-9 zählen lassen. Aber immer wenn PC5 dran ist, bleibt 
sie dunkel. Gefühlt zählt der uC ganz normal hoch, wenn wieder PC4 
Anzeige dran ist, funktioniert diese, usw.


#include <avr/io.h>

void sevenseg_show(int number);

void main(void) {

  int i = 0;
  int j = 0;

  DDRD = 0xff;
  PORTD = 0xff;

  DDRC = 0xff;
  PORTC &= ~(1<<PC4);
  PORTC |= (1<<PC5);

  while(1) {
      for (j = 0; j < 10; j++) {
        for (i = 0; i < 15000; i++) {}
        sevenseg_show(j);
      }
      PORTC ^= (1<<PC4);
      PORTC ^= (1<<PC5);
  }
}

void sevenseg_show(int number) {

  static int numbers[] = {0x6f, 0x21, 0x5D, 0x79, 0x33, 0x7A, 0x7E, 0x29, 0x7f, 0x7B};

  PORTD = 0xff;
  PORTD &= ~(numbers[number]);

  return;
}


Nachtrag:

Schließe ich eine einzelne LED an PC5 an, dann funktioniert diese nun 
auch einwandfrei.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank Thetank schrieb:

> Allerdings geht die an PC5 nicht.

Dann mach wieder dasselbe Spiel wie vorher:
überprüfe zunächst, ob Pin PC5 sich so verhält, wie du es erwartest (LED 
drann und nachsehen ob ein/ausschalten geht)

> Folgender Code soll beide Anzeigen
> abwechselnd von 0-9 zählen lassen.

Dein Code ist zwar .... unorthodox.
Nichtsdesto trotz kann ich jetzt aber erst mal nichts sehen, was ein 
aufleuchten der anderen Anzeige verhindern würde.


Edit: Deinen Nachtrag zu spät gesehen :-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Nachtrag:

Nimm besagte LED und häng sie trotzdem an PC5 noch mit drann.
Wenn die andere 7-Seg drann wäre, müsstest du sehen, wie diese LED ihren 
Zustand ändert.

Autor: Frank Thetank (franktank87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Danke für die ganze Unterstützung.
Der Grund warum 7Seg an PC5 nicht ging war ganz einfach der, dass ich 
nach dem Probestöpseln von LED beim Steckboard um eine Zeile verrutscht 
bin, d.h. die Anzeige garkeinen Saft bekommen hat. :D

Problem gelöst. :) Danke nochmals

Autor: Oliver Heinrichs (Firma: OliverHeinrichs.de) (dobson)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sehe ich das richtig, oder sind die segment anzeigen unvollständig 
angeschlossen? Pin 3 und Pin 8 auf beiden Anzeigen?
Dürften die Common Anschlüsse sein.
Warum nur einen benutzt pro Anzeige?

Autor: Frank Thetank (franktank87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wozu sind die leeren Anschlüsse da? Ich hab mich zwar drüber gewundert 
aber da ich ja alle Ziffern darstellen konnte war mir das dann egal. ^^

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank Thetank schrieb:
> Wozu sind die leeren Anschlüsse da? Ich hab mich zwar drüber gewundert
> aber da ich ja alle Ziffern darstellen konnte war mir das dann egal. ^^

Datenblatt!

Das sind die Anoden der Anzeigen, kurz gesagt die Anschlüsse für +
Die Anzeigen haben 2 davon (auf Pin 8 und auf Pin 3) und normalerweise 
sollte man auch beide anschliessen.

Wenn ein Baustein meherer Anschlüsse für + oder - hat, dann bedeutet das 
nicht notwendigerweise 'such dir den aus, der dir besser ins Layout 
passt', sondern: Der Baustein zieht im Extremfall soviel Strom, dass ein 
einziger Anschluss alleine überlastet wäre.

Autor: Anonym (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ha. Den Schaltplan kenne ich doch. Das ist ja unser Spicboard :-)
Schön, dass du es schon hinbekommen hast. Hab das 7-seg Modul vor ca. 2 
Wochen nachgebaut. Ist gar nicht so schwer.

Hast du das Timermodul schon fertig?

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.