Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 25 lut 2025, o 20:31


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 
Autor Wiadomość
PostNapisane: 7 lut 2015, o 20:16 
Offline
Nowy

Dołączył(a): 07 lut 2015
Posty: 13
Pomógł: 0

Witam robię projekt tzw przełącznika akustycznego (clapper) na atmega8 i proszę o sprawdzenie poprawności kodu dalszą pomoc w programowani jesli chodzi o to jak ja to widze to że od wykrycia pierwszego klaśniecia włącza Timeout i zwiększa wartość zmiennej. Timer odejmuje od tej zmiennej co ~500ms. Jak klasniemy drugi raz to przełącza i włącza drugi Timeout żeby nie było można przez chwilę zmieniać


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 lut 2015, o 23:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

Przecież to się nie ma prawa w ogóle poprawnie skompilować...
Klamry w nieodpowiednich miejscach, kod poza jakimkolwiek blokiem funkcyjnym, brak głównej pętli programu, osierocone funkcje, zatrzymanie timer'a poprzez zmianę prescaler'a (?) i pewnie jeszcze kilka niedociągnięć, ale w takiej formie bardzo źle się to czyta.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lut 2015, o 10:37 
Offline
Nowy

Dołączył(a): 07 lut 2015
Posty: 13
Pomógł: 0

czyli jak mam wyłączyć timer bo z tego co czytałem to muszę CS02="0" CS01="0" CS00="0" lub ustawic przerwanie TIMSK |= (1<<TOIE0) ??ale chciałbym jednocześnie sprawdzić wartość adc i jesli będzie rożna od zera to wysłać cos na PB0 jak mam to zrobić ??


ee: a teraz
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lut 2015, o 20:07 
Offline
Użytkownik

Dołączył(a): 16 sty 2015
Posty: 84
Pomógł: 6

pozwolę sobie włączyć się do dyskusji,
Dlaczego wysyłasz kod który się nie kompiluje? Ty sam napisałeś ten program czy przekopiowałeś z 10 różnych miejsc części kodu?
Jak zakładam to nie masz niebieskiej książki Mirka?
oglądałeś jakiekolwiek poradniki Mirka chociaż, bo z każdego poradnika wyniósłbyś wiedzę jak się pisze funkcje i jak używa się nawiasów klamrowych...
czy to jest Twój pierwszy program w C w ogóle, bo jak na moje oko to tutaj nic się nie zgadza.

po 1 co uważasz że robi 26 linijka i kiedy?
po 2 co uważasz że robisz w funkcji timer_init bo tam się dzieje coś ciekawego
po 3 gdzie wg Ciebie kończy się funkcja timer_init ?
po 4 co robi funkcja stop_timer?
po 5 dalej nie masz pętli głównej programu bo możesz z niej wyjść w linijce 37

jeszcze wymienię linijki Twojego kodu które wg. mnie nie mają sensu (i często się nie kompilują)
34, 36, 40, 43

Mój post nie ma na celu Ciebie obrazić czy zniechęcić - wg mnie powinieneś zacząć od migania diodą, następnie zrobić miganie diodą co sekundę za pomocą przerwań na timerze, następnie zrobić program do obsługi ADC, a później połączyć te programy ze sobą i w ten sposób uzyskasz upragniony cel. Wrzucanie za to cudzego kodu w sposób totalnie bezmyślny do twojego programu na pewno Ci nie pomoże...

Jak opiszesz co się wg Ciebie dzieje we wskazanych linijkach i funkcjach o których wspomniałem to chętnie Ci pomogę, ale mam wrażenie że tutaj trzeba przede wszystkim zrozumieć podstawy C
ps. jeśli operujesz na rejestrach odpowiedzialnych za interakcje z mikroprocesorem polecam wyszukiwać nazwy w nocie i czytać co te rejestry robią.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lut 2015, o 20:23 
Offline
Nowy

Dołączył(a): 07 lut 2015
Posty: 13
Pomógł: 0

wiem ze nie chcesz mnie obrażać dopiero zaczynam zabawę z programowaniem co do świecenia diody juz to przerabiałem,książkę mam troche czytałem
a co do linijek
1.26 włączenie przerwań jesli chodzi o przerwania to odnosi sie to do wszystkich przerwań
2.ustawiam przerwanie overflow
3 przekazuje wartość rejestru przerwania do timer_start (tylko teraz sam sie zastanawiam po co )
4. ma za zadnie zatrzymać timer0 ale chyba powinienem zrobic jak napisałem wyzej
5.no właśnie myślałem ze void main(void) będzie traktowana jako główna cześć programu
a reszta linijek o których piszesz to takie klepanie linijek bez sensu



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lut 2015, o 09:48 
Offline
Użytkownik

Dołączył(a): 16 sty 2015
Posty: 84
Pomógł: 6

