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:

Mo, 07.11.11, 08:57

Mohi hat geschrieben: 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...
h
Also diesem Test nach müssen die Transistoren in Ordnung sein.
Meiner Erfahrung nach kommen die Portpins schon auf 0,2V unter Vcc, besonders wenn sie unbelastet sind. Und das ist bei dir ja der Fall.
Ich hab das Gefühl, das Problem kommt vom µC...

PS: Ich bin auch nicht so der Fan von diesen Breadbords. Da hab ich schon einige mysteriöse Sachen mit erlebt und Fehler gesucht, die es nicht gab. Seitdem löte ich immer gleich alles, manchmal auch nur schnell als Drahtknäuel :wink:
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Mo, 07.11.11, 09:08

Meiner Erfahrung nach kommen die Portpins schon auf 0,2V unter Vcc, besonders wenn sie unbelastet sind.
Meiner Erfahrung nach auch. Aber vielleicht gibt es halt bei den AVRs auch manchmal 'schwarze Schafe'. Also Mohi:
Multimeter auspacken und messen.
OK, meinst du das so wie hier dem folgenden MIni-Schaltplan?
Ja, genau.
Wenn ja, dann müssen die drei Transistoren im Eimer sein, habs so probiert aber ohne Erfolg
Was genau heißt hier 'ohne Erfolg'? Leuchtet gar nicht, leuchtet immer...?
Mohi
Mega-User
Mega-User
Beiträge: 104
Registriert: Di, 11.10.11, 08:13

Mo, 07.11.11, 12:53

Beatbuzzer hat geschrieben:
Mohi hat geschrieben: 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...
h
Also diesem Test nach müssen die Transistoren in Ordnung sein.
Meiner Erfahrung nach kommen die Portpins schon auf 0,2V unter Vcc, besonders wenn sie unbelastet sind. Und das ist bei dir ja der Fall.
Ich hab das Gefühl, das Problem kommt vom µC...

PS: Ich bin auch nicht so der Fan von diesen Breadbords. Da hab ich schon einige mysteriöse Sachen mit erlebt und Fehler gesucht, die es nicht gab. Seitdem löte ich immer gleich alles, manchmal auch nur schnell als Drahtknäuel :wink:
Ja da gebe ich dir hundert Prozent recht, diese Breadboards sind eigentlich total für'n A...h! Hab 3 Segmentanzeigen mit Steckbrücken verbunden, ich sag dir ein geflimerere undd geflackere, war ja net mehr feierlich...
Deswegen hab ich eins zwei Abende damit verbracht die Segmentanzeigen auf ne Miniplatine zu löten, sieht man glaube ich auf der vorherigen Seite.. Wurd Gott sei dank besser...

Was mich am meisten an der Sache stört, das die Breadboards richtig teuer sind!
Bei Conrad kostet das große BBoard weit über 50 EUro...

10 solcher Drahtsteckbrücken kosten ab 5,50 aufwährts... Also richtig teuer aber kein verlass auf den Konatktstellen...

Wie gesagt heute Abend teste ich das nochmal richtig durch, mal gucken zu was ich für ein Ergebnis komme :-)
Mohi
Mega-User
Mega-User
Beiträge: 104
Registriert: Di, 11.10.11, 08:13

Mo, 07.11.11, 13:01

Borax hat geschrieben:
Meiner Erfahrung nach kommen die Portpins schon auf 0,2V unter Vcc, besonders wenn sie unbelastet sind.
Meiner Erfahrung nach auch. Aber vielleicht gibt es halt bei den AVRs auch manchmal 'schwarze Schafe'. Also Mohi:
Multimeter auspacken und messen.
OK, meinst du das so wie hier dem folgenden MIni-Schaltplan?
Ja, genau.
Wenn ja, dann müssen die drei Transistoren im Eimer sein, habs so probiert aber ohne Erfolg
Was genau heißt hier 'ohne Erfolg'? Leuchtet gar nicht, leuchtet immer...?
Hab ja noch ein paar ATMega8 werde mal verschiedene ausprobieren!
Hab auch noch drei nagelneue BC557er, da werd ich auch mal herumtesten...

Also ich hab die drei Transistoren wie auf dem Minischaltplan angeschloßen, aber ich konnte keinen Unterschied feststellen...
Ob ich die Widerstände (10 und 1K) nutze oder nicht, macht keinen Unterschied!

Bei Befehl "Reset" leuchten die Segmente normal, mit Befehl "Set" leuchten die Segmente etwas heller...
Wie man auf eines der Bilder hier in diesem thread sehen kann...

Aber ich hab schon einen Verdacht woran das liegen könnte, ich tippe auf Konatkte des Breedboards (ist übrigens nagelneu!)...

Heute Abend kann ich mehr sagen!


Danke euch :-)
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Mo, 07.11.11, 17:28

Also ich hab die drei Transistoren wie auf dem Minischaltplan angeschloßen, aber ich konnte keinen Unterschied feststellen...
Ob ich die Widerstände (10 und 1K) nutze oder nicht, macht keinen Unterschied!
Das ist aber sehr seltsam... Weil das würde ja heißen, dass der AVR das Potential irgendwie undefiniert aber 'aktiv' runterzieht, auch wenn der Pin auf High geschaltet ist. Aber das glaube ich nicht. Wie gesagt, mit einem Multimeter nachmessen, was da los ist.
Ich habe mit Breedboards bisher ganz gute Erfahrungen gemacht. Allerdings nur mit recht kleinen Aufbauten und nicht mit so einem 'Wust' von Leitungen wir hier für die 7-Segment Anzeigen.
Mohi
Mega-User
Mega-User
Beiträge: 104
Registriert: Di, 11.10.11, 08:13

Mo, 07.11.11, 19:12

Manonam... Ihr werdet's mir alle nicht glauben, aber es lag tatsächlich am ATmega8. Der absolute Hammer!!!
Zum ersten mal macht ein ATmega so Faxen mit mir...

Scheint echt Defekt zu sein, aber warum? ATmegas sind doch robust ooohne Ende...

Wie dem auch sei :-) alles funktioniert und wir können weiter machen... Das heißt nicht ganz...

Also mal ganz kurz, wenn ich folgendes im Code schreibe:

Code: Alles auswählen

Reset Portd.2
Reset Portd.3
Reset Portd.4
, dann erscheinen auf allen drei Segmente die Zahl 0 - F, also so 111, 222, 333, 444 und so weiter und das endlos...

Ändere ich den Code wie folgt:

Code: Alles auswählen

Set Portd.2
Set Portd.3
Set Portd.4
, dann zählt erst die von 0-F, dann geht die erste aus und die zweite beginnt zu zählen von 0-F, dann geht diese auch aus und die dritte Segmentanzeige zählt von 0-F und dann geht diese auch aus und beginnt wieder mit dem ersten Segment zu zählen an...

Es lechtet immer nur das eine Segment, was gerade von 0 - F durchzählt, die anderen beiden bleiben aus...

Ist dieses Symptom normal, ja, gell?
Obwohl ich bei "Set", nach eurer Aussage, ein völliges aus der Segmentanzeige erwartet hätte, also keine Zählerei, nix...
Und bei "Reset" würden alle drei Segmente simultan die Zeichen 0-F nacheinander anzeigen...

Was meint ihr, ist bei mir nun alles in Ordnung?
Benutzeravatar
Beatbuzzer
Auserwählter
Auserwählter
Beiträge: 3177
Registriert: Fr, 17.08.07, 11:02
Wohnort: Alfeld / Niedersachsen
Kontaktdaten:

Mo, 07.11.11, 20:21

Das ist durchaus als normal zu bezeichnen, weil wenn du in Borax Code nach dem "Do" alle drei Ausgänge auf reset setzt, dann sind ja alle Anzeigen permanent an, und werden nie wieder ausgeschaltet.
Wenn dort set steht, werden die Anzeigen über die If-Abfragen danach zur gegebenen Zeit eingeschaltet, und beim nächsten Durchlauf durch die Set-Befehle zuerst alle wieder ausgeschaltet.

Kurz: Du greifst damit auf eine Art und Weise in den Code ein, dass er nicht mehr korrekt funktionieren kann, also ein sozusagen "normales" Ergebnis, was du dann hast.
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Di, 08.11.11, 16:11

Hätte auch nicht geglaubt, dass der ATMega futsch ist, aber wie oben schon mal angemerkt: Warum soll es nicht auch bei den ATMegas 'schwarze Schafe' geben...
Aber gut. Jetzt können wir weiter machen.
Obwohl ich bei "Set", nach eurer Aussage, ein völliges aus der Segmentanzeige erwartet hätte, also keine Zählerei, nix...
Nach Set ist die Segmentanzeige auch aus, aber sie wird ja hier:

Code: Alles auswählen

    if Stelle = 1 then Reset Portd.2
    if Stelle = 2 then Reset Portd.3
    if Stelle = 3 then Reset Portd.4
je nach 'Stelle' wieder eingeschaltet.


Hier ein Test-Code zum 'Zählen' von 000 bis 999

Code: Alles auswählen


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

    Config Portb = Output                                   'Die 8 Kathoden der Segmentanzeigen (a,b,c,d,e,f,g,P.)

    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

    $LIB "mcsbyteint.lbx"

    Dim Ziffer As Byte                                      'Variable
    Dim Zeit As Byte                                        'Variable
    Dim Wert As Word                                        'Variable
    Dim S As String * 3                                     'Variable
    Dim Ar(4) As Byte                                       'Variable

    Set Portd.2                                             'Anzeige 1 aus
    Set Portd.3                                             'Anzeige 2 aus
    Set Portd.4                                             'Anzeige 3 aus

    Wert = 999

    Do
       Incr Wert
       If Wert = 1000 Then Wert = 0                            'Überlauf -> Bei 0 neu starten
       S = Str(wert)                                        'Wert in Zeichenkette umwandeln
       S = Format(s , "000")                                'Auf drei Stellen formatieren
       Str2digits S , Ar(1)                                 'In die drei einzelnen Stellen splitten

       For Zeit = 0 To 50                                    'Multiplexen: Anzeige mit 50 mal 6 Milisekunden, also  0.3 Sekunden pro Wert

         Portb = Lookup(ar(4) , Daten)                      ' Die erste Stelle ausgeben
         Reset Portd.2                                         ' Einschalten
         Waitms 2                                           ' Zwei Millisekunden lang...
         Set Portd.2                                           ' Und wieder aus

         Portb = Lookup(ar(3) , Daten)                      ' Die zweite Stelle ausgeben
         Reset Portd.3                                         ' Einschalten
         Waitms 2                                           ' Zwei Millisekunden lang...
         Set Portd.3                                           ' Und wieder aus

         Portb = Lookup(ar(2) , Daten)                      ' Die dritte Stelle ausgeben
         Reset Portd.4                                         ' Einschalten
         Waitms 2                                           ' Zwei Millisekunden lang...
         Set Portd.4                                           ' Und wieder aus
       Next Zeit
    Loop

    End

    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.


Wenn das auch funktioniert, dann ist es nicht mehr 'weit' bis zum Voltmeter :D
Mohi
Mega-User
Mega-User
Beiträge: 104
Registriert: Di, 11.10.11, 08:13

Di, 08.11.11, 20:56

Ey Borax, es funktioniert :-D Die Schaltung zählt sich gerade die Segmente wund :-D

Fängt bei 000 an und hört bei 999 auf und geht wieder weiter mit 000 und soweiter und so fort...
Echt cool!!! Vielen Dank!!

