Witam, właśnie przerabiam kolejne ćwiczenie z książki J. Dolińskiego, ale przechodząc do rzeczy...
Chcę wysłać kolejno w pętli za pomocą funkcji "WyslijTekstROM" 3 kolejne stringi, jednak przy wysyłaniu pojawia się następujący problem, że tylko ostatni string wypisywany jest na terminalu cały, a 2 początkowe są poucinane. Sądzę, że problem może leżeć w tym, że nie czekam aż zostanie wysłany następny string, ale przyznam, że siedzę już nad tym od dobrych kilku godzin i mi już wszystkie członki opadają... ;/
Oto kod programu:
A to co mi wyświetla Realterm:
Dziękuję z góry za pomoc i pozdrawiam Krzysiek ;]
Chcę wysłać kolejno w pętli za pomocą funkcji "WyslijTekstROM" 3 kolejne stringi, jednak przy wysyłaniu pojawia się następujący problem, że tylko ostatni string wypisywany jest na terminalu cały, a 2 początkowe są poucinane. Sądzę, że problem może leżeć w tym, że nie czekam aż zostanie wysłany następny string, ale przyznam, że siedzę już nad tym od dobrych kilku godzin i mi już wszystkie członki opadają... ;/
Oto kod programu:
//------------------------------------------------------------------
//
// USART_WinAVR
//
//------------------------------------------------------------------
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#define cbi(add,bit) ((add) &= ~(1 << bit))
#define sbi(add,bit) ((add) |= (1 << bit))
char napis[] = "\n\rUSART_WinAVR\n\r";
void usartInit(unsigned int baud);
void WyslijTekstROM(char *tekst);
void WyslijTekst(char *tekst);
unsigned char romram;
char *pfifosio;
volatile unsigned char fodbznak;
char komenda;
ISR(USART_RXC_vect)
{
komenda = UDR;
fodbznak = 1;
}
ISR(USART_TXC_vect)
{
char znak;
if(romram)
znak = pgm_read_byte(pfifosio++);
else
znak = *pfifosio++;
if(znak != 0)
UDR = znak;
else
cbi(UCSRB, TXEN);
}
int main(void)
{
unsigned char i;
char *info[3] = {
PSTR("USART_WinAVR TEST\n\r"),
PSTR("',' - zapal diodke\n\r"),
PSTR("'.' - zgas diodke\n\r")
};
usartInit(12); // 12 => 38400bps @ 8MHz XTAL
sei();
for(i = 0; i < 3; i++)
{
WyslijTekstROM(info[i]);
// Właśnie w tym miejscu Doliński pisze, że trzeba czekać, aż cały string zostanie wysłany, próbowałem while(bit_is_clear(UCSRB, TXEN)), ale nie daje żadnego efektu ;/
}
while(1);
}
//------------------------------------------------------------------
void usartInit(unsigned int baud)
{
UBRRH = (unsigned char) (baud >> 8);
UBRRL = (unsigned char) baud; // Set baud rate
UCSRB = (1 << RXCIE) | (1 << TXCIE) | (1 << RXEN);
UCSRC = (1 << URSEL)|(1 << USBS) | (3 << UCSZ0); // Set frame format: 8data, 2stop bit
}
//------------------------------------------------------------------
void WyslijTekstROM(char *tekst)
{
romram = 1;
pfifosio = tekst;
sbi(UCSRB, TXEN);
UDR = pgm_read_byte(pfifosio++);
}
//------------------------------------------------------------------
void WyslijTekst(char *tekst)
{
romram = 0;
pfifosio = tekst;
sbi(UCSRB, TXEN);
UDR = *pfifosio++;
}
//------------------------------------------------------------------
A to co mi wyświetla Realterm:
U'.' - zgas diodke
Dziękuję z góry za pomoc i pozdrawiam Krzysiek ;]