-
        

Ergebnis 1 bis 7 von 7

Thema: ADC problem

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.01.2007
    Ort
    Bodenseeregion
    Alter
    27
    Beiträge
    135

    ADC problem

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hi, ich hab vor kurzem mein RN-Control Board (V1.4) bekommen und möchte nach ein paar LED tests einen LDR mittels ADC auswerten.
    Doch auch mit der Suche und der RN-Wissensdatenbank bin ich nicht weitergekommen.
    Meine Schaltung sieht folgendermaßen aus. Den LDR hab ich an einen der 3 VCC pins (JP1 Leiste) und an den 1. Stecker von Port 1 angeschlossen. (Ich hoffe soweit richtig)

    Jetzt mein Source, der nicht funktioniert.



    Code:
    $regfile = "m32def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    $crystal = 16000000
    $baud = 9600
    
    Config Portc.0 = Output
    Config Portc.1 = Output
    Config Portc.2 = Output
    Config Portc.3 = Output
    Config Portc.4 = Output
    Config Portc.5 = Output
    Config Portc.6 = Output
    Config Portc.7 = Output
    
    
    Config Porta = Input
    
    
    
    Config Adc = Single , Prescaler = Auto
    Dim W As Word , Ch As Long
    
    Dim Port As Long
    
    Tccr1b = Tccr1b Or &H02
    
    
    Do
    Start Adc
      W = Getadc(ch)
    
      If W > 50 Then
      Portc.0 = 0
      End If
      If W > 200 Then
      Portc.1 = 0
      End If
      If W > 400 Then
      Portc.2 = 0
      End If
    
      If W < 50 Then
      Portc.7 = 0
      End If
    
    
      Ch = Ch + 1
      If Ch > 7 Then
      Ch = 0
      End If
    
    
      Waitms 100
    
    
    
    
    Loop
    
    End
    Gruß Robin

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    ----Den "Start Adc" macht man üblicherweise VOR dem "Do", also nur einmal.

    ----Die Analog-Pins solltest du auf "Input" konfigurieren

    ----Einzelne Pins konfiguriert man mir "PINx.N", das ist gewöhnungsbedürtfig
    Code:
    CONFIG PORTc = OUTPUT      ' ALLE Pins von 0-7
    CONFIG PINc.3 = OUTPUT      ' Nur Pin 3
    --- du setzt deine Pins immer nur auf 0, niemals auf 1. Da wird nicht viel zu sehen sein.

    --- Wenn du nur einen LDR angeschlossen hast, reicht GETADC(0)

    --- Für Ch reicht "AS Byte"

    --- Der LDR muß einen Spannungsteiler bilden, VCC nach analog-Pin ist zuwenig.

    --- *schnauf*
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.01.2007
    Ort
    Bodenseeregion
    Alter
    27
    Beiträge
    135
    Danke schonmal für deine Antwort.

    Ich hab mein Code jetzt aktualisiert. Ich hoffe soweit richtig


    Code:
    $regfile = "m32def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    $crystal = 16000000
    $baud = 9600
    
    Config Portc = Output
    Config Porta = Input
    
    
    
    Config Adc = Single , Prescaler = Auto
    Dim W As Word
    
    
    Tccr1b = Tccr1b Or &H02
    
    Start Adc
    Do
    
      W = Getadc(0)
      If W > 50 Then
      Portc.0 = 0
      End If
      If W > 200 Then
      Portc.1 = 0
      End If
      If W > 400 Then
      Portc.2 = 0
      End If
    
      If W < 50 Then
      Portc.7 = 0
      End If
    
    
      Waitms 100
    
    
    
    
    Loop
    
    End
    Beim Spannungsteiler bin ich mir auch nich nicht sicher. Ich habs ausgerechnet, wenn auf den LDR sehr helles Licht fällt und er 500 Ohm Widerstand hat, dann ergibt sich durch den Spannungsteiler 1,66 Volt, wenn er stark abgedunkelt wird und >200k hat, liegen eben >4,9 Volt an.
    Ist das richtig soweit ?


  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Nun gut. Ich nehm an, daß du je nach Spannung verschieden viele LED leuchten sollen.
    Also mußt du vor jeder Messung erstmal zurücksetzen:
    Code:
    Do 
      Portc.0 = 1 
      Portc.1 = 1 
      Portc.2 = 1 
      Portc.7 = 1 
    
      W = Getadc(0) 
      If W > 50 Then 
      Portc.0 = 0 
      End If 
      If W > 200 Then 
      Portc.1 = 0 
      End If 
      If W > 400 Then 
      Portc.2 = 0 
      End If 
      If W < 50 Then 
      Portc.7 = 0 
      End If 
    Loop
    Den "waitms" brauchst du nicht, der nutzt nix

    Zu geeigneten Werten mußt du dich hintasten
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    Hallo Robin1508,
    Beim Spannungsteiler bin ich mir auch nich nicht sicher. Ich habs ausgerechnet, wenn auf den LDR sehr helles Licht fällt und er 500 Ohm Widerstand hat, dann ergibt sich durch den Spannungsteiler 1,66 Volt, wenn er stark abgedunkelt wird und >200k hat, liegen eben >4,9 Volt an.
    Ist das richtig soweit ?
    Bei mir hat sich dies bewährt:
    Ein Spannungsteiler 220 kOhm / 4,7 kOhm zwischen 5V und Masse.
    Der LDR wird parallel zum 220 kOhm-Widerstand angeklemmt.

    Der ADC-Eingang (AD-Wandler) des AVR wird an den Abgriff (zwischen 220k und 4,7k) angeschlossen.
    Diese Schaltung liefert ca. 0,1 bis 4,9 V je nach LDR-Typ und Umgebungshelligkeit, hat also eine gute Spreizung.

    Gruß Dirk

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.01.2007
    Ort
    Bodenseeregion
    Alter
    27
    Beiträge
    135
    Alles klar, ich hab jetzt an meinem Code noch n bissl rumgebastelt und alles erneut verkabelt (um Wackelkontakte auszuschließen) und siehe da, es funktioniert.

    Hier ist mein Code.

    Code:
    
    $regfile = "m32def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    $crystal = 16000000
    $baud = 9600
    
    Config Portc = Output
    Config Porta = Input
    
    
    
    
    
    Config Adc = Single , Prescaler = Auto
    Dim W As Long
    
    
    
    Start Adc
    Do
    
    
      W = Getadc(7)
      If W > 50 Then
      Portc.1 = 0
      Else
      Portc.1 = 1
      End If
      If W > 100 Then
      Portc.2 = 0
      Else
      Portc.2 = 1
      End If
      If W > 200 Then
      Portc.3 = 0
      Else
      Portc.3 = 1
      End If
      If W > 400 Then
      Portc.4 = 0
      Else
      Portc.4 = 1
      End If
      If W > 600 Then
      Portc.5 = 0
      Else
      Portc.5 = 1
      End If
      If W > 700 Then
      Portc.6 = 0
      Else
      Portc.6 = 1
      End If
      If W > 800 Then
      Portc.7 = 0
      Else
      Portc.7 = 1
      End If
    
    
      If W < 50 Then
      Portc.0 = 0
      Else
      Portc.0 = 1
      End If
    
    
    
    
    
    Loop
    
    End
    Nur könnte mir jemand sagen was diese Zeile bewirkt?


    Code:
    Tccr1b = Tccr1b Or &H02
    Ich hatte sie Anfangs in meinem Code, weil ich irgentwo mitbekommen habe dass diese Zeile rein muss. Doch er funktioniert mit oder ohne genau gleich.

    Gruß

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hallo,

    diese Zeile ist nur wenn man ein ältere Bascom-Version mit Timer1 und PWM verwendet, da brauchte man das wohl

    Wenn kein Timer1 im Einsatz ist, machts auch keinen Unterschied

Berechtigungen

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