Skocz do zawartości

Raspberry Pi Pico i przerwania zewnętrzne


atlantis86

Pomocna odpowiedź

Temat mogłoby się wydawać banalny, ale siedzę nad tym i nie mogę zmusić pico do zgłaszania przerwania zewnętrznego.

Opierając się na kodzie z tego przykładu napisałem coś następującego:

#include <stdio.h>
#include <stdint.h>
#include "pico/stdlib.h"
#include "../FatFS/ff.h"
#include "../FatFS/diskio.h"
#include "../PicoJPEG/picojpeg.h"
#include "../PicoJPEG/jpeg_helpers.h"
#include "../wave/wave.h"
#include "hardware/pll.h"
#include "hardware/gpio.h"
#include "hardware/clocks.h"
#include "hardware/structs/pll.h"
#include "hardware/structs/clocks.h"
#include "FreeRTOS.h"
#include "task.h"
#include "common.h"
  
#define millis() to_ms_since_boot(get_absolute_time())
#define LED_PIN 25
#define SYNC_PIN 21
  
void sync_callback (uint gpio, uint32_t events) {
	gpio_xor_mask(1 << LED_PIN);
    printf("GPIO %d IRQ, millis %lu\r\n", gpio, millis());
}

int main() {
    stdio_init_all();
    gpio_init(LED_PIN);
    gpio_set_dir(LED_PIN, GPIO_OUT); 
    
    gpio_init(SYNC_PIN);
    gpio_set_dir(SYNC_PIN, GPIO_IN);
    gpio_pull_up(SYNC_PIN);
    gpio_set_irq_enabled_with_callback(SYNC_PIN, GPIO_IRQ_EDGE_RISE, true, sync_callback);
  
  	while(1) {}
}

Nie wklejam całego kodu, bo zaciemniałby on sprawę. W całym projekcie mam pododawane trochę różnych bibliotek: m.in. FatFS, FreRTOS, libMAD czy picoJPEG. Wszystkie one działają prawidłowo, ale funkcja sync_callback() z jakiegoś powodu nie chce się wywoływać, gdy sprowadzam GP21 do masy. Macie jakiś pomysł co może być powodem takiego stany rzeczy? Ktoś natknął się na taki problem?

Edytowano przez atlantis86
Link do komentarza
Share on other sites

A tak z ciekawości: nie wywołuje się kiedy pin odłączasz od masy? Bo zdaje się że tak to zaprogramowałeś...

Poza tym to, że nie wklejasz całego kodu to takie "nie pokażę bo nie". Albo wywal resztę kodu włącznie z jakimiś includami i pokaż, że ten pięciolinijkowy kod nie działa, albo...

Przede wszystkim: kod z przykładu działa? Jeśli nie, weź inną płytkę.

Kod który zrobiłeś na podstawie przykładu (pomijając libmad, libjpg, libthelepaty i libmithrandir) działa?

Po dodaniu do cmakelist pozostałych pierdoł i odpowiednich includów dalej działa?

Co dodajesz żeby przestał działać?

Komu jak komu, ale Tobie chyba nie trzeba tłumaczyć jak się zadaje pytania żeby uzyskać odpowiedź!

Link do komentarza
Share on other sites

(edytowany)

Ok, faktycznie pospieszyłem się z napisaniem tego posta.

Zapomniałem wspomnieć, że:

  • Na samym początku przetestowałem nie tyle wrzucony przeze mnie kod, co przykład GPIO IRQ z sieci i wtedy wszystko działało, więc płytkę uznałem za sprawną.
  • Dzisiaj testując układ próbowałem wywoływania przerwania na obydwu zboczach i efekt był taki sam.

Dopiero po chwili dotarło do mnie, że pierwszy test był wykonywany na samym RPiPico, a w drugim przypadku było ono włożone w płytkę, gdzie do pinu jest podłączony tranzystor, ściągający go do masy po otrzymaniu sygnału z innego obwodu. Najprawdopodobniej właśnie właśnie z tym tranzystorem jest coś nie tak i zwiera pin do masy cały czas, bo po wyjęciu płytki przerwania zaczęły być rejestrowane.

Przepraszam za zamieszanie, temat można usunąć, aby nie zaśmiecał forum. 

Edytowano przez atlantis86
Link do komentarza
Share on other sites

2 godziny temu, atlantis86 napisał:

temat można usunąć, aby nie zaśmiecał forum. 

Absolutnie nie!

Jeśli się czujesz na siłach to pokaż młodym jak można spartolić program.

Dam Ci przykład: ostatnio mój super-duper-zajebisty program nie uznał słowa "chcę"  za czasownik. Siedziałem nad tym pół dnia, sprawdzałem słowniki, sprawdzałem czy przypadkiem nie występuje w jakimś innym kontekście... no i co się okazało? Zrobiłem błąd w najprostszym algorytmie bsearch: zamiasr "a <= b" miałem "a < b". Literówka w sumie...

W sumie powinienem to dokładnie opisać, aby pokazać, jak można znaleźć taki durny błąd w programie mającym parę tysięcy linii.. i jeśli ktoś będzie chciał, to opiszę.

Opisz swój.

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.