Ich muss aber ehrlich gestehen, wenn ich dein Code sehe wird mir etwas schwindelig :oops:
Viele Sachen die ich noch nicht so ganz verstehe und auch neu sidn wie z.B. jenes hier: "$LIB "mcsbyteint.lbx"

Aber liebsten würde ich dich jetzt mit Fragen zuschüten...
Aber das würde bedeuten, dass du dir die Finger wund schreiben musst...
Musst du aber nicht ;-)

Ich werd mal bei ner ruhigen Minute alles mal nachgoogeln und wenn ich dann Fragen habe, kann ich dich bzw. euch noch mal kurz nerven :-)

Eines ist mir aufgefallen, und zwar das die Zählfrequenz mit der Blinkfrequenz (also Multiplex bei den Segmentanzeigen) verknüpft ist. Ändert man Waitms 2 auf Waitms 200 verhält sich die Zählfunktrion anders als erwartet...
Hättest du zu mir gesagt: "Yo Mohi, versuch mal das durchzählen von 000 bis 999 mal selber zu programmieren.", dann hätte ich vom Prinzip her versucht das Zählen so countermäßig hinzu bekommen.

Hab mal Codefragmente gefunden die bei Tastendruck einfach die Anzeige um eine Zahl erhöhen, also so: klick 001, klick 002, klick 003, etc.pp.
Das "Klicken" hätte ich dann versucht durch entsprechenden Code zu ersetzen, ob das funktioniert hätte steht allerdings in den Sternen :-)

Wie dem auch sei, Voltmeter scheint wohl nicht mehr weit weg zu sein :-)
Wie würdest du jetzt weiter vorgehen, also vom Prinzip her?

Würdest du wieder eine Library dafür nutzen?

Also ich frag deswegen nach deiner Vorgehensweise, weil ich wohl ein ganz anderes denken als ihr hab, wie gesagt, ich wäre an die Zähl-Code-Geschichte ganz anders ran gegangen :oops:
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Mi, 09.11.11, 00:46

Schon ok :D
Die Lib ist eigentlich nicht wirklich erforderlich, es würde auch ohne funktionieren, nur etwas weniger 'schön', sprich ein wenig flimmern. An der Stelle geht es aber schon tief in die 'Abgründe' von Bascom.
Problem ist ja das folgende:
Du hast eine Zahl (hier die Variable 'Wert') die zunächst mal binär ist. Um diese auf 3 dezimalen Stellen darzustellen, muss diese erst mal in das Dezimalsystem 'übersetzt' werden. Hierzu wird am einfachsten die binäre (Word) Variable in eine Zeichenkette (also Buchstaben) umgewandelt. Je nachdem, welchen Typ die Variable hat, ist das unterschiedlich schwierig/aufwändig (ein Byte ist einfach, Integer/Word auch, Long schon aufwändig und Fließkommazahlen richtig kompliziert). Weil Bascom zunächst den Programmierer von solchen 'Überlegungen' befreien will, unterstützt die str Funktion alle Datentypen. Aber halt nicht besonders schnell.
Der Befehl "$LIB "mcsbyteint.lbx" sorgt jetzt schlicht und einfach dafür, dass Bascom eine optimierte Version der str Funktion verwendet, die nur ganze Zahlen umwandeln kann (also Byte, Integer und Word), - dafür aber vernünftig schnell.
Ohne die "$LIB "mcsbyteint.lbx" dauert der Befehl:
S = Str(Wert) etwa 3.14 Millisekunden, mit "$LIB "mcsbyteint.lbx" sind es nur 0,22 Millisekunden.

Wenn Du den Rest des Codes verstanden hast, dann hast Du aber durchaus schon viel verstanden :D
ich wäre an die Zähl-Code-Geschichte ganz anders ran gegangen
Wie? Vielleicht lernst Du am meisten, wenn Du jetzt mal versuchst, einen eigenen Ansatz zu programmieren.
Mohi
Mega-User
Mega-User
Beiträge: 104
Registriert: Di, 11.10.11, 08:13

Mi, 09.11.11, 13:02

Sag mal Borax, hast du den Code so ausm Kopf geschrieben? Meine Schaltung hast du ja nicht nach gebaut, oder?


Wegen Code selber schreiben, werd ichs mal heute Abend versuchen! Und zwar so wie ich mir das vorgestellt habe. Malsehen obs klappt :-)
Eine Schwierigkeit ist, das die Segmente gemultiplext sind und wie wir alle bzw. ich festgestellt haben :-) kann man bei Multiplex nur immer ein Segment ansteuern... Da muss ich ma gucken wie ich das geregelt kriege...

Ein Jammer das ich arbeiten muss...
Es wäre sooo schön, wenn ich reich wäre...
Goethe hat ma gesagt: "Willkürlich handeln ist des Reichen Glück." Hat was dieser Spruch....
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Mi, 09.11.11, 14:26

hast du den Code so ausm Kopf geschrieben?
Mehr oder minder... In Bascom ist ein Simulator/Debugger vorhanden, damit kann man so ein Programm schon ganz gut 'testen', auch ohne die Hardware. Da habe ich auch die Laufzeiten (die natürlich nur für den bisher gesetzten Takt von 1MHz gelten) für die einzelnen Befehle nachgeschaut (auswendig weiß ich die auch nicht :D ). 100% verlässlich ist das zwar nicht, aber nach einiger Zeit kennt man die Macken halt auch.
Viel Erfolg!
Mohi
Mega-User
Mega-User
Beiträge: 104
Registriert: Di, 11.10.11, 08:13

Fr, 11.11.11, 21:11

Da bin ich wieder... Endlich Freitag ;-)

Der Simulator (F2) durchläuft ja nur den Code, oder?
Eine Art virtuelle Segmentanzeige die das ganze auch visuell darstellt ist so erst mal nicht möglich, richtig?


