4 LEDs so lange wie möglich leuchten lassen, aber wie?

Hier werden Fragen zu LED-Grundlagen beantwortet...

Moderator: T.Hoffmann

Antworten
Benutzeravatar
Beatbuzzer
Auserwählter
Auserwählter
Beiträge: 3177
Registriert: Fr, 17.08.07, 11:02
Wohnort: Alfeld / Niedersachsen
Kontaktdaten:

Sa, 05.11.11, 13:54

Mohi hat geschrieben: Was nur noch nicht so ganz klar ist, warum werden die einzelnen Segmente nacheinander mit hohem Tempo kurz eingeschaltet?
Man kann doch die einzelnen Segmente ganz normal an und wieder ausschlaten wie bei LEDs auch...
Wie denkst du dir das? Du hast nur einmal alle 7 Anschlüsse deiner drei Anzeigen zur Verfügung. Du kannst also nur eine Zahl gleichzeitig anzeigen.
Du bist also schon dazu gezwungen, die inzelnen Segmente nacheinander einzuschalten, und das muss dann entsprechend schnell passieren, sonst flackert ja alles.
Mohi hat geschrieben:Hab ich das bis hier hin so einigermaßen richtig verstanden?
Wenn ja, wie bekomme ich dann den "Vergleichswert" auf die Segmentanzeige?
Ja stimmt ungefähr. Zuerst wird der Wert mit der Referenz verglichen und digitalisiert. Mit GETADC liest du den Messwert in eine Variable.
Um Zahlen schnell und einfach anzeigen zu können, würde ich eine Tabelle erstellen, wo ich die einzelnen Bits des Ausgangsbytes für jede Ziffer von 0 bis 9 einmal entsprechend setze. Dann muss man aus dem Code heraus nur noch auf den entsprechenden Platz in der Tabelle verweisen.
Mohi
Mega-User
Mega-User
Beiträge: 104
Registriert: Di, 11.10.11, 08:13

Sa, 05.11.11, 14:17

Beatbuzzer hat geschrieben:
Mohi hat geschrieben: Was nur noch nicht so ganz klar ist, warum werden die einzelnen Segmente nacheinander mit hohem Tempo kurz eingeschaltet?
Man kann doch die einzelnen Segmente ganz normal an und wieder ausschlaten wie bei LEDs auch...
Beatbuzzer hat geschrieben: Wie denkst du dir das? Du hast nur einmal alle 7 Anschlüsse deiner drei Anzeigen zur Verfügung. Du kannst also nur eine Zahl gleichzeitig anzeigen.
Du bist also schon dazu gezwungen, die inzelnen Segmente nacheinander einzuschalten, und das muss dann entsprechend schnell passieren, sonst flackert ja alles.
Wie? Verstehe ich nicht ganz..
Ich kann doch wenn ich die Zahl 5,62 haben will alle drei Anoden auf High schalten und die jeweiligen Segmente....hmmm....
OK, ok, ich habs doch verstanden :-)

Ok, wenn ich ne "3" erscheinen lassen will, dann schalte ich doch die entsprechenden Pins nacheinander kurz ein, die die Segmente a, b, c, d und g leuchten lassen.
So wie du das dann erklärt hast, müsste dann ganz schnell immer wieder nacheinander a, b, c, d und g aufleuchten, dann würde ich als Mensch die Zahl 3 wahrnehmen. Je schnller es nacheinander kurz aufleuchtet umso flimmerfreier nehme ich die Zahl war
Beatbuzzer hat geschrieben:
Mohi hat geschrieben:Hab ich das bis hier hin so einigermaßen richtig verstanden?
Wenn ja, wie bekomme ich dann den "Vergleichswert" auf die Segmentanzeige?
Beatbuzzer hat geschrieben: Ja stimmt ungefähr. Zuerst wird der Wert mit der Referenz verglichen und digitalisiert. Mit GETADC liest du den Messwert in eine Variable.
Um Zahlen schnell und einfach anzeigen zu können, würde ich eine Tabelle erstellen, wo ich die einzelnen Bits des Ausgangsbytes für jede Ziffer von 0 bis 9 einmal entsprechend setze. Dann muss man aus dem Code heraus nur noch auf den entsprechenden Platz in der Tabelle verweisen.
Wie meinst du das mit der Tabelle? Hast du zufälligerweise so eine Beispieltabelle?

Meinst du vom Prinzip her in etwa so:
0 = a, b, c, d, e, f
1 = b, c
2 = a, b, g, e, d
etc.pp.
Benutzeravatar
Beatbuzzer
Auserwählter
Auserwählter
Beiträge: 3177
Registriert: Fr, 17.08.07, 11:02
Wohnort: Alfeld / Niedersachsen
Kontaktdaten:

Sa, 05.11.11, 14:35

Mohi hat geschrieben: Wie meinst du das mit der Tabelle? Hast du zufälligerweise so eine Beispieltabelle?

