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

Błędy w programie Bascom dla zegara RTC DS1307 na Atmega8515

pier 04 Cze 2007 13:43 2310 8
REKLAMA
  • #1 3952082
    pier
    Poziom 24  
    Posty: 2446
    Pomógł: 40
    Ocena: 1893
    Witam.
    Poniżej zamieściłem program w bascomie który właśnie pisze (jeszcze nie skończony) i mam taki oto problem:
    po sprawdzeniu składni wywala takie oto błędy:
    1.Error 7 Line: 327 IF THEN expected
    2.Error 222 Line: 327 illegal character [expected (,got"]
    3.Error 1 Line: 327 Unknown statement [.EQU not found for:PORT]
    Program to zwykły zegar z RTC DS1307 i atmega8515. Pierwszy raz próbuje użyć tego RTC. Sprawdzałem już setki razy cały program i nic nie znalazłem, zauważyłem tylko że gdy wyrzucę część programu odpowiedzialną za odczyt i zapis DS-a to błędy znikają. Linia 327 programu to ostatnia linia w której napisane jest tylko return!
    Czy mógłby ktoś bardziej doświadczony w temacie sprawdzić co jest nie tak?
    Pozdrawiam.

     
    '----KONFIGORACJA WYSWIETLACZA----.'
    Config Lcdpin = Pin , Db4 = Pa.5 , Db5 = Pa.4 , Db6 = Pa.3 , Db7 = Pa.2 , E = Pa.6 , Rs = Pa.7
    Config Lcd = 20 * 4
    
    '----KONFIGORACJA MAGISTRALI I2C I 1WIRE----.'
    Config 1wire = Pc.0
    Config Sda = Pd.6
    Config Scl = Pd.7
    
    '----DEKLARACJA PROCEDURY UZYTKOWNIKA----.'
    Declare Sub Odczyt
    Declare Sub Zapis
    
    '----PRZYPISANIE PRZYJAZNYCH NAZW----.'
    Cha Alias Pind.2
    Chb Alias Pind.0
    S1 Alias Pinb.0
    S2 Alias Pinb.1
    S3 Alias Pinb.2
    S4 Alias Pinb.3
    
    
    '----KONFIGURACJA PORTÓW----.'
    
    Portd.1 = 0
    Config Cha = Input       'wej.kanał A encodera INT0 procesora
    Config Chb = Input       'wej.kanał B encodera
    Config Pind.4 = Output   'wyjście +
    Config Pind.3 = Output   'wyjście -
    Config Portb = Input
            Portb = 11111111
    
    '----KONFIGÓRACJA PRZERWAN----.'
    Config Int0 = Falling
    
    '----DEKLARACJA ZMIENNYCH----.'
    Dim Sekunda As Byte
    Dim Minuta As Byte
    Dim Godzina As Byte
    Dim Dzientygodnia As Byte
    Dim Dzien As Byte
    Dim Miesiac As Byte
    Dim Rok As Word
    Dim Minutaspr3 As Byte
    Dim Inna As Byte
    Dim Iles As Byte
    Dim Zmienna As Byte
    
    
    On Int0 Getencoder
    Enable Interrupts
    Enable Int0
    Cls
    Locate 1 , 1
    Lcd "START"
    Wait 2
    
    Cls                      'czysc wyswietlacz.'
    I2cinit
    '----GLOWNA PETLA PROGRAMU----.'
    Do
    Call Odczyt
    Locate 1 , 1
    Lcd Dzien ; "/" ; Miesiac ; "/" ; Rok       'pokaz date.'
    Locate 2 , 1
    Lcd Godzina ; ":" ; Minuta ; ":" ; Sekunda       'pokaz czas.'
    If S1 = 0 Then
    Gosub Menu
    End If
    If S2 = 0 Then
    Gosub Fullclock
    End If
    Loop : End
    
    
    
    
    
    
    
    
    
    
    
    
    
    '######################################MENU#####################################.'
    '###############################################################################.'
    Menu:
    
    
    
    
    
    
    '######################################FULLCLOCK################################.'
    '###############################################################################.'
    Fullclock:
    Do
    If Minutaspr3 <> Minuta Then
    Cls
    Minutaspr3 = Minuta
    End If
    For Inna = 0 To 3
    
    Select Case Inna
    Case 0:
    Iles = 1
    Zmienna = Godzina / 10
    Case 1:
    Iles = 5
    Zmienna = Godzina Mod 10
    Case 2:
    Iles = 13
    Zmienna = Minuta / 10
    Case 3:
    Iles = 17
    Zmienna = Minuta Mod 10
    End Select
    
    Select Case Zmienna
    Case 0:
    Locate 1 , Iles
    Lcd Chr(0) ; Chr(6) ; Chr(6) ; Chr(1)
    Locate 2 , Iles
    Lcd Chr(5) ; "  " ; Chr(5)
    Locate 3 , Iles
    Lcd Chr(5) ; "  " ; Chr(5)
    Locate 4 , Iles
    Lcd Chr(2) ; Chr(4) ; Chr(4) ; Chr(3)
    Case 1:
    Incr Iles
    Locate 1 , Iles
    Lcd Chr(0) ; Chr(5)
    Incr Iles
    Locate 2 , Iles
    Lcd Chr(5)
    Locate 3 , Iles
    Lcd Chr(5)
    Decr Iles
    Locate 4 , Iles
    Lcd Chr(4) ; Chr(5) ; Chr(4)
    Case 2:
    Locate 1 , Iles
    Lcd Chr(0) ; Chr(6) ; Chr(6) ; Chr(1)
    Iles = Iles + 2
    Locate 2 , Iles
    Lcd Chr(0) ; Chr(3)
    Decr Iles
    Locate 3 , Iles
    Lcd Chr(0) ; Chr(3)
    Decr Iles
    Locate 4 , Iles
    Lcd Chr(0) ; Chr(7) ; Chr(4) ; Chr(4)
    Case 3:
    Locate 1 , Iles
    Lcd Chr(0) ; Chr(6) ; Chr(6) ; Chr(1)
    Incr Iles
    Locate 2 , Iles
    Lcd Chr(0) ; Chr(4) ; Chr(3)
    Locate 3 , Iles
    Lcd Chr(2) ; Chr(6) ; Chr(1)
    Decr Iles
    Locate 4 , Iles
    Lcd Chr(2) ; Chr(4) ; Chr(4) ; Chr(3)
    Case 4:
    Locate 1 , Iles
    Lcd Chr(5) ; "  " ; Chr(5)
    Locate 2 , Iles
    Lcd Chr(5) ; "  " ; Chr(5)
    Locate 3 , Iles
    Lcd Chr(2) ; Chr(6) ; Chr(6) ; Chr(5)
    Iles = Iles + 3
    Locate 4 , Iles
    Lcd Chr(5)
    Case 5:
    Locate 1 , Iles
    Lcd Chr(5) ; Chr(6) ; Chr(6) ; Chr(6)
    Locate 2 , Iles
    Lcd Chr(2) ; Chr(4) ; Chr(4) ; Chr(1)
    Iles = Iles + 3
    Locate 3 , Iles
    Lcd Chr(5)
    Iles = Iles - 3
    Locate 4 , Iles
    Lcd Chr(2) ; Chr(4) ; Chr(4) ; Chr(3)
    Case 6:
    Locate 1 , Iles
    Lcd Chr(0) ; Chr(6) ; Chr(6)
    Locate 2 , Iles
    Lcd Chr(5) ; Chr(0) ; Chr(4) ; Chr(1)
    Locate 3 , Iles
    Lcd Chr(5) ; "  " ; Chr(5)
    Locate 4 , Iles
    Lcd Chr(2) ; Chr(4) ; Chr(4) ; Chr(3)
    Case 7:
    Locate 1 , Iles
    Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(5)
    Iles = Iles + 2
    Locate 2 , Iles
    Lcd Chr(0) ; Chr(3)
    Decr Iles
    Locate 3 , Iles
    Lcd Chr(0) ; Chr(3)
    Locate 4 , Iles
    Lcd Chr(5)
    Case 8:
    Locate 1 , Iles
    Lcd Chr(0) ; Chr(6) ; Chr(6) ; Chr(1)
    Locate 2 , Iles
    Lcd Chr(2) ; Chr(4) ; Chr(4) ; Chr(3)
    Locate 3 , Iles
    Lcd Chr(0) ; Chr(6) ; Chr(6) ; Chr(1)
    Locate 4 , Iles
    Lcd Chr(2) ; Chr(4) ; Chr(4) ; Chr(3)
    Case 9:
    Locate 1 , Iles
    Lcd Chr(0) ; Chr(6) ; Chr(6) ; Chr(1)
    Locate 2 , Iles
    Lcd Chr(5) ; "  " ; Chr(5)
    Locate 3 , Iles
    Lcd Chr(2) ; Chr(6) ; Chr(3) ; Chr(5)
    Incr Iles
    Locate 4 , Iles
    Lcd Chr(4) ; Chr(4) ; Chr(3)
    End Select
    
    
    Next Inna
    If Sekunda.0 = 0 Then
    Locate 1 , 10
    Lcd Chr(0) ; Chr(1)
    Locate 2 , 10
    Lcd Chr(2) ; Chr(3)
    Locate 3 , 10
    Lcd Chr(0) ; Chr(1)
    Locate 4 , 10
    Lcd Chr(2) ; Chr(3)
    Else
    Locate 1 , 10
    Lcd "  "
    Locate 2 , 10
    Lcd "  "
    Locate 3 , 10
    Lcd "  "
    Locate 4 , 10
    Lcd "  "
    End If
    Cursor Off
    If S3 = 0 Then
    Return
    End If
    Loop : End
    
    
    
    
    
    
    
    '----PROCEDURA ODCZYTU DATY I CZASU----.'
    Sub Odczyt
    I2cstart
    I2cwbyte 208
    I2cwbyte 0
    I2cstop
    I2cstart
    I2cwbyte 209
    I2crbyte Sekunda , Ack
    I2crbyte Minuta , Ack
    I2crbyte Godzina , Ack
    I2crbyte Dzientygodnia , Ack
    I2crbyte Dzien , Ack
    I2crbyte Miesiac , Ack
    I2crbyte Rok , Nack
    I2cstop
    Sekunda = Makedec(sekunda)
    Minuta = Makedec(minuta)
    Godzina = Makedec(godzina)
    Dzientygodnia = Makedec(dzientygodnia)
    Dzien = Makedec(dzien)
    Miesiac = Makedec(miesiac)
    Rok = Makedec(rok)
    End Sub
    
    
    
    
    '----PROCEDURA ZAPISU DATY I CZASU----.'
    Sub Zapis
       Godzina = Makebcd(godzina)
       Minuta = Makebcd(minuta)
       Dzientygodnia = Makebcd(dzientygodnia)
       Dzien = Makebcd(dzien)
       Miesiac = Makebcd(miesiac)
       Rok = Makebcd(rok)
    
       I2cstart
       I2cwbyte 208
       I2cwbyte 0
       I2cwbyte Minuta
       I2cwbyte Godzina
       I2cwbyte Dzientygodnia
       I2cwbyte Dzien
       I2cwbyte Miesiac
       I2cwbyte Rok
       I2cstop
       Cls
       Locate 1 , 1
       Lcd "ZAPIS"
       Wait 2
    End Sub
    
    
    
    
    
    
    Getencoder:
    Waitus 1
    If Cha = 0 Then
    If Chb = 0 Then Set Portd.4 Else Set Portd.3
    End If
    Waitms 1
    Reset Portd.3
    Reset Portd.4
    Return
    
  • REKLAMA
  • #2 3952249
    janek1815
    Poziom 38  
    Posty: 4513
    Pomógł: 372
    Ocena: 1060
    W podprogramie Getencoder brakuje jednego END IF stad blad 7. reszty nie pomoge gdyz nie mam Bascoma.
  • REKLAMA
  • #3 3952420
    pier
    Poziom 24  
    Posty: 2446
    Pomógł: 40
    Ocena: 1893
    W podprogramie Getencoder nie brakuje end if. Pisałem że błędy znikają jeżeli usunę z programu funkcje zapisu i odczytu DS-a, lecz nie potrafię doszukać się tam błędu.
  • Pomocny post
    #4 3952489
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    pier napisał:
    Witam.
    Poniżej zamieściłem program w bascomie który właśnie pisze (jeszcze nie skończony) i mam taki oto problem:

    Twój problem , to notoryczne ignorowanie pliku pomocy Bascoma ;)
    Powiedz mi , co to ca dziwolągi przy definiowaniu :?:
    
    '----KONFIGORACJA WYSWIETLACZA----.'
    Config Lcdpin = Pin , Db4 = Pa.5 , Db5 = Pa.4 , Db6 = Pa.3 , Db7 = Pa.2 , E = Pa.6 , Rs = Pa.7
    Config Lcd = 20 * 4
    
    '----KONFIGORACJA MAGISTRALI I2C I 1WIRE----.'
    Config 1wire = Pc.0
    Config Sda = Pd.6
    Config Scl = Pd.7
    

    Pozmieniaj te udziwnienia typu Pa.4,Pc.5 , itp. ..., na Porta.4 ,Portc.5, ... i problemy znikną :D

    Piotrek
  • REKLAMA
  • #5 3952530
    karlos79
    Poziom 33  
    Posty: 1768
    Pomógł: 254
    Ocena: 76
    Witam
    Masz tak :

    Getencoder:
    Waitus 1
    If Cha = 0 Then
    If Chb = 0 Then Set Portd.4 Else Set Portd.3
    End If
    Waitms 1
    Reset Portd.3
    Reset Portd.4
    Return

    Powinno być
    Getencoder:
    Waitus 1
    If Cha = 0 Then
    If Chb = 0 Then Set Portd.4 Else Set Portd.3
    End If
    End if ' zapomniełaś o jednym "end if"
    Waitms 1
    Reset Portd.3
    Reset Portd.4
    Return

    Pozdrawiam
  • #6 3952553
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    karlos79 napisał:
    Powinno być ...

    ... tak , jak pisze w dokumentacji , czyli:
    Autor pliku pomocy do Bascoma napisał:

    The one line version of IF can be used :

    IF expression THEN statement [ ELSE statement ]

    The use of [ELSE] is optional.

    A ja dopiszę jeszcze
    If Chb = 0 Then : Set Portd.4 : Else : Set Portd.3 : End If

    Piotrek
  • #7 3952795
    pier
    Poziom 24  
    Posty: 2446
    Pomógł: 40
    Ocena: 1893
    Dzięki kolego Zumek,właśnie o te dziwolągi chodziło.
    Nie wiem dlaczego tak to zapisałem przecież to nie pierwszy mój program.
    Ale tak to bywa czasami można wpatrywać się godzinami w napisany program i nie widzi się prostego błędu.
    Przy okazji jeszcze jedno pytanko. Dlaczego Bascom pokazywał za każdym razem błąd w ostatniej lini a nie tam gdzie on naprawdę występował?
  • REKLAMA
  • #8 3954380
    karlos79
    Poziom 33  
    Posty: 1768
    Pomógł: 254
    Ocena: 76
    Witam
    Bo do ostatniej linii szukał "end if"
    Pozdrawiam
  • #9 3954823
    pier
    Poziom 24  
    Posty: 2446
    Pomógł: 40
    Ocena: 1893
    Powtarzam raz jeszcze w podprogramie Getencoder nie brakuje żadnego end if! Zmieniłem tylko to co pisał kolega Zumek (bez dodawania end if) i program śmiga.

Podsumowanie tematu

✨ Dyskusja dotyczy błędów kompilacji w programie napisanym w Bascom dla zegara RTC DS1307 na mikrokontrolerze Atmega8515. Główne błędy to: "IF THEN expected", "illegal character" oraz "Unknown statement [.EQU not found for:PORT]", pojawiające się w linii z poleceniem return. Problem okazał się związany z niepoprawną składnią w definicjach portów, gdzie zamiast poprawnych nazw typu Porta.4, Portc.5 użyto skróconych form Pa.4, Pc.0, co Bascom interpretuje jako błędne. Dodatkowo pojawiła się sugestia, że w podprogramie Getencoder może brakować instrukcji END IF, jednak autor potwierdził, że ten fragment jest poprawny i błędy znikają po usunięciu funkcji odczytu i zapisu DS1307. Wyjaśniono, że kompilator Bascom wskazuje błąd w ostatniej linii, ponieważ tam oczekuje zamknięcia wszystkich bloków warunkowych. Poprawne użycie składni Config oraz nazw portów rozwiązuje problem kompilacji.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA