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



Teraz jest 3 sty 2025, o 14:12


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 19 ] 
Autor Wiadomość
PostNapisane: 7 lut 2015, o 08:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sie 2012
Posty: 159
Pomógł: 1

Witam!

Od jakiegoś czasu zmagam się z głupim przerwaniem na pinie 12 portu A. Bez skutku. Pewnie coś pomyliłem bo te rejestry są numerowane od 1, jednak według mnie wyglada dobrze. Niestety nie działa. Procek STM32f103RBT6, przerwanie ma się wywoływać na zboczu rosnącym i opadającym, a teraz kod :

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

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

EXTI i AFIO ( tak mam włączone taktowanie dla AFIO :P )
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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


Proszę o pomoc, bo już długo z tym siedzę próbowałem to sam rozwiązać, ale cały czas coś robię źle.
pozdrawiam,
Piotrek



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

Dołączył(a): 28 lis 2012
Posty: 283
Lokalizacja: Warszawa
Pomógł: 17

Hej
W kontrolerze przerwań NVIC odblokowujesz przerwanie 4, a konfigurujesz 12, następnie obsługa przerwania ponownie od 4...
Pamiętaj, że pin12 portu A wchodzi w zakres przerwań zewnętrznych 10-15, ale zapewne to wiesz.


Autor postu otrzymał pochwałę

_________________
Pozdrawiam
Grzegorz



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 lut 2015, o 12:13 

Pomógł: 0

Dorzucę coś jeszcze :) Nie wszystko uważam za błąd - część pytań/uwag wynika z czystej ciekawości/chęci zwrócenia na coś uwagi.

1. Po co inline przy funkcji obsługi przerwania? Gdzie ona ma być inline'owana ;>?
2. Wykonywanie operacji "|=" zamiast "=" bywa zgubne, gdy rejestr po resecie nie ma wartości zero (np. rejestr CRL/H po resecie ma wartość 0x4444 4444)
3. Nie musisz zmieniać priotytetów przerwań. Szczególnie jak coś nie działa to warto program maksymalnie uprościć. Domyślnie po resecie wszystkie przerwania mają ten sam prio - nie ma wywłaszczania, są wykonywane w kolejności zależnej od numeru przerwania. Prawie jak na AVR :) Dopóki nie ma dobrego powodu do zmian, to warto je zostawić w spokoju.
4. "__enable_irg()" jest niepotrzebne. Przerwania po resecie są włączone.
5. Flagę przerwania należy czyścić na początku jego obsługi, inaczej procesor może ponownie wejść w obsługę przerwania zanim przetrawi operację kasowania flagi - link
6. Przy kasowaniu flagi nie jest potrzebne "|=", wystarczy "=" (wpisanie 1 kasuje bit, wpisanie 0 jest ignorowane)
7. Stosowanie atrybutu "interrupt" w Cortexie, przy procedurze obsługi przerwania, jest "dyskusyjne" ;) (dla zainteresowanych lekturka: Elektroda, ARM, GCC)


Autor postu otrzymał pochwałę


Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 7 lut 2015, o 13:29 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sie 2012
Posty: 159
Pomógł: 1

O kurcze ! Dzięki za zainteresowanie chłopaki, już zaieram się za odpowiadanie.

buz11 kurcze ja cały czas myślałem że są tylko 4 rodzaje przerwań od EXTI - te co są w pliku startup_stm32f10x_md.c, w którym mialem szukac nazw przerwań, a że najwyższy to "void WEAK EXTI4_IRQHandler(void);" to pomyślałem, że chodzi o EXTICR4 i tak to zapisałem.
plik startup_stm32f10x_md.c

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


Ojejku rzeczywiście są te nazwy tylko oddzielnie od powyzszych exiti.... Kurcze przepraszam za zamieszanie z tym plikiem - już wszystko działa....

A teraz kikla słów wyjaśneinia na pytania kolegi wwojtek:
1. To tylko przez moje głupie przepisywanie kodu jak zaczynałem z STM'ami - przepisywałem z neta żeby tylko sprawdzić czy działa i jakoś mi tak zostało - już to naprawiam :P
2.To akurat zauważyłem - zawsze do CRL'a i CRH przypisuję 0x00000000 i dopiero robię na nich operacje. Ale masz rację gdy nie znamy dobrze rejestru warto sobie nawet w debugerze podejrzeć.
3. Tutaj akurat chce dać najniższy priorytet dla tego przerwania, gdyż ma ono wyłączać i włączać natychmiastowo całe urządzenie, ale dzięki za wskazówkę.
4. Tego nei wiedziałem - znowu przepiwsywanie z neta bez zrozumienia - dzięki ;)
5. Dzięki - juz poprawiam
6. Znowy dzieki za informację
7. Ooo na pewno poczytam ! :)