Jeśli masz książkę Mirka to polecam przebrnąć przez cały rozdział 4 i np projekt 5.4(Multipleksowanie LED - przerwania) - tam zrozumiesz przerwania
a następnie możesz się pokusić o dział 5.7(Pomiar napięcia za pomocą ADC) żeby zrozumieć ADC (tego działu nie czytałem jeszcze)

Ja mam kontakt z programowaniem AVR-ów od mniej wiecej 3 lat ale mimo to przerabiam książkę wg. mnie bez sensu jest żebym ja Ci podał rozwiązania bo tutaj chodzi o podstawy zrozumienia całego języka

jak już migałeś diodą to ja jeszcze bym zrobił miganie diodą na przycisk (w procesorze odczytujesz stan przycisku i ze względu na to włączasz diodę albo jedna dioda się świeci jak masz wciśnięty przycisk a druga kiedy nie masz wciśnięte) chodzi o to żebyś zrozumiał funkcję if

odnosząc się do tego co mi napisałeś
1. zgadza się jest to zezwolenie na przerwania, kluczem mojego pytania było kiedy się to wykona - wg. mnie nigdy bo program zaczyna pracę od funkcji main i robi tylko to co zostanie mu przeznaczone w tej funkcji
2. linijka 15 pozwól że zacytuję specyfikację dotyczącą rejestru TIFR
Cytuj:
TOV0: Timer/Counter0 Overflow Flag
The bit TOV0 is set (one) when an overflow occurs in Timer/Counter0. TOV0 is cleared by hardware
when executing the corresponding interrupt Handling Vector. Alternatively, TOV0 is
cleared by writing a logic one to the flag. When the SREG I-bit, TOIE0 (Timer/Counter0 Overflow
Interrupt Enable), and TOV0 are set (one), the Timer/Counter0 Overflow interrupt is executed.

czyli ustawiając TOV0 na 1 tak na prawdę powiedziałeś procesorowi że otrzymał przerwanie, jednorazowo - to jest flaga informująca o przepełnieniu
zezwolenie na przerwanie masz w rejestrze TIMSK polecam spojrzeć do specyfikacji
3. nie rozumiem w ogóle co odpisałeś, w każdym razie funkcja timer_init w ogóle się nie kończy bo nie ma nawiasu klamrowego (to powinno Ci wyrzucać masę błędów podczas kompilacji stąd nie rozumiem czemu tego wcześniej nie poprawiłeś)
4. co to jest przerwanie? książka Mirka strona podrozdział 3.6.2 (Przerwania), jeśli ustawiasz przerwanie to znaczy, że umożliwiasz żeby to przerwanie się wykonywało. Funkcją timer_stop w Twoim przypadku robisz to co powinieneś robić w timer_init... Wydaje mi się przerwania można zatrzymywać poprzez przestawienie preskalera czyli właśnie za pomocą bitów CSxx (ale nigdy z tego nie korzystałem i nie wiem jak jest zgodnie ze sztuką)
5. main jest traktowane jako główna część programu - ale trzeba rozumieć jak jest wykonywany kod
najpierw jest odczytywana i wykonywana pierwsza instrukcja z funkcji main, a potem następna i następna - wyjątek pojawia się tylko kiedy pojawia się wywołanie funkcji albo funkcje warunkowe lub pętle wtedy program jest przenoszony do jakiejś instrukcji
jak działa pętla?
  • sprawdź warunek pętli
  • wykonaj kod z wnętrza pętli
  • skocz na początek pętli
jeśli nie ma nieskończonej pętli to program pogalopuje dalej i napotka instrukcje które nie mają sensu (bo tam nic nie zostało zdefiniowane)
prawdopodobnie są na to zrobione zabezpieczenia żeby mikrokontroler nie "wylazł" poza dozwolony obszar ale na pewno nie jest to "zgodne ze sztuką"...

W Twoim własnym kodzie nigdy nie może być nawet linijki która nie wiesz jak działa! chyba że musisz to tylko mieć a nie chcesz zrozumieć ani się rozwijać
W programowaniu jest bardzo fajna metoda testu własnego oprogramowania, ja znam tą metodą pod nazwą "metoda gumowej kaczuszki" czyli stawiasz na biurku gumową kaczuszkę lub jakikolwiek inny obiekt do którego będziesz się odnosił i linijka po linijce tłumaczysz jak działa Twój program - bardzo skuteczna metoda szczególnie jak projekt ma mniej niż powiedzmy 200 linii kodu ;)

Wg. mnie najpierw zrób diodę sterowaną przyciskami np. dobrze zrozumieć rozdział 5.3 następnie zrób coś z przerwaniami czasowymi (podłącz sobie kilka diodek do procesora i przerób rozdział 5.4 używając tych diodek zamiast wyświetlaczy)
a następnie wrzuć swoje kody (szczególnie ten drugi) i pochwal się jak Ci wyszło
dopóki czegoś takiego nie zrobisz to nie ma co się porywać dalej

