W BB jest wszystko opisane to fakt i do wczoraj myślałem że to rozumiem...
Napisałem programik coś na kształt zamka szyfrowego z możliwością zmiany kodu oraz resetu:
Tak wiem zamiast obrzydliwych delayów powinienem użyć timera - ubiegnę i wyjaśniam: zamierzam takie posunięcie ale po ukończeniu powyższego programu - tak dla porównania gabarytów kodu
Procesor Atmega32 na zestawie ATB taktowany z wewnętrznego oscylatora RC 1 MHz - (docelowo będzie to na attiny zasilane bateryjnie stąd masakryczne 1MHz)
No więc jak to ma działać:
sprzęt bardzo ubogi 1 dioda świecąca, jeden microswitch, serwo (w programie zamiast serwa na razie jest druga dioda led), na chwilę obecną podpięta biblioteka do obsługi multipleksowania LED (wzorowana na tej z BB) do celowo zniknie z projektu.
Po uruchomieniu led 1 zamiga po czym program będzie tkwił w pętli do czasu naciśnięcia przycisku (docelowo tu będzie usypianie procka a przycisk w przerwaniu)
Po naciśnięciu przycisku led 2 razy mrugnie po czym zaczyna powoli mrugać - każde mrugnięcie to inkrementacja wartości o 1 (zaczynając od zera - pierwsze mrugnięcie, 1 - drugie itd) po właściwej liczbie mrugnięć naciskamy ms , led 2 razy mrugnie i zaczyna od nowa - i tak dla 4 cyfr. Kod wskakuje do tablicy kodw[]. Kod porównywany jest z kodem w eeprom i jeśli identyczny wykonywana jest akcja czyli rusza serwo. No chyba że chcemy zmienić kod to po ostatniej cyfrze przytrzymujemy przycisk ok 5 sekund - wtedy rozpoczyna się procedura zmiany kodu czyli wprowadzamy cztery cyfry nowego po czym ponownie cztery cyfry dla sprawdzenia poprawności. Po operacji zmiany kodu akcja nie jest wykonywana.
Ostatnia opcja to reset kodu. trzymając przycisk robimy reset procesora (albo off -> on urządzenia) trzymamy 10 sekund aż led 1 zamiga 2 razy, następnie trzeba jednorazowo wprowadzić kod fabryczny czyli cztery jedynki i przepisanie z pamięci programu do ramu, a następnie z ramu do eepromu.
I teraz problemy: procedura pierwsza do wywołania akcji działa, druga do zmiany kodu też działa ale np z poziomu funkcji main wartość wprowadzona nie jest widziana - jak podpiąłem funkcje sprawdzającą aktualne wpisy w tablicy kodw[] to nadal są zera pomimo użycia funkcji pobierz_kod a przecież ta tablica nie jest później zerowana... chyba że o czymś nie wiem.
Procedura resetu nie działa - po wywołaniu przez funkcję resetu funkcji pobierz_kod to po jej działaniu tablica kodw[] nadal zawiera same zera.
Stąd moje pytanie o widoczność zmiennych. W BB jest napisane że po uruchomieniu funkcji main zmienne globalne umieszczane są w rejestrach, i teraz jeśli zostanie wywołana kolejna funkcja to operuje ona na tych samych rejestrach, czy bezpośrednio na ramie czy może znowu z ramu zmienne pakowane są do innych rejestrów...?
squeez napisał(a):
Zmienne globalne jak sama nazwa wskazuje są globalnie widoczne, wszędzie w całym programie.
no właśnie z działania powyższego programu nie do końca tak jest.
Z kolei użycie volatile dla tablic kodw[] i kodt[] wywala warningi przy operacjach kopiowania pamięci eeprom i progmem.
Zastanawiam się czy tablic nie powinno się przekazywać do funkcji jako argument... Tylko czemu to nie działa w takiej formie skoro to zmienne globalne!?