Wegen dem Voltmeter:
Ich muss ja eigentlich nur den Code zwischen Do und Loop anpassen, oder?
Würdest du dabei GETADC nutzen?

Viele Grüße

mohi
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Fr, 11.11.11, 23:18

Eine Art virtuelle Segmentanzeige die das ganze auch visuell darstellt ist so erst mal nicht möglich, richtig?
Nein, nicht wirklich. Aber Du kannst die Zustände der PORT Bits als eine Art LED Anzeige sehen. Wenn man weiß welches Segment was ist, dann kann man es schon halbwegs sehen. Natürlich nicht 'gemultiplext' :D Weil ja der PORT nur ein Mal sichtbar ist.
Ich muss ja eigentlich nur den Code zwischen Do und Loop anpassen, oder?
Würdest du dabei GETADC nutzen?
Ja und ja. :D
Mohi
Mega-User
Mega-User
Beiträge: 104
Registriert: Di, 11.10.11, 08:13

Sa, 12.11.11, 02:24

Borax hat geschrieben:
Ich muss ja eigentlich nur den Code zwischen Do und Loop anpassen, oder?
Würdest du dabei GETADC nutzen?
Ja und ja. :D
OK, dann müsste die Abfrage vom ADC so aussehen: Wert = Wert + Getadc(0)
Wobei ich "Wert = 999" durch "Wert = 0" ersetzen würde, damit später der ADC-Wert mit 0 addiert werden kann...





Hier nochmal der eine Code der von 0 bis 999 durchzählt, ergänzt mit Config ADC:

Code: Alles auswählen

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

Config Portb = Output                                       'Die 8 Kathoden der Segmentanzeigen (a,b,c,d,e,f,g,P.)

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

$lib "mcsbyteint.lbx"

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

Dim Ziffer As Byte                                          'Variable
Dim Zeit As Byte                                            'Variable
Dim Wert As Word                                            'Variable

Dim S As String * 3                                         'Variable
Dim Ar(4) As Byte                                           'Variable

Set Portd.2                                                 'Anzeige 1 aus
Set Portd.3                                                 'Anzeige 2 aus
Set Portd.4                                                 'Anzeige 3 aus

Wert = 999

Do
   Incr Wert
   If Wert = 1000 Then Wert = 0                             'Überlauf -> Bei 0 neu starten
   S = Str(wert)                                            'Wert in Zeichenkette umwandeln
   S = Format(s , "000")                                    'Auf drei Stellen formatieren
   Str2digits S , Ar(1)                                     'In die drei einzelnen Stellen splitten

   For Zeit = 0 To 50                                       'Multiplexen: Anzeige mit 50 mal 6 Milisekunden, also  0.3 Sekunden pro Wert

     Portb = Lookup(ar(4) , Daten)                          ' Die erste Stelle ausgeben
     Reset Portd.2                                          ' Einschalten
     Waitms 2                                               ' Zwei Millisekunden lang...
     Set Portd.2                                            ' Und wieder aus

     Portb = Lookup(ar(3) , Daten)                          ' Die zweite Stelle ausgeben
     Reset Portd.3                                          ' Einschalten
     Waitms 2                                               ' Zwei Millisekunden lang...
     Set Portd.3                                            ' Und wieder aus

     Portb = Lookup(ar(2) , Daten)                          ' Die dritte Stelle ausgeben
     Reset Portd.4                                          ' Einschalten
     Waitms 2                                               ' Zwei Millisekunden lang...
     Set Portd.4                                            ' Und wieder aus
   Next Zeit
Loop

End

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 den Buchstaben F dar.
Benutzeravatar
Beatbuzzer
Auserwählter
Auserwählter
Beiträge: 3177
Registriert: Fr, 17.08.07, 11:02
Wohnort: Alfeld / Niedersachsen
Kontaktdaten:

Sa, 12.11.11, 09:18

Ich würde "wert=getadc(0)" schreiben, dann wird bei jedem Durchlauf der aktuelle Messwert in "Wert" geschrieben.
Die beiden Zeilen
incr wert
if wert=1000 then...
kannst du auch rausschmeißen, die waren ja nur zum hochzählen und zurücksetzen da. Das brauchst du ja jetzt beim Messen nicht mehr.
Dann musst du nachdem "wert=getadc(0)" nur noch "wert" in die zahl die auf dem Display stehen soll umrechnen und kannst sie dann weiter nach Borax Prinzip zerlegen und anzeigen lassen.
Mohi
Mega-User
Mega-User
Beiträge: 104
Registriert: Di, 11.10.11, 08:13

Sa, 12.11.11, 11:57

Juhuuuu, es funktioniert :-) So halbwegs zumindest...

Wenn ich 'ne Batterie an die Messpunkte setze, dann krieg ich tatsächlich einen Wert ausgespuckt :-)
Allerdings ist der Ausgegebene Wert nicht der den ich erwartet hätte...

Hab ne Batterie, die meinem Multimeter nach 3,165Volt anzeigt.

Wenn ich diese Batterie (3,165V) an meine Schaltung (DVM) anschließe, bekomme ich die Zahl 169 auf den Segmentanzeigen ausgespuckt.
Ich hätte erwartet, das der DVM eine Zahl um die 644 anzeigt.
Sooo, warum hätte ich die Zahl ~644 erwartet?

