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

Kod w C dla USART na ATmega16 w WINAVR - odbiór i nadawanie znaków

celnik 03 Lut 2012 10:46 1993 2
REKLAMA
  • #1 10488174
    celnik
    Poziom 14  
    Posty: 139
    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ć).
  • REKLAMA
  • #2 10489588
    marcianno1
    Poziom 2  
    Posty: 3
    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
    Załączniki:
    • uart.rar (17.3 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #3 10492162
    celnik
    Poziom 14  
    Posty: 139
    Wpisałem następujący kod:
    
    /*************************************************************************
    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.
REKLAMA