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



Teraz jest 11 gru 2024, o 08:35


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 
Autor Wiadomość
PostNapisane: 5 gru 2012, o 20:44 
Offline
Nowy

Dołączył(a): 05 gru 2012
Posty: 4
Pomógł: 0

Jako, że jest to mój pierwszy post na forum także Witam wszystkich :) Od jakiegoś czasu już przeglądam forum ale jakoś okazji do rejestracji nie było, dziś przyszła, długo się zastanawiałem czy tworzyć ten topić czy nie bo zostanę zjechany :P albo co gorzej trafie do lochów.
Zainteresowałem się tematem avr i c jakiś czas temu ale z powodu braku czasu odłożyłem zakup książki i atb autorstwa pana Mirka jednakże trochę się zmieniło i muszę nauczyć się C już nie z powodu chęci, a wymagań na studiach, dlatego też jeszcze w tym miesiącu zrobię sobie prezent i zamówię książki i pewnie płytkę. Książki jeszcze nie mam, a już muszę trochę umieć i napotkałem parę problemów. Są to bardzo proste rzeczy no ale cóż każdy kiedyś zaczynał :)

Mam do zrobienia program, który na jednym wyświetlaczu będzie prosty licznik, na drugim wyświetlaczy led 7 segmentowym znak wciśnięty z klawiatury matrycowej. Do drugiej części programu ciężko mi się wg zabrać chociaż widziałem jakiś topic SunRivera na temat obsługi takiej klawiatury muszę się przyjrzeć może uda mi się coś zrozumieć :)

A więc prosty programik, który będzie wyświetlał liczby z przedziału [0 , 9] po kolei oczywiście:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.




Ale niestety ma to być na przerwaniach, a o tym nie mam zielnego pojęcia, coś tam poczytałem co znalazłem i średnio to zrozumiałem, ale wykodziłem takie cudo:



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



To moje cudo niestety nie działa i niestety teraz nie mam jak sprawdzić innych możliwości ponieważ nie mam żadnego mirkokontrolera w domu, dopiero jutro będę mógł podejść do laboratorium i skorzystać z płytki.
Ma wg jakikolwiek sens ten mój kod z użyciem przerwań ? Z góry dzięki za pomoc pozdrawiam ;)

Nie żebym był wredny czy coś , ale mam dosyć poprawiania znaczników kodów źródłowych --- SunRiver
wy edytuj i zobacz jak ma być umieszczane !!
sory! :D



Ostatnio edytowano 5 gru 2012, o 22:38 przez magicgoti, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 gru 2012, o 21:28 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

No witamy na forum ;)

ale niestety nie mam dobrych wieści - bo w odpowiedzi na twoje końcowe pytanie niestety odpowiedź jest prosta - to nie ma żadnego sensu :( w ogóle ....

po prostu widać, że nie znasz jeszcze podstaw i np próba wytłumaczenia ci tutaj jak zrobić multipleksowanie - przekracza moje umiejętności .... tłumaczenia. Gdybym miał ci nawet kurs przyśpieszony zrobić i naziemny - to i tak TRZEBA byłoby zacząć od totalnych podstaw. Mam nadzieję, że nie odbierzesz tego jako zjechanie czy coś.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 gru 2012, o 21:34 
Offline
Użytkownik

Dołączył(a): 16 maja 2012
Posty: 349
Lokalizacja: Legnica
Zbananowany użytkownik

Pomógł: 23

delay 300ms w przerwaniu ??? No super to ci zabija procka na amen. Pokaż też w której linijce programu masz wystawienie na portc stanów odpowiadających konkretnej cyfrze. Zadeklarowałeś licznik jako tablicę char'ów a później podstawiasz pod licznik wartość int. Kompilator nie sypnął błędami ani warningami? Ponadto używasz nie zalecanej deklaracji funkcji obsługi przerwania powinno być:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Jak chcesz gotowca poproś moda o przeniesienie do rybnego.

No i kol. Mirek był szybszy w komentażu.

_________________
sig off ;(



Ostatnio edytowano 5 gru 2012, o 21:36 przez perlon, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 gru 2012, o 21:35 
Offline
Nowy

Dołączył(a): 05 gru 2012
Posty: 4
Pomógł: 0

Tak też myślałem po prostu w sumie we wtorek zacząłem "uczyć" się C jako że nie było czasu uczyć się od podstaw, a trzeba było napisać od razu program najpierw zapalający diodę, potem jeszcze coś i teraz to musiałem zacząć od d..y strony, że tak powiem ;p
Jakoś pewnie przebrnę przez te laboratoria, a do końca miesiąca mam nadzieję, będę już miał książkę u siebie. Kod powstał na podstawie wniosków przeglądając inne kody, wpisy, pdf'y. Jak widać nie wyszło ;p

Co do funkcji obsługi przerwań, pozwiedzano mi na zajęciach, że mam użyć SIG_OFERFLOW, które razem wygrzebaliśmy z plików WinAvr io.h czy tam m128.h



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 gru 2012, o 22:14 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

No to widzisz, kolega wyżej dobrze ci podpowiedział - że nie używa się SIGNAL() tylko ISR() i to postaraj się sobie zapamiętać a już będziesz troszkę do przodu. Druga rzecz - to też jak kolega wyżej napisał - NIGDY ale to NIGDY nie stosuj żadnych _delay_xx wewnątrz jakichkolwiek przerwań ok ?

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 gru 2012, o 22:28 
Offline
Nowy

Dołączył(a): 05 gru 2012
Posty: 4
Pomógł: 0

No rzeczywiście to opóźnienie wewnątrz przerwania to moja głupota no i oczywiście nie wiedza, co do funkcji obsługi przerwań ok zapamiętam. Sporo znalazłem w necie kodów z uzyciem SIGNAL() dlatego tak napisałem.

No ale rozumiem ze zamianiajać SIGNAL() na ISR i wywalając delay z przerwania to i tak kod i tak sam w sobie nie ma po prostu sensu ? :>



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 gru 2012, o 23:30 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

magicgoti napisał(a):
No ale rozumiem ze zamianiajać SIGNAL() na ISR i wywalając delay z przerwania to i tak kod i tak sam w sobie nie ma po prostu sensu ? :>


No niestety - nadal ten kod nie ma nic wspólnego z multipleksowaniem - w ogóle nie ma .... ale sam widzisz ile tych błędów się nawarstwiło przez pisanie kodu tak na podstawie tylko jakichś tam obserwacji a bez zrozumienia podstaw.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 gru 2012, o 13:57 
Offline
Użytkownik

Dołączył(a): 27 mar 2012
Posty: 511
Lokalizacja: Sląsk
Pomógł: 14

W takim wypadku masz trzy wyjścia:
1. Szukać w necie kursów języka C (ja straciłem 6miesęcy na takich kursach a i tak nic z nich nie rozumiałem) wiec nie polecam
2. Przyspieszyć kupno I cz. książki Pana Mirka i zabrać się za czytanie. Polecam
3. Tak jak kolega powyżej wspomniał poproś moda o przeniesienie do rybnego.

Każdy kurs w internecie ma inny styl pisania programów w C. Każdy autor takich kursów internetowych pisze je na swój sposób. Dlatego jeśli weźmiesz kawałek kodu z jednego i z drugiego i połączysz to prawdopodobne że nic z tego nie będzie. Trzeba uczyć się tylko z jednego źródła. Ważne są podstawy bo jeżeli będziesz je znał to wtedy dopiero możesz rozpatrywać inne projekty kursy i przerabiać na swój styl.
Sam widzisz ze w takim krótkim kodzie co podałeś ile błędów i niejasności. Musielibyśmy całą I cz. książki przepisać tutaj żebyś wiedział o co chodzi i wtedy mógł zrobić samemu. Pisanie programów to nie takie łatwe jak się wydaje :)

_________________
Programowanie to styl życia :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2012, o 02:22 
Offline
Nowy

Dołączył(a): 07 gru 2012
Posty: 6
Pomógł: 0

Witam.
Nie chce zakładać nowego tematu a ten w zasadzie jest podobny do mojego więc zapytam tutaj.
Co jest wymagane do odblokowania przerwań pochodzących od licznika 1 i ich przechwycenia. Przerwanie powinno pochodzić z przepełnienia licznika bądź porównania jego stanu z pewną wartością.

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

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

Z tego co tam wyczytałem to powinno działać, a nie działa. Wszystkie biblioteki są dodane.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Domyślam się również, że jak chce wykorzystywać przerwanie które porównuje wartości, to tą porównywaną wartość również muszę gdzieś wpisać ale to już sobie znajdę.



Ostatnio edytowano 7 gru 2012, o 12:49 przez alkan0id, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2012, o 09:58 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27315
Lokalizacja: Szczecin
Pomógł: 1041

Dokładnie do takich celów proszę zakładać nowy temat. Ale uczulam, na tym forum nie chcę widzieć w kodach programów

#define F_CPU xxxxxxxx

tego NIGDY nie piszemy w kodzie programu.

a poza tym tak jak kolega wyżej pisał:

Kod:
TIMSK|=(1<<TOIE1);


tym zezwalasz tzn dajesz możliwość żeby timer generował jedno ze swoich przerwań (chociaż nazwę wektora źle wpisujesz) poczytaj to:

http://mirekk36.blogspot.com/2012/03/ec ... nazwy.html

ale nie można zapomnieć o GLOBALNYM odblokowaniu przerwań, czyli

Kod:
sei();

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2012, o 14:45 
Offline
Nowy

Dołączył(a): 05 gru 2012
Posty: 4
Pomógł: 0

Witam pytanie mam mianowicie w moim nieszczęsnym "programie" tablica z liczbami wygląda tak:

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


A znalazłem takie coś, co jest bardziej zrozumiałe i logicznie bo definiuje zapalone segmenty dla każdej z liczb:

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


I teraz pytanko czy procesor widzi tak samo oba zapisy?

I jeszcze małe pytanko co do przerwań trzeba w kodzie definiować rejestr OCRx? Zawsze trzeba to liczyć ?
I jak to jest z tym odświeżaniem w tym wypadku 250hz jak to się ustawia?
np mamy F_CPU 10240000Hz

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



Z góry dzięki za pomoc pozdrawiam :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2012, o 14:49 
Offline
Nowy

Dołączył(a): 07 gru 2012
Posty: 6
Pomógł: 0

Cytuj:
sei używasz ZAWSZE. sei nie odblokowuje wszystkich przerwań hurtowo tak, że wszystkie już mogą działać... do przerwań są tak jakby dwa szeregowe przełączniki, jeden to globalny sei (włącznik dla wszystkich), a drugi włącznik to odpowiedni rejestr dla każdego z przerwań

No rozumiem to działa jak iloczyn logiczny, oba warunki muszą być spełnione aby móc obsługiwać przerwanie. Właśnie tego nie mogłem nigdzie doczytać.
Cytuj:
F_CPU NIE DEFINIUJESZ w plikach, ale w ustawieniach projektu!

Ja tego nie wymyśliłem, ale chyba nie pierwszy raz się z tym spotykasz więc nie jest to mój wymysł. Teraz będę wiedział co i jak gdy sobie doczytam.
Cytuj:
Z tego co wiem to ma być ISR(TIMER1_OVF_vect), a nie ISR(TIMER1_OVF_VECT). Wielkość liter w prawie wszystkich językach programowania ma duże znaczenie!

Wiem, że wielkość liter ma znaczenie ale uznałem, że skoro nie ma błędu informującego tym, że nie istnieje coś takiego jak "TIMER1_OVF_VECT" to jest ok.
Cytuj:
Dokładnie do takich celów proszę zakładać nowy temat.

Jeśli nie ma możliwości ciągnięcia tego wątku w tym temacie, istnieje możliwość wydzielenia odpowiedzi i utworzenie nowego?

Port C jest ustawiony w stan wysoki więc wygląda na to, że wszystko działa.

Mam jeszcze jedno pytanie. Potrzebuje ten timer do generowania sygnału PWM o trzech różnych częstotliwościach, ze zmianą współczynnika wypełnienia ( stosunek trwania stanu wysokiego do okresu). Wiem o istnieniu funkcji PWM w atmedze i nawet byłem skłonny zastosować to rozwiązanie ale wole sobie napisać swoją funkcję pwm na przerwaniach, która z tego co wiem działa w taki sam sposób jak ta wbudowana. Pytanie jest następujące mogę generować naraz dwa sygnały PWM o różnych częstotliwościach i o różnych współczynnikach wypełnienia, na jednej atmedze? Chodzi mi o to, że czasem może się zdarzyć tak, że nastąpi przerwanie przerwania. Główny kod programu posłuży jedynie do odbioru bitów po ISP i prostego przeliczania wartości otrzymanych na współczynnik wypełnienia.

Cytuj:
(1<<0|1<<1|1<<2|1<<3|1<<4|1<<5)

Tak komputer widzi to w ten sam sposób, ale tylda('~') poprzedzająca to wyrażenie spowoduje jego zanegowanie.
wyrażenie (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5) da nam
nr bitu 7 6 5 4 3 2 1 0
. 0 0 1 1 1 1 1 1
zanegowanie tego wyrażenia daje
. 1 1 0 0 0 0 0 0
czyli zmienia się stan poszczególnych bitów na przeciwny.
Chociaż w sumie w zależności od budowy układu segment może zapalać 1 lub 0 więc możesz o tym wiedzieć.



Ostatnio edytowano 8 gru 2012, o 13:42 przez alkan0id, łącznie edytowano 2 razy

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