Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj sięProśba do posiadaczy FULL wersji bascoma
Moderatorzy:Jacek Bogusz, robertw, k.pawliczak, Moderatorzy
Witam.
Piszę programik który coraz bardziej się rozrasta. Teraz ma już koło 4kB i zaczynają się dziać cuda. Nie wiem czy to moja wina czy kompilatora czy tego że DEMO nie informuje o przekroczeniu 4kB i cośtam sobie kompiluje. Jeśli problem tkwi w magicznych 4kB to kupię pełną wersję bo czas na to najwyższy, ale jeśli to BUGi to przesiadam się na C.
Dla jasności zamieszcze kod tutaj jeśli znajdzie się ktoś kto pomoże. Program nie robi na razie nic ciekawego więc jego kompilacja nie będzie miała skutków zarobkowych .
Kompilację chcę tylko przeprowadzić by sprawdzić przyczyny niepowodzenia.
pzdr.
Michał
Piszę programik który coraz bardziej się rozrasta. Teraz ma już koło 4kB i zaczynają się dziać cuda. Nie wiem czy to moja wina czy kompilatora czy tego że DEMO nie informuje o przekroczeniu 4kB i cośtam sobie kompiluje. Jeśli problem tkwi w magicznych 4kB to kupię pełną wersję bo czas na to najwyższy, ale jeśli to BUGi to przesiadam się na C.
Dla jasności zamieszcze kod tutaj jeśli znajdzie się ktoś kto pomoże. Program nie robi na razie nic ciekawego więc jego kompilacja nie będzie miała skutków zarobkowych .
Kompilację chcę tylko przeprowadzić by sprawdzić przyczyny niepowodzenia.
pzdr.
Michał
-
- -
- Posty:58
- Rejestracja:30 lip 2005, o 00:36
- Lokalizacja:Lublin
Napisałem, że zamieszczę, JEŚLI znajdzie się ktoś kto mi skompiluje. Nie ma sensu śmiecić.Próbowałem już wiele rzeczy minimalizować w programie i wygląda na to że to kwestia właśnie tych 4kB.
Np zamiast
LCD"Podaj parametr"
pisałem
LCD "p?"
I stosowałem różne podobne sztuczki aż zszedłem z 4,4kB do ~4kB i zaczęło działać. Dla pewności chciałbym skompilować całość.
Np zamiast
LCD"Podaj parametr"
pisałem
LCD "p?"
I stosowałem różne podobne sztuczki aż zszedłem z 4,4kB do ~4kB i zaczęło działać. Dla pewności chciałbym skompilować całość.
-
- -
- Posty:58
- Rejestracja:30 lip 2005, o 00:36
- Lokalizacja:Lublin
-
- -
- Posty:58
- Rejestracja:30 lip 2005, o 00:36
- Lokalizacja:Lublin
Za parę dni będę miał pełną wersję. Swoją drogą zamówiłem od Holendrów za 79euro bez problemu, a w Polsce chcą 100euro.
Jak wam się będzie chciało to skompilujcie mi takie coś:
Jakby wyszło to ok, chociaż jak znam siebie to poprzez to poprawianie i tak zrobiłem jakieś błędy i może nie ruszyć nie tylko ze względu na 4kb.
NAjwyżej będę męczył już na swoim kompie.
Pzdr
Jak wam się będzie chciało to skompilujcie mi takie coś:
Kod: Zaznacz cały
$regfile = "m32def.dat"
$crystal = 8000000
$hwstack = 100 '32standardowo
$swstack = 100 '8standardowo
$framesize = 100 '24standardowo
Config Pind.0 = Input
Config Pind.1 = Input
Config Pind.2 = Input
Set Portd.0
Set Portd.1
Set Portd.2
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Porta.5 , Db5 = Porta.4 , Db6 = Porta.3 , Db7 = Porta.2 , E = Portc.7 , Rs = Portc.6
Cursor Off
Dim Parametr1 As Byte ,
Dim Parametr2 As Byte
Dim Menu_poz As Byte 'okresla aktualna pozycje w menu
Dim Par1_set As Bit
Dim Par2_set As Bit
Dim Praca As Bit
Dim Wstrzymano As Bit
Wait 1
Enable Interrupts
Config Int0 = Falling
Enable Int0
On Int0 Zatwierdzone
Cls
Wait 1
Upperline
Lcd "Komunikat"
Lowerline
Lcd "Powitalny"
Wait 2
Goto Menu_startowe
Menu_startowe:
Par1_set = 0
Par2_set = 0
Praca = 0
Wstrzymano = 0
Cls
Lcd "Parametr1?"
Lowerline
Lcd Parametr1 ; "%"
Menu_poz = 1
Do
Debounce Pind.0 , 0 , Wiecej_par1 , Sub
Debounce Pind.1 , 0 , Mniej_par1 , Sub
Loop Until Par1_set = 1
Cls
Upperline
Lcd "parametr2??"
Lowerline
Lcd Parametr2 , "sek"
Menu_poz = 2
Do
Debounce Pind.0 , 0 , Wiecej_par2 , Sub
Debounce Pind.1 , 0 , Mniej_par2 , Sub
Loop Until Par2_set = 1
Cls
Lcd " Grzejemy?"
Lowerline
Lcd " ENTER-START"
Menu_poz = 3
Do
Debounce Pind.0 , 0 , Wstrzymanie , Sub
Debounce Pind.1 , 0 , Wstrzymanie , Sub
If Wstrzymano = 1 Then
Goto Menu_startowe
End If
Loop Until Praca = 1
Cls
Lcd "praca"
Lowerline
Lcd "Par1=" ; Parametr1 ; " Par2=" ; Parametr2
End
Wiecej_par1:
Parametr1 = Parametr1 + 10
Cls
Lcd "parametr1?"
Lowerline
Lcd Parametr1 ; "%"
Return
Mniej_par1:
Parametr1 = Parametr1 - 10
Cls
Lcd "parametr1?"
Lowerline
Lcd Parametr1 ; "%"
Return
Wiecej_par2:
Parametr2 = Parametr2 + 10
Cls
Lcd "parametr2?"
Lowerline
Lcd Parametr2 ; "sek"
Return
Mniej_par2:
Parametr2 = Parametr2 - 10
Cls
Lcd "parametr2?"
Lowerline
Lcd Parametr2 ; "sek"
Return
Wstrzymanie:
Wstrzymano = 1
Return
Zatwierdzone:
Disable Int0
If Menu_poz = 1 Then
Par1_set = 1
End If
If Menu_poz = 2 Then
Par2_set = 1
End If
If Menu_poz = 3 Then
Praca = 1
End If
Enable Int0
Return
NAjwyżej będę męczył już na swoim kompie.
Pzdr
-
- -
- Posty:58
- Rejestracja:30 lip 2005, o 00:36
- Lokalizacja:Lublin
Skompilowało się, ale program... jest napisany w zły sposób. Za dużo tłumaczyć co nie jest poprawne - przede wszystkim brak pętli głównej programu itd.
Proponuję Ci przeczytać jakąś książkę o programowaniu uK. Do Bascoma najlepsza jest: Mikrokontrolery dla początkujących
ewentualnie: Programowanie mikrokontrolerów AVR w języku Bascom
Pierwsza jest lepsza.
W załączniku skompilowany powyższy program. Nie zajmuje nawet 2kB więc w wersji demo też skompiluje się.
Proponuję Ci przeczytać jakąś książkę o programowaniu uK. Do Bascoma najlepsza jest: Mikrokontrolery dla początkujących
ewentualnie: Programowanie mikrokontrolerów AVR w języku Bascom
Pierwsza jest lepsza.
W załączniku skompilowany powyższy program. Nie zajmuje nawet 2kB więc w wersji demo też skompiluje się.
- Załączniki
-
- Nowy folder (2).rar
- (9.77KiB)Pobrany 269 razy
Dzięki.
Chętnie posłucham co nie jest poprawne.
Jeśli chodzi o pętlę główną to po pierwsze program ten jest po to by sprawdzić konkretne zachowanie, po drugie docelowy wcale nie ma działać w pętli. Skąd taka zasada że ma być pętla główna?
Książkę mam, bo przecież nie urodziłem się z podstawową wiedzą bascomową(mam drugą).
Nie wiem jak u Ciebie zajmuje 2kB bo u mnie ponad 5kb a plik BAS 2,5kb.
Na razie to mam problem bo resetuje się na linii(tzn po naciśnięciu przycisku )
Wg mnie bez powodu...
Chętnie posłucham co nie jest poprawne.
Jeśli chodzi o pętlę główną to po pierwsze program ten jest po to by sprawdzić konkretne zachowanie, po drugie docelowy wcale nie ma działać w pętli. Skąd taka zasada że ma być pętla główna?
Książkę mam, bo przecież nie urodziłem się z podstawową wiedzą bascomową(mam drugą).
Nie wiem jak u Ciebie zajmuje 2kB bo u mnie ponad 5kb a plik BAS 2,5kb.
Na razie to mam problem bo resetuje się na linii(tzn po naciśnięciu przycisku )
Kod: Zaznacz cały
Debounce Pind.1 , 0 , Mniej_par2 , Sub
-
- -
- Posty:58
- Rejestracja:30 lip 2005, o 00:36
- Lokalizacja:Lublin
Program dochodzi do:
i co dalej? Nie wiadomo. Może się zawiesi a może będzie chodził jakoś inaczej.
Pisząc pętla główna nie mam na myśli tego, że cały program ma działać w pętli, ale nie ma być możliwości działania nieprzewidzianego.
Zrób tak:i już jest pętla główna.
Kod: Zaznacz cały
Cls
Lcd "praca"
Lowerline
Lcd "Par1=" ; Parametr1 ; " Par2=" ; Parametr2
End
Pisząc pętla główna nie mam na myśli tego, że cały program ma działać w pętli, ale nie ma być możliwości działania nieprzewidzianego.
Zrób tak:
Kod: Zaznacz cały
Cls
Lcd "praca"
Lowerline
Lcd "Par1=" ; Parametr1 ; " Par2=" ; Parametr2
Do : Loop
End
Ostatnio zmieniony 18 lis 2008, o 14:00 przez K_o_n_r_a_d, łącznie zmieniany 2 razy.
Przecież jest na końcu END.
Program się kończy i procesor nie robi nic. Zegar chodzi, nic się nie dzieje- nie można tak?
Skompilowałem u siebie i efekt ten sam jest, więc zamieniłem miejscami dwa podprogramy:
Teraz program się resetuje jak nacisnę drugi guzik. Niespodzianka...
Program się kończy i procesor nie robi nic. Zegar chodzi, nic się nie dzieje- nie można tak?
Skompilowałem u siebie i efekt ten sam jest, więc zamieniłem miejscami dwa podprogramy:
Kod: Zaznacz cały
Mniej_par2:
Parametr2 = Parametr2 - 10
Cls
Lcd "parametr2?"
Lowerline
Lcd Parametr2 ; "sek"
Return
Wiecej_par2:
Parametr2 = Parametr2 + 10
Cls
Lcd "parametr2?"
Lowerline
Lcd Parametr2 ; "sek"
Return
-
- -
- Posty:58
- Rejestracja:30 lip 2005, o 00:36
- Lokalizacja:Lublin
Aha już wiem skąd bierzesz 5kB. Sprawdzasz wielkość pliku *.hex, ale to nie o to chodzi. Plik *.hex nie jest plikiem który wgrywa się bezpośrednio do uK. Ten plik zawiera jeszcze dodatkowe dane typu sumy kontrolne. Każdy wrywany bajt do uK jest w nim zapisany jako tekst zawierający reprezentację szesnastkową każdego kolejnego bajtu programu wynikowego + sumę kontrolną.
Plik *.bin jest plikiem który się wgrywa bezpośrednio do uK.
W Bascomie jak klikniesz "Show result", w wyświetlonym raporcie masz podany rozmiar wynikowego programu
Plik *.bin jest plikiem który się wgrywa bezpośrednio do uK.
W Bascomie jak klikniesz "Show result", w wyświetlonym raporcie masz podany rozmiar wynikowego programu
Ostatnio zmieniony 18 lis 2008, o 14:13 przez K_o_n_r_a_d, łącznie zmieniany 2 razy.
Ten problem zostawiłbym na drugi plan.
Niedługo będę miał FULL i nie będize kłopotu.
Zrobiłem tak jak mówiłeś i rzeczywiście pętla coś zmienia.
Już się nie resetuje, ale w pętli wyświetlania parametru2 przy klikaniu nieszczęśliwego przycisku pojawia się wartość zero zamiast prawdziwej wartości. Jak potem wyśietlam parametr 2 to już pokazuje jego wartość prawdziwą.DZiwne
Zmieniłem
na
i znowu sie resetuje.
Poj...ane
Niedługo będę miał FULL i nie będize kłopotu.
Zrobiłem tak jak mówiłeś i rzeczywiście pętla coś zmienia.
Już się nie resetuje, ale w pętli wyświetlania parametru2 przy klikaniu nieszczęśliwego przycisku pojawia się wartość zero zamiast prawdziwej wartości. Jak potem wyśietlam parametr 2 to już pokazuje jego wartość prawdziwą.DZiwne
Zmieniłem
Kod: Zaznacz cały
Lcd Parametr2; "sek"
Kod: Zaznacz cały
Lcd Parametr2
lcd "sek"
Poj...ane
Ostatnio zmieniony 18 lis 2008, o 14:15 przez lotnick, łącznie zmieniany 1 raz.
-
- -
- Posty:58
- Rejestracja:30 lip 2005, o 00:36
- Lokalizacja:Lublin
Sprawdziłem, niby jest pętla pusta na końcu programu.
Czyli chyba faktycznie samo END powinno zapętlić program.
Program nie tyle zawiesza się co kończy pracę. Wyjście z każdej pozycji w menu zrobiłeś pod jednym przyciskiem i obsługujesz go poprzez przerwania. Wciskasz przycisk raz - program przechodzi dalej, za chwilę puszczasz przycisk i drgania styków sprawiają, że automatycznie wychodzisz ze wszystkich kolejnych pozycji menu.
Musisz to rozwiązać inaczej, lub redukować drgania styków.
Proponuję całkowicie zlikwidować przerwania i zrobić to tak samo jak zmieniasz wartości.
Kod: Zaznacz cały
CFFF RJMP PC-0x0000 Relative jump
Program nie tyle zawiesza się co kończy pracę. Wyjście z każdej pozycji w menu zrobiłeś pod jednym przyciskiem i obsługujesz go poprzez przerwania. Wciskasz przycisk raz - program przechodzi dalej, za chwilę puszczasz przycisk i drgania styków sprawiają, że automatycznie wychodzisz ze wszystkich kolejnych pozycji menu.
Musisz to rozwiązać inaczej, lub redukować drgania styków.
Proponuję całkowicie zlikwidować przerwania i zrobić to tak samo jak zmieniasz wartości.
Ale problem nie pojawia się podczas używania przycisku powodującego przerwanie tylko właśnie podczas zmiany wartości przyciskami obsługiwanymi przez DEBOUNCE.
A teraz zauważyłem jeszcze,że jak w podprogramie zmienię:
na
to wszystko chodzi ok
A teraz zauważyłem jeszcze,że jak w podprogramie zmienię:
Kod: Zaznacz cały
Lcd Parametr2 ; "sek"
Kod: Zaznacz cały
lcd"dupa"
Czasami powody bywają zaskakujące.
instrukcje wyświetlania wywaliłem do głównego programu a w podprogramie dałem tylko załączenie flagi,że zmieniono wartości zmiennych. Teraz jeśli zmienię przyciskiem wartość to zostanie ona wyświetlona dopiero po powrocie z podprogramu.
Zmieniłem też INT0 na rising. Dzięki temu eliminuję sytuację, w której po wciśnięciu INT0 (pojawia się niski poziom) i wykonaniu podprogramu przerwania użytkownik puszcza przycisk i przy drganiu styków wywołuje niechcący przerwanie.
Miałem też duże kłopoty gdy przez pomyłkę wpisałem
zamiast
-czyli zamiast średnika przecinek.
NA razie hula.
Tutaj poprawione:
Pozdrawiam,
dzięki za aktywny udział
instrukcje wyświetlania wywaliłem do głównego programu a w podprogramie dałem tylko załączenie flagi,że zmieniono wartości zmiennych. Teraz jeśli zmienię przyciskiem wartość to zostanie ona wyświetlona dopiero po powrocie z podprogramu.
Zmieniłem też INT0 na rising. Dzięki temu eliminuję sytuację, w której po wciśnięciu INT0 (pojawia się niski poziom) i wykonaniu podprogramu przerwania użytkownik puszcza przycisk i przy drganiu styków wywołuje niechcący przerwanie.
Miałem też duże kłopoty gdy przez pomyłkę wpisałem
Kod: Zaznacz cały
lcd"par1",par1
Kod: Zaznacz cały
lcd"par1";par1
NA razie hula.
Tutaj poprawione:
Kod: Zaznacz cały
$regfile = "m32def.dat"
$crystal = 8000000
$hwstack = 200 '32standardowo
$swstack = 200 '8standardowo
$framesize = 200 '24standardowo
Config Pind.0 = Input
Config Pind.1 = Input
Config Pind.2 = Input
Set Portd.0
Set Portd.1
Set Portd.2
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Porta.5 , Db5 = Porta.4 , Db6 = Porta.3 , Db7 = Porta.2 , E = Portc.7 , Rs = Portc.6
Cursor Off
Dim Parametr1 As Byte ,
Dim Parametr2 As Byte
Dim Menu_poz As Byte 'okresla aktualna pozycje w menu
Dim Par1_set As Bit
Dim Par2_set As Bit 'okresla czy zatwierdzono dane temperatury i parametr2u
Dim Praca As Bit
Dim Wstrzymano As Bit
Dim Wyswietlaj As Bit
Wait 1
Enable Interrupts
Config Int0 = Rising 'dopiero po puszczeniu przycisku bedzie przerwanie
Enable Int0
On Int0 Zatwierdzone
Config Debounce = 30
Cls
Wait 1
Upperline
Lcd "Komunikat"
Lowerline
Lcd "Powitalny"
Wait 2
Goto Menu_startowe
Menu_startowe:
Par1_set = 0
Par2_set = 0
Praca = 0
Wstrzymano = 0
Wyswietlaj = 0
Cls
Lcd "Parametr1?"
Lowerline
Lcd Parametr1 ; "%"
Menu_poz = 1
Reset Wyswietlaj
Do
Debounce Pind.0 , 0 , Wiecej_par1 , Sub
Debounce Pind.1 , 0 , Mniej_par1 , Sub
If Wyswietlaj = 1 Then
Cls
Lcd "Parametr1?"
Lowerline
Lcd Parametr1 ; "%"
End If
Reset Wyswietlaj
Loop Until Par1_set = 1
Cls
Upperline
Lcd "Parametr2?"
Lowerline
Lcd Parametr2 ; "sek"
Waitms 500
Menu_poz = 2
Reset Wyswietlaj
Do
Debounce Pind.1 , 0 , Mniej_par2 , Sub
Debounce Pind.0 , 0 , Wiecej_par2 , Sub
If Wyswietlaj = 1 Then
Cls
Lcd "Parametr2?"
Lowerline
Lcd Parametr2 ; "sek"
End If
Reset Wyswietlaj
Loop Until Par2_set = 1
Cls
Lcd " Odpalamy?"
Lowerline
Lcd " ENTER-START"
Menu_poz = 3
Do
Debounce Pind.0 , 0 , Wstrzymanie , Sub
Debounce Pind.1 , 0 , Wstrzymanie , Sub
If Wstrzymano = 1 Then
Goto Menu_startowe
End If
Loop Until Praca = 1
Cls
Lcd "praca"
Lowerline
Lcd "Par1=" ; Parametr1 ; " Par2=" ; Parametr2
Do
Loop
End
Wiecej_par1:
Parametr1 = Parametr1 + 10
Set Wyswietlaj
Return
Mniej_par1:
Parametr1 = Parametr1 - 10
Set Wyswietlaj
Return
Mniej_par2:
Parametr2 = Parametr2 - 10
Set Wyswietlaj
Return
Wiecej_par2:
Parametr2 = Parametr2 + 10
Set Wyswietlaj
Return
Wstrzymanie:
Wstrzymano = 1
Return
Zatwierdzone:
Disable Int0
Waitms 30
If Menu_poz = 1 Then
Par1_set = 1
End If
If Menu_poz = 2 Then
Par2_set = 1
End If
If Menu_poz = 3 Then
Praca = 1
End If
Enable Int0
Return
dzięki za aktywny udział
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 8 gości