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

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