Weil der ADC als Referenz den AVcc hat und AVcc hat 5,03 Volt.
Meine Batterie (ist so'n Mignon-Doppelpack) hat eine Spannung von 3,165 Volt

Wenn Referenz 5,03V ist und Messspannung 3,165V und bei 10Bit 1024 Stufungen gegeben sind, dann sollte doch eigentlich ~644 als Ergebnis angezeigt werden.

5,03V - 1024
3,165V - x
-----------------
3,165 x 1024 / 5,03 = 644,32604373757455268389662027833

Bei mir zeigt es aber den Wert 169 an...

Wenn ich nun nur eine einzige Batterie an die Messpunkt halt dann zeigt mir meine DVM-Schlatung ungefähr den halben Wert an, also die Zahl 83.
Obwohl ich auch hier, logisch gesehen, die Zahl 84,5 erwartet hätte, wenn Kommastellen nicht darstellbar sind, dann wenigstens die Zahlen 84 oder 85... Beide Batterien meines Doppelpackes haben die selbe Spannung.


Ich kann ja auch die Referenzspannungsquelle ändern auf "Internal", dann habe ich eine Referenzspannung von 2,56 Volt...
Wenn ich nun (über Internal) vergleiche, dann bekomme ich den Wert 335 ausgespuckt.

Auch hier hätte ich erwartet, das (wenn die gleich folgende Rechnung stimmt) ein Wert von 1266 angezeigt wird, denn:
3,165 x 1024 / 2,56 = 1266

Hmmm..., kann aber auch sein, weil mein DVM nur drei Stellen hat, das der DVM die tausender Stelle nicht darstellen kann...
Wenn mein DVM 4 Segmentanzeigen hätte, dann könnte auch der Wert 335 möglicherweise 1335 sein...
Geht aber nicht, weil ja die vierte Segmentanzeige fehlt, also fehlt auch die 1 von 1335, also wird nur die 335 angezeigt...

Wenn das so wäre, könnte ich an dem Tripo solange dran drehen bis ich den Wert 266 angezeigt bekomme, dann wäre alle eigentlich korrekt, weil ja nicht 226 sondern 1226 gemeint ist, aber nicht darstelbar, da die vierte Segmentanzeige in meiner Schaltung fehlt...


Tut mir Leid, wenn ich etwas verwirrend schreibe :oops:




Meint ihr, das es an dem Code liegt, oder eher an dem Widerstand (R5 = 33 KOhm) der zwischen dem Tripo und dem posititiven Messpunkt liegt?




So sieht aktuell mein Code aus:

Code: Alles auswählen

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

Config Portb = Output   'Die 8 Kathoden der Segmentanzeigen (a,b,c,d,e,f,g,P.)

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

$lib "mcsbyteint.lbx"

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

Dim Ziffer As Byte  'Variable
Dim Zeit As Byte'Variable
Dim Wert As Word'Variable

Dim S As String * 3 'Variable
Dim Ar(4) As Byte   'Variable

Set Portd.2 'Anzeige 1 aus
Set Portd.3 'Anzeige 2 aus
Set Portd.4 'Anzeige 3 aus

Wert = 000

Do
   Wert = Getadc(0)

   S = Str(wert)'Wert in Zeichenkette umwandeln
   S = Format(s , "000")'Auf drei Stellen formatieren
   Str2digits S , Ar(1) 'In die drei einzelnen Stellen splitten

   For Zeit = 0 To 50   'Multiplexen: Anzeige mit 50 mal 6 Milisekunden, also  0.3 Sekunden pro Wert

 Portb = Lookup(ar(4) , Daten)  ' Die erste Stelle ausgeben
 Reset Portd.2  ' Einschalten
 Waitms 2   ' Zwei Millisekunden lang...
 Set Portd.2' Und wieder aus

 Portb = Lookup(ar(3) , Daten)  ' Die zweite Stelle ausgeben
 Reset Portd.3  ' Einschalten
 Waitms 2   ' Zwei Millisekunden lang...
 Set Portd.3' Und wieder aus

 Portb = Lookup(ar(2) , Daten)  ' Die dritte Stelle ausgeben
 Reset Portd.4  ' Einschalten
 Waitms 2   ' Zwei Millisekunden lang...
 Set Portd.4' Und wieder aus
   Next Zeit
Loop

End

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 den Buchstaben F dar.
Mohi
Mega-User
Mega-User
Beiträge: 104
Registriert: Di, 11.10.11, 08:13

Sa, 12.11.11, 13:11

Woher weiß eigentlich unser Code welches der in Daten befindlichen Zeilen er nehmen soll?

Wenn ich Wert = 012 schreibe, dann erscheint die Zahl 012 auf den SA's (Segmentanzeigen).
Aber woher weiß der Code, das er die erste Zeile, die zwei und die dritte Zeile nehmen soll, damit 012 auf den SA's steht?

Code: Alles auswählen

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 den Buchstaben F dar.
Data &B01111111                                             'Stellt den Punkt dar.
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Sa, 12.11.11, 22:56

Fangen wir mal mit dem Getadc an.
Du hast einen Spannungsteiler (bei Mitte Poti) aus 33k + 2.5k 'oben' und 2.5k + 10k 'unten'. Das ergibt einen Teiler auf rund 1/4
Wenn jetzt diese Batterie (3,165V) auf 1/4 geteilt wird, ergibt das 0,82V
Beim Messbereich 0-5V (REF=AVCC) entspricht 5V = 1023; 0,82V also =169 (0,82/5 * 1023) Bei Ref=INTERNAL bekommst Du 335; Gleiche Rechnung 0,82/2.56 * 1024 = 328 wahrscheinlich ist aber die Referenz nicht genau 2.56 (ist sie fast nie), daher bekommst Du 335. Wir haben das ganze so konzipiert, dass die interne Ref verwendet werden soll (wenn die Spannung unter 5V sinkt, würde ja der AVR immer noch 1023 messen, weil die Referenz ja nicht 5V sondern AVCC also Betriebsspannung ist). Also mit REF=INTERNAL arbeiten.
Du solltest also jetzt das Poti so einstellen, dass bei der Batterie mit 3,165V ein Wert von 317 angezeigt wird. Dann noch den Dezimalpunkt dauerhaft einschalten so dass dann 3.17 angezeigt wird. Und das sollte ja auch angezeigt werden.
Wenn das so klappt, kommen wir noch zur Mittelwertbildung...
Woher weiß eigentlich unser Code welches der in Daten befindlichen Zeilen er nehmen soll?
Steht doch eigentlich recht ausführlich im Kommentar:

Code: Alles auswählen

       S = Str(wert)                                        'Wert in Zeichenkette umwandeln
       S = Format(s , "000")                                'Auf drei Stellen formatieren
       Str2digits S , Ar(1)                                 'In die drei einzelnen Stellen splitten
Du solltest mal die Hilfe für die Funktion Str2digits nachschauen... Diese liefert ein ARRAY (ein Array ist eine Art Tabelle) zurück (drum heißt die Variable auch Ar...) mit 4 Elementen:
1. Die Anzahl Stellen. Ist hier immer 3 weil schon vorher der Wert auf 3 Stellen formatiert wurde (mit der Format Funktion)
2-4 sind dann die Stellen (von rechts beginnend, daher wird die erste Stelle von links mit Ar(4) angesprochen:

Code: Alles auswählen

         Portb = Lookup(ar(4) , Daten)                      ' Die erste Stelle ausgeben
Frei übersetzt: Schau in der Daten-Tabelle (Data Teil am Ende des Programmes) nach und zwar nach dem X-ten Wert wobei der Wert X dem Wert des 4ten Elementes der Ar Tabelle entspricht.
Beispiel
Wert = 317 (also &B100111101 binär)
Zeichenkette: '317'
Auf drei Stellen formatiert: Immer noch '317' (wenn es stattdessen '5' wäre dann ergäbe sich hier ein '005')
Ar(1) =3 (Es sind 3 Stellen - interessiert hier nicht, das wissen wir schon)
Ar(2) =7 (Erste Stelle von Rechts)
Ar(3) =1 (Mittlere Stelle)
Ar(4) =3 (Erste Stelle von Links)

Lookup(ar(4) , Daten) liefert also das vierte Element (die Data Tabelle beginnt mit 0) also das Bitmuster: &B10110000
usw....
Mohi
Mega-User
Mega-User
Beiträge: 104
Registriert: Di, 11.10.11, 08:13

So, 13.11.11, 23:15

Es funktioniert :-)
Zwar nicht so genau wie ein Multimeter, aber immerhin... ;-)
Du hast einen Spannungsteiler (bei Mitte Poti) aus 33k + 2.5k 'oben' und 2.5k + 10k 'unten'. Das ergibt einen Teiler auf rund 1/4
Wenn jetzt diese Batterie (3,165V) auf 1/4 geteilt wird, ergibt das 0,82V
Wie rechnest du, das du auf den Teiler 1/4 kommst?
Weil ja bei Prescaler Auto steht, erkennt der dann automatisch die 1/4, oder wie?
Anstatt Auto hätte ich auch 4 schreiben können, ja?
Der Teiler bezieht sich doch auf den Presaler, oder?

