- Akku Tests und Balkonkraftwerk Speicher         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 25

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

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

    LiFePo4 Akku selber bauen - Video
    Jap so etwas hatte ich mir inziwschen fast gedacht, dass die Pins
    nicht funktionieren wegen einem Fehler im Programm.
    Hatte das ganze Ding schon zerlegt, Controller getauscht,
    Verbindungskabel überprüft, Fehler auf Leiterplatte gesucht...
    Danke, für den Tipp
    Das mit dem Signal2 ist ein Fehler durchs Kopieren, wurde auch geändert.
    Singel wurde auch auf Byte geändert!

    Und siehe da es geht schon mehr:
    - Alle 4 Signale funktionieren (auch wenn ich nur 3 brauche)
    - Jetzt ist es so, dass mit den ersten 3 Bewegungen, jeweils ein weiteres
    Signal kommt. Nach der dritten Servobewegung ändert sich an den Signalen
    nichts mehr. Alle 3 Signal sind dann da.
    - Die Signale kommen egal was für ein Analogwert vorhanden ist.

    Bin mir nur nicht sicher wo der Fehler liegt, so wie ich es gerad sehe,
    schreibt er immer die 10 in die Arrays, egal was für ein Analogwert
    ansteht.
    Seh aber auch keinen Fehler im Programm, bei den Vergleichen oder beim Array beschreiben?!?
    Irgendwie sollt ich sehen was in die Arrays geschrieben wird, wenn ein bestimmter Analogwert ansteht.
    Ich weiß nicht mehr weiter...

    Grüße High Light

    P.s.: Hier noch das neue Programm:


    Code:
    $regfile = "m48def.dat"
    $crystal = 16000000
    
    
    
    '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 Pind.7 = Output
    Statusled Alias Pind.7
    
    'Signalausgabe
    
    Config Pind.0 = Output
    Signal1 Alias Pind.0
    
    Config Pind.1 = Output
    Signal2 Alias Pind.1
    
    Config Pind.2 = Output
    Signal3 Alias Pind.2
    
    Config Pind.3 = Output
    Signal4 Alias Pind.3
    
    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 Byte
    
    '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
    Signal1 = 0
    Elseif Volt_list(3) = 100 Then
    Signal1 = 1
    End If
    
    'Servo stellen und Analogwert auslesen und Array schreiben
    If T = 1 Then
       Select Case Z
    
       'Servostellung 1
       Case 2:
    
         Servo(1) = Servostellung1
       T = 0
    
             If Volt <= 4.2 Then
             Volt_list(1) = 100
    
             Elseif Volt > 4.2 Then
             Volt_list(1) = 10
    
             End If
    
    
       'Servostellung 2
       Case 4:
    
         Servo(1) = Servostellung2
        T = 0
    
            If Volt <= 4.2 Then
            Volt_list(2) = 100
    
            Elseif Volt > 4.2 Then
            Volt_list(2) = 10
    
            End If
    
    
       'Servostellung 3
       Case 6:
    
         Servo(1) = Servostellung3
        T = 0
    
           If Volt <= 4.2 Then
           Volt_list(3) = 100
    
           Elseif Volt > 4.2 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

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

    Also am Programm liegt es meiner Vermutung nach nicht,
    hab ein altes Programm umgeschrieben, mit dem ich schon mal einen
    Analogwert eingelesen hab.
    Und meine Feststellung ist, dass im Prgramm immer der höchste Wert steht.
    Bedeutet dass er nicht mitbekommt, dass sich der Analogwert ändert.

    Nach folgendem Beispiel hab ich es angeschlossen, nur habe ich vor dem
    Messpunkt noch einen 12KOhm Widerstand drin, wenn ich den aber
    brücke ändert sich auch nichts.

    http://halvar.at/elektronik/kleiner_...dc_mit_getadc/


    Jemand eine Vermutung oder Idee???

    Gruß High Light
    __________________________________________________ _____________
    http://pe-products.jimdo.com/

  3. #13
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.01.2007
    Ort
    westliches Pannonien
    Beiträge
    123
    Hallo!

    Du machst nur eine einzige ADC-Messung.

    MfG

  4. #14
    Erfahrener Benutzer Fleißiges Mitglied Avatar von High Light
    Registriert seit
    21.08.2009
    Ort
    Baden Württemberg
    Beiträge
    142
    Ja klar, ich will ja nur an einem Punkt den Analogwert erfassen,
    oder meinst du, dass ich ihn im Programm nur einmal erfasse?

    Wenn ja wo und wie änder ich das?


    Grüße High Light

    Schöne Weihnachten euch allen und viele Geschenke!!!
    __________________________________________________ _____________
    http://pe-products.jimdo.com/

  5. #15
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Du hast den Befehl Messergebnis = Getadc(0) vor die Do-Loop-Schleife geschrieben, und deshalb wird er auch nur ein einziges mal ausgeführt! Auch wenn sich das Analogsignal ständig ändert, bleibt die Variable Messwert zunächst einmal unverändert - bis der Befehl Messwert = Getadc(0) das nächste mal ausgeführt wird. Von daher muss diese Zeile unbedingt in die Hauptschleife, wenn Du eine kontinuierliche Auswertung des Analogsignales haben möchtest!

  6. #16
    Erfahrener Benutzer Fleißiges Mitglied Avatar von High Light
    Registriert seit
    21.08.2009
    Ort
    Baden Württemberg
    Beiträge
    142
    Achso, macht Sinn! dankeschön!!!
    Probier ich gleich aus!
    Wie ist es mit der Auslastung für den Controller???
    Bringt es viel Rechenaufwand mit sich, wenn er dies kontinuierlich macht? Wenn ja sollte man es dann immer aus- und einschalten?
    __________________________________________________ _____________
    http://pe-products.jimdo.com/

  7. #17
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Hallo High Light,

    das reine Umwandeln von Analog- in Digitalsignale kostet den Controller keine Rechenleistung, weil es auf Hardware-Ebene geschieht - sozusagen im "Hintergrund". Wenn Du den AD-Converter kontinuierlich laufen lässt, bremst das das Programm definitiv nicht aus. Der Converter braucht halt ein wenig Strom, allerdings auch nicht so viel, dass davon gleich die Glühbirnen dunkler werden Aber wenn es mal auf konsequente Reduktion der Stromaufnahme ankommt, kann es durchaus sinnvoll sein den ADC nur bei Bedarf zu aktivieren - in allen anderen Fällen kann man ihn guten Gewissens durchlaufen lassen.

    Der Befehl Getadc(x), mit dem der letzte gemessene Wert des Converters ausgelesen wird, braucht laut Simulator 28 Taktzyklen. Bei 16 MHz also knapp 2 µS - das sollte keine kritische Verzögerung sein...

  8. #18
    Erfahrener Benutzer Fleißiges Mitglied Avatar von High Light
    Registriert seit
    21.08.2009
    Ort
    Baden Württemberg
    Beiträge
    142
    Alles klar, dankeschön für die klasse Unterstützung!!!

    Als nächstes werd ich mich jetzt um das Thema I2C kümmern,
    hatte schon einmal damit angefangen, aber nachdem ich es nicht
    hinbekommen hatte, hatte ich es aufgegeben.
    Schaun wir mal, wie weit ich dieses mal komme!!!
    Auf jeden Fall muss es klappen.

    Möchte, dass ich Werte vom Master an die Slaves sende, und wenn die
    Slaves einen bestimmten Wert erhalten haben, sollen sie einen Ausgang
    einschalten und mit einer Art "Ok" dem Master melden, dass sie die Daten
    bekommen haben.
    Anschließend soll dies dann noch so erweitert werden, dass der Master mit
    einer Nachricht alle Slaves Stoppen kann.

    Damit werde ich dann morgen mal anfangen, mal sehen wann ich dieses
    Mal aufgebe...noch bin ich motiviert :-D

    Habt ihr schon Erfahrung mit I2C???

    Grüße High Light

  9. #19
    Erfahrener Benutzer Fleißiges Mitglied Avatar von High Light
    Registriert seit
    21.08.2009
    Ort
    Baden Württemberg
    Beiträge
    142
    So hab mich wieder in das Thema eingearbeitet!!!
    Hatte dazu schon einmal ein Thema eröffnet,
    in dem geht es jetzt auch weiter...

    Wäre klasse wenn ihr dort Mal vorbei sehen könntet,
    vielleicht könntet ihr mir weiter helfen!!!

    Thema: I2C zwischen Atmegas 88


    Grüße High Light
    __________________________________________________ _____________
    http://pe-products.jimdo.com/

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

    Hab den Bus zum Laufen gebracht und bin richtig happy!!!

    Ich habe nun nach einigen Versuchen das erste richtige Programm
    für den Master und den Slave geschrieben. Das Master-Programm
    scheint soweit zustimmen, aber beim Slave läuft dauernd etwas schief
    und zwar funktioniert das Case 20 nicht.
    Wenn der Slave den Wert 20 erhält, soll er den Ablauf in Case 20
    durcharbeiten. Jedoch fährt er alle 3 Servos auf eine undefinierte Positon
    und mehr nicht.
    Was stimmt mit Case 20 nicht?
    Habt ihr eine Idee???

    Slave-Code:
    Code:
    $regfile = "m88def.dat"
    $crystal = 16000000
    
    
    'I2C Konfiguration
    Dim Twi_control As Byte                                     ' Controlregister lokale kopie
    Dim Twi_status As Byte
    Dim Twi_data As Byte
    
    Dim Neuesbyte As Byte                                       ' Bytemerker
    
    Declare Sub Twi_init_slave
    
    Twi_data = 0
    Call Twi_init_slave                                         ' TWI aktivieren
    
    'Servokonfiguration
    Config Portb = Output
    
    Config Servos = 3 , Servo1 = Portb.0 , Servo2 = Portb.1 , Servo3 = Portb.2 , Reload = 10
    
    Enable Interrupts
    
    Dim Xpos1 As Byte
    
    'StatusLED
    Config Portd.0 = Output
    Statusled Alias Portd.0
    Statusled = 1
    
    'Variablen
    Dim Freigabe As Byte
    Freigabe = 0
    
    ' Hauptschleife
    Do
       ' Merker zurücksetzen
        Neuesbyte = 0
    
        ' schauen ob TWINT gesetzt ist
        Twi_control = Twcr And &H80                             ' Bit7 von Controlregister
    
        If Twi_control = &H80 Then
            Twi_status = Twsr And &HF8                          ' Status
    
            ' wurde ein Byte geschickt
            If Twi_status = &H80 Or Twi_status = &H88 Then
                Twi_data = Twdr                                 ' neue Daten merken
                Neuesbyte = 1                                   ' merken das ein neues Byte da ist
            End If
    
            ' TWINT muss immer gelöscht werden, damit es auf dem Bus weiter geht
            Twcr = &B11000100                                   ' TWINT löschen, erzeugt ACK
        End If
    
    
        'Start
        If Twi_data = 10 Then
            Statusled = 0                                       ' StatusLED anschalten
            Freigabe = 1
        End If
    
        'Stop
        If Twi_data = 100 Then
            Statusled = 1                                       ' StatusLED ausschalten
            Freigabe = 0
        End If
    
        'Ablauf start
        If Freigabe = 1 Then
             Select Case Twi_data
    
             Case 20:
             Servo(1) = 100
             Servo(2) = 105
             Servo(3) = 80
    
             For Xpos1 = 100 To 103
             Servo(1) = Xpos1
             Waitms 167
             Next
    
             For Xpos1 = 103 To 106
             Servo(1) = Xpos1
             Waitms 167
    
             Next
             Servo(1) = 98
             Servo(2) = 140
             Servo(3) = 50
              Waitms 250
    
             Servo(1) = 91
             Servo(2) = 105
             Servo(3) = 80
              Waitms 250
    
             For Xpos1 = 91 To 94
             Servo(1) = Xpos1
             Waitms 167
             Next
    
             For Xpos1 = 94 To 97
             Servo(1) = Xpos1
             Waitms 167
             Next
    
             For Xpos1 = 97 To 100
             Servo(1) = Xpos1
             Waitms 167
             Next
    
    
    
             End Select
        End If
    
        Loop
    
    End
    
    
    ' Unterprogramme
    
    
    ' TWI als slave aktivieren
    Sub Twi_init_slave
        Twsr = 0                                                ' status und Prescaler auf 0
        Twdr = &HFF                                             ' default
        Twar = &HCA                                             ' Slaveadresse setzen
        Twcr = &B01000100                                       ' TWI aktivieren, ACK einschalten
    
    End Sub
    Grüße High Light
    __________________________________________________ _____________
    http://pe-products.jimdo.com/

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress