Skocz do zawartości

Programowanie w C na RPi4


slawomirskm

Pomocna odpowiedź

Witam,

Bawię się RPi4 od kilku dni. Rewelacja. Wróciłem (po ponad 20 latach) do programowania w C. Więc nie jestem tak zaawansowany jak większość na forum:

1. Chętnie nawiążę kontakt z C-owcami na RPi i coś sobie zmontuję. Na tą chwilę stanąłem na obsłudze przerwań w C / RPi. Mam pytanie o dostępne biblioteki oraz obsługę i konfigurację  GPIO jako wejścia dla sygnałów (kiedy i jak włączać opornik wejścia) oraz obsługę kamery. W manualu do Wiring Pi znalazłem informację że jeśli program działa na sys to do włączenia opornika trzeba zastosować skrypt przed startem programu. Jakby ktoś mógł mnie naprowadzić to będę zobowiązany. 

2. Staram się wyjaśnić dlaczego mój program połowicznie nie daje się skompilować. Program trywialnie prosty. Przez Geany na RPi kompiluje się ale nie przechodzi procedury Bolid. Wypada na funkcji powf() gdy argumentami są zmienne (typu float). Gdy są liczby jest OK. Połowicznie bo kompilując to samo przez gcc przechodzi i działa (dokładnie tak jak do napisałem). To samo jest gdy program kompiluję i uruchamiam przez Geany na Mac-u. Znaczy, działa dokładnie. i liczy co ma liczyć?? Zagadka dotąd nierozwiązana. 

Edytowano przez slawomirskm
Link do komentarza
Share on other sites

12 godzin temu, slawomirskm napisał:

Zagadka dotąd nierozwiązana. 

I taką pozostanie dopóki nie pokażesz kodu, a przynajmniej jakiegoś znaczącego fragmentu (z deklaracją zmiennych włącznie).

Z ciekawości: dlaczego float a nie double?

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

(edytowany)

Co do float to przyzwyczajenie. Jeśli nie muszę mieć dokładnych wyników to nie chcę zajmować za dużo pamięci. 

Program trywialny:

#include <stdio.h>
#include <math.h>

int main()
    {
        float a,b,P,c=0;
            
        printf("\nPodaj a:");
        scanf("%f" , &a);
        printf("\nPodaj b:");
        scanf("%f" , &b);
        P=0.5*a*b;
        c=powf(a,0.5);
        printf("\npole powierzchni = %f", P);
        printf("\nprzeciwprostokątna= %f", c);
        
        return(0);

    }

Produkuje następujący komunikat:

1721875768_Zrzutekranu2020-12-20o19_08_42.thumb.png.f51a7378de5511ab0624dc66788005e3.png

Jak wstawiam liczbę w miejsce zmiennej "a" w funkcji powf to program kompiluje się bez problemu i działa. 

Właśnie pracuję nad poprawnym skonfigurowaniem wejścia. Stanąłem na szukaniu funkcji C równoważnej z instrukcją: "gpio -g wfi 26 falling". Pewnie prędzej czy później znajdę ale może masz sugestie dotyczące biblioteki i funkcji? Dotyczy to zadania z https://forbot.pl/blog/kurs-raspberry-pi-pwm-wejscia-kamera-w-pythonie-id26930

 

 

Edytowano przez Gieneq
Link do komentarza
Share on other sites

Następnym razem:

  1. wstawiaj kody programów za pomocą narzędzia "wstaw kod" (masz pod nosem na górnym pasku edytora);
  2. nie wrzucaj zdjęć kompilatora bo to nie piękna modelka w skąpym odzieniu, a zrobienie ctrc-c/ctrl-v (i znów "wstaw kod") będzie bardziej czytelne (przed chwilą chciałem to obejrzeć na komórce i się nie dało)

Rozumiem że 20 lat temu nie używałeś gcc? No to powiem, że dołączenie właściwych bibliotek z reguły pomaga na nieznalezienie funkcji. powf siedzi w libm a nie w libc i sam się nie dołączy:

gcc -o test test.c -lm

i wszystko pięknie działa 😉

  

10 minut temu, slawomirskm napisał:

Stanąłem na szukaniu funkcji C równoważnej z instrukcją: "gpio -g wfi 26 falling"


Ja bym w takiej sytuacji po prostu użył funkcji z biblioteki wiringPi - daleko nie musisz szukać, masz pewnie na dysku/karcie czy na czym tak Twój RPi trzyma biblioteki. Co powiesz na poczytanie sobie http://wiringpi.com/reference/ ?

Tyle że WiringPi jest już przestarzała, poszukaj pigpio.

 

Edytowano przez ethanak
  • 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

Rozumiem. Nie byłem w stanie skopiować tekstu z kompilatora Geany nie mogłem go zaznaczyć w całości. Powalczę. 

Dzięki za podpowiedź dotyczącą wstawiania kodów.

O tym problemie pisałem. Przez gcc (jak wyżej)kompiluje się. Przez interface graficzny (Geany) wypada. 

A programowałem na interpretatorze C (także Fortran, Pascal, Basic) na komputerze MERA400 / OS Crook5 i na zwykłym PC.

 

Link do komentarza
Share on other sites

16 minut temu, slawomirskm napisał:

Przez interface graficzny (Geany) wypada

