logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Przykładowy program obsługi UART w CodeVisionAVR - jak zacząć?

firefox_PL 13 Lis 2007 11:07 2123 5
  • #1 4475946
    firefox_PL
    Poziom 17  
    Posty: 235
    Pomógł: 21
    Ocena: 2
    Witam mam prośbę do osób korzystających z CodeVisionAVR o przykładowy program obsługi UART, niestety w help'ie nie ma przykładów jak go obsłużyć, a pisząc "po omacku" nawet nie wiem co mogę robić nie tak.
    Z góry dziękuję za pomoc.
  • #2 4476022
    maxiu25
    Poziom 16  
    Posty: 190
    Pomógł: 16
    Ocena: 3
    przy tworzeniu programu jest zakładka uart trzeba zaznaczyc czy uządzenie ma byc odbiornikiem czy nadajnikiem ma miec przerwania itp.
    codevisionavr wygeneruje caly program
  • #3 4476934
    firefox_PL
    Poziom 17  
    Posty: 235
    Pomógł: 21
    Ocena: 2
    tyle to ja wiem, chodzi mi o to jak później z tego skorzystać w main(), ponieważ zmienne w przerwaniu są lokalne, nigdy nie opracowywałem UART, dlatego proszę np. o coś w stylu wyświetlenie danych z UART na LCD 16x2 w środowisku CodeVision (z wykorzystaniem wbudowanych bibliotek)
  • #4 4477845
    autoservice
    Poziom 20  
    Posty: 516
    Pomógł: 7
    Ocena: 16
    zle czytasz helpa ;) jest funkcja ktora obsluguje uart'a , poszukaj dokladnie...w f. standardowych :)
    Pzdr.
  • Pomocny post
    #5 4478925
    maxiu25
    Poziom 16  
    Posty: 190
    Pomógł: 16
    Ocena: 3
    dołożyłem do gotowego programu zmienna nadaj

    #include <mega32.h>

    #define RXB8 1
    #define TXB8 0
    #define UPE 2
    #define OVR 3
    #define FE 4
    #define UDRE 5
    #define RXC 7

    #define FRAMING_ERROR (1<<FE)
    #define PARITY_ERROR (1<<UPE)
    #define DATA_OVERRUN (1<<OVR)
    #define DATA_REGISTER_EMPTY (1<<UDRE)
    #define RX_COMPLETE (1<<RXC)
    char nadaj;
    //===============================================

    // USART Receiver buffer
    #define RX_BUFFER_SIZE 8
    char rx_buffer[RX_BUFFER_SIZE];
    unsigned char rx_wr_index,rx_rd_index,rx_counter;
    // This flag is set on USART Receiver buffer overflow
    bit rx_buffer_overflow;

    // USART Receiver interrupt service routine
    #pragma savereg-
    interrupt [USART_RXC] void uart_rx_isr(void)
    {
    char status,data;
    #asm
    push r26
    push r27
    push r30
    push r31
    in r26,sreg
    push r26
    #endasm
    status=UCSRA;
    data=UDR;
    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
    {
    rx_buffer[rx_wr_index]=data;
    if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
    if (++rx_counter == RX_BUFFER_SIZE)
    {
    rx_counter=0;
    rx_buffer_overflow=1;
    };
    };
    nadaj++;
    #asm
    pop r26
    out sreg,r26
    pop r31
    pop r30
    pop r27
    pop r26
    #endasm
    }
    #pragma savereg+

    #ifndef _DEBUG_TERMINAL_IO_
    // Get a character from the USART Receiver buffer
    #define _ALTERNATE_GETCHAR_
    #pragma used+
    char getchar(void)
    {
    char data;
    while (rx_counter==0);
    data=rx_buffer[rx_rd_index];
    if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
    #asm("cli")
    --rx_counter;
    #asm("sei")
    nadaj--;
    return data;
    }
    #pragma used-
    #endif

    // USART Transmitter buffer
    #define TX_BUFFER_SIZE 8
    char tx_buffer[TX_BUFFER_SIZE];
    unsigned char tx_wr_index,tx_rd_index,tx_counter;

    // USART Transmitter interrupt service routine
    #pragma savereg-
    interrupt [USART_TXC] void uart_tx_isr(void)
    {
    #asm
    push r26
    push r27
    push r30
    push r31
    in r26,sreg
    push r26
    #endasm
    if (tx_counter)
    {
    --tx_counter;
    UDR=tx_buffer[tx_rd_index];
    if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
    };
    #asm
    pop r26
    out sreg,r26
    pop r31
    pop r30
    pop r27
    pop r26
    #endasm
    }
    #pragma savereg+

    #ifndef _DEBUG_TERMINAL_IO_
    // Write a character to the USART Transmitter buffer
    #define _ALTERNATE_PUTCHAR_
    #pragma used+
    void putchar(char c)
    {
    while (tx_counter == TX_BUFFER_SIZE);
    #asm("cli")
    if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
    {
    tx_buffer[tx_wr_index]=c;
    if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
    ++tx_counter;
    }
    else UDR=c;
    #asm("sei")
    }
    #pragma used-
    #endif

    // Standard Input/Output functions
    #include <stdio.h>


    // USART initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: On
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud Rate: 9600
    UCSRA=0x00;
    UCSRB=0xD8;
    UCSRC=0x86;
    UBRRH=0x00;
    UBRRL=0x17;

    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;

    // Global enable interrupts
    #asm("sei")

    while (1)
    {
    #asm("sei")
    odb(); // funkcja przełącająca max485 na odbiur

    a=a+128;




    do
    {
    //jakis program
    xx=2;

    }
    while(nadaj==0) ;

    b=getchar(); // odebranie z transmisji

    nad(); // funkcja przełącająca max485 na nadawanie
    putchar(234) ; // nadanie 234

    };
    }
  • #6 4479002
    firefox_PL
    Poziom 17  
    Posty: 235
    Pomógł: 21
    Ocena: 2
    dzięki oto chodziło
REKLAMA