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



Teraz jest 17 kwi 2024, o 00:51


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
 Tytuł: UART problem
PostNapisane: 19 sie 2017, o 14:26 
Offline
Nowy

Dołączył(a): 19 sie 2017
Posty: 14
Pomógł: 0

Witam. Nie działa mi kod z rozdziału uart przerwania bufor cykliczny. Wysyłanie działa bez zrzutów, ale gdy odbieram buforem to na wyświetlaczu nie pojawia się nic. Funkcje są takie same jak w książce.
Kod:
int main( void )
{
   lcd_init();
      USART_Init(__UBRR);
      sei();

      while(1){

      znak = uart_getc();
      if(znak>0){
      lcd_char(znak);
      }
      }
}

Zaznaczam, że program z noty pdf atmegi 8 działa bez problemu.
Kod:
int main( void )
{
   lcd_init();
      USART_Init(__UBRR);
      sei();

      while(1){

      znak = USART_Receive();
      if(znak>0){
      lcd_char(znak);
      }
      }
}

unsigned char USART_Receive( void )
{
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) )
;
/* Get and return received data from buffer */
return UDR;
}



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sie 2017, o 16:00 
Offline
Użytkownik

Dołączył(a): 27 lis 2012
Posty: 289
Pomógł: 6

Rzuć okiem na animacje bufora cyklicznego
https://scratch.mit.edu/projects/167562919/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sie 2017, o 17:49 
Offline
Nowy

Dołączył(a): 19 sie 2017
Posty: 14
Pomógł: 0

Już to widziałem,ale nie wiem jak to ma mi pomóc.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sie 2017, o 19:09 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2561
Pomógł: 126

A oryginalny kod z książki Ci działa?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sie 2017, o 19:16 
Offline
Nowy

Dołączył(a): 19 sie 2017
Posty: 14
Pomógł: 0

Właśnie kod na bufor cykliczny z książki nie działa. Podstawowy z noty bez problemów. To chyba coś z przerwaniem, bo jak dodam tam np. gaszenie diody to też nie działa, w funkcji wszystko jest ok.

Wysłane z mojego Mi-4c przy użyciu Tapatalka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sie 2017, o 19:27 
Offline
Użytkownik

Dołączył(a): 02 gru 2015
Posty: 63
Pomógł: 1

Możliwe, że nie dział Tobie poprawnie ten kod z powodu, że został on przygotowany na Atmega32 a nie na Atmega8. W tych dwóch mikroprocesorach są zapewne odmienne rejestry.

Jako ciekawostkę dodam, że gdy użyłem procesora Atmega328p to musiałem poprawić swoją bibliotekę od USART z powodu rozbieżności w rejestrach.

Pozdrawiam,
Tomek.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sie 2017, o 19:53 
Offline
Nowy

Dołączył(a): 19 sie 2017
Posty: 14
Pomógł: 0

W tym przypadku chyba nie ma żadnych rejestrów do zmiany. Cała reszta działa tylko nie bufor odbiorczy.

Wysłane z mojego Mi-4c przy użyciu Tapatalka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sie 2017, o 20:06 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27224
Lokalizacja: Szczecin
Pomógł: 1041

pokaż fragment kodu pliku *.h do konfiguracji UARTA jak to zrobiłeś? jak poustawiałeś sobie

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sie 2017, o 08:40 
Offline
Nowy

Dołączył(a): 19 sie 2017
Posty: 14
Pomógł: 0

Kod:
#ifndef UART_H_
#define UART_H_

#define UARRT_RX_BUF_SIZE 32
#define UART_RX_BUF_MASK (UARRT_RX_BUF_SIZE-1)

#define UARRT_TX_BUF_SIZE 16
#define UART_TX_BUF_MASK (UARRT_TX_BUF_SIZE-1)

#define BAUD 9600
#define MYUBRR (F_CPU/16/BAUD)-1
#define UART_BAUD 9600
#define __UBRR ((F_CPU+UART_BAUD*8UL) / (16UL*UART_BAUD)-1)
void USART_Init(uint16_t ubrr);
void uart_putc(char data);
char uart_getc(void);

#endif /* UART_H_ */

Kod:
void USART_Init(uint16_t ubrr)
{
/*Set baud rate */
UBRRH = (uint8_t)(ubrr>>8);
UBRRL = (uint8_t)ubrr;
//Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 2stop bit */
UCSRC = (1<<URSEL)|(3<<UCSZ0);
}



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sie 2017, o 08:48 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27224
Lokalizacja: Szczecin
Pomógł: 1041

No to czemu piszesz że kod z książki ci nie działa jeśli masz skopaną inicjalizację ? tzn inną niż w książce ? eeeeeh panie panie .... tak to nigdy nie ruszysz. Ileż razy można powtarzać, a już wyżej kolega micky pytał cię czy działa ci kod z książki i też miał na myśli niezmieniony kod ....

weź więc nośnik dołączony do książki i odpal to - zamiast pisać swoją inicjalizację w której w ogóle przerwań do UARTa nie odpalasz. No co stoi na przeszkodzie żeby sobie sprawdzić oryginalny kod z książki

a rzeczywiście w ATmega8 są identyczne rejestry jak w ATmega32 więc nic przerabiać nie trzeba nawet - tylko skompilować pod innego procka

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sie 2017, o 10:39 
Offline
Nowy

Dołączył(a): 19 sie 2017
Posty: 14
Pomógł: 0

Nie miałem ustawionego bitu RXCIE teraz już działa. Dzięki.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


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