Meinst du vom Prinzip her in etwa so:
0 = a, b, c, d, e, f
1 = b, c
2 = a, b, g, e, d
etc.pp.
Wenn du deine Segmente z.B. an Portb angeschlossen hast hieße der Befehl in Bascom:

Portb = lookup (position,daten)
[...]
daten:
data &b00000000
data &b00000000
...

"position" ist dabei ein willkürlicher Name für eine Variable. byte-Variablen reichen hier vollkommen aus. "position" beschreibt dabei die Position in der Tabelle. Könnte auch "Stelle" oder "Ziffer" oder wie du willst heißen. Also das erste "data" wäre 1, das zweite wäre 2...
"daten" beschreibt den Namen der Tabelle. Die kann man auch "X" oder "zahlen" oder wie auch immer nennen.

Die 8 Nullen dahinter sind die Ausgangsbits. 0 bedeutet low und 1 bedeutet high. Also überall, wo ein Segment leuchten soll, kommt ne 1 rein.
Mohi
Mega-User
Mega-User
Beiträge: 104
Registriert: Di, 11.10.11, 08:13

Sa, 05.11.11, 17:25

Oh manoman... gar nicht soo easy das Ganze... :-(

Hab erstmal an der Tabelle rumprobiert und folgendes ist dabei raus gekommen:

Code: Alles auswählen

Data = &B11111001                                          '1
Data = &B10100100                                          '2
Data = &B10110000                                          '3
Data = &B10011001                                          '4
Data = &B10010010                                          '5
Data = &B10000010                                          '6
Data = &B11111000                                          '7
Data = &B10000000                                          '8
Data = &B10010000                                          '9
Data = &B11000000                                          '0
Data = &B00001110                                          'F.
Das folgende verstehe ich noch nicht so: Portb = lookup (position,daten)

"Portb" ja zwischen "Do" und "Loop" und "Data = &B...., etc" über Do, oder?

Wenn ich Portb = lookup einsetze, dann müsste ja jedes Data (also die Darstellung von 0-9 und F.) eine Art identifizierung haben...

Ich hab irgendwie kein Plan, muss nochmal im Net nachgucken...
Aber eines kann ich schonmal sagen, einfach ist es nicht, trotz Recherche!
Benutzeravatar
Beatbuzzer
Auserwählter
Auserwählter
Beiträge: 3177
Registriert: Fr, 17.08.07, 11:02
Wohnort: Alfeld / Niedersachsen
Kontaktdaten:

Sa, 05.11.11, 17:47

Einfach wird es, wenn du im Programmieren fitter bist.

Bau mal das hier in dein Programm ein:

Code: Alles auswählen

Dim Ziffer As Byte

Set Portd.2
Set Portd.3
Reset Portd.4

Do
For Ziffer = 1 To 10
Portb = Lookup(ziffer , Daten)
wait 1
Next Ziffer
Loop

Daten:
Data &B11111001                                             '1
Data &B10100100                                             '2
Data &B10110000                                             '3
Data &B10011001                                             '4
Data &B10010010                                             '5
Data &B10000010                                             '6
Data &B11111000                                             '7
Data &B10000000                                             '8
Data &B10010000                                             '9
Data &B11000000                                             '0
Data &B00001110                                             'F
Hatte ganz vergessen, dass bei dir ja eine Null ein leuchtendes Segment darstellt. Aber du hast ja dran gedacht, wie man sieht.
Das Segment an Portd.4 sollte jetzt im Sekundentakt alle Zeichen von 0 bis F zeigen.

Allerdings ohne Multiplex. Es geht erstmal nur um das Tabellenverständnis.
Mohi
Mega-User
Mega-User
Beiträge: 104
Registriert: Di, 11.10.11, 08:13

Sa, 05.11.11, 18:57

Beatbuzzer hat geschrieben:Einfach wird es, wenn du im Programmieren fitter bist.
Hatte ganz vergessen, dass bei dir ja eine Null ein leuchtendes Segment darstellt. Aber du hast ja dran gedacht, wie man sieht.
Also ich hab einfach zwischen Do und Loop die einzelnen Segmente als LEDs angesehen und diese an und aus gemacht, also so:
PortB = &B11111111
Und bei der Segmentanzeige ist dann die Reihenfolge so:
PortB =&B'Pgfedcba'

OK, bei "Portb = Lookup(ziffer , Daten)" bedeutet "Daten" alles das was hier nach "Daten:" steht:

Code: Alles auswählen

Daten:
Data &B11111001                                             '1
Data &B10100100                                             '2
Data &B10110000                                             '3
Data &B10011001                                             '4
Data &B10010010                                             '5
Data &B10000010                                             '6
Data &B11111000                                             '7
Data &B10000000                                             '8
Data &B10010000                                             '9
Data &B11000000                                             '0
Data &B00001110                                             'F 
Und wenn nach "Daten:" 100 Zeilen stehen würde, dann würden die 100 Zeilen nacheinander ablaufen, gell?

Natürlich müsste ich noch "For Ziffer = 1 To 10" anpassen...
Übrigens zeigt mir bei "1 To 10" in deinem Code nicht die 1 an, aber wenn man es ändert auf "0 To 10" ändert, dann schon ;-)