Taka ciekawostka nie masz nigdzie obsługi przerwania nawet w Twoim programie - także do dzieła masz minimum 100 stron do przeczytania i zrozumienia
Najbardziej kluczowe strony dla Ciebie to jest od początku rozdziału 4 do podrozdziału z makrodefinicjami włącznie. Resztę doczytaj jak najszybciej się da, ale będziesz w stanie na tej podstawie zrobić większość rzeczy

Wszystkie te rozdziały które poruszyłem są ze starego bluebooka nie wiem jak to jest w nowym ale myślę, że będziesz w stanie się połapać jeśli masz nowego
W razie pytań pisz



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lut 2015, o 19:40 
Offline
Nowy

Dołączył(a): 07 lut 2015
Posty: 13
Pomógł: 0

napisałem juz kod ale dioda nie świeci i nie wiem co jest :/
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lut 2015, o 20:54 
Offline
Użytkownik

Dołączył(a): 16 sty 2015
Posty: 84
Pomógł: 6

1. biblioteka ! pisałem Ci o tym na PW - kilka razy... a eclipse wyrzuca Ci cały czas warning na prawdę już czas to zmienić
2. nie czekasz na to aż zakończy się konwersja - zawsze po rozpoczęciu konwersji napięcia musisz odczekać na wykonanie się tej konwersji np. w pętli jak poniżej
Kod:
ADCSRA |= (1<<ADSC);
while(ADCSRA & (1<<ADSC));

tak jak Ci pisałem....
i pewnie przez to za każdym razem ADC jest równe 0 w warunku w linii 19 bo nie czekasz na koniec konwersji (nie wiem czy ADC jest zerowane po rozpoczęciu nowej konwersji czy nie)


taka podpowiedź jeszcze - jeśli będziesz wklejał losowe linijki w losowych miejscach to nie pomożesz sobie np. linijka 24 po co?
podpowiedź numer 2 - jeśli ktoś Ci pomógł to spróbuj zastosować jego porady a jeśli czegoś nie rozumiesz to pytaj zamiast ignorować - jest spora szansa że lepiej na tym wyjdziesz
podpowiedź numer 3 - wysłałem Ci w pełni działający program na PW, wydaje się że był on podobny do tego co chcesz zrobić, spróbowałeś zrozumieć jak on działa? spróbowałeś go odpalić? analiza czyjegoś kodu może okazać się pomocna przy próbach zrobienia swojego programu
podpowiedź numer 4 ostatnia - w momencie w którym nie powiesz jak Ci się wydaje że program ma działać ciężej jest go analizować być może źle pobudzasz układ??



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 mar 2015, o 17:04 
Offline
Nowy

Dołączył(a): 07 lut 2015
Posty: 13
Pomógł: 0

witam ponowie posiedziałem nad kodem do tego projektu i wszystko niby smiga jak powinno ale jest jedno ale dioda świeci tylko wtedy gdy klasnę powiedzmy przez ułamek sekundy później zaraz gaśnie i nie wiem czemu?chce by zmienił się stan na przeciwny dopiero po ponownym klaśnięciu
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 mar 2015, o 19:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 lut 2015
Posty: 26
Pomógł: 0

rekon napisał(a):
2. linijka 15 pozwól że zacytuję specyfikację dotyczącą rejestru TIFR
Cytuj:
TOV0: Timer/Counter0 Overflow Flag
The bit TOV0 is set (one) when an overflow occurs in Timer/Counter0. TOV0 is cleared by hardware
when executing the corresponding interrupt Handling Vector. Alternatively, TOV0 is
cleared by writing a logic one to the flag. When the SREG I-bit, TOIE0 (Timer/Counter0 Overflow
Interrupt Enable), and TOV0 are set (one), the Timer/Counter0 Overflow interrupt is executed.

czyli ustawiając TOV0 na 1 tak na prawdę powiedziałeś procesorowi że otrzymał przerwanie, jednorazowo - to jest flaga informująca o przepełnieniu
zezwolenie na przerwanie masz w rejestrze TIMSK polecam spojrzeć do specyfikacji


A wpisanie 1 logicznej na pozycję w rejestrze TIFR przypadkiem nie skutkuje ustawieniem na tej pozycji logicznego 0(tj. wyczyści flagę przerwania)? To wynika ze sprzętowej realizacji tego rejestru.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 mar 2015, o 09:52 
Offline
Nowy

Dołączył(a): 07 lut 2015
Posty: 13
Pomógł: 0

witam mam juz gotowy problem ale mam problem bo dioda miga tylko raz na początku a później świeci cały czas
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 mar 2015, o 16:40 
Offline
Nowy

Dołączył(a): 07 lut 2015
Posty: 13
Pomógł: 0

Witam ponownie nie zakończyłem tego projektu ale napotkałem pewien problem i nie moge sobie z nim poradzić mianowicie wszytko jest niby dobrze napisane ale dioda która powinna zaswicic sie dopiero po klaśnięciu siwci od samego początku
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO