Hyperterminal vs at16

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
nasiono
-
Posty: 46
Rejestracja: 29 lip 2005, 0:01

Hyperterminal vs at16

Post autor: nasiono » 16 paź 2006, 15:32

Witam.
Mam taki problem, że gdy wysyłam z procka na hyperterminal to wszystko przebiega bez problemowo. Za to gdy chce coś otrzymywać np. pisząc na komputerze chce widzieć tekst na LCD podpjętego do uP, ewentualnie po prostu coś przesłać na mikrokontroler to wtedy hyperterminal nie pozwala mi wprowadzić ani jednego znaku jak by nie było połączenia.

procesor to Atmega 16L z kwarcem 8mhz , zasilany przez stabilizator napięciem ~3,3V.
Bardzo prosze o pomoc.

Kod: Zaznacz cały

#include <avr/io.h> 
#include "lcd.h" 


#define CPU_Hz   8000000               // częstotliwość zegara w Hz 
        

#define BAUD   9600               // prędkość transmisji po RS232 
#define MYUBRR  CPU_Hz/16/BAUD-1 

// **** fukcje dla RS232 **** 
void UART_init(unsigned int ubrr)       // inicjalizacja 
{ 
   UBRRH = (unsigned char) (ubrr>>8);   // ustawienie prędkości 
   UBRRL = (unsigned char) ubrr; 
   UCSRB = (1<<RXEN)|(1<<TXEN);         // transmisja dwukierunkowa, odbieranie/nadawanie 
   UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);      // ustawienie 8 bitów danych i 1 bity stopu 
} 


void USART_out (unsigned char data)    // wysłanie znaku 
{ 
   while (!(UCSRA & (1<<UDRE))); 
   UDR = data; 
} 


unsigned char USART_in (void)    // odebranie znaku 
{ 
   while (!(UCSRA & (1<<RXC))); 
   return UDR; 
} 




char kom[10]={"AT\r"}; 
char i; 

void wyslij_text_U(char *k) 
{    
              for(i=0;i<strlen(k);i++) 
           { 
                USART_out(k[i]); 
            } 
} 



char odp[50]; 


// **** program główny **** 
int main(void)                        
{ 


    LCD_init();    



UART_init(MYUBRR); 
              
   while(1) {  
    
//ablo
  wyslij_text_U(kom); 
   delayms(300); 
    
//albo
  // LCD_xy(0,0);
  // LCD_putchar(USART_in());
   } 
}

zajcew
-
Posty: 12
Rejestracja: 15 lut 2007, 14:42
Lokalizacja: Szczecin

Post autor: zajcew » 16 lut 2007, 1:59

Odpowiedź jest prosta w przypadku kiedy odbierasz dane masz napisane wysyłanie znaku do LCD niezależnie od tego czy coś odebrałeś czy nie. Więc nawet jak coś odbierzesz to zaraz to zamażesz zmień tak:
char tmp_chr;
.
.
.
//albo
LCD_xy(0,0);
tmp_chr = USART_in();
if(tmp_chr !=0)
LCD_putchar(tmp_chr);
}
}

Albo lepiej odpal przerwanie dla odbioru i wstaw procedure obsługi przerwania:
ISR(USART_RXC_vect) //jeśli używasz GCC(AVRSTUDIO + WINAVR;ATMANAVR)
{
LCD_xy(0,0);
LCD_putchar(UDR);
}

Awatar użytkownika
gaweł
Użytkownik
Posty: 651
Rejestracja: 05 kwie 2004, 8:38
Lokalizacja: Białystok
Kontakt:

Re: Hyperterminal vs at16

Post autor: gaweł » 16 lut 2007, 9:58

nasiono pisze:Witam.
Mam taki problem, że gdy wysyłam z procka na hyperterminal to wszystko przebiega bez problemowo. Za to gdy chce coś otrzymywać np. pisząc na komputerze chce widzieć tekst na LCD podpjętego do uP, ewentualnie po prostu coś przesłać na mikrokontroler to wtedy hyperterminal nie pozwala mi wprowadzić ani jednego znaku jak by nie było połączenia.
Zakładam, że masz poprawnie skonfigurowany program hyperterminal.
To, że nie widzisz znaków wysyłanych przez hyperterminal w jego oknie nie oznacza, że on nie wysyła. Znak wczytany przez hyperterminal jest wysyłany do twego urządzenia poprzez kanał szeregowy, ale to wcale nie oznacza, że musi być wyświetlony w onkie. Jeżeli chcesz go widzieć, to w swoim procku odeślij go spowrotem do hyperterminala.

nasiono pisze:

Kod: Zaznacz cały

(...)

unsigned char USART_in (void)    // odebranie znaku 
{ 
   while (!(UCSRA & (1<<RXC))); 
   return UDR; 
} 

(...)
int main(void)                        
{ 
    LCD_init();    
   UART_init(MYUBRR); 
   while(1) {  
   wyslij_text_U(kom); 
   delayms(300); 
   } 
}
Usuwając komentarze z pokazanego programu, widać nie realizujesz w ATMEGA żadnej operacji odczytu.

ODPOWIEDZ