A teraz pytanie z innej beczki - może wiecie dlaczego w Coocox'ie w zakładce peripherals podczas debugowania nie mam rejestrów np timera8, czy nvic ?
Czasami bardzo lubię sobie podejrzeć rejestry, ale w tych przypadkach nie mogę, gdyż timery mam maksymalnie do czwartego...

Naprawdę dziękuję za całą pomoc - już układ ładnie śmiga :)

Pozdrawiam serdecznie,
Piotrek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 lut 2015, o 14:51 

Pomógł: 0

Zerknij do datasheet'a (nie reference manuala!) - ten procek ma tylko 4-ry timery (nie licząc SysTick'a i watchdogów).

A rejestry SysTick'a można podglądać? Nie znam coocox'a, ale może pokazuje tylko rejestry peryferiów mikrokontrolera, bez peryferiów rdzenia. Ew. "rdzeniowe peryferia" są gdzieś indziej.

Dodano po zjedzeniu obiadu:

Broń Boże nie chcę Cię zniechęcać do podglądania rejestrów przez debugger bo to jest super sprawa, ale jest jedna mała pułapka. Czasem z odczytem rejestru jest powiązany jakiś myk - np. jakaś flaga kasuje się podczas odczytu rejestru. Podglądając taki rejestr przez debugger można sobie niechcący taką flagę skasować ;)



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 7 lut 2015, o 15:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sie 2012
Posty: 159
Pomógł: 1

O kurcze - rzeczywiście, ale ze mnie gapa - nie sprawdzić czegoś takiego...
Rejestrów Systicka nie można podglądać, tak samo jak nvic , może dlatego że to sa jak to nazwałeś "rdzeniowe peryferia" ?

Dzięki za ostrzeżenie z tym debugowaniem :P

EDIT: A jakie procki polecasz ? Na jakich najczęściej pracujesz ? F4 ?



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

Dołączył(a): 15 lut 2012
Posty: 224
Lokalizacja: Opole
Pomógł: 24

Do większości celów wystarcza w zupełności F1, nie ma sensu pchać się w setki MHz bo wtedy już zaczynają się cyrki z doborem parametrów ścieżki (szerkość, długość), filtrowaniem itp



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 lut 2015, o 17:06 

Pomógł: 0

Eee tam zaraz gapa. Próba uruchomienia czegoś, czego konkretny mikrokontroler fizycznie nie ma to (z tego co obserwuję różniste fora) dosyć częsta pułapka przy STM'ach. Jeśli wcześniej przyzwyczaiłeś się np. do dokumentacji AVR'ów 8bit. - gdzie wszystko jest w jednym pdfie - to trochę trzeba się przestawić. Kilka tygodni temu dłuższy czas głowiłem się nad tym jak sprawdzić ile właściwie portów GPIO ma jakiś tam procek :mrgreen:

Tak jak pisałem - Coocox'a nie znam. Korzystam z Eclipse'a. Do przeglądania rejestrów mam "dossany" plugin "EmbSysRegView". Swoją drogą Kokos jest jakąś pochodną Eclipse'a - może da się doinstalować Eclipsowego plugina :) ?

Co do procków - wszystko zależy do czego :) Nie pracuję (w dosłownym/zawodowym tego słowa znaczeniu) na żadnym - programowanie uK to tylko hobby. Do hobbystycznej zabawy (nauki) - im "większy" i bardziej rozbudowany mikrokontroler/zestaw tym lepiej. Mam dwa zestawy "rozwojowe" do zabawy: Hy-mini (stm32f103) i discovery z stm32f409. Zestawem HY-mini bawię się już ponad rok i jeszcze go nie "wyeksplorowałem" do końca. Wszystko zależy od celu i podejścia. Stosując gotowe biblioteki/przykłady z netu itp... można "zaliczyć" wszystkie ważniejsze peryferia w ~miesiąc pisząc tylko wieczorami ;) Bawiąc się w pisanie wszystkiego po swojemu od zera to miesiąc może nie starczyć na opanowanie dokumentacji kart SD i uruchomienie SDIO ;)



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 7 lut 2015, o 19:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sie 2012
Posty: 159
Pomógł: 1