Olej kompilowanie przez Geany bo to ficzer który nigdy nie został dokończony. Geany to bardzo dobry edytor, ale traktuj go właśnie jako edytor, a nie IDE. Nie wiem jak tam na Makówce, ale na swoim Linuksie po prostu montuję RPi przez ssh, Geany służy mi jako edytor, a wszelkie kompilacje (od prostych wywołań gcc po jakieś configure/make) robię po prostu na terminalu.

Link do komentarza
Share on other sites

Dzięki za podpowiedź w sprawie Geany. Czyli moje problemy zapewne nie są odosobnione choć na Mac-u Geany spisuje się znacznie lepiej. 

Mam inny problem. I to chyba bardziej dotyczy kursu Kurs Raspberry Pi – #13 – PWM, wejścia, skrypty z kamerą. A w zasadzie samego działania włącznika w ćwiczeniu z aparatem. 

Zgodnie z informacjami z kursu podłączałem do wyłącznika pin (fizyczne) 37 i 20 i testowałem czy RPi rozpoznaje sygnał low/high. Wynik negatywny. 

W końcu:

  1. włączyłem rezystor (jak na załączonym kodzie) tj w funkcji pullUpDnConstol zmieniłem z PUD_DOWN na PUD_UP. 
  2. Oraz podłączyłem fizyczne pin do 1 zamiast 20.

I ... chodzi jak powinno. Czyli rozpoznaje stany. To tylko test ale zastanawiam się czy w kursie jest błąd czy ja coś przeoczyłem.  

#include <stdio.h>
#include <wiringPi.h> 

#define PIN_READ  25
#define PIN_LED  29
#define OUT 1
#define IN 0
#define ON 1
#define OFF 0


int main(void)
	{
		int a = -1;
		int b = -1;
		int c = -1;
		int i = 10;
		
		if (wiringPiSetup() == -1) {printf("błąd inicjacji wiringPi");};

		pinMode (PIN_READ , IN);
		pinMode (PIN_LED , OUT);	
		pullUpDnControl (PIN_READ, PUD_UP);
	
		for(i=1; i<=10;++i) {
			
			a=digitalRead(PIN_READ);
			c=wpiPinToGpio(PIN_READ);
		
			printf("\nstan wejścia pin %d to= %d", c, a);
			printf("\nkontrola stanu= %d\n", b);		
		
			delay(1000);
		};
		
	return(0);
	}

 

Link do komentarza
Share on other sites

@slawomirskm wydaje mi się, że wiem o czym piszesz. W komentarzach do kursu jest ten temat poruszany. Na nowym RPi nie działa na niektórych pinach pullup więc te PUD_UP z kodu raczej nie działa. Możesz sprawdzić na których pinach jest domyślny stan wysoki i spróbować z nimi.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

10 godzin temu, slawomirskm napisał:

choć na Mac-u Geany spisuje się znacznie lepiej

Oj, chyba ktoś tu nie przeczytał podręcznika. Cytuję:

Cytat

Geany does not have a built-in build system, nor does it limit which system you can use. Instead the build menu provides a configurable and flexible means of running any external commands to execute your preferred build system.

Geany sam z siebie nic nie kompiluje, po prostu wywołuje jakieś tam zewnętrzne polecenie. A te akurat mogą być dla MacOS-a i Linuxa inne. Poza tym trochę dalej:
 

Cytat

 

Note

If you need complex settings for your build system, or several different settings, then writing a Makefile and using the Make commands is recommended; this will also make it easier for users to build your software.

 

Rozumiem, że Makefile nie masz, a nie wiem jak w Macu, lecz w Linuksie -lm nie jest standardowym ustawieniem kompilatora. Resztę dopowiedz sobie sam.

Co do wszelakich wyłączników podpiętych pod GPIO - zaintsresuj się dtoverlay, a konkretnie gpio-key. Tutaj masz taki przykład od czego zacząć: https://www.raspberrypi.org/forums/viewtopic.php?t=284359

Link do komentarza
Share on other sites

Dziękuję wam za pomoc i nakierowanie. 

dla wPi (wiringPi) 25 w mode IN zasilanie 3V3 z pionu fizycznego 1 stan niski 0,0 mA (prądy błądzące) , stan wysoki 0,06 mA. Co oznacza oporność wewnętrzną ok 50kohm + 5kohm mojego zabezpieczenia fizycznym opornikiem. Doczytałem że graniczny max prąd to 50mA. A więc jeszcze daleko do granicznego. Dla wPi25 funkcja pullUpDnControl nie zdejmuje opornika. Testowałem także na wPi27. Efekt ten sam. Testowałem także na wPi25 i wPi27 zaczytywanie stanu przy połączeniu z masą podobnie jak w RPi forum   nie działa. Co nie jest na razie problemem bo działa w konfiguracji w połączeniu z zasilaniem. Innych pinów na razie nie testowałem. Nie wiem czy dobrze myślę ale jeśli pin jest na IN to oczkuje pojawienia się sygnału. Czyli powinien działać podobnie jak masa. Połączenie masy z masą nie da sygnału prądowego. Potwierdza to miernik podłączony w układ. Może za daleko skuję przypuszczenia ale mam nadzieję że moja informacja się kiedyś komuś przyda. 

Link do komentarza
Share on other sites

Dzięki Moderatorowi rozwiązałem problem nie działania sygnału przy połączeniu pinu z masą. Oczywiste dla tych co długo bawią się RPi ale może być odkrywcze dla startujących. Szczegółowe wyjaśnienie na RPi forum

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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.