Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

komunikacja RS232 atmega16 program

celnik 03 Lut 2012 10:46 1681 2
  • #1 03 Lut 2012 10:46
    celnik
    Poziom 14  

    Witam,
    szukam już od dłuższego czasu programu do odbioru i nadawania znaków na atmege16 do WINAVR w języku C, ale wszystko co znajduje to albo nie działa albo widać nie jest dostosowane tylko odbioru (np. stosowane są sbi, a WINAVR tego nie zna).
    Czy ktoś mógłby skrobnąć kod wzorcowy, nawet dla potomnych, żeby od razu zadziałał na ATMEGA16 z rezonatorem wewnętrznym (najprostsza konfiguracja) i skompilował się w WINAVR, do odbioru i nadawania znaków przez USART (już pozostałą część każdy może sobie dopisać jak odbierze znak to coś ma się stać).

    0 2
  • #2 03 Lut 2012 16:24
    marcianno1
    Poziom 2  

    Jeżeli dobrze zrozumiałem co potrzebujesz to dodaj plik .h do header i .c do source do swojego projektu oraz do folderu z projektem. Potem #include "uart.h" i jedziesz.
    Przykładową inicjalizacje masz w testuart.
    Pozdrawiam

    0
  • #3 04 Lut 2012 00:58
    celnik
    Poziom 14  

    Wpisałem następujący kod:

    Code:

    /*************************************************************************
    Title:    example program for the Interrupt controlled UART library
    Author:   Peter Fleury <pfleury@gmx.ch>   http://jump.to/fleury
    File:     $Id: test_uart.c,v 1.4 2005/07/10 11:46:30 Peter Exp $
    Software: AVR-GCC 3.3
    Hardware: any AVR with built-in UART, tested on AT90S8515 at 4 Mhz

    DESCRIPTION:
              This example shows how to use the UART library uart.c

    *************************************************************************/
    #include <stdlib.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    #include <avr/pgmspace.h>
    #include <util/delay.h> 

    #include "uart.h"


    /* define CPU frequency in Mhz here if not defined in Makefile */
    #ifndef F_CPU
    #define F_CPU 4000000UL
    #endif

    /* 9600 baud */
    #define UART_BAUD_RATE      9600     


    int main(void)
    {
        unsigned int c;
        char buffer[7];
        int  num=134;
       
       DDRA  = 0x07;
       PORTA = 0x00;
       
        /*
         *  Initialize UART library, pass baudrate and AVR cpu clock
         *  with the macro
         *  UART_BAUD_SELECT() (normal speed mode )
         *  or
         *  UART_BAUD_SELECT_DOUBLE_SPEED() ( double speed mode)
         */
        uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
       
        /*
         * now enable interrupt, since UART library is interrupt controlled
         */
        sei();
       
        /*
         *  Transmit string to UART
         *  The string is buffered by the uart library in a circular buffer
         *  and one character at a time is transmitted to the UART using interrupts.
         *  uart_puts() blocks if it can not write the whole string to the circular
         *  buffer
         */
        //uart_puts("String stored in SRAM\n");
       
        /*
         * Transmit string from program memory to UART
         */
        //uart_puts_P("String stored in FLASH\n");




       
           
        /*
         * Use standard avr-libc functions to convert numbers into string
         * before transmitting via UART
         */     
        //itoa( num, buffer, 10);   // convert interger into string (decimal format)         
        //uart_puts(buffer);        // and transmit string to UART

       
        /*
         * Transmit single character to UART
         */
        //uart_putc('\r');
       
        for(;;)
        {
            //PORTA = 0x03;
          //   _delay_ms(500);
          //   PORTA = 0x00;
          //   _delay_ms(500);
          /*
             * Get received character from ringbuffer
             * uart_getc() returns in the lower byte the received character and
             * in the higher byte (bitmask) the last receive error
             * UART_NO_DATA is returned when no data is available.
             *
             */
            //c = 0;
          c = uart_getc();
          
          
          
          if ( c > 0)
          {
             PORTA = 0x03;
             _delay_ms(6000);
             PORTA = 0x00;
             
          }
          
            //if ( c & UART_NO_DATA )
            //{
                /*
                 * no data available from UART
                 */
            //}
            //else
            //{
                /*
                 * new data available from UART
                 * check for Frame or Overrun error
                 */
                //if ( c & UART_FRAME_ERROR )
                //{
                //    /* Framing Error detected, i.e no stop bit detected */
                //    uart_puts_P("UART Frame Error: ");
                //}
                //if ( c & UART_OVERRUN_ERROR )
                //{
                    /*
                     * Overrun, a character already present in the UART UDR register was
                     * not read by the interrupt handler before the next character arrived,
                     * one or more received characters have been dropped
                     */
                //    uart_puts_P("UART Overrun Error: ");
                //}
                //if ( c & UART_BUFFER_OVERFLOW )
                //{
                    /*
                     * We are not reading the receive buffer fast enough,
                     * one or more received character have been dropped
                     */
                //    uart_puts_P("Buffer overflow error: ");
                //}
                /*
                 * send received character back
                 */
                //uart_putc( (unsigned char)c );
            //}
        }
       
    }

    czyli lekko go przerobiłem, żeby po przyjściu na pin 14 portD0 na ATMEGA16 zapaliła się dioda LED na porcie A. Tylko że cały czas sie pali.

    0