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



Teraz jest 16 kwi 2024, o 08:28


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
Avatar użytkownika

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

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

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



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
Avatar użytkownika

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

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

niemniej poczekajmy

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



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 ]
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 ]
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
Avatar użytkownika

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

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 ,

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



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