C64Power Forum
Software => Programowanie => Wątek zaczęty przez: ExciterELB w 20 Stycznia 2016, 09:35
-
Elo,
wziąłem się niedawno za programowanie. Kiedyś trzeba. Ponieważ mam proste wymagania na początek na pierwszy rzut poszła Attiny 2313.
Program napisany w BASCOM (dziecinnie proste, po 2h już kumałem o co chodzi).
Problem pojawia się po załadowaniu wsadu do uC. Nie działa tak jak powinno. Co gorsze, w symulatorze w BASCOM AVR wszystko działa jak trzeba.
Temat jest tak prosty, że nie idzie tego spieprzyć, a jednak.... Jeden przycisk ma zmieniać stany logiczne na 2 wyjściach Attiny.
Wygląda tak:
start 0 0
push 0 1
push 1 0
push 1 1
push 0 0
..i tak w kółko
w symulatorze patrzyłem na wszystkie stany logiczne i zmienną sterującą if-ami dla poszczególnych stanów i działa dokładnie tak jak w założeniu... po wgraniu do Attiny mam:
start 0 0
push 0 1
push 1 1
push 0 0
push 0 0
czy może być to kwestia fusebitów w attiny? sterowana jest zegarem wew 8MHz i żadnych więcej cudów w/g mnie tu nie trzeba robić... chyba, że się mylę??
Z moich obserwacji wychodzi, że "ona" jakby podwaja stany, czy przypisze PINB.5 = 0, potem PINB.5 =1 czy Toggle PINB.5..bez znaczenia, zachowuje się tak samo.. dla niej wychodzi mniej więcej tak
0 = 0
1 = 0
1 = 1
0 = 1
0 = 0
Ktoś coś podpowie? Już drugi dzień z tym walczę, szukam po forach, po pdf'ach, ale nie widzę nigdzie podobnego problemu.
-
Nie wiem dokładnie jak to wygląda w Bascomie, ale zwróć uwagę czy portami na pewno steruje się PINB.5 = 0. W języku C PINB odczytuje się stan portu, natomiast zmienia stan PORTB.5 = 0. Sprawdź czy masz ustawione porty jako wyjścia (rejestr DDR).
-
Są ustawione jako wyjścia. Temat sterowania portami/ pinami już przerabiałem i jest opanowany. Sterowałem już komendami SET, RESET, TOGGLE, PINX.X=0 i PINX.X=1 i żadnej różnicy w zachowaniu nie ma. Nadal zachowanie fizyczne portów nie przekłada się na wartości logiczne. Podciągnąłem też rezystory polaryzujące 4.7k do poszczególnych linii (wiem, że attiny ma wbudowane, ale tak na wszelki wypadek) i też to nie zmienia zachowania układu.
próbowałem już tak:
PIN1 i PIN2 zdefiniowany jako Bit, jako wyjście
X zdefiniowany jako Byte
X=0 - stan początkowy
do
komenda wywołująca podprogram po wciśnięciu klawisza ------to chodzi w pętli non stop do momentu wciśnięcia klawisza
loop
incr X
if X=1 then PIN1 = 1
if X=2 then PIN1 = 0
if X=3 then PIN1 = 1
if X=4 then PIN1 = 0
if X=1 then PIN2 = 0
if X=2 then PIN2 = 1
if X=3 then PIN2 = 1
if X=4 then PIN2 = 0
if X=4 then X=0
return
-
Jest jeszcze taka właściwość jak "drgania styków". Gdy robi się obsługę przycisków, trzeba o tym pamiętać i wprowadzać dodatkowe opóźnienia (kilkunasto lub kilkusetmilisekundowe), ponieważ właściwość przycisków jest taka, że jak go naciskasz to tak naprawdę program odczytuje kilka lub nawet kilkanaście zmian stanu portu podczas jednego naciśnięcia. Jeśli odczytujesz stan portu w pętli bez opóźnienia to taka właściwość nastąpi. Tylko w takim przypadku stany portów wyjściowych będziesz miał przypadkowe, bo nigdy nie wiadomo jaki będzie stan zmiennej X.
-
to nie to, jest tam komenda do obslugi odczytywania klawiszy i ustawia sie w niej czas opoznienia (przewidzieli to)... ale jeszcze raz musze przeanalizowac to co napisales odnosnie ODCZYTOW i zmiany statusow na portach.... PINX.X i PORTX.X) bo to mnie tak cos tknelo..
-
Jak nie masz debouncingu to masz nie ustalone stany na wejściu.
-
jak wodzu napisal albo debounce, albo "wait 100ms" lub timer turn on :)
$regfile = "attiny2313.dat" 'najpierw określamy typ proca
$crystal = 1000000 'definiujemy z jakim taktowaniem będzie pracował
config portb=input 'port b jako wejścia
portb=&B00000000 'wszędzie stan spoczynkowy-0
config portd=output 'pprt d jako wyjścia
portd=&B0000000 'wszędzie stan spoczynkowy-0
do 'pętla nieskończona
debounce pinb.0, 1, wlacz, sub
loop 'koniec petli
wlacz: 'etykieta
toggle portd.0 'zmień stan wyprowadzenia
return 'powrót
end 'koniec programu
see more : http://www.forbot.pl/forum/topics20/kurs-bascom-lekcja3-zaczynamy-programowac-vt1091.htm
-
W języku C PINB odczytuje się stan portu, natomiast zmienia stan PORTB.5 = 0.
i chwała Ci za to. I to był właśnie mój błąd. Przeczytałem instrukcję na szybko i zamiast ZMIENIAĆ stany portów to je odczytywałem. Gdzieś w jakimś PDF'ie przeczytałem, że sterowanie poszczególnymi PIN'ami odbywa się właśnie przez komendę PINX.X i trwale siedziałem w tym błędnym przeświadczeniu.
Teraz jest malinowo i gra gitara :) Wszystko działa tak jak chciałem :)
Wcześniej w poście pisałem z pamięci i "komenda wywołująca podprogram po wciśnięciu klawisza" - miałem na myśli właśnie debouncig, tylko nie pamiętałem jak się nazywa.
Dzięki jeszcze raz za "natchnienie".