Nochwas, warum kann man den Buchstaben Z von Ziffern nicht groß schreiben?
Bascom macht es immer wieder klein...

Ich meine, die Dim Variable im Code ist ja auch das Z groß geschrieben...

Übrigens, diese Animation sieht total süß aus :-)
Zum ersten mal zeigt meine Segmentanzeige was anständiges an :-)
Danke...
Benutzeravatar
Beatbuzzer
Auserwählter
Auserwählter
Beiträge: 3177
Registriert: Fr, 17.08.07, 11:02
Wohnort: Alfeld / Niedersachsen
Kontaktdaten:

Sa, 05.11.11, 19:17

Mohi hat geschrieben:
OK, bei "Portb = Lookup(ziffer , Daten)" bedeutet "Daten" alles das was hier nach "Daten:" steht:
Und wenn nach "Daten:" 100 Zeilen stehen würde, dann würden die 100 Zeilen nacheinander ablaufen, gell?

Natürlich müsste ich noch "For Ziffer = 1 To 10" anpassen...
Übrigens zeigt mir bei "1 To 10" in deinem Code nicht die 1 an, aber wenn man es ändert auf "0 To 10" ändert, dann schon ;-)

Nochwas, warum kann man den Buchstaben Z von Ziffern nicht groß schreiben?
Bascom macht es immer wieder klein...
Du kannst zu jeder zeit jede beliebige Position der Tabelle abfragen. Nur hier im Code hab ich es jetzt so gemacht, dass die Variable für die For-Next Schleife (Anzahl der Wiederholungen) gleichzeitig auch die Variable für die Posiition in der Tabelle ist.

Da hab ich auf die Eile mal wieder nicht bis zu Ende gedacht. Die Tabelle fängt natürlich bei der ersten Position mit Null an, was aber bei dir die Ziffer 1 ist. Aber du hast es ja schon richtig geändert.

Groß/Kleinschreibung ist bei den Variablen nicht von Bedeutung, die werden im Code trotzdem richtig erkannt. Von daher kannst du das einfach ignorieren.
Mohi
Mega-User
Mega-User
Beiträge: 104
Registriert: Di, 11.10.11, 08:13

Sa, 05.11.11, 20:06

Code: Alles auswählen

Set Portd.2
Set Portd.3
Reset Portd.4
Warum hast du einmal Set und einmal Reset geschrieben?

Das sind ja die Port für die Anoden der Segmentanzeigen, also müssten alle drei die selbe Grundlage haben, denke ich zumindest :-)

Hab mal Reset durch Set ersetzt... Die Helligkeit hat sich verändert... Bei Set leuchten die Segmente schwächer, bei Reset heller...

Im moment sieht mein Code so aus:

Code: Alles auswählen

$regfile = "m8def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 1000000

Config Portb = &B11111111                                   'Die 8 Kathoden der Segmentanzeigen
Portb = &B11111111

Config Portc.0 = Input  'ADC - Messpunkt

Config Portd.2 = Output 'Anode der 1. Stelle vor dem Komma
Config Portd.3 = Output 'Anode der 2. Stelle nach dem Komma
Config Portd.4 = Output 'Anode der 3. Stelle nach dem Komma


Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Dim Ziffer As Byte

Set Portd.2
Set Portd.3
Set Portd.4

Do
Ziffer = 0
Portb = Lookup(ziffer , Daten)
Waitms 300
Ziffer = 8
Portb = Lookup(ziffer , Daten)
Waitms 300
Loop


Daten:
Data &B11000000                                             '0
Data &B11111001                                             '1
Data &B10100100                                             '2
Data &B10110000                                             '3
Data &B10011001                                             '4
Data &B10010010                                             '5
Data &B10000010                                             '6
Data &B11111000                                             '7
Data &B10000000                                             '8
Data &B10010000                                             '9
Data &B00001110                                             'F
Rein theoretisch könnte ich mit dem Code jetzt an ADC0 eine Spannung messen, diese könnte der ATmega auch verwerten...

Da ich als Referenzspannung AVcc gewählt habe, beträgt diese genau das was aus meinem 7805er rauskommt (der den ATmega8 meiner Schaltung), nämlich genau 5.03Volt, gehen wir mal davon aus, das mein Multimeter genaue Werte anzeigt.

Da der ADC ein 10Bit-Wandler ist, habe ich 1024 Abstufungen, also von "0" bis "1023", wobei die "0" 0,00 Volt und "1023" 5,03 Volt bedutet.
Teile ich die 1024 Abstufungen durch die 5,03 Volt, ergibt eine "Stufe" genau 0,004912109375 Volt.
Also kann theoretisch mein DVM-Projekt auf 0,004912109375 Volt genau messen...

