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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 6 maja 2025, o 16:08


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
    Autor Wiadomość
    PostNapisane: 8 paź 2016, o 19:45 
    Offline
    Nowy

    Dołączył(a): 08 paź 2016
    Posty: 21
    Pomógł: 0

    Witam, mam przejściówkę RS232-USB działającą na układzie PL2303HX, podłączyłem ją tak jak należy z komputera do ATmegi8.
    Zainstalowałem sterownik, ustawiłem prędkość na 9600, i napisałem program który miał wysyłać literę A co 1 sekundę wg programu z BlueBooka. Wszystko działało poprawnie a na terminalu wyświetlała mi się co 1 sekunde litera A.
    Problem zaczął się kiedy chciałem dane w postaci char z terminala wysyłać do ATmegi8 a następnie wyświetlać je na 2x16 LCD.

    Kod:
    int main(void)
    {
       LCD_INIT();
       UART_Init();
       while(1)
       {
          CLR();
          LCD(UART_Receive());
          _delay_ms(500);
          CLR();
          LCD("tekst");
          _delay_ms(500);
       }
    }

    Program ten powinien wyświetlić jakąś literę wysłaną przezemnie z terminala (czego nie robi), a po 0,5 sekundzie wyświetlić napis "tekst" (to akurat wyświetla, czyli LCD jest dobrze podłączony).

    Funkcję char UART_Receive( void ) skopiowałem z noty katalogowej ATmegi8, i myślę że jest dobra
    Przy kompilacji wyświetla mi się Warning:
    Cytuj:
    ../UART/uart.c:75:3: warning: passing argument 1 of 'LCD' makes pointer from integer without a cast [enabled by default]

    dla lini:
    Kod:
    LCD(UART_Receive());


    Pomóżcie, siedze przy tym kilka dni i nie wiem co jest grane



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 paź 2016, o 20:45 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 cze 2014
    Posty: 76
    Pomógł: 10

    Kompilator mówi ci, że funkcja UART_Receive() zwraca niezgodny typ, który przyjmuje funkcja LCD.
    Prawdopodobnie pomoże ci rzutowanie zmiennych. Pokaż ciało funkcji UART_Receive(); i LCD();

    Jeśli się mylę, proszę o poprawkę.

    _________________
    :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 paź 2016, o 20:48 
    Offline
    Użytkownik

    Dołączył(a): 04 paź 2011
    Posty: 8615
    Pomógł: 338

    Potrzebujesz funkcję wyswietlającą znaki na lcd ,
    pokaż swoją funkcję odbioru znaku z uart
    mniej może to tak wyglądać ...

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


    łańcuch powinieneś też kończyć /0

    _________________
    Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 paź 2016, o 20:49 
    Offline
    Użytkownik

    Dołączył(a): 25 lip 2015
    Posty: 140
    Zbananowany użytkownik

    Pomógł: 18

    Rzutowanie tu nie pomoże, a kompilator ostrzega, że funkcja LCD spodziewa się otrzymać wskaźnik (Prawdopodobnie na cstring), a otrzymuje wartość typu całkowitego.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 paź 2016, o 20:54 
    Offline
    Użytkownik

    Dołączył(a): 04 paź 2011
    Posty: 8615
    Pomógł: 338

    na razie spekulujemy , bez kodu ... nic nie zrobimy ..
    ale właśnie tu mi się wydaje że jest błąd ..

    niemniej poczekajmy

    _________________
    Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 paź 2016, o 21:07 
    Offline
    Nowy

    Dołączył(a): 08 paź 2016
    Posty: 21
    Pomógł: 0

    Kod:
    void LCD(char *str)
       {
          RS_SET;
          while(*str) LCD_ALL(*str++);
          RS_CLR;
       }

    Funkcja do wysyłania znaków do LCD

    Kod:
    char UartReceive( void )
    {
    while ( !(UCSRA & (1<<RXC)) );
    return UDR;
    }

    A to do odbioru danych

    ------------------------ [ Dodano po: 6 minutach ]

    Zrobiłem tak jak polecił mi SunRiver, tym razem wyskoczył mi warning:
    Kod:
    ../UART/uart.c:76:1: warning: control reaches end of non-void function [-Wreturn-type]

    dla funkcji:
    Kod:
    unsigned char UART_Receive( void )
    {

       while ( !(UCSRA & (1<<RXC)) );
       char bufor[2];
       bufor[0]=UDR;  // znak z uarta
       bufor[1]=0;
       LCD(bufor);  //wyświetlamy na LCD odebrany znak :)

    }


    ------------------------ [ Dodano po: 16 minutach ]

    Ok, już działa, pokombinowałem trocę z funkcjami, ostatecznie kod wygląda tak:
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Dzięki z pomoc :D , po prostu nie skapnołem się że w funkcji LCD() musi występować jakiś znak i znak NULL, o tym drugim zapomniałem i wszystko działało nieprawidłowo ;)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 paź 2016, o 21:35 
    Offline
    Użytkownik

    Dołączył(a): 25 lip 2015
    Posty: 140
    Zbananowany użytkownik

    Pomógł: 18

    Ok. Działa. Tylko tego się tak nie robi!

    Co wspólnego ma funkcja UART_Recive() z LCD? -> Ano nic.
    Czego spodziewamy się, po funkcji typu UART_Recive() -> Że coś zwróci.

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


    A najlepiej by było, gdyby jednak funkcja LCD() potrafiła też przyjąć pojedynczy argument typu char.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 paź 2016, o 21:47 
    Offline
    Nowy

    Dołączył(a): 08 paź 2016
    Posty: 21
    Pomógł: 0

    Dzięki Sparrow-hawk, myślę że posiedzę jeszcze trochę przy funkcji LCD() i poprawię ją tak żeby mogła wysyłać 1 bajt (nie czekając na znak NULL) ;)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 paź 2016, o 22:03 
    Offline
    Użytkownik

    Dołączył(a): 04 paź 2011
    Posty: 8615
    Pomógł: 338

    no właśnie zapomniałem dopisać return UDR; na końcu (przepraszam)\\

    ------------------------ [ Dodano po: 1 minucie ]

    Sparrow-hawk napisał(a):
    Ok. Działa. Tylko tego się tak nie robi!


    wiem mało eleganckie rozwiązanie ,

    _________________
    Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



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

    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