Witajcie,
mam problem z kodem poniżej.
Chodzi o ten element:
Kod: text
Zaloguj się, aby zobaczyć kod
W takim przypadku kompilator wywala mi błąd w wierszu z Timer2 - niezadeklarowana zmienna TIMER2. To nie jest zmienna!!
A gdy zmieniam na Timer1 - wszystko jest OK. Ale dla mnie ... to całkowicie bez sensu.
Błędy w kompilatorze?
Dziękuję kolego.
Domyślam się, że to jednak wina kompilatora. Podobno w najnowszej wersji bascoma obsługa timerów również nieco kuleje.
Dzięki za potwierdzenie przypuszczeń.
Nikt tu nie dodaje "licznika".
Timer2 jest przez BASCOMa traktowane na równi z TNCT2. A przynajmniej powinno być.
Tak samo jak można napisać:
Timer2 = 100
i to nie zapisze wartości 100 do "licznika", tylko konkretnie do rejestru TCNT2.
Zgoda z atom1477, chociaż wolę przypisywać bezpośrednio rejestrowi. Niestety podstawiając w miejsce pojawiającego się błędu TNCT2 zamiast TIMER2 - też traktuje to jako zmienną = bzdury.
Faktycznie chyba ruszę C.
Zgoda z atom1477, chociaż wolę przypisywać bezpośrednio rejestrowi. Niestety podstawiając w miejsce pojawiającego się błędu TNCT2 zamiast TIMER2 - też traktuje to jako zmienną = bzdury.
Faktycznie chyba ruszę C.
Witam.
Panowie, każdy Timer jest blokiem funkcjonalnym w mikrokontrolerze i nie można go dodawać do zmiennej.
Atom napisał, iż nikt nie dodaje licznika, ale w pierwszym poście napisane:
B = B + Timer2
Uważam, iż declarowanie Timera jako zmienną jest błędem ponieważ w kodzie podlega on konfiguracji.
Panowie, każdy Timer jest blokiem funkcjonalnym w mikrokontrolerze i nie można go dodawać do zmiennej.
Ale tak jest z punktu widzenia człowieka.
Dla kompilatora "Timer" to tylko literał. Tak samo jak każdy inny tekst.
yokoon napisał:
Atom napisał, iż nikt nie dodaje licznika, ale w pierwszym poście napisane:
B = B + Timer2
jak wyżej, nie ważne co jest napisane. Człowieka to może i to kłóje w oczy ale dla BASCOMa to jest literał. I definicja. I on to przekierowuje do TNCT2.
yokoon napisał:
Uważam, iż declarowanie Timera jako zmienną jest błędem ponieważ w kodzie podlega on konfiguracji.
Nikt go nie deklaruje jako zmienną. Jedynie chce potraktować jako zmienną. Poza tym mowa o rejestrze TNCT2. I jedynie sobie go czasami nazywamy "Timer2".
Gdy równolegle z "Timer2" podajesz parametry, to kompilator to traktuje jako instrukcję kompilatora i konfiguruje konfiguruje Timer2 (jako blok peryferyjny).
Gdy jednak użyjesz tylko "Timer2" bez parametrów, i użyjesz go jak stałej bądz zmiennej, to "Timer2" zostanie zinterpretowane jako TNCT2 (rejestr).
Nie jest więc błędem używanie nazwy Timer2.
Jak już to błędem jest takie zaprojektowanie BASCOMa żeby pozwalał używać nazw w tak dziwny sposób.
Oczywiście mi też się to nie podoba i sugeruję używać nazwy TNCT2.
Ale jeżeli już mówimy o poprawności, to to co napisałem wyżej czyli użycie nazwy Timer2, też jest poprawne.
Tak, jednak w powyższym przykładzie podmiana Timer2 na nazwę rejestru nic nie zmieni - nadal będzie chciał to potraktować jako zmienną. Wpisując jednak TNCT1 zamiast 2 - wszystko jest ok. Wiem już też na pewno, że to kompilator.
Myślę, iż po sprawdzeniu sprawy dowiemy się prawdy na forum.
Wie Kolega, nie, zrobię to w ścisłej tajemnicy, tak żeby nikt się o tym nie dowiedział.
1. Podany na samym początku kod kompiluje się BEZ BŁĘDÓW w Bascomie 2.0.7.6
2. Ponadto - rozmawiamy od ATMega32, tymczasem w kodzie załączonym w 1. poście regfile podany jest dla ATMega644p - a to zupełnie inna seria procesorów
---Tu zmieniam regfile na taki dla ATMega32
3. Kompilacja nadal bez błędów
4. Brak zadeklarowanego baudrate dla UART/RS232 - dodaję deklarację dla 9600 - nie wiem jak ma to Autor ustawione u siebie w parametrach komunikacji.
5. Kompilacja bez błędów + wgranie pliku wynikowego do procesora
6. Wynik działania z konsoli:
000.000 s (timer2= 1 *256 + 168)
001.034 s (timer2= 64 *256 + 222)
002.070 s (timer2= 127 *256 + 37)
003.106 s (timer2= 190 *256 + 92)
004.141 s (timer2= 253 *256 + 146)
005.178 s (timer2= 317 *256 + 217)
006.215 s (timer2= 380 *256 + 33)
007.250 s (timer2= 443 *256 + 87)
008.286 s (timer2= 506 *256 + 141)
009.323 s (timer2= 570 *256 + 213)
010.360 s (timer2= 633 *256 + 28)
011.395 s (timer2= 696 *256 + 83)
012.431 s (timer2= 759 *256 + 139)
013.468 s (timer2= 823 *256 + 210)
014.505 s (timer2= 886 *256 + 26)
015.540 s (timer2= 949 *256 + 81)
016.576 s (timer2= 1012 *256 + 152)
017.614 s (timer2= 1076 *256 + 240)
018.652 s (timer2= 1139 *256 + 72)
019.689 s (timer2= 1202 *256 + 143)
020.726 s (timer2= 1266 *256 + 231)
7. Kod, który kompilowałem:
Kod: text
Zaloguj się, aby zobaczyć kod
8. Załączam projekt (program + pliki wynikowe), który skompilowałem BASCOM 2.0.7.6 w pełnej wersji.
9. Błędu w aktualnej wersji kompilatora BASCOM 2.0.7.6 nie stwierdzam - zapewne Autor nie dokonał jeszcze aktualizacji, którą można pobrać tutaj: http://register.mcselec.com/login.php Lub jeśli ma wersję DEMO to tu do pobrania wersja 2.0.7.5: http://www.mcselec.com/index.php?option=com_d...mp;task=doc_details&gid=139&Itemid=54 ----
Myślę, że to kończy temat. Dodam ze swojej strony, że rzeczywiście starsze wersje bascoma (ja zaczynałem od 1.11.9.8) miały sporo błędów związanych z Timerem, ale Mark Alberts po raportach je naprawił.
Ponadto - wartowałoby zaznaczyć, że Autor tematu nie jest autorem tego kodu...
To czy ktoś się nauczy czy nie to już indywidualna sprawa każdego z osobna - nie mogę oceniać Twoich umiejętności nie znając Cię...
A Bascom, jak sam widzisz, jest naszpikowany błędami. Jedne znikają, inne się pojawiają...
Ba, raz nawet program kompilowany w 1.11.9.8 nie działał po kompilacji 2.0.7.6 - trzeba było modyfikować logikę, mimo poprawnej kompilacji...
Tak kolego piotrva, nie jestem jego autorem - powinienem zaznaczyć, przepraszam. Kod pochodzi z kursu Bascoma And-Tech.
Cytat:
2. Ponadto - rozmawiamy od ATMega32, tymczasem w kodzie załączonym w 1. poście regfile podany jest dla ATMega644p - a to zupełnie inna seria procesorów
Pierwotnie miałem ustawione poprawnie na A32 - tutaj przypadkiem usunąłem nie ten koment - jest ok.
Baudrate ... faktycznie inicjuje uart, a w kodach And-Tech zwykle nie występuje, w tym także nie.