Bist du der selben Meinung?



Ach warte, die Segmentanzeigen leuchten ja nicht via Multiplex, also muss ich mich wohl als allerersten mit der Multiplexsteuerung beschäftigen :-)
Benutzeravatar
Beatbuzzer
Auserwählter
Auserwählter
Beiträge: 3177
Registriert: Fr, 17.08.07, 11:02
Wohnort: Alfeld / Niedersachsen
Kontaktdaten:

Sa, 05.11.11, 21:53

Mohi hat geschrieben: Warum hast du einmal Set und einmal Reset geschrieben?

Das sind ja die Port für die Anoden der Segmentanzeigen, also müssten alle drei die selbe Grundlage haben, denke ich zumindest :-)
Ich hab nur einen Port auf Masse geschaltet, damit auch nur eine Anzeige leuchtet. Wir Multiplexen in diesem Code ja noch nicht.
Dieselbe Grundlage haben sie im Betrieb nie. Außer alle Anzeigen sind dauerhaft aus. Zum Multiplexen werden sie der Reihenfolge nacheinander einzeln eingeschaltet.
Mohi hat geschrieben: Da ich als Referenzspannung AVcc gewählt habe, beträgt diese genau das was aus meinem 7805er rauskommt (der den ATmega8 meiner Schaltung), nämlich genau 5.03Volt, gehen wir mal davon aus, das mein Multimeter genaue Werte anzeigt.

Da der ADC ein 10Bit-Wandler ist, habe ich 1024 Abstufungen, also von "0" bis "1023", wobei die "0" 0,00 Volt und "1023" 5,03 Volt bedutet.
Teile ich die 1024 Abstufungen durch die 5,03 Volt, ergibt eine "Stufe" genau 0,004912109375 Volt.
Also kann theoretisch mein DVM-Projekt auf 0,004912109375 Volt genau messen...
Das hast du alles schon ganz gut verstanden.

Ich würde auch sagen, mach erstmal nur eins nach dem anderen. Messen und gleichzeitig Multiplexen und dazu dann noch die ADC-Werte auf die Anzeigen umsetzen ist durchaus schon als anspruchsvoll anzusehen. Da gibt es jede Menge Fehlerquellen, die einen schnell zur Verzweiflung bringen können wenn man noch nicht so viel Erfahrung hat.

Einen groben Überblick, wie eine Tabelle funktioniert, hast du ja jetzt schonmal. Wie der ADC für deine Anwendung funktioniert, weißt du auch schon.
Dann sieh jetzt mal, dass du mit dem Prinzip des Multiplexens sicherer wirst. Auch wegen der Frage oben glaube ich, dass du da noch nicht durchblickst.
Aber das wird schon :wink:
Mohi
Mega-User
Mega-User
Beiträge: 104
Registriert: Di, 11.10.11, 08:13

So, 06.11.11, 08:12

Ja, ich hab echt noch nicht so den Durchblick, das ist nervig.
Hast du's gut. Du kannst einfach drauf los basteln, ich muss mir erst noch viel know how aneignen, das ist natürlich hinderlich...

Gott sei Dank gibt es Internet, aber merkwürdig finde ich, das es kaum Anleitungen/Beschreibungen zu Bascom Multiplex Steuerung gibt...

Falls du eine nette Site kennst, wo das Thema Multiplex in Bascom durch genommen wird, sag bescheid :-)
Mohi
Mega-User
Mega-User
Beiträge: 104
Registriert: Di, 11.10.11, 08:13

So, 06.11.11, 09:38

Jetzt sieht der Code so aus:

Code: Alles auswählen

$regfile = "m8def.dat"
$framesize = 100
$swstack = 100
$hwstack = 100
$crystal = 1000000

Config Portb = &B11111111                                   'Die 8 Kathoden der Segmentanzeigen (a,b,c,d,e,f,g,P.)
Portb = &B11111111                                          'Pull-up aktiviert

Config Portc.0 = Input                                      'ADC - Messpunkt

Config Portd.2 = Output                                     'Anode der 1. Stelle vor dem Komma
Config Portd.3 = Output                                     'Anode der 2. Stelle nach dem Komma
Config Portd.4 = Output                                     'Anode der 3. Stelle nach dem Komma

Config Adc = Single , Prescaler = Auto , Reference = Avcc   'Konfiguration des AD Wandlers
Start Adc                                                   'AD Wandler starten

Config Timer0 = Timer , Prescale = 8                        'Timersteuerung für Multiplexansteuerung konfigurieren
Enable Timer0                                               'Aktiviert Timer0 ein

On Timer0 Segment_multiplex                                 'Springe bei Timer0 zu Segment_multiplex
Enable Interrupts                                           'Aktiviere Interrupts

Dim Ziffer As Byte                                          'Variable

Set Portd.2                                                 '...
Set Portd.3                                                 '...
Set Portd.4                                                 '...

