Dzień dobry,
Mam problem z pewnym programem w BASCOM. Po dodaniu do pętli głównej, podprogramu powodującego wyświetlenie prostej animacji na wyświetlaczu graficznym, w czasie kompilacji pojawiają się 4 błędy o treści: Error: 221 Line: 526 Backward jump out of range [_GPIXEL[ 2110]].
Podprogram korzysta z pięciu zmiennych typu Byte. W książce M. Wiązani nie znalazłem rozwiązania. W Internecie widziałem podobny problem, jednak tam pomogła zmiana procesora na taki z większą pamięcią. Mój program zajmuje 36% pamięci Flash, więc to raczej nie jest spowodowane brakiem miejsca. Próbowałem również, zmieniać nazwę procesora w nagłówku $regfile w samym kodzie programu, jednak błędy nadal się pojawiają. Zmieniałem też zmienne na inny typ - bez rezultatu. Dodam, że gdy do procesora wgram tylko ten podprogram wtedy kompiluje się i działa bez zarzutu.
Mam jeszcze drugi problem związany z parametrem $baud. Jeśli tylko w kodzie programu napiszę np. $baud=9600 program kompiluje się, ale nie działa prawidłowo, zawiesza się. Niezależnie od wpisanej wartości jest tak samo. Natomiast jeśli usunę ten parametr z programu, wszystko jest okej. Domyślam się, że wpisywanie tego parametru w kodzie programu, nie jest konieczne, skoro jest on ustawiony w zakładce Communications w opcjach Bascoma, ale pamiętam, że kiedyś wpisywałem i wszystko działało.
Z góry dziękuje
Pozdrawiam,
[BASCOM] Backward jump out of rang, parametr Baud
-
FireIsland
- -
- Posty: 36
- Rejestracja: 07 lis 2013, 20:58
- Lokalizacja: Grybów
Pierwsza zasada jeśli prosisz o pomoc to dajesz cały kod lub na tyle zawężony żeby problem nadal występował.
Ewentualnie zapytaj pod tym linkiem:
http://wrozbita-maciej.pl/
Ewentualnie zapytaj pod tym linkiem:
http://wrozbita-maciej.pl/
-
FireIsland
- -
- Posty: 36
- Rejestracja: 07 lis 2013, 20:58
- Lokalizacja: Grybów
Powracam z problemem.
Po dodaniu kilku linijek programu odpowiedzialnych za zapis do karty SD pojawia się błąd "Backward jump out of range".
Program dokonuje obliczeń, a po zakończeniu i wciśnięciu przez użytkownika przycisku wywołany zostaje podprogram odpowiedzialny za zapis na karcie SD. Podprogram wygląda następująco:
St5 to nazwa pliku tekstowego. Zdefiniowana jako Dim St5 As String * 10, zainicjowana łańcuchem "kolory.txt".
W pliku tekstowym zapisuję trzy zmienne: R, G, B oraz słowo "Pomiar".
Deklaracja odpowiednich pinów do karty SD wygląda następująco:
Do programu głównego dołączona jest biblioteka "Config_AVR-DOS.BAS".
Mam również program z określeniem szybkości transmisji bodów parametrem $baud. Jeśli tylko wpiszę ten parametr w kod, program po kompilacji wgrywa się (nie ma żadnych błędów) ale nie działa prawidłowo - zawiesza się. Usunięcie tego parametru z programu przywraca poprawne funkcjonowanie.
Cały kod źródłowy oraz biblioteka AVR-DOS dostępna jest pod linkiem (nie mogę dodać załącznika - format .txt oraz .bas jest niedozwolony, a hiperłącze z dozwolonymi rozszerzeniami się nie uruchamia):
http://www18.zippyshare.com/v/KkNawUYs/file.html
Prosty program testowy, którego zadaniem jest zapisanie kilku zmiennych na karcie po wciśnięciu przycisku, napisany z użyciem tej samej biblioteki oraz wyżej pokazanych poleceń konfiguracyjnych - działa bez problemu.
Dziękuję za pomoc,
Pozdrawiam Piotr,
EDIT:
Zauważyłem, że w podprogramie dokonującym zapisu do SD usunięcie linii:
Open St5 For Append As #2
powoduje, że program się kompiluje beż żadnych błędów.
EDIT2:
Użycie któregoś z poleceń (obsługa wyświetlacza graficznego): Circle, Line, Boxfill powoduje wygenerowanie błędu Backward jump out of range.
Po skomentowaniu ich wszystkich program kompiluje się bez problemów.
Polecenie Lcdat nie powoduje błędów i może być używane.
W odniesieniu do wcześniejszego wpisu EDIT, program kompiluje się z aktywną linią:
Open St5 For Append As #2
pod warunkiem, że polecenia obsługi wyświetlacza graficznego są nieaktywne.
Domyślam się, że chodzi tutaj o kanały transmisji UART. Polecenia takie jak Print (Lcdat pewnie też) korzystają z automatycznie otwieranego kanału COM1. Instrukcje obsługi wyświetlacza graficznego (Circle, Boxfill, Line) korzystają z innego kanału transmisji. Gdy otwieram kolejny kanał (dla zapisu SD) następuje jakiś konflikt czego skutkiem jest wspomniany wcześniej błąd.
Po dodaniu kilku linijek programu odpowiedzialnych za zapis do karty SD pojawia się błąd "Backward jump out of range".
Program dokonuje obliczeń, a po zakończeniu i wciśnięciu przez użytkownika przycisku wywołany zostaje podprogram odpowiedzialny za zapis na karcie SD. Podprogram wygląda następująco:
Kod: Zaznacz cały
Zapis_sd:
Gbdriveerror = Driveinit()
B_err = Initfilesystem(1)
If B_err = 0 Then
Lcdat 1 , 1 , "SD-record"
Waitms 300
Open St5 For Append As #2
Write #2 , R , G , B
Write #2 , "Pomiar"
Flush #2
Close #2
Else
Lcdat 5 , 1 , "SD-err"
Waitms 300
End If
Return
W pliku tekstowym zapisuję trzy zmienne: R, G, B oraz słowo "Pomiar".
Deklaracja odpowiednich pinów do karty SD wygląda następująco:
Kod: Zaznacz cały
Const Cmmc_soft = 0 'SPI HARDWARE
'define Chip-Select Pin
Config Pinb.3 = Output ' define here Pin for CS of MMC/SD Card
Mmc_cs Alias Portb.3
Set Mmc_cs
'Define here SS Pin of HW-SPI of the CPU (f.e. Pinb.0 on M128)
Config Pinb.4 = Output ' define here Pin of SPI SS 'b7 (old)
Spi_ss Alias Portb.4
Set Spi_ss ' Set SPI-SS to Output and High por Proper work of
' SPI as Master
'HW-SPI is configured to highest Speed
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 4 , Noss = 1 'Config Spi = Soft , Din = Pinb.3 , Dout = Portb.2 , Ss = Portb.0 , Clock = Portb.1
Spsr.0 = 1 ' Double speed on ATMega128
Spiinit ' Init SPI
Const Cperrdrivereset = 225 ' Error response Byte at Reset command
Const Cperrdriveinit = 226 ' Error response Byte at Init Command
Const Cperrdrivereadcommand = 227 ' Error response Byte at Read Command
Const Cperrdrivewritecommand = 228 ' Error response Byte at Write Command
Const Cperrdrivereadresponse = 229 ' No Data response Byte from MMC at Read
Const Cperrdrivewriteresponse = 230 ' No Data response Byte from MMC at Write
Const Cperrdrive = 231
Const Cperrdrivenotsupported = 232 ' return code for DriveGetIdentity, not supported yet
Waitms 700
Dim Gbdriveerror As Byte ' General Driver Error register
Dim Gbdriveerrorreg As Byte ' Driver load Error-Register of HD in case of error
Dim Gbdrivestatusreg As Byte ' Driver load Status-Register of HD on case of error
Dim Gbdrivedebug As Byte
$lib "MMC.LIB" ' link driver library
$external _mmc
Gbdriveerror = Driveinit()
B_err = Initfilesystem(1)
Mam również program z określeniem szybkości transmisji bodów parametrem $baud. Jeśli tylko wpiszę ten parametr w kod, program po kompilacji wgrywa się (nie ma żadnych błędów) ale nie działa prawidłowo - zawiesza się. Usunięcie tego parametru z programu przywraca poprawne funkcjonowanie.
Cały kod źródłowy oraz biblioteka AVR-DOS dostępna jest pod linkiem (nie mogę dodać załącznika - format .txt oraz .bas jest niedozwolony, a hiperłącze z dozwolonymi rozszerzeniami się nie uruchamia):
http://www18.zippyshare.com/v/KkNawUYs/file.html
Prosty program testowy, którego zadaniem jest zapisanie kilku zmiennych na karcie po wciśnięciu przycisku, napisany z użyciem tej samej biblioteki oraz wyżej pokazanych poleceń konfiguracyjnych - działa bez problemu.
Dziękuję za pomoc,
Pozdrawiam Piotr,
EDIT:
Zauważyłem, że w podprogramie dokonującym zapisu do SD usunięcie linii:
Open St5 For Append As #2
powoduje, że program się kompiluje beż żadnych błędów.
EDIT2:
Użycie któregoś z poleceń (obsługa wyświetlacza graficznego): Circle, Line, Boxfill powoduje wygenerowanie błędu Backward jump out of range.
Po skomentowaniu ich wszystkich program kompiluje się bez problemów.
Polecenie Lcdat nie powoduje błędów i może być używane.
W odniesieniu do wcześniejszego wpisu EDIT, program kompiluje się z aktywną linią:
Open St5 For Append As #2
pod warunkiem, że polecenia obsługi wyświetlacza graficznego są nieaktywne.
Domyślam się, że chodzi tutaj o kanały transmisji UART. Polecenia takie jak Print (Lcdat pewnie też) korzystają z automatycznie otwieranego kanału COM1. Instrukcje obsługi wyświetlacza graficznego (Circle, Boxfill, Line) korzystają z innego kanału transmisji. Gdy otwieram kolejny kanał (dla zapisu SD) następuje jakiś konflikt czego skutkiem jest wspomniany wcześniej błąd.