- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: Problem mit AD-Wandler (TLC549) an AT-Tiny2313

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    11.03.2007
    Ort
    Allgäu
    Alter
    33
    Beiträge
    55

    Problem mit AD-Wandler (TLC549) an AT-Tiny2313

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Zu aller erst, ich bin bei Microcontrollern noch blutiger Anfänger und das ist meine erste Schaltung damit. Ich habe allerdings vorher schon mit FreeBASIC unter Linux und Windows ein bisschen programmiert, darum jetzt auch Bascom.

    Ich habe jetzt ein HD44780 Display an meinen 2313 angeschlossen (hiernach: https://www.roboternetz.de/wissen/index.php/Bascom_und_LCD's , genau wie beschrieben, nur dass es ein andere Microcontroller ist). Damit kann ich auch wunderbar anzeigen lassen, was ich will.
    Jetzt habe ich noch einen AD-Wandler TLC549 mit angeschlossen und möchte mir Spannungen anzeigen lassen.

    Jetzt das Problem. Abgeguckt habe ich hier: http://www.skilltronics.de/versuch/e...nik_pc/ad.html

    der wichtige Teil des Originalcodes in FreeBASIC/QuickBasic:
    Code:
    volt = 0
    
    OUT 1020, 2                         'Strobe an
    OUT 1020, 0                         'Strobe aus
    
    FOR leitung = 7 TO 0 STEP -1        'Der IC sendet das hoechste Bit zuerst,
                                        'darum laeuft die Schleife rueckwaerts
                                       
     ein = (INP(ba + 6) AND 16) / 16    'Daten werden ueber CTS eingelesen
     volt = volt + ein * 2 ^ leitung    'Jedes Bit bekommt seinen Dezimalwert
     OUT 1020, 1                        'Clock an
     OUT 1020, 0                        'Clock aus
    
    NEXT
    
    LOCATE 10, 14
    PRINT USING "###"; volt
    Und nun mein Code für den AT-Tiny2313:

    Code:
    $regfile = "2313def.dat"
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
    Config Lcdbus = 4
    
    Config Portb.3 = Output
    Portb.3 = 0
    Config Portb.2 = Input
    Portb.2 = 0
    Config Portb.1 = Output
    Portb.1 = 0
    
    Dim Volt As Single
    Dim Leitung As Single
    Dim Ein As Single
    
    Do
    
      Volt = 0
      Portb.3 = 1
      Portb.3 = 0
        For Leitung = 7 To 0 Step -1
        Ein = Portb.2 / 16
        Volt = Volt + Ein * 2 ^ Leitung
        Portb.1 = 1
        Portb.2 = 0
      Next
     Cls
     Locate 1 , 1
     Lcd Volt
    
    Loop
    Und hier die Fehlermeldung vom Compiler:

    http://www.imageup.de/my.php?image=bcerr.JP.76xi.jpg (tut mir leid wegen der Werbung, aber imageshack war im moment nicht zu erreichen *wunder*)

    Hier noch die jeweiligen Zeilen, die die Fehler enthalten:
    Code:
    Zeile 24:
      Ein = Portb.2 / 16
    Code:
    Zeile 25:
      Volt = Volt + Ein * 2 ^ Leitung
    Ich werd aus diesen Meldungen nicht schlau... Ich hoff' ihr könnt mir dabei helfen

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Mach's so für alle Pins:

    Config Pinb.2 = Input

    Die Zeile Ein = Portb.2 / 16 verstehe ich nicht.

    Gruß Dirk

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    11.03.2007
    Ort
    Allgäu
    Alter
    33
    Beiträge
    55
    Dann kommt die Fehlermeldung immer noch. Und ausserdem lese ich ja an PB2 die Daten vom ADC ein. Was hat das dann für einen Sinn?

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Was hat das dann für einen Sinn?
    Du hattest doch nach Kompilierungsfehlern gefragt.

    CONFIG Portb.7 = Input ist ein Syntaxfehler

    Es muss heissen:
    CONFIG Pinb.7 = Input

    Das must du bei allen Pin-Definitionen so machen.
    Dann gibt's noch:
    CONFIG PortB = Output
    Der ganze Port B wird zur Ausgabe genutzt (d.h. Pinb.0 .. 7)

    Gruß Dirk

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    11.03.2007
    Ort
    Allgäu
    Alter
    33
    Beiträge
    55

    Du hattest doch nach Kompilierungsfehlern gefragt.
    Ja, wie gesagt, die sind immer noch da.

    Ich komme damit irgendwie nicht klar, probier auch schon die ganze Zeit herum, aber das hat weder Hand noch Fuss...

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    07.03.2007
    Beiträge
    27
    Zitat Zitat von oiermann
    Ich komme damit irgendwie nicht klar, probier auch schon die ganze Zeit herum, aber das hat weder Hand noch Fuss...
    ja Bascom ist irgendwie eigen, ich blicke auch noch nicht volltändig durch, aber der Code funktioniert

    Code:
    $regfile = "2313def.dat"                                    ' specify the used micro
    $crystal = 4000000                                          ' used crystal frequency
    $hwstack = 32                                               ' default use 32 for the hardware stack
    $swstack = 10                                               ' default use 10 for the SW stack
    $framesize = 40                                             ' default use 40 for the frame space
    
    Ddrb = &HFF
    Ddrd = &H01
    
    Config Rc5 = Pind.2
    Portd.2 = 1
    
    Enable Interrupts
    
    Declare Sub Dimm_pwm
    
    Dim Address As Byte , Command As Byte
    Dim Oldaddress As Byte , Oldcommand As Byte
    
    Oldaddress = 0
    Oldcommand = 0
    
    
    
    
    '$lib"lcd4busy.lib"
    
    'define the used constants
    'I used portA for testing
    'Const _lcdport = Portb
    'Const _lcdddr = Ddrb
    'Const _lcdin = Pinb
    'Const _lcd_e = 1
    'Const _lcd_rw = 2
    'Const _lcd_rs = 3
    
    'this is like always, define the kind of LCD
    Config Lcd = 20 * 4
    'other options are 16 * 2 , 16 * 4 and 20 * 4, 20 * 2 , 16 * 1a
    
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 8
    
    
    Dim A As Byte , Count As Long
    Dim Strcount As String * 12
    
    Portb.0 = 1
    
    'and here some simple lcd code
    Cursor Off Noblink
    Cls
    Locate 1 , 1 : Lcd "17tes  "                                'display this at the top line
    Wait 1
    Locate 2 , 1 : Lcd "im LOOP LED blinkt1"
    A = Portd
    Portd = 1
    Waitms 500
    Portd = 0
    Waitms 500
    'Loop
    Locate 2 , 1 : Lcd "Waiting for RC5..."
    Count = 0
    
    Call Dimm_pwm
    
    Do
    
       Getrc5(address , Command)
       If Address < 255 Then
          Count = Count + 1
          'If Count.0 = 0 Then
          '   Compare1a = 128
          'Else
          '   Compare1a = 32
          'End If
          Strcount = Str(count)
          A = 20 - Len(strcount)
          Locate 1 , 8
          Lcd "            "
          Locate 1 , A
          Lcd Strcount
       End If
    
       Locate 3 , 1 : Lcd "Address=" ;
       Locate 4 , 1 : Lcd "Command=" ;
       If Address < 255 Then
          If Address = 54 And Command = 7 Then
             Toggle Portb.0
             Waitms 500
             Toggle Portb.0
          End If
          If Address = 7 And Command = 54 Then
             Toggle Portb.0
             Waitms 500
             Toggle Portb.0
          End If
    
          Locate 3 , 9 : Lcd Address
          If Command.7 = 1 Then
             Portd = 1 : Command.7 = 0
             Compare1a = 200
          Else
             Portd = 0
             Compare1a = 8
          End If
          Locate 4 , 9 : Lcd Command
          If Command <> Oldcommand Or Address <> Oldaddress Then
             Oldcommand = Command
             Oldaddress = Address
             Locate 2 , 1 : Lcd "                   "
             Locate 2 , 1 : Lcd "Old..."
             Locate 2 , 7 : Lcd Oldaddress ; "   ..."
             Locate 2 , 11 : Lcd Oldcommand ; "   ..."
             Locate 2 , 15 : Lcd "Wait"
             Count = 0
          End If
       Else
             Locate 3 , 9 : Lcd "   "
             Locate 4 , 9 : Lcd "   "
       End If
    Loop
    End
    
    Sub Dimm_pwm
    
    Dim I As Byte , J As Byte
    
    For I = 1 To 2
       For J = 255 To 64 Step -10
          Compare1a = J
          Waitms 10
       Next J
       Wait 1
       For J = 64 To 255 Step 10
          Compare1a = J
          Waitms 10
       Next J
       Wait 1
    Next I
    
    
    End Sub
    Problem ist die Sprache als solches

    folgendes wollte ich, gab Fehlermeldungen,

    If ((Address = 54 And Command = 7) or (Address = 7 And Command = 54 ))Then

    dieses funzt, ist aber doofer Stil

    If Address = 54 And Command = 7 Then
    Toggle Portb.0
    Waitms 500
    Toggle Portb.0
    End If
    If Address = 7 And Command = 54 Then
    Toggle Portb.0
    Waitms 500
    Toggle Portb.0
    End If

    usw.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    11.03.2007
    Ort
    Allgäu
    Alter
    33
    Beiträge
    55
    So, das compilieren hab ich nun hinbekommen und in der Hilfe auch ein bisschen gestöbert, aber das bringt mich nun auch nicht weiter.
    Mit diesem Code kommen nur 1er auf dem Display, egal ob ich am Eingang des ADC etwas anlege oder frei lasse.
    Code:
    $regfile = "2313def.dat"
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
    Config Lcdbus = 4
    
    Dim Leitung As Byte
    Dim A As Byte
    Dim Ein As Byte
    Dim Ein2 As Integer
    Dim Ein3 As Byte
    Dim Volt As Byte
    
    Dim Volt2 As Byte
    Dim Volt3 As Byte
    
    
    Do
     Portb.3 = 1
     Portb.3 = 0
      For Leitung = 7 To 0 Step -1
       If Pinb.2 = 0 Then A = 0
       If Pinb.2 = 1 Then A = 1
       Ein = A * 16
       Ein2 = Ein And 16
       Ein3 = Ein2 / 16
       Volt = Volt + Ein3
       Volt2 = Volt * 2
       Volt3 = Volt2 ^ Leitung
       Portb.1 = 1
       Portb.1 = 0
      Next
     Lcd Volt3
    Loop
    Was mir auch noch komisch vorkommt, ist soewtwas hier:
    Code:
    a = a + b 
    a2 = a * c 
    a3= a2 ^ d
    In FreeBASIC wäre das so a = a + b * c ^ d gewesen, aber wenn ich das so reinschreibe, bringt der Compiler wieder Fehlermeldungen

    //edit2:

    jar_: Ja der Dialekt ist eigen, aber dein Code hat doch hoffentlich nichts mit meinem Problem zu tun oder? Da komm ich nich mit...

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    07.03.2007
    Beiträge
    27
    Zitat Zitat von oiermann
    So, das compilieren hab ich nun hinbekommen und in der Hilfe auch ein bisschen gestöbert, aber das bringt mich nun auch nicht weiter.
    Mit diesem Code kommen nur 1er auf dem Display, egal ob ich am Eingang des ADC etwas anlege oder frei lasse.

    jar_: Ja der Dialekt ist eigen, aber dein Code hat doch hoffentlich nichts mit meinem Problem zu tun oder? Da komm ich nich mit...
    mein code hat nix mit deinem zu tun, wollte nur zeigen was als alter basic progger zu Fehlermeldungen vom Bascom führt

    zu deinem Problem, warum nicht erst mal ADC lesen und ausgeben, warum schon vorher in IF abfragen verstecken und rechnen, muss man sich nicht über Fehler wundern, ich würde erst den ADC Port mit Multimeter versehen und schaun das ich passende Digiwerte lese

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo oiermann,

    das sieht doch schon gut aus.
    Ich kenne den TLC549 nicht, aber er gibt doch nur 8 Bits beginnend mit dem MSB aus. Oder?

    Da reicht eine Schleife, wie du sie schon hast (0..7).
    Darin sind die Hauptbefehle
    SHIFT Ergebnis , LEFT , 1
    Ergebnis = Ergebnis + Eingabepin

    Ergebnis ist deine 8-Bit-Variable für das Ergebnis (0..255), Eingabepin war ja bei dir Pinb.2
    Das ist alles.

    Schau dir den Befehl SHIFT in der Bascom-Hilfe an.

    Gruß Dirk

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    11.03.2007
    Ort
    Allgäu
    Alter
    33
    Beiträge
    55
    Jar_: achsoo, ich hab' mich schon gewundert...

    Dirk: jetzt muss ich in die Schule, werd mir das heute Mittag mal ansehen. Hier ist er nocheinmal gut erklärt http://www.franksteinberg.de/SOURCE/TLC549.TXT

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

12V Akku bauen