Do
Ziffer = 0                                                  'Hat nix zu sagen, ist nur so zum probieren
Portb = Lookup(ziffer , Daten)                              'Hat nix zu sagen, ist nur so zum probieren
Waitms 300                                                  'Hat nix zu sagen, ist nur so zum probieren
Ziffer = 8                                                  'Hat nix zu sagen, ist nur so zum probieren
Portb = Lookup(ziffer , Daten)                              'Hat nix zu sagen, ist nur so zum probieren
Waitms 300                                                  'Hat nix zu sagen, ist nur so zum probieren
Loop

End

Segment_multiplex:                                          'Die Aktion um die Werte auf die Segmentanzeigen zu bringen
Return

Daten:
Data &B11000000                                             'Stellt die Zahl 0 dar.
Data &B11111001                                             'Stellt die Zahl 1 dar.
Data &B10100100                                             'Stellt die Zahl 2 dar.
Data &B10110000                                             'Stellt die Zahl 3 dar.
Data &B10011001                                             'Stellt die Zahl 4 dar.
Data &B10010010                                             'Stellt die Zahl 5 dar.
Data &B10000010                                             'Stellt die Zahl 6 dar.
Data &B11111000                                             'Stellt die Zahl 7 dar.
Data &B10000000                                             'Stellt die Zahl 8 dar.
Data &B10010000                                             'Stellt die Zahl 9 dar.
Data &B00001110                                             'Stellt die Buchstabe F dar.
Zwischen "Do" und "Loop" findet die Abfrage des ADC0 statt.
Ist der Wert ermittelt, springt es dann zu "Segment_multiplex:", um von dort die entsprechenden Zeilen von "Data:" auf die Segmentanzeigen zu bringen.
Fertig :-)

Nee, stimmt so nicht ganz, oder?
Irgendwie fehlt das nachainander leuchten der einzelnen Segmente, damit alle drei Segmentanzeigen gleichzeitig genutzt werden kann...

Hmmm.. Da muss ich noch mal gucken... Bin ich wenigstens auf dem richtigen Weg?
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

So, 06.11.11, 12:18

1. Du bist auf dem richtigen Weg. :D
2.
Warum hast du einmal Set und einmal Reset geschrieben?
Set setzt ein Bit auf 1 und Reset auf 0. Wenn man das mit Port-Bits macht, dann bedeutet Set PortX.Y: Schalte am PortX das Bit (den Pin) Y auf logisch High also auf AVCC (hier 5V). Reset PortX.Y entsprechend: Schalte am PortX das Bit (den Pin) Y auf logisch Low also auf 0V. Die PNP Transistoren schalten 'ein', wenn man die Basis auf eine Spannung von etwa 0.7V weniger als am Emitter setzt. Wenn also der Pin Portd.2 auf 0V gesetzt wird, dann wird über den Vorwiderstand eben die Basis des Transistors auf ein solches Potential gesetzt und die Anzeige kann leuchten (kann deswegen, weil natürlich auch die entsprechenden Bits an PortB gesetzt sein müssen). Und bei Reset ist die Basis auf 5V und der Transistor leitet nicht. Dann sollte die Anzeige aus sein, egal was an PortB-Bits gesetzt ist oder nicht.
Hab mal Reset durch Set ersetzt... Die Helligkeit hat sich verändert... Bei Set leuchten die Segmente schwächer, bei Reset heller...
Eigentlich sollten sie bei Set Portd.2/3/4 aus sein. Wenn sie das nicht sind, dann stimmt was nicht.

Probier mal dieses 'Animationsprogramm':

Code: Alles auswählen

    Dim Stelle As Byte
    Dim Ziffer As Byte

    Do
    For Stelle = 1 to 3
    Set Portd.2
    Set Portd.3
    Set Portd.4
    if Stelle = 1 then Reset Portd.2
    if Stelle = 2 then Reset Portd.3
    if Stelle = 3 then Reset Portd.4
       For Ziffer = 1 To 10
          Portb = Lookup(ziffer , Daten)
          wait 1
       Next Ziffer
    Next Stelle
    Loop

    Daten:
    Data &B11111001                                             '1
    Data &B10100100                                             '2
    Data &B10110000                                             '3
    Data &B10011001                                             '4
    Data &B10010010                                             '5
    Data &B10000010                                             '6
    Data &B11111000                                             '7
    Data &B10000000                                             '8
    Data &B10010000                                             '9
    Data &B11000000                                             '0
    Data &B00001110                                             'F
Zwischen "Do" und "Loop" findet die Abfrage des ADC0 statt.
Darum kümmern wir uns als nächstes. Erst muss die Anzeige als solche klar von Dir verstanden sein und auch korrekt funktionieren...
Also wenn das oben klappt, dann kommt als nächstes ein 'Animationsprogram', welches mal von 001 bis 999 'durch zählt' :D
Mohi
Mega-User
Mega-User
Beiträge: 104
Registriert: Di, 11.10.11, 08:13

So, 06.11.11, 13:17

