- fchao-Sinus-Wechselrichter AliExpress         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 28 von 28

Thema: ADC Ausgabe an 7-Segment-Display

  1. #21
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Anzeige

    Praxistest und DIY Projekte
    Kann es sein, dass du gar keine 1 auf den Port geben musst, damit die Stelle angeht, sondern eine 0? Wie sieht deine Beschaltung aus, die an PortB dran ist?
    Wenn nur zwei Stellen da sind, dann ist das egal. Dann wären nur die Ziffern vertauscht. Bei drei Stellen würden dann aber immer zwei leuchten, was zu so einem Effekt führen würde.

  2. #22
    Benutzer Stammmitglied
    Registriert seit
    20.01.2008
    Beiträge
    66
    Hab es gerade mal ausprobiert. Du hast wieder mal Recht . Die Basis meines Transistors wird gegen Minus geschaltet (ich mach schon sooo lange mit der Schaltung rum, dass ich das ganz vergessen habe). Das heißt jetzt ich muss PortB erst ein und dann aus schalten.....und die Kathoden von Portb.1 und Portb.2 vertauschen??

  3. #23
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Zitat Zitat von Malte0815
    Das heißt jetzt ich muss PortB erst ein und dann aus schalten.....und die Kathoden von Portb.1 und Portb.2 vertauschen??
    Das erste ja. In der ISR erst PortB.Stelle = 1 und am Ende PortB.Stelle=0.
    Die Anschlüsse von Portb.1 und .2 brauchst du nicht zu vertauschen, das kannst du im Programm ändern. Einfach da wo Wert_Stelle(1) gesetzt wird schreibst du nun Wert_stelle(2) und umgekehrt.

  4. #24
    Benutzer Stammmitglied
    Registriert seit
    20.01.2008
    Beiträge
    66
    Endlich mal ein kleiner Erfolg. Hab nach langer Suche noch nen kleinen Fehler gefunden durch den bei der dritten Stelle(fürs grad) immer nur ne 8 angezeigt wurde. Bei ....
    Code:
    For I = 1 To 10
       Read Segmente(i)....
    ... muss die 10 noch durch ne 11 ersetzt werden da sonst ja das elfte Zeichen nicht gefunden wird.

    Als nächstes werd ich mal versuchen nen fotowiderstand als Helligkeitsregelung einzubauen.

  5. #25
    Benutzer Stammmitglied
    Registriert seit
    20.01.2008
    Beiträge
    66
    Nun ist es fast geschaft . ein kleines Problem bleibt noch bei der Darstellung im negativen Bereich. Meine Überlegung war nun mit einer "If-Then-Abfrage" in eine Sub-Routine zu springen, und dann den Wert der Variable Temp einfach 2 mal zu addieren. doch irgendwie klappt das nicht.
    Was passiert eigentlich mit einer Byte-Variable wenn ein negatives Ergebnis berechnet wird?
    Den "Minus-Strich" steuere ich nun über einen 5. Transistor und Portb.0 indem ich an die Basis des Transistors für die "Minusstelle" gegen + schalte. Das funktioniert auch ganz gut:
    Code:
     Messung2 = Getadc(0)
       If Messung2 < 237 Then Portb.0 = 1                       'wenn getadc(0) kleiner als 237 (0°) dann minus an
       If Messung2 > 237 Then Portb.0 = 0
    Ich weiss natürlich jetzt nicht ob es sehr elegant ist, aber es funktioniert. Ich hab dadurch zwar bei ausgeschaltetem Minuszeichen einen Mehrverbrauch von 5mA aber das spielt eigentlich erstmal keine Rolle..

    Doch nochmal zurück zum eigentlichen Problem:
    Wie kann ich am besten die Programmierung für die Invertierung von z.B. -10° vornehmen? In ein Unterprogramm springen wenn getadc unterschritten wird? Ich hab es schon mit dem Rotate Befehl probiert aber es hat nicht geklappt.

  6. #26
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Es gibt da natürlich viele Wege zum Ziel.
    Du könntest z.B. Messung als Integer deklarieren. Dann wird Messung < 0, falls der Getadc Wert <237 ist.
    Dann überprüfst du, ob Messung < 0 ist und schaltest entsprechend PortB.0 auf 1, ansonsten auf 0.
    Anschliessend multiplizierst du Messung mit -1, sodass Messung wieder positiv ist. Dann funktionieren die Stellen wieder wie gewohnt.

  7. #27
    Benutzer Stammmitglied
    Registriert seit
    20.01.2008
    Beiträge
    66
    So. Hab mein Thermometer endlich fertig und es funktioniert (jippi). Vielen dank an for_ro für die tolle Unterstützung. Werd morgen noch den fertigen Code und ein paar Bilder uploaden, für alle (Anfänger) die vielleicht vor ähnlichen Problemen stehen werden.

  8. #28
    Benutzer Stammmitglied
    Registriert seit
    20.01.2008
    Beiträge
    66
    Hier sind wie versprochen ein Bild und der fertige Code.
    (Die Option vier Sensoren abzufragen und mit dem Taster durchzuschalten ist noch nicht ganz fertig aber sonst funktioniert es einwandfrei).

    Schaltplan:
    https://www.roboternetz.de/phpBB2/al...hp?pic_id=2485
    Bild:
    https://www.roboternetz.de/phpBB2/al...hp?pic_id=2484

    Code:
    $regfile = "M8def.dat"
    $crystal = 4000000
    
    '--------Segmente---------------
    Config Portd = Output
    Portd = 1                                                   'anfangs alles aus
    
    '----------Anode Display---------
    Config Portb = Output
    Digit1 Alias Portb.1
    Digit2 Alias Portb.2
    Digit3 Alias Portb.3
    Digit4 Alias Portb.4
    Dp Alias Portb.5
    Portb = 1                                                   'auch hier alles aus
    
    '---------------Taster------------
    Config Pind.7 = Input
    Pind.7 = 1
    'Taster Alias Pind.7
    
    '---------AD-Wandler Config-------------
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Start Adc
    
    '--------Timer Config----------------
    Dim Stelle As Byte                                          'Umschaltung zehner/einer/grad_zeichen
    Stelle = 1                                                  'start mit Zehner
    
    Config Timer0 = Timer , Prescale = 64
    On Timer0 Timer_routine                                     'wird 4.000.000/64/256 ~ 244 mal pro Sekunde aufgerufen
    Enable Timer0
    Enable Interrupts
    
    'Declare Sub Naechste
    
    Dim Messung As Integer
    Dim Wert_stelle(4) As Byte                                  'Variable für die einzelnen Stellen im Array(3)
    Dim I As Byte                                               'Variable für Ausgabe der einzelnen Zeichen
    Dim Temp As Integer                                         'Variable für Temperatur nach Berechnung
    Dim Segmente(12) As Byte                                    'Variable für einzelne Segmente jeder Ziffer
    Dim Messung2 As Integer                                     'für Minuszeichen
    Dim Messpunkt As Byte
    Messpunkt = 0
    
    
    Const Offset = 150.5
    Restore Segment_daten                                       'Tabelle der Zeichen laden
    
    For I = 1 To 12
       Read Segmente(i)
    Next I
    
    
    
     Wert_stelle(3) = 11                                        '°fest auf Stelle 3
     Wert_stelle(4) = 12                                        'minus fest auf Stelle 4
    
    
    
     Do
    
        'If Taster = 0 Then Gosub Naechste
    
    
       Messung = Getadc(messpunkt) * 64                         'Messung des ADC in Variable(Messung) speichern und mit 64 multiplizieren
       Messung = Messung / 101                                  'Messung mit 101 dividieren
       Messung = Messung - Offset
       Temp = Messung / 10                                      'für direkte Temperaturanzeige 150 abziehen                                     'ganzahlige Division, also 47 / 10 = 4
       Wert_stelle(1) = Temp + 1
       Temp = Messung Mod 10                                    'Mod ergibt den Rest der Division, also bei 47 / 10 ist Mod = 7
       Wert_stelle(2) = Temp + 1
    
       Messung2 = Getadc(messpunkt)
       If Messung2 < 237 Then Portb.0 = 1                       'wenn getadc(0) kleiner als 237 (0°) dann minus an
       If Messung2 > 237 Then Portb.0 = 0
    
    
       Waitms 1000                                              'hier vielleicht noch eine kleine Pause - um pendeln zwischen 2 temperaturen zu reduzieren
    
       Loop
       End
    
    
    Timer_routine:
    
       Portb.stelle = 1                                         'Vorherige Stelle ausschalten
       Portd = 1                                                'zusätzlich alle Segmente aus
       Incr Stelle                                              'auf nächste Stelle umschalten
       If Stelle = 5 Then Stelle = 1                            'am Ende wieder zurück zur ersten Stelle
       Portd = Segmente(wert_stelle(stelle))                    'Neue Segmente ausgeben
       Portb.stelle = 0                                         'neue Stelle einschalten
       Return
    
    'Sub Naechste
    'Incr Messpunkt
    'If Messpunkt = 2 Then Messpunkt = 0
    'End Sub
    
    
    
    Segment_daten:
    'gemeinsame Anode:
    '      0      1       2      3        4      5        6      7     8      9
    'Data &H3F , &H6 , &H05B , &H04F , &H066 , &H06D , &H07D , &H7 , &H7F , &H6F
    'gemeinsame kathode:
    '      0      1       2      3      4      5     6      7     8      9        grad         minus
    Data &H40 , &H79 , &H24 , &H30 , &H19 , &H12 , &H02 , &H78 , &H00 , &H10 , &B10011100 , &B1011

Seite 3 von 3 ErsteErste 123

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests