-         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: Variablen-/Cases- und Analogwert-Problem in Bascom

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied Avatar von High Light
    Registriert seit
    21.08.2009
    Ort
    Baden Württemberg
    Beiträge
    142

    Variablen-/Cases- und Analogwert-Problem in Bascom

    Anzeige

    Hallo zusammen,

    und zwar habe ich in meinem Programm ein paar Fehler:
    - der Servo bekommt keine Wert. Vermute es liegt daran, dass ich mit
    Variablen arbeite, weil wenn ich direkt die Werte an den Servo gebe, also
    ohne Variablen, dann geht es. Könnte es sein, dass ich einen andere
    Datentyp anstelle von "WORD" nehmen muss? Wenn ja welcher???

    - das zweite Problem ist, dass die Cases auch nicht funktioneren. Hatte es
    mir so vorgestellt, dass ich die Variable Z immer um 1 erhöhe, und so von
    Case zu Case gehe. Wenn Z = 3 ist soll sie wieder auf 0 gesetzt werden.
    Und das ganze beginnt von vorn.
    Entweder es liegt hier auch wieder am Datentyp oder es geht nicht so,
    dass ich "Select Case Z " nicht schreiben kann oder darf, wenn danach
    immer "Case 1", "Case 2" oder "Case 3" aufgerufen werden soll.

    Wäre super gut, wenn ihr mir weiter helfen könntet!!!
    Wenn ihr eine Alternative habt, ist sie herzlich willkommen, nur würde ich
    gern "Waitms" vermeiden.

    Grüße High Light

    Hier noch der Code:

    Code:
    $regfile = "m48def.dat"
    $crystal = 16000000
    $baud = 9600
    
    
    'Servoeinstellungen
    Config Servos = 1 , Servo1 = Portd.6 , Reload = 10
    Servo(1) = 90
    
    Config Portd.6 = Output
    
    Enable Interrupts
    
    Dim Servostellung1 As Word
    Servostellung1 = 90
    Dim Servostellung2 As Word
    Servostellung1 = 110
    Dim Servostellung3 As Word
    Servostellung1 = 130
    
    Dim Xpos1 As Byte
    
    'StatusLED
    Config Portd.7 = Output
    Statusled Alias Portd.7
    
    'Datenausgabe
    
    Config Portd.1 = Output
    Config Portd.2 = Output
    Config Portd.3 = Output
    Config Portd.4 = Output
    
    'Analogeinstellungen
    Const Adc_multi = 0.0048828125                              ' = 5.0 / 1024.0
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    
    Start Adc
    
    Dim Messergebnis As Word
    Dim Volt As Single
    
    Messergebnis = Getadc(0)
    Volt = Messergebnis * Adc_multi
    
    
    'Arraykonfiguration
    Dim Volt_list(3) As Single
    
    'Schrittvariablen
    Dim T As Word
    Dim Z As Word
    Dim Z2 As Word
    Z = 0
    T = 0
    
    'Timer
    Config Timer1 = Timer , Prescale = 256                      'Konfiguriere Timer1
    Enable Timer1                                               'schalte den Timer1 ein
    On Timer1 Isr_von_timer1                                    'verzweige bei Timer1 überlauf zu   Isr_von_Timer1
    Timer1 = 3035                                               'Timer1 soll schon von 3035 wegzählen
    
    
    Do
    
    Statusled = 1
    
    
    If T = 1 Then
       Select Case Z
    
       'Servostellung 1
       Case 1:
    
         Servo(1) = Servostellung 1
       T = 0
    
       'Servostellung 2
       Case 2:
    
         Servo(1) = Servostellung 2
        T = 0
    
       'Servostellung 3
       Case 3:
    
         Servo(1) = Servostellung 3
        T = 0
    
       End Select
    End If
    
    Loop
    
    End
    
    
    Isr_von_timer1:                                             'ISR von Timer1
    Timer1 = 3035
    
    If Z >= 3 Then
    Z = 0
    End If
    
    Z = Z2
    Z = Z2 + 1
    T = 1
    
    Return

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    Wo kriegt Z2 seinen Wert her?
    In der ISR wird Z immer mit dem Wert von Z2 überschrieben. D.h. es wird immer der gleiche Case durchlaufen; Z2 wird wahrscheinlich 0 sein, d.h. Z ist immer 1.
    #ifndef MfG
    #define MfG

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied Avatar von High Light
    Registriert seit
    21.08.2009
    Ort
    Baden Württemberg
    Beiträge
    142
    Ach so :-D ich seh den Fehler ich hatte geschrieben:
    Z = Z2
    Z = Z2 + 1

    und eigentlich müsste es ja so heißen:
    Z2 = Z
    Z = Z2 + 1

    Probier ich gleich mal aus, dankeschön!!!
    Was meinst du wegen den Variablen für den Servowert?

    Grüße High Light

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Bascom arbeitet bei Servos mit Bytes,
    http://www.rn-wissen.de/index.php/Ba...ide-Code#SERVO
    d.h. du solltest für die Servovariablen auch nur bytes verwenden

    Dann kannst du die Sache einfacher machen:
    Im Prinzip wird das Servo immer durch den Timer auf drei verschiedene werte gestellt ( Z ), die aber festgelegt sind.
    da kannst du Z gleich als Index für eine Tabelle verwenden und dir das Select ersparen (allerdings geht Z dann nichtmehr 1-3 sondern von 0-2)
    Also, reduziert auf das Servo-handling:
    Code:
    $regfile = "m48def.dat" 
    $crystal = 16000000 
    $baud = 9600 
    
    'Servoeinstellungen 
    Config Servos = 1 , Servo1 = Portd.6 , Reload = 10 
    
    Servo(1) = 90 
    
    Config Portd.6 = Output 
    
    Enable Interrupts 
    
    'Schrittvariablen 
    Dim Z As BYTE 
    
    'Timer 
    Config Timer1 = Timer , Prescale = 256                      'Konfiguriere Timer1 
    Enable Timer1                                               'schalte den Timer1 ein 
    On Timer1 Isr_von_timer1                                    'verzweige bei Timer1 überlauf zu   Isr_von_Timer1 
    Timer1 = 3035                                               'Timer1 soll schon von 3035 wegzählen 
    
    
    Do 
    Statusled = 1 
    
    Loop 
    
    End 
    
    
    Isr_von_timer1:                                             'ISR von Timer1 
        Timer1 = 3035 
    
        Servo(1) = lookup ( Z,  Servo_tabelle) 
       
        INCR Z            ' Z  + 1 
    
        If Z > 2 Then 
             Z = 0 
       End If 
    
    
    Return
    
    Servo_tabelle:
      DATA  90, 110, 130       ' servo-stellungen
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied Avatar von High Light
    Registriert seit
    21.08.2009
    Ort
    Baden Württemberg
    Beiträge
    142
    Klasse, bin gerad oberglücklich!!!
    Mein Programm läuft, hab es abgeändert und dabei noch 2 bis 3 andere
    kleine Fehler gefunden.
    Vielen Dank!!!
    Morgen probier ich das ganze nach deiner Möglichkeit noch aus, mit der Tabelle.
    Als nächstes kommt jetzt dann noch eine Anlogwertauswertung dazu,
    welche in ein Array schreiben soll, ob ein bestimmter Wert überschritten
    worden ist, oder nicht.

    Danke nochmal an euch, und bis bald

    Grüße High Light

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied Avatar von High Light
    Registriert seit
    21.08.2009
    Ort
    Baden Württemberg
    Beiträge
    142
    Hallo zusammen,

    jetzt ist es soweit, dass nächste Problem,
    also der Servo fahrt nun seine Positionen an.
    Immer wenn er eine Position angefahren hat, soll
    ein Analogwert eingelesen, ausgewertet und dann
    in ein Array geschrieben werden.
    Wenn das Array mit einem bestimmten Wert beschrieben ist,
    soll ein Signalausgang geschalten werden.

    Code:
    $regfile = "m48def.dat"
    $crystal = 16000000
    $baud = 9600
    
    
    'Servoeinstellungen
    Config Servos = 1 , Servo1 = Portd.6 , Reload = 10
    Servo(1) = 90
    
    Config Portd.6 = Output
    
    Enable Interrupts
    
    Dim Servostellung1 As Byte
    Servostellung1 = 90
    Dim Servostellung2 As Byte
    Servostellung2 = 110
    Dim Servostellung3 As Byte
    Servostellung3 = 130
    
    Dim Xpos1 As Byte
    
    'StatusLED
    Config Portd.7 = Output
    Statusled Alias Portd.7
    
    'Signalausgabe
    Signal1 Alias Portd.0
    Config Signal1 = Output
    
    Signal2 Alias Portd.1
    Config Signal2 = Output
    
    Signal3 Alias Portd.2
    Config Signal3 = Output
    
    Signal4 Alias Portd.3
    Config Signal4 = Output
    
    Signal1 = 1
    Signal2 = 1
    Signal3 = 1
    Signal4 = 1
    
    'Analogeinstellungen
    Const Adc_multi = 0.0048828125                              ' = 5.0 / 1024.0
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    
    Start Adc
    
    Dim Messergebnis As Word
    Dim Volt As Single
    
    Messergebnis = Getadc(0)
    Volt = Messergebnis * Adc_multi
    
    
    'Arraykonfiguration
    Dim Volt_list(3) As Single
    
    'Schrittvariablen
    Dim T As Byte
    Dim Z As Byte
    Dim Z2 As Byte
    Z = 0
    T = 0
    
    'Timer
    Config Timer1 = Timer , Prescale = 256                      'Konfiguriere Timer1
    Enable Timer1                                               'schalte den Timer1 ein
    On Timer1 Isr_von_timer1                                    'verzweige bei Timer1 überlauf zu   Isr_von_Timer1
    Timer1 = 3035                                               'Timer1 soll schon von 3035 wegzählen
    
    
    Do
    'Statusled
    Statusled = 1
    
    'Wenn Arrayinhalt = 10 dann SignalX = 0
    If Volt_list(1) = 10 Then
    Signal3 = 0
    Elseif Volt_list(1) = 100 Then
    Signal3 = 1
    End If
    
    If Volt_list(2) = 10 Then
    Signal2 = 0
    Elseif Volt_list(2) = 100 Then
    Signal2 = 1
    End If
    
    If Volt_list(3) = 10 Then
    Signal2 = 0
    Elseif Volt_list(3) = 100 Then
    Signal2 = 1
    End If
    
    'Servo stellen und Analogwert auslesen und Arry schreiben
    If T = 1 Then
       Select Case Z
    
       'Servostellung 1
       Case 2:
    
         Servo(1) = Servostellung1
       T = 0
    
             If Volt <= 3.0 Then
             Volt_list(1) = 100
    
             Elseif Volt > 3.0 Then
             Volt_list(1) = 10
    
             End If
    
    
       'Servostellung 2
       Case 4:
    
         Servo(1) = Servostellung2
        T = 0
    
            If Volt <= 3.0 Then
            Volt_list(2) = 100
    
            Elseif Volt > 3.0 Then
            Volt_list(2) = 10
    
            End If
    
    
       'Servostellung 3
       Case 6:
    
         Servo(1) = Servostellung3
        T = 0
    
           If Volt <= 3.0 Then
           Volt_list(3) = 100
    
           Elseif Volt > 3.0 Then
           Volt_list(3) = 10
    
           End If
    
       End Select
    End If
    
    Loop
    
    End
    
    
    Isr_von_timer1:                                             'ISR von Timer1
    Timer1 = 3035
    
    If Z >= 6 Then
    Z = 0
    End If
    
    Z2 = Z
    Z = Z2 + 1
    T = 1
    
    Return
    Nur funktioniert nichts, der Portd.0 und Portd.1 reagieren gar nicht,
    auch wenn sie dierekt geschalten werden. Portd.2 und Portd.3 kann
    man direkt schalten, aber mit dem Programm funktioniert es nicht???

    Also muss zum einen ein oder mehrere Fehler im Programm sein
    und zum anderen versteh ich nicht, warum die ersten 2 Ausgänge nicht
    reagieren???
    Hat jemand eine Idee???

    Grüße High Light

  7. #7
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Bascom hat eine Eigenheit:
    Beim In/out-configurieren ist er schizophren:
    Ein ganzes Port wird definier:
    CONFIG PORTD = Output
    aber einzelne Pin als
    CONFIG PIND.0 = Output
    CONFIG PIND.1 = Output
    CONFIG PIND.2 = Output
    CONFIG PIND.3 = Output

    d.h. dein Alias kannst du zwar im programm verwenden, aber nicht zum "Output" setzen.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied Avatar von High Light
    Registriert seit
    21.08.2009
    Ort
    Baden Württemberg
    Beiträge
    142
    Ah okey, dass wusste ich nicht, bis jetzt hatte ich damit noch keine
    Probleme gehabt. Hab es aber geändert, jedoch ist alles noch wie zuvor.
    Als nächstes werde ich mal den Controller tauschen, vlt ist dieser kaputt,
    weil die 2 ersten Pins gehen immer noch nicht.
    Aber igrendwie stimmt da was mit dem Array nicht, weil an den 2
    funktionsfähigen Ausgängen ändert sich nichts, wenn sich das Analogsignal
    ändert.
    Den wenn sich dieses ändert, müsste sich ja auch der Inhalt des Arrays
    ändern?!?
    Aber wo liegt der Fehler???

  9. #9
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    SINGLES ( volt_list ) mit "=" abzufragen, klappt oft nicht.

    Du schreibst doch ohnehin keine dezimalen rein, nur 100 oder 10
    Nimm doch lieber Byte
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo High Light,
    solange du die $baud-Direktive im Programm hast, werden die Pins PIND.0 und PinD.1 als RXD und TXD für den USART verwendet. Nimm die einfach mal raus.
    In dem Teil
    If Volt_list(3) = 10 Then
    Signal2 = 0
    Elseif Volt_list(3) = 100 Then
    Signal2 = 1
    End If
    setzt du genau so wie in dem Teil davor den Ausgang Signal2. Ist das gewollt?

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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