Also, dein Animationsprogram zeigt bei mir im Sekundentakt die Zeichen 0,1,2,3,4,5,6,7,8,9 und F. an, was immer wieder wiederholt wird...
Nur musste ich auch hier die Schleife auf "Ziffer = 0 To 10" ändern, sonst zeigt mir das Programm die 1 nicht an. Aber das ist kein Problem für mich ;-)

Ok, "Reset" setzt ein Bit auf "0" und "Set" auf "1", demnach müssten also die Transistoren je nach dem durchschalten oder ausschalten.
In meiner Schaltung verändert das nur die Leuchtstärke!
Wenn ich den Code wie folgt andere:

Code: Alles auswählen

Reset Portd.2                                               '...
Set Portd.3                                                 '...
Reset Portd.4                                               '...
, dann leuchtet die mittlere Segmentanzeige schwächer, wie auf dem angehängten Bild gut zu sehen ist...

Du sagst ja, dass normalerweise je nach Set oder Reset die Anzeigen an oder aus sein müssten...
An der Basis vom Transisstor, hängt ein 1K Widerstand dran, daran dürfte es nicht liegen, oder?
Deine Code funktioniert auf meiner Schaltung einwandfrei, meinst du, das es an der Hardware liegt, oder eher an der Software?

Noch ne doofe Frage, ein Bit ist doch sozusagen die Tür an einem Pin/Port, entweder ist die auf (5V) oder zu (0V). Eigentlich genau dasselbe was auch Config PortX.Y macht, oder?


Ok, das ist ne Herausforderung, meinen Code so zu verändern, das er von Null bis 999 durchzählt :-)
Mal schauen, wie weit ich komme :-)
Dateianhänge
CIMG4867a.JPG
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

So, 06.11.11, 14:12

Eigentlich genau dasselbe was auch Config PortX.Y macht, oder?
Nein, eigentlich nicht ;)
Config PortX.Y sagt zunächst mal dem Chip, ob der entsprechende Pin des Ports als ein Eingang oder ein Ausgang verwendet werden soll. Zusätzlich kann man bei einem Eingang(!) auch noch PullUp Widerstände im Inneren des AVRs aktivieren, so dass ein solcher Pin (wenn er z.B. mit einem Taster verbunden) wird, nicht 'in der Luft' hängt, sondern über etwa 30kOhm mit AVCC verbunden ist. Der Taster wird dann üblicherweise mit Masse verbunden und wenn man 'lesen' will, ob der Taster gedrückt ist, dann muss man quasi 'umdenken': Wenn Taster gedrückt (mit Masse verbunden) dann liefert PINX.Y eine '0' und wenn der Taster nicht gedrückt ist eine '1' (der Pin ist ja intern mit +5V verbunden).
In meiner Schaltung verändert das nur die Leuchtstärke!
Das musst Du mal näher prüfen...
Also, dein Animationsprogram zeigt bei mir im Sekundentakt die Zeichen 0,1,2,3,4,5,6,7,8,9 und F. an, was immer wieder wiederholt wird...
Auch an den einzelnen Anzeigen?
Sollte ja etwa so aussehen (X=komplett aus!):
XX0, XX1, XX2,...XXF, X0X, X1X, X2X,... XFX, 0XX, 1XX... FXX, XX0...
Wenn es wenigstens grundsätzlich so aussieht (aber die X Anzeigen schwach mit leuchten), dann mal mit einem Multimeter an einer Anzeige die gerade aus sein soll (also ggf. nur schwach leuchtet) zwischen +5V und Basis des entsprechenden Transistors die Spannung messen. Wenn es hier 0.5V oder mehr sind, dann brauchst Du wohl noch zusätzliche Widerstände zwischen Basis und +5V mit etwa 10kOhm.
Mohi
Mega-User
Mega-User
Beiträge: 104
Registriert: Di, 11.10.11, 08:13

So, 06.11.11, 15:19

Also die 3 Transistor sind wie folgt angeschloßen:
Transistor 1:
PortD.2 -> 1KOhm -> Basis
Collector -> 5 Volt
Emitter -> Anode (linke Segmentanzeige)

Transistor 2:
PortD.3 -> 1KOhm -> Basis
Collector an 5 Volt
Emitter -> Anode (mittlere Segmentanzeige)

Transistor 3:
PortD.4 -> 1KOhm -> Basis
Collector -> 5 Volt
Emitter -> Anode (rechten Segmentanzeige)

Hab auch den Widerstand zwischen Transistor-Basis und PortD.3 verändert.
Ersetzt durch einen 10 KOhm, die mittlere Anzeige wurde noch schwächer, dann habe ich zwei 10KOhm zwischen Basis und PortD.3 angeschloßen, die Anzeige wurde noch schwächer und bei drei 10KOhm Widerstände halt noch schwächer, aber trotz der 30K immer noch recht gut sichtbar.



