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



Teraz jest 7 cze 2026, o 02:40


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 3 mar 2014, o 00:56 
Offline
Nowy

Dołączył(a): 03 mar 2014
Posty: 3
Pomógł: 0

Witam opiszę w czym tkwi problem, zaprojektowałem i wykonałem układ sterujący dwoma siłownikami- wykorzystuję do tego rygle samochodowe. Odpowiadają one za nastawianie przełożeń w pewnej przekładni.

Założenia projektu:
2 przyciski- wyższy bieg, niższy bieg
7-segmentowy wyświetlacz LED wskazujący aktualną pozycję. Co to znaczy? Ano tylko tyle, że gdy naciskamy + na wyświetlaczu dostajemy 1,2,3,4,5 gdy minus 5,4,3,2,1. Oczywiście gdy np jesteśmy na stanie wyświetlacza 3 i naciskamy - to otrzymamy 2 i analogicznie gdy mamy 3 i naciśniemy + dostaniemy 4. Zakres to 1-5.
2 elektromagnesy załączające się w zależności który przycisk naciśniemy
czujnik biegu- sprzężenie zwrotne pozwalające sprawdzić czy po wyzwoleniu siłownika bieg wszedł czy też nie udało się go wbić. W wypadku gdy się nie powiodło stan wyświetlacza zostaje niezmieniony. Płytkę i schemat sprawdziłem 150 000 razy i tam błędów nie stwierdziłem. Wyświetlacz to wyświetlacz ze wspólną katodą- sterowany 1kami z procesora. Siłowniki wyzwalane są 0-1kowo za pomocą 2 mosfetów.
Przyciski podłaczone do JP2, JP5 obsługuje wyświetlacz, JP7 siłowniki natomiast JP3 odbiera sygnały z czujnika biegu- aktualny bieg daje stan wysoki na odpowiedni pin złącza, tam do działania wkraczają transoptory które złączają odpowiednie piny procesora do masy.

Teraz troszkę o programie:
program zawiera 3 podstawowe moduly

klawiatura (keyboard.c)
wyswietlacz (display.c)
elektromagnesy ( elektro.c)
czujnik biegu(gsens.c)

kazdy modul ma swoje zadanie i zdarzenia z niego lub informacje sa odbierane lub wysylane w aplikacji.

klawiatura :

funkcja init ktora zawsze raz na poczatku inicjuje rozne zeczy.
z kontekstu przerwania sprawdzany jest stan obydwu przyciskow
jezeli jest on stabilny przez 50ms to znaczy ze drgania stykow sie skonczyly i mozna powiedzec ze przycisk jest nacisniety. Przerwanie wtedy ustawia odpowieno dla tego przycisku flage signal. Potem przychodzi kontekst Main i widzi ze jeden z przyciskow ma flage do zgloszenia i zglasza funkcje callback ktora jest odbierana w glownej aplikacji. Po czym flaga jest zerowana.

display jest prosty i chyba nie trzeba wiele tlumaczyc.

elektromagnesy przyjmuja rozkazy z aplikacji.
jezeli dany elektromagnes zostanie pobudzony to wtedy jest on zalaczany i zostaje ustawiony licznik ktory jest co 1ms dekrementowany w przerwaniu.
Jezeli dekrementacja osiagnie zero ( po 500ms ) to wtedy zostaja wylaczone elektromagnesy.

czujnik biegu sprawdza czy po odpaleniu trigger'ze czyli naciśnięciu przycisku wszedł kolejny lub poprzedni bieg, jeżlei tak to wszystko gra jeżeli coś się nie zgadza- biegu nie udało się wrzucić to dekrementuje lub inkrementuje cyfrę na wyświetlaczu. Po co? By nie doszło do sytuacji, że wskazanie wyświetlacza rozjedzie się z aktualnym przełożeniem.

Na czym polega problem?
Po podłączeniu zasilania nic się nie grzeje napięcia są ok jednak na wyświetlaczu palą się segmenty a, b, g oraz dp. Gdy naciskam przyciski nie dzieje się nic, nie załączają się ani mosfety ani nie zmienia się nic na wyświetlaczu. Nie mam pojęcia gdzie może leżeć błąd.

Nie ukrywając, kod jest dość mocno skomplikowany a stworzony został w istnych męczarniach (do tej pory znałem język C lecz tylko od strony programowania komputerowego- pierwszy raz programuję procesory), dlatego też prosiłem o pomoc osoby z forum ponieważ sam nie jestem jeszcze na takim etapie zaawansowania by to obsłużyć.
Na pomysły w czym rzecz czekam gorąco, zwłaszcza interesuje mnie wypowiedź kolegi Mirka ponieważ między innymi jego książką i blogiem się pożytkowałem podczas tworzenia kodu :)
Pozdrawiam, Krzysiek!

ObrazekObrazek

Kody:

display:
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.


electro:
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.


gsens:
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.


keyboard:
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.

atmega 16
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.

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

system
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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 mar 2014, o 07:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lip 2012
Posty: 203
Lokalizacja: Sosnowiec
Pomógł: 2

Niestety na razie nie mogę Ci pomóc ale dam parę rad.

1 Wstaw wszystkie pliki z projektu jako załączniki - łatwiej będzie to wrzucać do eclipsa
2 "TCCR0=0x8B;" Proponuję zapisywać takie rzeczy jak Mirek radzi, albo przynajmniej w komentarzu napisać co toto ustawia

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


nie wiem co ++i robi za returnem ? wydaje mi się że powinno być przed a dokładniej w osobnej linii, ale jestem początkujący więc mogę się mylić.

i na koniec luźne spostrzeżenie (nie bierz tego do siebie) wydaje mi się że taka ilość #define-ów jak w twoim kodzie nie poprawia czytelności ale ją zmniejsza. Bez eclipsa nie podochodź ;)

całkiem zgrabnie wyszła Ci pętla while :)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


W sumie to całkiem prosty projekt a kod jest tak zamieszany że strach podchodzić.
Następnym razem testuj kod od samego początku pisania.
Dla mnie to niezrozumiałe jest że napisałeś tyle kodu, a nie działa Ci wyśw
Pooglądaj filmy Mirka i zobacz jak on kodzi ;)

_________________
sig on ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 mar 2014, o 15:43 
Offline
Nowy

Dołączył(a): 03 mar 2014
Posty: 3
Pomógł: 0

TCCR0=0x8B to konfiguracja timera



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 mar 2014, o 21:46 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lip 2012
Posty: 203
Lokalizacja: Sosnowiec
Pomógł: 2

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


a to jest konfiguracja SPI z mojego projektu, wiesz już o co chodzi ?

_________________
sig on ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 mar 2014, o 22:59 
Offline
Nowy

Dołączył(a): 03 mar 2014
Posty: 3
Pomógł: 0

wybaczcie koledzy moją ostatnią wypowiedź, byłem na zajęciach w szkole i przez telefon pisałem podczas równań różniczkowych no i tak jakos niebardzo mogłem się skupić :) Już wyjaśniam co chciałem uzyskać ale nie ejstem pewien czy sie udało:

TCCR0=0x8B to konfiguracja timera preskaler przez 64
TCNT0 = RELOAD_VAL to ustawienie wartości początkowej licznika na 131
TIMSK=(1<<TOIE0) służy konfiguracji przerwania gdy przepełnia się licznik timera 0- włączam przerwanie przy pomocy bitu TOIE0



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: 5 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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