@wwojtek właśnie często objawia się przyzyczajnie do 8-bitowców - szczególnie z datasheetami. No ale nic, powolutku do celu, nie ;) ?

Jeszcze raz dzięki za całą pomoc !

Pozdrawiam,
Piotrek


EDIT: Aaa tam zapytam skoro mam okazję - jak sprawdzić czy procek wystartował na zewnętrznym kwarcu czy na wewnętrznym ? Ogólnie wiem, że mam 72Mhz, ale jako zewnętrzny kwarc mam 16Mhz, a że typową wartością jest 8 nie wiem czy gdzieś trzeba coś zmienić... Ogólnie się o to pytam bo uart niby dobrze skonfigurowany tzn prędkość itp, ale przy częstym wysyłaniu np 4 cyfrowej liczby zaczyna krzaczyć.



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

Dołączył(a): 15 lut 2012
Posty: 224
Lokalizacja: Opole
Pomógł: 24

W pliku system_stm32fxxxxx.c jest ustawienie zegara



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

Dołączył(a): 26 sie 2012
Posty: 159
Pomógł: 1

Zmieniłem na 16Mhz, ale dalej czasami wkradają się nieporządane znaki. Przynajmniej wiem że to nie wina kwarcu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 lut 2015, o 21:45 

Pomógł: 0

klonyyy napisał(a):
No ale nic, powolutku do celu, nie ;) ?
No ba :) Bit po bicie aż do przepełnienia stosu (lub stosów w stm'ie) :mrgreen:

Co do ustawień zegara - w rejestrach RCC jest trochę różnych flag, które pozwalają sprawdzić który zegar jest włączony i z czego jest taktowany cały procek. Jeśli chodzi o szybki i prosty test to: dioda migająca w przerwaniu od SysTicka (np. co 1s) + stoper ;)



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 7 lut 2015, o 22:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sie 2012
Posty: 159
Pomógł: 1

A ustawienie zmiennej jako SystemCoreClock(); i odczytanie jej w debugerze będzie złym pomysłem ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 lut 2015, o 22:30 

Pomógł: 0

klonyyy napisał(a):
SystemCoreClock();
Nie wiem :) Wszystko zależy od tego co jest w funkcji SystemCoreClock(). Osobiście wszelkie funkcje biblioteczne od st omijam.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 7 lut 2015, o 22:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sie 2012
Posty: 159
Pomógł: 1

OK sprawdziłem Systickiem i chyba jest ok :)

A bawiliście się może w wysyłenie int'ów uartem ?



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

Dołączył(a): 18 maja 2014
Posty: 126
Pomógł: 12

wwojtek napisał(a):
SystemCoreClock().
To akurat jest z cmsis i to nie funkcja tylko zmienna ;) Powinna pokazać dobrą wartość, po zmianie ustawień zegara trzeba tylko wywołać SystemCoreClockUpdate().

------------------------ [ Dodano po: 3 minutach ]

Cytuj:
A bawiliście się może w wysyłenie int'ów uartem ?

Tak, sprintfem: http://www.cplusplus.com/reference/cstdio/sprintf/

_________________
Pozdrawiam, Adrian.



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

Dołączył(a): 26 sie 2012
Posty: 159
Pomógł: 1

Oj kurcze rzeczywiście wkradły mi się tam nawisy - sorki za zamieszanie.

Cytuj:

A czymś mniej pamięcio-żernym ? :P



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lut 2015, o 00:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 18 maja 2014
Posty: 126
Pomógł: 12

Używałem tego na F030 do debugowania, bo wygodne i się mieściłem w 16 kB flasha, ale można jeszcze tak:
http://www.freddiechopin.info/pl/download/category/9-rozne plik itoa()

_________________
Pozdrawiam, Adrian.



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

Dołączył(a): 26 sie 2012
Posty: 159
Pomógł: 1

Właśnie miałem itoa(), a przynajmniej jej czyjąś implementację w kodzie i chyba była za wolna bo sypało błędami, za to z sprintf od razu wzystko chodzi jak powinno, ale i tak spróbuję z tą funkcją co mi podesłałeś.

pozdrawiam,
Piotrek



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 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