-         

Ergebnis 1 bis 6 von 6

Thema: Atmega128 - AD Wandler defekt?!

  1. #1

    Atmega128 - AD Wandler defekt?!

    Anzeige

    Hallo zusammen,

    ich habe ein Problem mit dem AD Wandler eines Atmega128.

    Ich möchte mit dem AD Wandler ein Touchscreen auswerten, doch leider kann ich an dem Wandler keine Spannungen einlesen.

    Es geht mir hier nur um den AD Wandler und nicht um die Auswerteroutinen. Zugehörige Spannungen liegen sicher an den jeweiligen Pins (ADC0 - 3) an. Liegt hier ein Problem in der Firmware oder doch in der Hardware des ATmega128 vor?

    Egal welchen ADC Kanal ich einlesen möchte, ich bekomme immer den Wert 1023 zurück.

    hier der Code:

    Code:
    '############################################################################
    'DEBUG-Firmware für Panel
    'Testprogramme für
    '  -  Displayhelligkeit
    '  -  Touchscreenfunktion
    '############################################################################
    
    
    $regfile = "m128def.dat"
    $crystal = 12000000
    $baud = 19200                                               ' use baud rate
    $hwstack = 32                                               ' default use 32 for the hardware stack
    $swstack = 10                                               ' default use 10 for the SW stack
    
    
    
    Config Graphlcd = 240 * 128 , Dataport = Porta , Controlport = Portc , Ce = 4 , Cd = 3 , Wr = 6 , Rd = 5 , Reset = 2 , Fs = 7 , Mode = 8
    
    Config Adc = Single , Prescaler = Auto , Reference = AVCC
    
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 8
    
    
    
    Dim X As Word , Y As Word
    Dim X2 As Word , Y2 As Word
    Dim T_zeile As Byte
    Dim T_spalte As Byte
    Dim A1 As Byte
    Dim A2 As Word
    Dim Ymid As Word
    Dim Xmid As Word
    Dim Ok As Bit
    Dim Brightness As Byte
    
    
    Config Portb.5 = Output
    
    
    Declare Sub Readtouch
    Declare Sub Touch_zuordnung
    
    Declare Sub Status_bargraph
    
    Declare Sub Lcd_funktionsbutton
    Declare Sub Lcd_stat_info
    Declare Sub Lcd_stat_home
    Declare Sub Lcd_draw_object_touchscreen
    
    Ok = 0
    
    
    '############################################################################
    'LCD Initialisierung / Lizenzierung
    '############################################################################
    
    
    
    Cls
    
    Cursor Off
    
    Waitms 500
    
    Locate 1,1
    LCD "Brightness: "
    
    Do
    Incr Brightness
    Compare1a = Brightness
    Locate 1,13
    LCD Brightness
    Waitms 10
    Loop Until Brightness = 255
    
    Wait 1
    
    Stop ADC
    Start ADC
    
    
    CLS
    
    
    
    '############################################################################
    'HAUPTSCHLEIFE
    '############################################################################
    
    
    call lcd_draw_object_touchscreen
    
    
    Do
    
       A1 = 0
       locate 1,1
       lcd "                    "
    
          locate 4,10
          lcd "F.0"
          locate 5,10
          lcd "hi" ; "    "
    
          locate 15, 10
          lcd "F.2"
          locate 16,10
          lcd "lo"    ; "    "
    
          locate 9,2
          lcd "F.1"
          locate 10,2
          lcd "read"  ; "    "
    
          locate 10, 18
          lcd "F.3"
          locate 11,18
          lcd "-"  ; "    "
    
       locate 1,1
       lcd "Y-Value: "
    
          do
    
             Config Pinf.0 = Output
             Config Pinf.2 = Output
             Set Portf.0
             Reset Portf.2
             Ddrf.1 = 0
             Ddrf.3 = 0
             Waitms 10
             Y = Getadc(1)
             Y2 = 1024 - Y
    
             locate 1,22
             lcd Y;"   "
             locate 2,22
             lcd Y2;"   "
             incr A1
    
          loop until A1 = 255
    
       A1 = 0
       locate 1,1
       lcd "                    "
    
          locate 4,10
          lcd "F.0"
          locate 5,10
          lcd "read"  ; "    "
    
          locate 15, 10
          lcd "F.2"
          locate 16,10
          lcd "-"  ; "    "
    
          locate 9,2
          lcd "F.1"
          locate 10,2
          lcd "hi"; "    "
    
          locate 10, 18
          lcd "F.3"
          locate 11,18
          lcd "lo"  ; "    "
    
       locate 1,1
       lcd "X-Value: "
    
          do
    
               Config Pinf.3 = Output
               Config Pinf.1 = Output
               Reset Portf.3
               Set Portf.1
               Ddrf.0 = 0
               Ddrf.2 = 0
               Waitms 10
               X = Getadc(0)
               X2 = 1024 - X
    
               locate 1,22
               lcd X ; "   "
               locate 2,22
               lcd X2; "   "
               incr A1
    
          loop until A1 = 255
    
    Loop
    
    End
    
    
    
    
    
    '############################################################################
    'TOUCHSCREEN Einteilung in Spalten und Zeilen
    '############################################################################
    
    Sub Touch_zuordnung
    
       Select Case Y
       Case 340 To 400 : T_zeile = 1
       Case 401 To 470 : T_zeile = 2
       Case 471 To 550 : T_zeile = 3
       Case 551 To 620 : T_zeile = 4
       Case 621 To 700 : T_zeile = 5
       Case Else : T_zeile = 0
    
       End Select
    
    
    
       Select Case X
       Case 165 To 300 : T_spalte = 1
       Case 301 To 435 : T_spalte = 2
       Case 436 To 570 : T_spalte = 3
       Case 571 To 700 : T_spalte = 4
       Case 701 To 840 : T_spalte = 5
       Case Else : T_spalte = 0
    
       End Select
    
    End Sub
    
    
    
    '############################################################################
    'TOUCHSCREEN Auswertung
    '############################################################################
    
    Sub Readtouch
    
    Ymid = 0
    Xmid = 0
    
    For A1 = 1 To 3
    
     Config Pinf.1 = Output                                     ' Makes port F.0 output
     Config Pinf.2 = Output                                     ' Makes port F.0 output
     Set Portf.1                                                ' Sets port F.0 High
     Reset Portf.2                                              ' Sets port F.2 Low
     Ddrf.3 = 0                                                 ' Sets port F.1 as input
     Ddrf.0 = 0                                                 ' Sets port F.1 as input because we need it now as ad input
     Waitms 3                                                   ' Wait until the port is stable
     Y = Getadc(4)                                              ' Read the ad value for the y
     Y = 1024 - Y                                               ' Invert the reading
    
     Config Pinf.3 = Output                                     ' Makes port F.1 output
     Config Pinf.0 = Output                                     ' Makes port F.3 output
     Reset Portf.3                                              ' Sets port F.3 Low
     Set Portf.0                                                ' Sets port F.1 High
     Ddrf.1 = 0                                                 ' Sets port F.0 as input
     Ddrf.2 = 0                                                 ' Sets port F.2 as input because we need it now as ad input
     Waitms 3                                                   ' Wait until the port is stable
     X = Getadc(1)                                              ' Read the ad value for the x
     X = 1024 - X                                               ' Invert the reading
    
    Ymid = Ymid + Y
    Xmid = Xmid + X
    
    Next A1
    
    Y = Ymid / 3                                                'Mittelung der X,Y Werte über 3 Messungen
    X = Xmid / 3
    
    
    End Sub
    
    
    
    
    '############################################################################
    'LCD Objekt Touchscreen
    '############################################################################
    Sub Lcd_draw_object_touchscreen
    
    
    Box(50,50)-(125,100),255
    box(51,51)-(124,99),255
    Line(52,48)-(123,48),255
    line(52,102)-(123,102),255
    line(48,52)-(48,98),255
    line(127,52)-(127,98),255
    
    
    locate 12,9
    lcd "TOUCH"
    
    
    'locate 4,10
    'lcd "F.0"
    'locate 5,10
    'lcd "hi"
    
    'locate 15, 10
    'lcd "F.2"
    'locate 16,10
    'lcd "lo"
    
    'locate 8,3
    'lcd "F.1"
    'locate 9,3
    'lcd "read"
    
    'locate 10, 18
    'lcd "F.3"
    'locate 11,18
    'lcd "-"
    
    
    End Sub

    Viele Grüße,
    Michael
    michaelwuehr.de

    CNC - Bearbeitung
    3D - Druck
    Software

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    Egal welchen ADC Kanal ich einlesen möchte, ich bekomme immer den Wert 1023 zurück.
    Und was für Werte erwartest Du, d.h. wie sehen die Spannungen aus, die an den Eingängen liegen? Du hast sie ja sicherlich mit irgendeinem geeigneten Messinstrument (Oszi o.ä.) verifiziert, oder?

  3. #3
    Zitat Zitat von Sauerbruch Beitrag anzeigen
    Und was für Werte erwartest Du, d.h. wie sehen die Spannungen aus, die an den Eingängen liegen? Du hast sie ja sicherlich mit irgendeinem geeigneten Messinstrument (Oszi o.ä.) verifiziert, oder?
    Temporär eine vom Berührpunkt der resistiven Folien abhängigen DC Spannung zwischen 0V und 5V.
    Die Spannung wird auch bis zum ADC1 (F.1) Pin des Atmegas weitergegeben, nur wird sie eben nicht vom uC erfasst.

    Daher auch meine Frage ob es vielleicht den AD Converter im AVR durch statische Ladung gekillt hat oder doch nur ein simpler Programmierfehler vorliegt...


    Viele Grüße,
    Michael
    michaelwuehr.de

    CNC - Bearbeitung
    3D - Druck
    Software

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    Verstehe...

    Ich habe zwar bislang noch nie mit so großen, "quadratischen" Controllern gearbeitet, ganz zu schweigen von Touchscreen-Displays. Allerdings ist mir beim programmieren von kleineren ATMELs schon manchmal aufgefallen, dass Bascom gerade beim Thema ADC bisweilen etwas seltsame Dinge compiliert.

    Ich würde mir an Deiner Stelle mal direkt vor und nach dem Getadc-Befehl den Inhalt der beiden relevanten Register auf dem Display anzeigen lassen, d.h. ADMUX und ADCSRA. Anhand dieser beiden Register kannst Du im Datenblatt nachsehen, wie der ADC von Deinem Programm tatsächlich konfiguriert wird. Vielleicht lässt sich der Fehler ja schon da erkennen...

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    30.12.2008
    Beiträge
    1.418
    an avcc liegen auch 5V an?
    was gibt es noch zu sagen

  6. #6
    Erfahrener Benutzer Roboter Experte Avatar von ePyx
    Registriert seit
    14.05.2008
    Ort
    Falkensee
    Beiträge
    700
    Was nimmst du als Referenzspannung? (Hab den Bascom-Code nicht gelesen).
    Grüße,
    Daniel

Ähnliche Themen

  1. Atmega128 defekt? wie kann ich es sicher sagen?
    Von Stefanie im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 24.05.2010, 16:41
  2. I/0 Ports ; A/D Wandler ; D/A Wandler am Laptop?
    Von jojo.glaser im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 31.05.2006, 20:15
  3. ATMega128
    Von beryllium im Forum AVR Hardwarethemen
    Antworten: 4
    Letzter Beitrag: 13.05.2005, 21:24
  4. ATmega128 und ATmega128-16AI
    Von im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 31.08.2004, 17:51
  5. ATMega128
    Von miroblaz im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 22.06.2004, 14:14

Stichworte

Berechtigungen

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