Skocz do zawartości

[Atmega32] Przerwania USART i przypadkowe dane


marek.morr

Pomocna odpowiedź

Witam,

Skonfigurowałem USART żeby wysyłać dane, do komputera lecą prawidłowo. Chciałem teraz odbierać dane z komputera, jednak chciałbym to zrobić w przerwaniu aby tam w tablicy buforować dane i co jakiś czas obrabiać je w głównej pętli programu. Problem jest z tym, że po uruchomieniu przerwań uzyskuję jakieś śmieci - tak mi się wydaje, bo nie wysyłam żadnych danych a indeks w poniższym kodzie rośnie cały czas:

#include "main.h"
#define USART_BAUDRATE 19200
#define BAUDRATE ((F_CPU)/(USART_BAUDRATE*16UL)-1)

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "hd44780.h"
#include "usart.h"

volatile char index = 0;
volatile unsigned char buffor[255];

ISR(USART_RXC_vect) 
{	
unsigned char tmp = UDR;
if (index == 254)
	index = 0;
buffor[index++] = tmp;
}

int main(void)
{	
unsigned char temp_buffor[32];
USART_Init();	

LCD_Initalize();		
_delay_ms(100);
LCD_Clear();
_delay_ms(100);
LCD_Home();	

_delay_ms(50);
LCD_GoTo(0,1);
_delay_ms(50);
LCD_WriteText("test LCD");

sei();
while(1)
{					
	_delay_ms(1000);
	sprintf(temp_buffor, "index: %d \r\n", index);
	USART_SendArray(temp_buffor);			
	USART_SendText("ramka: ");
	USART_SendArray(buffor);
	USART_SendText("\r\n");
}
}
#include <stdio.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "usart.h"

void USART_Init(void)
{
UBRRH = (BAUDRATE>>8);
UBRRL = BAUDRATE;
UCSRB |= (1 << RXEN ) | (1 << TXEN)  | (1 << RXCIE);
UCSRC |= (1 << URSEL ) | (1 << UCSZ0 ) | (1 << UCSZ1 );		
}

void USART_SendChar(unsigned char data)
{
while (!(UCSRA & (1<<RXC)));
UDR = data;
}

void USART_SendByte(uint8_t u8Data)
{
while((UCSRA &(1<<UDRE)) == 0);
UDR = u8Data;
}

void USART_SendArray(char StringPtr[])
{
unsigned char i = 0;
while(StringPtr[i] != 0x00)
{
	USART_SendByte(StringPtr[i]);
	i++;
}
}

void USART_SendText(char* StringPtr)
{
while(*StringPtr != 0x00)
{
	USART_SendByte(*StringPtr);
	StringPtr++;
}
}

Częstotliwość (8MHz na wewnętrznym kwarcu, deklaracja w main.h) i prędkość jest raczej dobrze liczona bo jak się pomyliłem z konfiguracją to Terminal.exe miałem krzaki gdy wysyłałem coś z procka.

A teraz nie wysyłając żadnych danych do proca, otrzymuje:

index: 217

ramka: ?‹•áż°¸°C!®|?‹˝üřü…˙ţđ-˝üřţ~ţđ-ýţü˙˙đ-˙˙ţ˙đ-˙˙řK˙ř˙ü¤?‹•áż°˙

ňü<'úúřŹűţ°Z˝üüţ~˙ţđ}ţü˙ůđ˙ţ˙đ-˙đ-˙˙ü˙üü¤ţ°˙Źűţ:ŇúĆřzűţđ˙ţţ~˙ţř˙ţůđ˙đ-˙đ˙ţüüä˙†˙ź˙żű?˙˙řţţţ˙üţůđ˙ř˙řţüüöÇźq˙˙ř˙˙˙ţ˙üü˙ţţ˙~ţźü˙ţţ˙˙˙˙ç˙˙˙ěü?‹•ăż°»LjŹűüka:`ż°¸đüű|?‹ţüţŁŘţř˙

index: 171

ramka: ţţ~ţř˙˙˙˙ř˙ţ˙đmü÷ř˙üöż°˙đělü<'˙˙ĆŹű˙ř˙üüţţ˙řţü˙űř˙đ-ř˙˙ü˙üţö˙űţ˙':?˙˙˙ţ˙˙˙˙ţůřřýđ˙ţţţö†˙?˙ű?˙ü˙˙˙üţüřţüţ˙~źqü˙˙ţ˙ţţţţ˙ţ˙çţţ˙˙˙˙˙ěţż°»îł¶ükáżđúĂţţ°Zţţ˙>ţř˙

Ź?‹żüż°LSţŹűĽk+éű˙˙ř˙˙üţ˙đţüüö˙üřđělüľűĆźüüüţ˙ü˙˙űřřă˙˙ü˙ţ˙˙űţŰ˙y˙˙˙˙˙ţůüüřţţţ

index: 124

ramka: ˙Ç°úűžţ˙˙ü˙ţüüţ˙˙ţźü˙˙ţ˙˙˙˙ţß˙˙˙˙ţ˙ż°ű˙żţ­żđ˙řüţ°˙˙˙>ţř˙üţżüżđîż°ŹűĽ˙ďř˙˙řţ˙đţüţ˙ţđěüţ˙ç°ŁĆţţ˙ü˙˙üüŢ˙ü˙˙†żţ˙˙˙˙˙˙ţţţţěü?‹•ăż°.&jŹűüka:`˙żyţţţüü˙˙Ć˙˙˙˙ţß˙˙żđ˙küţÜ°˙˙ż˙üüţ˙ţřďűţř˙˙ü˙řüţ˙˙řţţ˙çđľŢ˙ü˙˙ţţ˙ü˙˙Ç˙˙˙˙˙˙˙ţěü?ż°.·ł¶ükáżđźżyţţ˙ţţ˙Ć˙˙˙˙˙ř

index: 60

ramka: üţÜř˙üüţ˙üűţřţřüţü˙˙çđ˙˙ţ˙ţţţÇ˙˙˙ţěü˙ř雳ţüđźżů˙˙˙˙Ć˙˙ř

Ź?‹˝üż°jŹűüka:`8˙ţ˙üü˙ţŘţř˙üţ˙˙˙çř˙ţţţţţěü˙ü˙żţüđ˙˙˙˙˙ĆĆ

Ź?›ţř" ­ţţ<'á˙ţ˙ţř˙üţ˙˙˙˙ţţţţţü˙żţţř˙˙˙Ćçüţmţřf°˙˙:˙˙˙üţúţţţ˙˙ţżţţřçţ˙ü÷ű˙zŹüţúţ˙˙ţżţţüßň˙ü÷˙Ćţúţ˙ţţü˙űţ˙Ćţ˙˙˙ü˙ű˙ç˙˙˙üď˙˙üţ˙Ć˙˙˙˙˙ř

Jak zrobiłem wysyłanie co 1 sekundę wartości zmiennej index, to nie wysyłając nic z komputera, wpada po 9 znaków, czyli mam:

index: 1

index: 10

index: 19

index: 28

Gdy wyślę coś z komputera, to zaburzam tą stałą wartość i mam:

index: 1

index: 10

index: 43

index: 51

Już nie rozumiem, co tutaj się dzieje...

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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