Skocz do zawartości

[C] transmisja uart problemy


mazurek266

Pomocna odpowiedź

Witam , chciałem uruchomić transmisje miedzy dwiema atmegami 8 jednak nie chce działać więc prosiłbym o wskazanie gdzie znajduje sie błąd.

kod nadajnika:



#include <avr/io.h>
#include <util/delay.h>


#define F_CPU 8000000UL // zegar w Hz
#define RS_BAUD 9600
#define RS_UBRR F_CPU / 16 / RS_BAUD - 1

void USART_Init(int baud) 
{ 
UBRRH = (unsigned char)(baud>>8); 
UBRRL = (unsigned char)baud; 
UCSRB = (1<<RXEN)|(1<<TXEN); 
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0); 
}


//Wysłanie 8 bitow 

void USART_Transmit( unsigned char dane ) 
{ 
/* Wait for empty transmit buffer */ 
while ( !( UCSRA & (1<<UDRE)) ) ; 
/* Put data into buffer, sends the data */ 
UDR = dane; 
}

char konw(int i)
{

   char ch=i+48;
   return ch;
}






                   int main(void)
                   {
                   USART_Init(RS_UBRR) ;


                   DDRC=0x00;
                   PORTC=0xFF;








							while(1)
                   			{





                   			while(!(PINC  & _BV(0)))
                   			{			
											PORTD|=0x04;
											USART_Transmit(konw(1));
											_delay_ms(500);
											PORTD^=0x04;
											while(!(PINC  & _BV(0))){}
                   			}		   
                   			while(!(PINC  & _BV(1)))
                   			{

											PORTD|=0x08;
											USART_Transmit(konw(2));
											_delay_ms(500);
											PORTD^=0x08;
											while(!(PINC  & _BV(1))){}
							}
                   			while(!(PINC  & _BV(2)))
							{

										PORTD|=0x10;
										USART_Transmit(konw(3));
										_delay_ms(500);
										PORTD^=0x10;
										while(!(PINC  & _BV(2))){}
							}
							while(!(PINC  & _BV(3)))
							{

										PORTD|=0x20;
										USART_Transmit(konw(4));
										_delay_ms(500);
										PORTD^=0x20;
										while(!(PINC  & _BV(3))){}
							}
							while(!(PINC  & _BV(4)))
							{
										PORTD|=0x40;
										USART_Transmit(konw(5));
										_delay_ms(500);
										PORTD^=0x40;
										while(!(PINC  & _BV(4))){}

							}
							while(!(PINC  & _BV(5)))
							{

										PORTD|=0x80;
										USART_Transmit(konw(6));
										_delay_ms(500);
										PORTD^=0x80;
										while(!(PINC  & _BV(5))){}
							}

                   			}
                   }

kod odbiornika:



#include <avr/io.h>
#include <util/delay.h>


#define F_CPU 8000000UL // zegar w Hz
#define RS_BAUD 9600
#define RS_UBRR F_CPU / 16 / RS_BAUD - 1

void USART_Init(int baud) 
{ 
UBRRH = (unsigned char)(baud>>8); 
UBRRL = (unsigned char)baud; 
UCSRB = (1<<RXEN)|(1<<TXEN); 
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0); 
}

unsigned char odbior(void)
{
while(!(UCSRA& (1<<RXC)));
return UDR;
}



int konw(char ch)
{
   int i=ch-48;

   return i;
}
                   int main(void)
                   {
                   USART_Init(RS_UBRR) ;
				PORTC=0x00;
				DDRC=0x3F;
				PORTB=0x01;
				DDRB=0x01;
							while(1)
							{



									if (konw(odbior())==1)
									{
										PORTC|=0x01;
										//_delay_ms(1000); 
										//PORTC^=0x01;
									}
									if (konw(odbior())==2)
									{
										PORTC|=0x02;
										//_delay_ms(1000); 
										//PORTC^=0x02;
									}
									if (konw(odbior())==3)
									{
										PORTC|=0x04;
										//_delay_ms(1000); 
										//PORTC^=0x04;
									}
									if (konw(odbior())==4)
									{
										PORTC|=0x08;
										//_delay_ms(1000); 
										//PORTC^=0x08;
									}
									if (konw(odbior())==5)
									{
										PORTC|=0x10;
										//_delay_ms(1000);
										//PORTC^=0x10;
									}
									if (konw(odbior())==6)
									{
										PORTC|=0x20;
										//_delay_ms(1000); 
										//PORTC^=0x20;
									}
							}
                   }

Link do komentarza
Share on other sites

Cześć, pytanie brzmi czy uzywasz wewnetrzenego generatora RC. Jeśli tak to przy 8Mhz wymaga to kalibracji a co za tym idzie zmiane wartości w rejestrze OSCCAL.

Zrób taki myk:

zmienna 8bitowa inkrementowana co jeden skok pętli z opóznieniem np. 500ms

nastepnie wartość ten zmiennej wpisujesz do rejestru OSCCAL

i wysyłasz przez UART zmienną 🙂

jak na ekranie przestaną pojawiać się krzaki tylko liczby to przepisz je na stałe juz do rejestru OSCCAl. To samo zrób z 2 Atmegą.

Zakładam, ze posiadasz przejsciówke USB-RS232, bądz inną 🙂

pobierz sobie najlepiej Terminal By Br@y.

zewrzyj wyprowadzenie RXD i TXD, napisz cos w terminalu(wczesniej łącząć sie z nim) i sprawdz czy otrzymujesz echo(to co piszesz na klawiaturze powinno wyświetlić sie na terminalu)

mam nadzieję, że zrobiłem mało błedów ortograficznych, za które serdecznie przepraszam 😃

  • 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.