Und deine Code-Animation zeigt folgendes an:
111
222
333
444
555
666
777
888
999
000
F.F.F.
111
222
333
444
und so weiter...

Und hier nochmal ein Bild, damit ihr ne Vorstellung habt wie es bei mir aussicht :-)
Dateianhänge
CIMG4868a.JPG
Benutzeravatar
Beatbuzzer
Auserwählter
Auserwählter
Beiträge: 3177
Registriert: Fr, 17.08.07, 11:02
Wohnort: Alfeld / Niedersachsen
Kontaktdaten:

So, 06.11.11, 15:41

Mohi hat geschrieben:Also die 3 Transistor sind wie folgt angeschloßen:
Transistor 1:
PortD.2 -> 1KOhm -> Basis
Collector -> 5 Volt
Emitter -> Anode (linke Segmentanzeige)
Ahh, verpolt.
Emitter kommt an 5Volt und Collector an das Segment. So wie jetzt fließt Strom aus dem µC durch die Basis und den Emitter in das Segment wenn der Port auf High also 5V liegt. Es leuchten also alle immer etwas.
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

So, 06.11.11, 16:06

Ahh, verpolt.
Auf die Idee bin ich mal wieder nicht gekommen :oops: Der Schaltplan war ja richtig...
Mohi
Mega-User
Mega-User
Beiträge: 104
Registriert: Di, 11.10.11, 08:13

So, 06.11.11, 16:29

Also wenn links Collector ist, Mitte die Basis und rechts der Emitter, dann stimmt der Anschluß.
Abgesehen davon hab ich auch mal so aus Spaß mal umgepolt, aber da hat sich nur was an der Leuchtstärke geändert...

Hier mal ne Nahaufnahme:
Dateianhänge
transis.jpg
Benutzeravatar
Beatbuzzer
Auserwählter
Auserwählter
Beiträge: 3177
Registriert: Fr, 17.08.07, 11:02
Wohnort: Alfeld / Niedersachsen
Kontaktdaten:

So, 06.11.11, 17:18

Mohi hat geschrieben:Also wenn links Collector ist, Mitte die Basis und rechts der Emitter, dann stimmt der Anschluß.
Also links ist der Collector, Mitte Basis und rechts Emitter, soweit sind wir uns einig. Aber auf dem Bild hast du genau anders herum angeklemmt. Da ist ja dann der Collector an 5V...
Mohi
Mega-User
Mega-User
Beiträge: 104
Registriert: Di, 11.10.11, 08:13

So, 06.11.11, 18:00

Wie gesagt, ich habs auch schon andersrum versucht, aber ohne Erfolg...
Das Einzige was sich ändert, ist nur die HElligkeit.

Hab eben aus Spaß an der Freude den folgenden Codeteil geändert:

Code: Alles auswählen

Config Portd.2 = Output                                     'Anode der 1. Stelle vor dem Komma
Config Portd.3 = Input                                     'Anode der 2. Stelle nach dem Komma
Config Portd.4 = Output                                     'Anode der 3. Stelle nach dem Komma
Ich hätte eigentlich erwartet, das spätestens jetzt die mittlere Segmentanzeige aus ist...
Ists aber nicht... hmmm echt ärgerlich :?

An dem Transisitor an sich kanns nicht liegen, oder?
Also ich meine, das der Typ BC557 nicht so geeignet ist.
Immerhin sind diese Transistoren die C-Variante, also recht große Verstärkung...

Käme der BC556 auch in Frage? Wenn ja, würd ich mir mal morgen welche holen gehen...



So ists nach dem Schlatplan richtig, seht ihr doch auch so, oder?
Dateianhänge
transis2.jpg
transis2.jpg (123.21 KiB) 4863 mal betrachtet
Benutzeravatar
Beatbuzzer
Auserwählter
Auserwählter
Beiträge: 3177
Registriert: Fr, 17.08.07, 11:02
Wohnort: Alfeld / Niedersachsen
Kontaktdaten:

So, 06.11.11, 18:21

Mohi hat geschrieben: An dem Transisitor an sich kanns nicht liegen, oder?
Also ich meine, das der Typ BC557 nicht so geeignet ist.
Immerhin sind diese Transistoren die C-Variante, also recht große Verstärkung...
Das muss auf jeden Fall damit gehen. Erinnere dich an meinen Aufbau. Da ist auch der 557er drin. Und "große Verstärkung" steht hier noch in Anführungsstrichen. Die 420-800 sind zwar für so einen Transistor schon ganz gut, aber das ist noch nichts, was Probleme machen könnte.

Also so wie es jetzt auf dem Bild ist, ists richtig. Zieh doch einfach mal die Basis-Anschlüsse zum µC raus, dann müssen die Anzeigen auf jeden Fall aus sein. Wenn sie das nicht sind, liegt noch irgendwo ein Fehler in der Verdrahtung.
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

So, 06.11.11, 22:57

