logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Rozwiązano] Błędy kompilacji w BASCOM AVR - analiza kodu woltomierza i amperomierza

darex120 05 Mar 2025 07:52 303 4
REKLAMA
  • #1 21466696
    darex120
    Poziom 18  
    Posty: 1106
    Pomógł: 1
    Ocena: 61
    Program napisany w BASCOM AVR i wyskakujące 3 błędy , mogę wiedzieć dlaczego one wyskakują podczas kompilacji , poniżej zamieszczam kodzik.

    
    
    'podwójny woltomierz i amperomierz (dwa kanały pomiaru napięcia i dwa kanały pomiaru prądu
    
    'UWAGA _ PONOWNE WGRANIE PROGRAMU SKASUJE WARTOŚCI WSP KOREKCJI Z PAMIECI EPROM
    '---------------------------------------------------------------------------------
    
    
    $regfile = "m8def.dat"                                      'definicja procesora
    $crystal = 1000000                                          'czestotliwosc pracy
    
    'definicja portów wejściowych
    Config Pind.7 = Input
    Config Pinb.0 = Input
    
    'podciąganie wejść do +
    Portd.7 = 1
    Portb.0 = 1
    
    'definicja podłączenia LCD
    Config Lcdpin = Pin , Db4 = Portd.3 , Db5 = Portd.2 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portd.4 , Rs = Portd.6
    Config Lcd = 16 * 2
    
    'definicja i uruchomienie przewtornika AD
    Config Adc = Single , Prescaler = Auto , Reference = Internal
    Start Adc
    
    
    'deklaracja timera służącego do odczytu stanu ADC i jego przeliczenia
    'Config Timer1 = Timer , Prescale = 64
    'On Timer1 Timerek                                           'ustawienie procedury przerwania
    'Enable Timer1                                               'włączenie timera
    
    'Enable Interrupts                                           'włączenie przerwań
    'Timer1 = 50285                                              '50285 było
    
    
    'deklaracja procedur i zmiennych
    Declare Sub Menu
    
    Dim I As Word
    Dim J As Word
    Dim Ii As Word
    
    
    Dim U1 As Word
    Dim U2 As Word
    Dim I1 As Word
    Dim I2 As Word
    
    Dim U1_suma(50) As Integer
    Dim U2_suma(50) As Integer
    Dim I1_suma(50) As Integer
    Dim I2_suma(50) As Integer
    Dim Temp As Integer
    
    Dim Wu1 As Single
    Dim Wu2 As Single
    Dim Wi1 As Single
    Dim Wi2 As Single
    
    Dim Ewu1 As Eram Single
    Dim Ewu2 As Eram Single
    Dim Ewi1 As Eram Single
    Dim Ewi2 As Eram Single
    
    
    Dim Nap1 As Single
    Dim Prad1 As Single
    Dim Wart_nap1 As String * 5
    Dim Wart_prad1 As String * 5
    Dim Nap2 As Single
    Dim Prad2 As Single
    Dim Wart_nap2 As String * 5
    Dim Wart_prad2 As String * 5
    
    Dim Pomiar As Byte
    Dim Pomiar_1 As Byte
    Dim Pom As Byte
    Dim W As Byte
    
    Dim S As String * 4
    
    'odczytanie z pamieci EEPROM mnożników
       'Wu1, Wi1, Wu2, Wi2
    
    Wu1 = Ewu1
    Wu2 = Ewu2
    Wi1 = Ewi1
    Wi2 = Ewi2
    
    'sprawdzenie czy eeprom nie jest pusty (wykonywane tylko przy pierwszym uruchomieniu układu
    If Wu1 > 0 Then
       Wu1 = Wu1
       Else
       Wu1 = 0.04848
       End If
    If Wu2 > 0 Then
       Wu2 = Wu2
       Else
       Wu2 = 0.05026
       End If
    If Wi1 > 0 Then
       Wi1 = Wi1
       Else
       Wi1 = 0.004882
       End If
    If Wi2 > 0 Then
       Wi2 = Wi2
       Else
       Wi2 = 0.004882
       End If
    
    
    Cls
    Cursor Noblink
    Cursor Off
    
    'wartości początkowe zmiennych
    Pomiar = 0
    Wart_nap1 = "0.00"
    Wart_nap2 = "0.00"
    Wart_prad1 = "0.00"
    Wart_prad2 = "0.00"
    
    
    '--------------------------------PROGRAM-------------------------
    Do
    
    Debounce Pind.7 , 0 , Menu , Sub
    
    If Pomiar <> 0 Then
       'Disable Timer1
       Cls
       Pomiar_1 = Pomiar - 1
       Lcd Lookupstr(pomiar_1 , D_menu)
    
       Pom = Pomiar
    
       Do
       Debounce Pind.7 , 0 , Menu , Sub
       Select Case Pomiar
         Case 1 :
          Debounce Pinb.0 , 0 , Dodaj_u1 , Sub
          Locate 2 , 1
          Lcd Fusing(wu1 , "#.#####")
    
         Case 2 :
          Debounce Pinb.0 , 0 , Odejmij_u1 , Sub
          Locate 2 , 1
          Lcd Fusing(wu1 , "#.#####")
    
         Case 3 :
          Debounce Pinb.0 , 0 , Dodaj_u2 , Sub
          Locate 2 , 1
          Lcd Fusing(wu2 , "#.#####")
    
         Case 4 :
          Debounce Pinb.0 , 0 , Odejmij_u2 , Sub
          Locate 2 , 1
          Lcd Fusing(wu2 , "#.#####")
    
         Case 5 :
          Debounce Pinb.0 , 0 , Dodaj_i1 , Sub
          Locate 2 , 1
          Lcd Fusing(wi1 , "#.#####")
    
         Case 6 :
          Debounce Pinb.0 , 0 , Odejmij_i1 , Sub
          Locate 2 , 1
          Lcd Fusing(wi1 , "#.#####")
    
         Case 7 :
          Debounce Pinb.0 , 0 , Dodaj_i2 , Sub
          Locate 2 , 1
          Lcd Fusing(wi2 , "#.#####")
    
         Case 8 :
          Debounce Pinb.0 , 0 , Odejmij_i2 , Sub
          Locate 2 , 1
          Lcd Fusing(wi2 , "#.#####")
       End Select
       Locate 2 , 1
       Loop Until Pom <> Pomiar
    
    Cls
    End If
    
    '50 pomiarów i wybranie mediany dla 4 wejść przetwornika
    For I = 1 To 50
       U1_suma(i) = Getadc(0)
       Next
    For I = 1 To 50
          Ii = I + 1
       For J = Ii To 51
          If U1_suma(i) > U1_suma(j) Then
             Temp = U1_suma(j)
             U1_suma(j) = U1_suma(i)
             U1_suma(i) = Temp
          End If
     Next I
     Next J
    U1 = U1_suma(25)
    Nap1 = Wu1 * U1
    
    
    For I = 1 To 50
       U2_suma(i) = Getadc(1)
       Next
    For I = 1 To 50
          Ii = I + 1
       For J = Ii To 51
          If U2_suma(i) > U2_suma(j) Then
             Temp = U2_suma(j)
             U2_suma(j) = U2_suma(i)
             U2_suma(i) = Temp
          End If
       Next I
    Next J
    U2 = U2_suma(25)
    Nap2 = Wu2 * U2
    
    For I = 1 To 50
       I1_suma(i) = Getadc(2)
       Next
    For I = 1 To 50
          Ii = I + 1
       For J = Ii To 51
          If I1_suma(i) > I1_suma(j) Then
             Temp = I1_suma(j)
             I1_suma(j) = I1_suma(i)
             I1_suma(i) = Temp
          End If
       Next I
    Next J
    I1 = I1_suma(25)
    If I1 = 1 Then I1 = 0                                       'korekta szumów wzmacniacza POPRAWIC! bo wychodzi minus 0
    If I1 = 2 Then I1 = 0
    
    Prad1 = Wi1 * I1
    
    
    
    For I = 1 To 50
       I2_suma(i) = Getadc(3)
       Next
    For I = 1 To 50
          Ii = I + 1
       For J = Ii To 51
          If I2_suma(i) > I2_suma(j) Then
             Temp = I2_suma(j)
             I2_suma(j) = I2_suma(i)
             I2_suma(i) = Temp
          End If
       Next I
    Next J
    I2 = I2_suma(25)
    Prad2 = Wi2 * I2
    Prad2 = 5 - Prad2                                           'odwrócenie wyświetlania
       'przeliczenie wartości binarnej na napięcie rzeczywiste
    
    
       'ograniczenie ilości wyświetlanych znaków (do dwóch po przecinku)
       Wart_nap1 = Fusing(nap1 , "#.##")
       Wart_prad1 = Fusing(prad1 , "#.##")
       Wart_nap2 = Fusing(nap2 , "#.##")
       Wart_prad2 = Fusing(prad2 , "#.##")
    
    
    
    'wyswietlanie na LCD wartości mierzonych (poza menu)
    If Pomiar = 0 Then
       Locate 1 , 1
       S = Format(wart_nap1 , " 0000")
       Lcd S
       Lcd " V "
       Locate 2 , 2
       Lcd Wart_prad1
       Lcd " A "
    
       Locate 1 , 10
       S = Format(wart_nap2 , " 0000")
       Lcd S
       Lcd " V "
       Locate 2 , 11
       Lcd Wart_prad2
       Lcd " A "
    End If
    
    Loop
    End
    '------------------------------------------------------------------------------
    
    
    Dodaj_u1:
       Wu1 = Wu1 + 0.00001
       Locate 2 , 1
       Lcd Fusing(wu1 , "#.#####")
       Waitms 100
       If Pinb.0 = 0 Then Goto Dodaj_u1
    Return
    
    Odejmij_u1:
       Wu1 = Wu1 - 0.00001
       Locate 2 , 1
       Lcd Fusing(wu1 , "#.#####")
       Waitms 100
       If Pinb.0 = 0 Then Goto Odejmij_u1
    Return
    
    Dodaj_u2:
       Wu2 = Wu2 + 0.00001
       Locate 2 , 1
       Lcd Fusing(wu2 , "#.#####")
       Waitms 100
       If Pinb.0 = 0 Then Goto Dodaj_u2
    Return
    
    Odejmij_u2:
       Wu2 = Wu2 - 0.00001
       Locate 2 , 1
       Lcd Fusing(wu2 , "#.#####")
       Waitms 100
       If Pinb.0 = 0 Then Goto Odejmij_u2
    Return
    
    Dodaj_i1:
       Wi1 = Wi1 + 0.00001
       Locate 2 , 1
       Lcd Fusing(wi1 , "#.#####")
       Waitms 100
       If Pinb.0 = 0 Then Goto Dodaj_i1
    Return
    
    Odejmij_i1:
       Wi1 = Wi1 - 0.00001
       Locate 2 , 1
       Lcd Fusing(wi1 , "#.#####")
       Waitms 100
       If Pinb.0 = 0 Then Goto Odejmij_i1
    Return
    
    Dodaj_i2:
       Wi2 = Wi2 + 0.00001
       Locate 2 , 1
       Lcd Fusing(wi2 , "#.#####")
       Waitms 100
       If Pinb.0 = 0 Then Goto Dodaj_i2
    Return
    
    Odejmij_i2:
       Wi2 = Wi2 - 0.00001
       Locate 2 , 1
       Lcd Fusing(wi2 , "#.#####")
       Waitms 100
       If Pinb.0 = 0 Then Goto Odejmij_i2
    Return
    
    
    Sub Menu
       If Pomiar = 0 Then
          Waitms 1000
                If Pind.7 = 0 Then
                   Incr Pomiar
                   End If
       Else
       Incr Pomiar
       End If
    
    
    If Pomiar = 9 Then
       Pomiar = 0
       Cls
       Lcd "  ZAPISYWANIE"
       'zapisanie do pamieci
       'Wu1, Wi1, Wu2, Wi2
       Ewu1 = Wu1
       Ewu2 = Wu2
       Ewi1 = Wi1
       Ewi2 = Wi2
       Wait 1
       End If
    
    End Sub
    
    D_menu:
    Data "Korekta + wsp.U1" , "Korekta - wsp.U1" , "Korekta + wsp.U2" , "Korekta - wsp.U2" , "Korekta + wsp.I1" , "Korekta - wsp.I1" , "Korekta + wsp.I2" , "Korekta - wsp.I2"
    
    
  • REKLAMA
  • Pomocny post
    #2 21466710
    Kuniarz
    Moderator Projektowanie
    Posty: 4520
    Pomógł: 371
    Ocena: 825
    Co to za błędy, albo co wskazuje kompilator ?

    Dodano po 1 [sekundy]:

    Co to za błędy, albo co wskazuje kompilator ?
    Pomogłem? Kup mi kawę.
  • REKLAMA
  • Pomocny post
    #3 21466711
    bart-projects
    Poziom 30  
    Posty: 836
    Pomógł: 200
    Ocena: 260
    W Bascom można najpierw uruchomić funkcję Edit -> Proper Indent i to ułoży ładnie kod z wcięciami.
    Potem w ustawieniach włączyć Configuration -> Environment -> Draw Indention Lines i to połączy pionowymi liniami wszystkie pętle Do-Loop, For-Next etc.

    Czytasz błędy :
    Cytat:
    Error : 382 Line : 201 variable does not match FOR [I]
    Error : 382 Line : 202 variable does not match FOR [J]
    Error : 124 Line : 202 LOOP expected


    Patrzysz na kod w linii błedu :

    Kod programu w Bascom z podświetloną linią błędu związaną z niewłaściwym użyciem zmiennej w pętli Next I/J.

    I chyba jasnym się staje że dla dla "For I = 1 To 50" na dole ma być Next I a nie Next J a dalej dla "For J" na dole ma być Next J a nie Next I

    Ogólnie przy tych Next to te nazwy zmiennych I i J mozesz sobie darować bo Bascom i tak wie dla której zmiennej to jest Next, ale jak chcesz zostawić to muszisz literki przy Next`ach zamienić miejscami.

    Ten sam błąd jeszcze się tam kika razy powtarza, ale jak usuniesz literki przy słowach Next to się kompiluje i ma 74% zajętości flash.
  • REKLAMA
  • #4 21466718
    darex120
    Poziom 18  
    Posty: 1106
    Pomógł: 1
    Ocena: 61
    Genialnie dziękuje za pomoc wszystko poszło bez żadnych błędów. Jeszcze raz dzięki temat zamykam.
  • #5 21466719
    darex120
    Poziom 18  
    Posty: 1106
    Pomógł: 1
    Ocena: 61
    Problem rozwiązany dzięki pomocy kolegów. Dzięki.
REKLAMA