(Ganz schöne viele Fragezeichen... :) )

Das mit Array und Str2digits versteh ich noch nicht so ganz, auch wie die einzelnen Variablen (z.B. "Zeit") funktionieren, uiuiui, gar nicht mal so easy! Muss das mal in aller seelenruhe begoogeln...
Wenn das so klappt, kommen wir noch zur Mittelwertbildung...
Ja es klappt, die zweite Stelle nachm Komma ist sehr ungenau, ich denke, das es meine DVM-Schaltung +- 0,2 Volt genau anzeigt, muss das aber nochmal mit verschiedenen Batterien und dem Multimeter genau nach prüfen...

Meinst du mit Mittelwertbildung, wenn zum Beispiel meine Batterie 3,165 anzeigt, der ATmega auf oder abrundet?




Vielen Dank für eure Hilfe, ehrlich!! Ohne euch hätte ich das niiiie gepackt!!!



Und hier nochmal der komplette Code mit dem die Schaltung funktioniert:

Code: Alles auswählen

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

Config Portb = Output                                       'Die 8 Kathoden der Segmentanzeigen (a,b,c,d,e,f,g,P.)

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

$lib "mcsbyteint.lbx"

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

Dim Ziffer As Byte                                          'Variable
Dim Zeit As Byte                                            'Variable
Dim Wert As Word                                            'Variable

Dim S As String * 3                                         'Variable
Dim Ar(4) As Byte                                           'Variable

Set Portd.2                                                 'Anzeige 1 aus
Set Portd.3                                                 'Anzeige 2 aus
Set Portd.4                                                 'Anzeige 3 aus

Wert = 000

Do

   Wert = Getadc(0)

   S = Str(wert)                                            'Wert in Zeichenkette umwandeln
   S = Format(s , "000")                                    'Auf drei Stellen formatieren
   Str2digits S , Ar(1)                                     'In die drei einzelnen Stellen splitten

   For Zeit = 0 To 50                                       'Multiplexen: Anzeige mit 50 mal 6 Milisekunden, also  0.3 Sekunden pro Wert

      Portb = Lookup(ar(4) , Daten)                         ' Die erste Stelle ausgeben
      Reset Portd.2                                         ' Einschalten
      Reset Portb.7                                         ' Dezimalpunkt einschalten
      Waitms 2                                              ' Zwei Millisekunden lang...
      Set Portd.2                                           ' Und wieder aus


      Portb = Lookup(ar(3) , Daten)                         ' Die zweite Stelle ausgeben
      Reset Portd.3                                         ' Einschalten
      Waitms 2                                              ' Zwei Millisekunden lang...
      Set Portd.3                                           ' Und wieder aus

      Portb = Lookup(ar(2) , Daten)                         ' Die dritte Stelle ausgeben
      Reset Portd.4                                         ' Einschalten
      Waitms 2                                              ' Zwei Millisekunden lang...
      Set Portd.4                                           ' Und wieder aus

   Next Zeit
Loop

End

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 den Buchstaben F dar.
Mohi
Mega-User
Mega-User
Beiträge: 104
Registriert: Di, 11.10.11, 08:13

Mo, 14.11.11, 09:04

Meinst du mit Mittelwertbildung, wenn zum Beispiel meine Batterie 3,165 anzeigt, der ATmega auf oder abrundet?


Sorry, völliger Quatsch was ich da geschrieben habe...
Mittelwert muss irgendein Durchschnitt sein, deswegen heißt es ja Mittelwertbildung :-D
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Mo, 14.11.11, 10:01

Der Teiler bezieht sich doch auf den Presaler, oder?
Nein. Der Teiler bezieht sich auf den Schaltplan. Hat mit dem Prescaler gar nichts zu tun.
Der Prescaler hat eine ganz andere Aufgabe:
Um einen analogen Wert mit dem ATMega zu messen muss dieser zunächst in einen digitalen Wert umgewandelt werden. Hierzu gibt es im ATMega eine eigene 'Einheit', den AD-Wandler. Dieser läuft mehr oder minder unabhängig vom 'Rest' des ATmega. Aber der AD-Wandler braucht auch einen Takt. Dieser muss (sollte - sonst wird es ungenau) zwischen 50kHz und 200kHz liegen. Also muss der Systemtakt (der ja hier 1MHz ist) runtergeteilt werden. Entweder man rechnet das 'von Hand', oder man überläßt diese Rechnung dem Compiler, hier also Bascom. Prescaler = Auto sagt jetzt dem Bascom Compiler: Schau nach was für ein Takt eingestellt ist (crystal=...) und berechne den Prescaler so, dass am AD-Wandler ein Takt zwischen 50kHz und 200kHz liegt. Bascom wird hier also den Prescaler auf 8 setzen (1000kHz/8 = 125kHz)
Wie rechnest du, das du auf den Teiler 1/4 kommst?
Das liegt an den Widerständen (davon weiß ja weder der ATMega noch der Compiler irgendwas... die können ja die Widerstände vor dem ADC Eingang nicht 'sehen').
Du hast einen Spannungsteiler (bei Mitte Poti) aus 33k + 2.5k 'oben' und 2.5k + 10k 'unten'. Das ergibt einen Teiler auf rund 1/4
Schau noch mal auf den Schaltplan: Dort wo die Spannung angeschlossen wird, ist zunächst ein 33k Widerstand, dann ein 5k Poti und dann ein 10k Widerstand (dann Masse).
Wenn das Poti in der Mitte steht, sind auf beiden Seiten des Schleifer-Anschlusses die gleichen Widerstände eingestellt (also 2.5k und noch mal 2.5k). Also kann man die ersten 2.5k bei den 33k dazu zählen und die zweiten 2.5k beim 10k Widerstand.
Kurz gesagt haben wir dann:
+ Messspannung
35,5k Widerstand
ADC Anschluss
12,5k Widerstand
Masse
Summe der Widerstände: 48kOhm. Nach Ohmschem Gesetz bleibt am größeren Widerstand auch der größere Teil der Spannung 'hängen'. Und zwar 12,5/48 = 0,26 also rund 1/4. Du kannst ja übungshalber mal alle Spannungen und Ströme ausrechnen, wenn als Messspannung 5V anliegen.

Jetzt zur Mittelwertbildung. Du hast ja schon gemerkt dass die zweite Stelle sehr ungenau ist. Das liegt daran, dass es 'rauscht'. Im Moment misst Du ja nur ein Mal den Wert und gibst den aus. Wenn man aber jetzt 50 Mal den Wert messen würde und dann mitteln, wird das wesentlich 'stabiler'. Aus Gründen die mal wieder mit dem Binärsystem zusammenhängen macht es mehr Sinn nicht 50 Mal zu messen, sondern 64 Mal (oder sonst eine Potenz von 2).

Probier mal das hier:

Code: Alles auswählen


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

    Config Portb = Output                                   'Die 8 Kathoden der Segmentanzeigen (a,b,c,d,e,f,g,P.)

    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 = Internal

    $lib "mcsbyteint.lbx"

    Dim Ziffer As Byte                                      'Variable
    Dim Zeit As Byte                                        'Variable
    Dim Wert As Word                                        'Variable
    Dim Adcwert As Word                                     'Variable
    Dim W As Word                                           'Variable
    Dim S As String * 3                                     'Variable
    Dim Ar(4) As Byte                                       'Variable

    Set Portd.2                                             'Anzeige 1 aus
    Set Portd.3                                             'Anzeige 2 aus
    Set Portd.4                                             'Anzeige 3 aus

    '$SIM

    W = Getadc(0)

    If W > 999 Then Wert = 999 Else Wert = W              'Anzeige geht nur bis 999

    Do
       S = Str(wert)                                        'Wert in Zeichenkette umwandeln
       S = Format(s , "000")                                'Auf drei Stellen formatieren
       Str2digits S , Ar(1)                                 'In die drei einzelnen Stellen splitten

       For Zeit = 0 To 63                                   'Anzeige 64 mal 6 Milisekunden, also etwa 0.4 Sekunden pro Wert

         Portb = Lookup(ar(4) , Daten)                      ' Die erste Stelle ausgeben
         Reset Portd.2                                      ' Einschalten
         Waitms 2                                           ' Zwei Millisekunden lang...
         Set Portd.2                                        ' Und wieder aus

         Portb = Lookup(ar(3) , Daten)                      ' Die zweite Stelle ausgeben
         Reset Portd.3                                      ' Einschalten
         Waitms 2                                           ' Zwei Millisekunden lang...
         Set Portd.3                                        ' Und wieder aus

         Portb = Lookup(ar(2) , Daten)                      ' Die dritte Stelle ausgeben
         Reset Portd.4                                      ' Einschalten
         Waitms 2                                           ' Zwei Millisekunden lang...
         Set Portd.4                                        ' Und wieder aus

         W = Getadc(0)                                      'ADC lesen
         Adcwert = Adcwert + W                              'ADC Wert aufaddieren zum Mittelwert bilden

       Next Zeit

       Shift Adcwert , Right , 6                            ' enstpricht ADC Wert = ADC Wert / 64 = Mittelwert
       If Adcwert > 999 Then Wert = 999 Else Wert = Adcwert 'Anzeige geht nur bis 999
       Adcwert = 0                                          'Reset Adcwert
    Loop

    End

    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.