Zieh doch einfach mal die Basis-Anschlüsse zum µC raus, dann müssen die Anzeigen auf jeden Fall aus sein. Wenn sie das nicht sind, liegt noch irgendwo ein Fehler in der Verdrahtung.
Oder noch besser: Verbinde die Basis über den 1KOhm Widerstand direkt mit +5V (aber ohne Verbindung zum µC!). Wenn dann immer noch was leuchtet, dann ist da was faul...
Mohi
Mega-User
Mega-User
Beiträge: 104
Registriert: Di, 11.10.11, 08:13

So, 06.11.11, 23:28

Borax hat geschrieben:
Zieh doch einfach mal die Basis-Anschlüsse zum µC raus, dann müssen die Anzeigen auf jeden Fall aus sein. Wenn sie das nicht sind, liegt noch irgendwo ein Fehler in der Verdrahtung.
Oder noch besser: Verbinde die Basis über den 1KOhm Widerstand direkt mit +5V (aber ohne Verbindung zum µC!). Wenn dann immer noch was leuchtet, dann ist da was faul...
Trenne ich die Basis vom µc, dann ists aus.
Verbinde ich dann die Basis über einen 1K Widerstand direkt an 5 Volt ist die eine Segmentanzeige ebenfalls aus.
Verbinde ich aber die Basis über einen 1k Widerstand direkt an Minus (GND), dann leuchtet die Segmentanzeige...

Ich hab eben alle drei Basise (ich weiß, es heißt Basen :-)) derTransistoren direkt an Minus angeschloßen, alle drei Segmentanzeigen leuchten und die Animation geht weiter...

Hab mir die Schaltung schon mit dem Schaltplan verglichen, konnte so keinen Fehler finden.
Morgen mach ich nochmal einen Intensivcheck, mal gucken was dabei raus kommt.

Eins steht fest, wenn meine Schaltung einen Fehler hat, dann nur einen kleinen, weil ja so eigentlich alles funktioniert, bis auf ein und ausschalten via "Set" bzw. "Reset"...
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

So, 06.11.11, 23:40

Hast Du noch ein paar 10K Widerstände? Weil dann bau die mal zusätzlich mit ein (wie ich das weiter oben schon Mal angemerkt hatte):
7-Segment_BC557_1.png
7-Segment_BC557_1.png (65.96 KiB) 4842 mal betrachtet
(hier ist nur einer eingezeichnet)
Also von der Basis über die 10k direkt an 5V, und über 1K an den AVR Pin. Natürlich bei allen 3 Transistoren.
Es müssen auch nicht unbedingt 10K sein. Alles zwischen 1K und 33K geht genauso :) Damit sollte dieses Problem gelöst sein.
Ein Blick ins Datenblatt hilft manchmal auch... Man ist es halt schon so gewohnt, dass die Ausgänge nahe 0 bzw. VCC liegen, dass man es nicht mehr überprüft :oops:
Output High Voltage (Ports B,C,D) IOH = -20 mA, VCC = 5V: 4.2V.
Da sperrt ein BC557 nicht mehr richtig.
Mohi
Mega-User
Mega-User
Beiträge: 104
Registriert: Di, 11.10.11, 08:13

Mo, 07.11.11, 00:50

Borax hat geschrieben:Hast Du noch ein paar 10K Widerstände? Weil dann bau die mal zusätzlich mit ein (wie ich das weiter oben schon Mal angemerkt hatte):
Der Dateianhang 7-Segment_BC557_1.png existiert nicht mehr.
(hier ist nur einer eingezeichnet)
Also von der Basis über die 10k direkt an 5V, und über 1K an den AVR Pin. Natürlich bei allen 3 Transistoren.
Es müssen auch nicht unbedingt 10K sein. Alles zwischen 1K und 33K geht genauso :) Damit sollte dieses Problem gelöst sein.
Ein Blick ins Datenblatt hilft manchmal auch... Man ist es halt schon so gewohnt, dass die Ausgänge nahe 0 bzw. VCC liegen, dass man es nicht mehr überprüft :oops:
Output High Voltage (Ports B,C,D) IOH = -20 mA, VCC = 5V: 4.2V.
Da sperrt ein BC557 nicht mehr richtig.
Das war einer der ersten Entwürfe des Schaltplanes...
Dieser Widerstand hatte ne andere Aufgabe... Da ist ist auch kein "Lötpunkt" (schwarzer Punkt)...

OK, meinst du das so wie hier dem folgenden MIni-Schaltplan? Wenn ja, dann müssen die drei Transistoren im Eimer sein, habs so probiert aber ohne Erfolg :-(
Morgen muss ich mir meine Schaltung nochmal ganz genau anschauen....

Aber jetzt muss ich ins Bett, weiß gar nicht wie ich morgen aufstehen soll :-( Gott Sei Dank ist in fünf Tagen wieder Freitag ;-)

Schlaf gut
Dateianhänge
BC557-10k-1k.jpg
BC557-10k-1k.jpg (35.52 KiB) 4834 mal betrachtet
Antworten