Amtega8a + 终端实时

问题描述 投票:0回答:1

将代码上传到atmega

# define F_CPU 1000000UL
//#include <stddef.h>
#include <avr\io.h>
#include <stdio.h>
#include <avr/interrupt.h>
#include <util/delay.h>

//zmienne dot. odbioru danych
volatile unsigned char odb_x;       //odebrana liczba X
volatile unsigned char odb_flaga =0;//flaga informująca main o odebraniu liczby

//bufor znaków ze wzorem funkcji, który wysyłamy po starcie programu
volatile unsigned int usart_bufor_ind;           //indeks bufora nadawania
char usart_bufor[30] = "y = 0.3187x^2 + 2x - 7"; //bufor nadawania

void usart_inicjuj(void)
{
    //definiowanie parametrów transmisji za pomocą makr zawartych w pliku
    //nagłówkowym setbaud.h. Jeżeli wybierzesz prędkość, która nie będzie
    //możliwa do realizacji otrzymasz ostrzeżenie:
    //#warning "Baud rate achieved is higher than allowed"

    #define BAUD 57600        //tutaj podaj żądaną prędkość transmisji
    #include <util/setbaud.h> //linkowanie tego pliku musi być
    //po zdefiniowaniu BAUD
    
    //ustaw obliczone przez makro wartości
    UBRRH = UBRRH_VALUE;
    UBRRL = UBRRL_VALUE;
    #if USE_2X
    UCSRA |=  (1<<U2X);
    #else
    UCSRA &= ~(1<<U2X);
    #endif


    //Ustawiamy pozostałe parametry moduł USART
    //U W A G A !!!
    //W ATmega8, aby zapisać do rejestru UCSRC należy ustawiać bit URSEL
    //zobacz także: http://mikrokontrolery.blogspot.com/2011/04/avr-czyhajace-pulapki.html#avr_pulapka_2
    UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);  //bitów danych: 8
    //bity stopu:  1
    //parzystość:  brak
    //włącz nadajnik i odbiornik oraz ich przerwania odbiornika
    //przerwania nadajnika włączamy w funkcji wyslij_wynik()
    UCSRB = (1<<TXEN) | (1<<RXEN) | (1<<RXCIE);
}


//--------------------------------------------------------------


ISR(USART_RXC_vect)
{
    //przerwanie generowane po odebraniu bajtu
    odb_x = UDR;   //zapamiętaj odebraną liczbę
    odb_flaga = 1; //ustaw flagę odbioru liczby dla main()
}


//--------------------------------------------------------------

ISR(USART_UDRE_vect){

    //przerwanie generowane, gdy bufor nadawania jest już pusty,
    //odpowiedzialne za wysłanie wszystkich znaków z tablicy usart_bufor[]

    //sprawdzamy, czy bajt do wysłania jest znakiem końca tekstu, czyli zerem
    if(usart_bufor[usart_bufor_ind]!= 0){

        //załaduj znak do rejestru wysyłki i ustaw indeks na następny znak
        UDR = usart_bufor[usart_bufor_ind++];

        }else{

        //osiągnięto koniec napisu w tablicy usart_bufor[]
        UCSRB &= ~(1<<UDRIE); //wyłącz przerwania pustego bufora nadawania
    }
}


//--------------------------------------------------------------


void wyslij_wynik(void){

    //funkcja rozpoczyna wysyłanie, wysyłając pierwszy znak znajdujący się
    //w tablicy usart_bufor[]. Pozostałe wyśle funkcja przerwania,
    //która zostanie wywołana automatycznie po wysłaniu każdego znaku.

    //dodaj do tekstu wyniku znaki końca linii (CR+LF), by na
    //ekranie terminala wyniki pojawiały się w nowych liniach
    unsigned char z;
    for(z=0; z<30; z++){
        if(usart_bufor[z]==0){   //czy to koniec takstu w tablicy
            //tak znaleziono koniec tekstu, dodajemy znak CR
            usart_bufor[z]   = 13;  //znak powrotu karetki CR (Carrige Return)
            usart_bufor[z+1]  = 10; //znak nowej linii LF (Line Feed)
            usart_bufor[z+2]  = 0;  //znak końca ciągu tekstu w tablicy
            break;
        }
    }


    //Zaczekaj, aż bufor nadawania będzie pusty
    while (!(UCSRA & (1<<UDRE)));

    //bufor jest pusty można wysłać

    //następny znak do wysyłki to znak nr 1
    usart_bufor_ind = 0;

    //włącz przerwania pustego bufora UDR, co rozpocznie transmisję
    //aktualnej zawartości bufora
    UCSRB |= (1<<UDRIE);

}

//--------------------------------------------------------------


int main(void)
{
    usart_inicjuj(); //inicjuj moduł USART (RS-232)
    sei();           //włącz przerwania globalne

    wyslij_wynik();  //na początku wysyłamy text wzoru, który po
    //resecie jest w tablicy usart_bufor[]

    while(1){

        //tutaj Twój program ....

        //czekamy na informację o odebraniu danej nie blokując mikrokontrolera
        if(odb_flaga){

            odb_flaga = 0; //zgaś flagę

            //wykonaj obliczenia i wynik przekształć na znaki ładując do
            //bufora usart_bufor[]
            sprintf(usart_bufor, "%f", 0.3187 * odb_x * odb_x + 2 * odb_x - 7);

            wyslij_wynik();  //rozpocznij wysyłanie wyniku przez RS-232
        }

        //w tym czasie można wykonywać dowolny program
        //umieść go tutaj lub przed if() powyżej
    }
}

他在实际期限中得到的是,除其他外,“•eâ‚ âŤń•Ăeâ™ âŤń”

我想要普通角色。我有微芯片。他希望从终端发送一个数字后求解方程并将结果发回。

代码来自网站:https://mikrokontrolery.blogspot.com/2011/03/rs-232-atmega8-komputer-terminal.html。它使用转换器 CH340G USB RS232 TTL UART USART Arduino

进行连接
c++ c avr atmega
1个回答
0
投票

在 Fosc 1Mhz 和波特率 57600 的情况下,正确波特率与处理器生成的波特率之间的误差为 8.5%。请参阅数据表中的表 60。这对于正确评估传输的字符来说太多了。解决方案要么降低传输速度,要么提高MCU的时钟频率。使用 DS 的表 60 来正确选择最大传输速度。如果误差小于 1.5%,即可实现可靠传输(详情请参阅此处

© www.soinside.com 2019 - 2024. All rights reserved.