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

[attiny2313] UART czemu nie działa?

carkar 06 Lis 2010 12:30 2385 6
REKLAMA
  • #1 8708891
    carkar
    Poziom 15  
    #define BAUD 2400
    #define MYUBRR  F_CPU/BAUD/16-1
    
    #include <stdio.h>
    #include <avr/io.h>
    #include <util/delay.h>
    
    
    /* Inicjuje port szeregowy AVRa */
    void USART_init(unsigned int myubrr)
    {
        /* Ustala prędkość transmisji */
        UBRRH = (unsigned char)(myubrr>>8);
        UBRRL = (unsigned char)myubrr;
    
        /* Włącza nadajnika */
        UCSRB = (1<<TXEN);
    
        /* Format ramki: 8 bitów danych, 1 bit stopu, brak bitu parzystości */
        UCSRC = (1<<URSEL)|(3<<UCSZ0); 
    }
    
    
    /* Wysyła znak do portu szeregowego */
    static int USART_Transmit(char c, FILE *stream)
    {
        while(!(UCSRA & (1<<UDRE)));
        UDR = c;
    
        return 0;
    }
    
    
    /* Tworzy strumienia danych o nazwie 'mystdout' połączony
        z funkcją 'USART_Transmit' */
    static FILE mystdout = FDEV_SETUP_STREAM(USART_Transmit, NULL, _FDEV_SETUP_WRITE);
    
    
    /*  GŁÓWNA FUNKCJA  */
    int main(void)
    {
    
      /* Inicjalizuje  port szeregowy AVRa */
      USART_init(MYUBRR);
    
      /* Przekierowuje standardowe wyjście do  'mystdout' */
      stdout = &mystdout;
    
      /* Główna pętla */
      while(1)
      {
    
            printf("Temperatura powietrza: /n") ; 
        }
      }
     


    A wynik kompilacji to:
    
    Compiling C: main.c
    avr-gcc -c -mmcu=attiny2313 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./main.lst  -std=gnu99 -MMD -MP -MF .dep/main.o.d main.c -o main.o 
    main.c: In function 'USART_init':
    main.c:33: error: 'URSEL' undeclared (first use in this function)
    main.c:33: error: (Each undeclared identifier is reported only once
    main.c:33: error: for each function it appears in.)

    Czy aktualizacja winAVR pomoże??
  • REKLAMA
  • #2 8708930
    Samuraj
    Poziom 35  
    Wyraźnie jest napisane że problem leży w funkcji USART_init a konkretnie w UCSRC nie ma URSEL.
    Błąd zapewne wziął się stąd iż kod pochodzi zapewne z ATMega8 lub coś wyższego.
    Dla ATtiny2313 usart inicjuj tak:
    
    #define PARITY_NONE 0
    #define DATA_BITS_8 ((1<<UCSZ1)|(1<<UCSZ0))
    #define STOP_BITS_1 0
    
    
    	UBRRH = (unsigned char)(baud_reg>>8);
    	UBRRL = (unsigned char)baud_reg;
    	UCSRB = UCSRB = (1<<TXEN);
    	UCSRC = DATA_BITS_8 | PARITY_NONE | STOP_BITS_1;
    
  • REKLAMA
  • #3 8708960
    carkar
    Poziom 15  
    Dzięki już się kompiluje.
    Masz rację kod pochodzi z atm16
  • #4 8708980
    hotdog
    Poziom 26  
    aktualizacja nie pomoże. Kompilatr w sumie wszystko napisał. zrób tak:

    UCSRC = (3<<UCSZ0);

    i powinno działać.
  • REKLAMA
  • #5 8709073
    carkar
    Poziom 15  
    czy może mi ktoś powiedzieć czemu w terminal bray wyświetla mi się:
    0><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><<00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00>€<00><00><00><00>ŕ<00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00>·<00> <00><00><00><00><00><00><00><00><00><00><00><00><00>Ŕ<00><00>

    zamiast temperatura powietrza


    I czemu
    void uart_putc(uint8_t data)
    {
    	// Oczekiwanie na zakończenie nadawania
    	while (!(UCSR & (1 << UDRE0)));
     
    	// Wysłanie danych
    	UDR0 = data;
    }
     
    // przydatna (ale nie niezbędna) funkcja wysyłająca ciąg znaków
    void uart_puts(const char *s )
    {
    	while (*s) 
    		uart_putc(*s++);
    }
    te funkcje się nie kompilują??

    main.c:29: error: 'UCSR' undeclared (first use in this function)
    main.c:29: error: (Each undeclared identifier is reported only once
    main.c:29: error: for each function it appears in.)
    main.c:29: error: 'UDRE0' undeclared (first use in this function)
    main.c:32: error: 'UDR0' undeclared (first use in this function)
  • Pomocny post
    #6 8709127
    Samuraj
    Poziom 35  
    hotdog napisał:
    aktualizacja nie pomoże. Kompilatr w sumie wszystko napisał. zrób tak:

    UCSRC = (3<<UCSZ0);

    i powinno działać.

    Przecież ja napisałem dokładnie to samo, tylko u mnie widać które bity są ustawione.


    carkar spróbuj tego:
    
    #include <inttypes.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <string.h>
    
    #define F_CPU 12000000UL
    #define UART_BAUD 4800UL
    #define _UBBR_ ((F_CPU/(16*UART_BAUD))-1)
    #define PARITY_NONE 0
    #define DATA_BITS_8 ((1<<UCSZ1)|(1<<UCSZ0))
    #define STOP_BITS_1 0
    
    
    
    /*UART*/
    void USART_Init( unsigned int baud_reg)
    {
       UBRRH = (unsigned char)(baud_reg>>8);
       UBRRL = (unsigned char)baud_reg;
       UCSRB = (1<<RXEN)|(1<<TXEN);					/* Enable Receiver and Transmitter */   
       UCSRC = DATA_BITS_8 | PARITY_NONE | STOP_BITS_1; 				/* Set frame format: 8data, 1stop bit */
    }
    
    void USART_Transmit( unsigned char data )
    {
    	while ( !( UCSRA & (1<<UDRE)) );			/* Wait for empty transmit buffer */
    	UDR = data;									/* Put data into buffer, sends the data */
    }
    
    unsigned char USART_Receive( void )
    {
       while ( !(UCSRA & (1<<RXC)) );				/* Wait for data to be received */
       return UDR;									/* Get and return received data from buffer */
    }
    
    void USART_TransmitString (unsigned char *str) 
    {
    	while ((*str != 0) && (*str != 10)) USART_Transmit (*str++);
    }
    
    int main(void)
    {
    	USART_Init(_UBBR_);
    	while(1)
    	{
    		USART_TransmitString("Test");
    		USART_Transmit(13);
    		USART_Transmit(10);
    	}
    }
    
    
    
  • REKLAMA
  • #7 8709169
    carkar
    Poziom 15  
    Dzięki, działa :)
    Masz +5p
REKLAMA