Um das zu verstehen wirst Du aber erst mal die 'einfachen' Befehle und Typen (Array, Str Funktion, STR2Digits Funktion...) aus dem ersten Code 'lernen' müssen.
Mohi
Mega-User
Mega-User
Beiträge: 104
Registriert: Di, 11.10.11, 08:13

Di, 15.11.11, 21:02

Die zweite Stelle nach'm Komma "zittert" jetzt nicht mehr, aber es scheint da noch ein Problem zu geben...

Hab drei verschiedene Batterien, ein 9 Volt Block, so'n Mignon-Doppelpack und ne Knopfzelle.

Mein Multimeter misst folgendes:
9V-Block = 8,05 Volt
Mignon-Doppel = 3,16 Volt
Knopfzelle 1,54 Volt.

So, ich nehme den Mignon-Doppelpack und "eiche" meinen DVM, also zeigt er nun 3,16 Volt an, bei der Knopfzelle zeigt er aber jetzt 1,22 Volt an und bei dem 9V-Block 8,8 Volt an...

Nun "eiche" ich nach dem 9V-Block, also zeigt mein DVM 8,05 Volt an, aber dafür misst er jetzt beim Mignon-Doppelpack 2,86 und bei der Knopfzelle 1,08 Volt an...

"Eiche" ich nun meinen DVM nach der Knopfzelle, komme ich mit dem Tripo nicht hochgenug um auf den (Multimeter-)Wert 1,54 Volt zu kommen...



Wegen deiner Beschreibung, ich raffs so langsam :-)
Du bist echt krass und danken muss ich dir eh! Hast dir echt Zeit für mich genommen... Vielen Dank dafür...

Ich kann dir leider keine Schokolade übers Internet schicken, aber ich kann dir ein Lied singen:

Du bist der hellste Punkt an meinem Horizont...
Du bist der Farbenklecks in meinem Grau in Grau...
Du bist die Melodie la la lalaaallaaalaaaa
Merciiie das es dich gibt... :-)

Musste eben voll loslachen :-D

Nicht falsch verstehen, ja ? ;-)

Hau rein..

Mohi
Zuletzt geändert von Mohi am Mi, 16.11.11, 19:03, insgesamt 1-mal geändert.
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Mi, 16.11.11, 12:20

Mein Multimeter misst folgendes:
9V-Block = 8,05 Volt, Mignon-Doppel = 3,16 Volt, Knopfzelle 1,54 Volt.
So, ich nehme den Mignon-Doppelpack und "eiche" meinen DVM, also zeigt er nun 3,16 Volt an, bei der Knopfzelle zeigt er aber jetzt 1,22 Volt an und bei dem 9V-Block 8,8 Volt an...
Das wundert mich zwar schon ein wenig, einen kleinen Unterschied habe ich zwar erwartet, aber nicht so viel. Aber das kriegen wir auch noch hin. Es gibt jetzt zwei Möglichkeiten damit umzugehen.
1. Wir versuchen den 'echten' Fehler zu finden (besser aber ggf. aufwändig)
2. Einfach per Software 'passend' machen.
Die Wahl überlasse ich Dir...

Hast Du diese Werte eigentlich 'parallel' gemessen (also Multimeter + AVR-DVM an die Batterien angeschlossen) oder 'hintereinander' (erst die Batterien mit dem Multimeter gemessen und anschließend mit dem AVR-DVM)?
Das kann einen Unterschied machen, weil die Eingangswiderstände von Multimeter und AVR-DVM sehr unterschiedlich sind (Multimeter: >1Meg; AVR-DVM: 48k). Also bevor wir das korrigieren anfangen auf alle Fälle 'parallel' messen.

Und Danke für die virtuelle Schokolade!
Mohi
Mega-User
Mega-User
Beiträge: 104
Registriert: Di, 11.10.11, 08:13

Mi, 16.11.11, 20:56

Ganz klar versuchen wir den echten Fehler zu finden :-)

Wollte eben los messen, als sich mir plötzlich die Frage aufdrängte nach was ich eigentlich kalibieren soll?

Also ich muss ja mein DVM über den Tripo kalibrieren.
Kalibrier ich den DVM nach dem 9Volt-Block ein, oder nach der Knopfzelle, oder nach dem Mignon-Doppelpack?

Ich frag ja deswegen, weil wenn ich nach der Knopfzelle den DVM kalibriere, der DVM dann richtig misst, allerdings nur bei Knopfzelle...

Gemessen habe ich gestern übrigens hintereinander, also erst mit Multimeter (MM), dann mit DVM.

Hab auch kurz mal den DVM und den MM an die selbe Stromquelle gehalten. Ergebniss war ein anderer. Also es macht durchaus einen Unterschied, ob man einzeln misst, oder DVM und MM zusammen an eine Batterie hält...

1Mega Ohm ist etwas mehr als 48k :-)
Gut 1MOhm geht ja nicht bei meinem DVM, da würd ja nix mehr an dem ATmega ankommen...


Hast du irgendwie eine Vermutung, wo der Fehler liegen könnte?

Ich werd mal bei nächster Gelegenheit ne hardcore-Intensive-Messung vornehmen, parrallel und hintereinander schön übersichtlich in ne Tabelle. Ma gucken was dabei rauskommt...

Viele Grüße
Mohi
Antworten