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.

atmega128 [c] UART wysyłanie liczb

dziczka 06 Lis 2012 17:59 1752 5
  • #1 06 Lis 2012 17:59
    dziczka
    Poziom 7  

    Witam,
    Od razu zaznaczę, że jestem początkująca w programowaniu uC.

    Mam problem z przesłaniem przez uart liczby, np 123.
    Próbowałam na kilka sposobów i nadal nie działa. Uart sam w sobie na pewno działa, ponieważ mogę wysłać pojedynczy znak.
    Czy mógłby ktoś spojrzeć na kod i powiedzieć co jest nie tak?
    Docelowo program ma wysyłać przez UART dane z ADC.

    Póki co ostateczna wersja:

    Kod: c
    Zaloguj się, aby zobaczyć kod



    Próbowałam też przez funkcje typu:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 5
  • #2 06 Lis 2012 20:45
    tmf
    Moderator Mikrokontrolery Projektowanie

    Nie działa, tzn. co wysyła? Pierwszy przykład nie może poprawnie działać bo funkcja oczekuje typu bajtowego (0-255), a przekazujesz jej liczbę reprezentowaną przez int. Drugi przykład powinien działać o ile USART jest poprawnie skonfigurowany.

    0
  • #3 06 Lis 2012 20:47
    krru
    Poziom 32  

    dziczka napisał:
    Póki co ostateczna wersja:
    Kod: c
    Zaloguj się, aby zobaczyć kod



    Powinno być (podobnie jak to masz w drugim przykładzie):
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #4 06 Lis 2012 20:57
    zumek
    Poziom 39  

    Kolejny błąd:
    Po wejściu do funkcji Usart_wysylanie, wyzeruj zmienną "i".
    ...
    Przydałoby się również:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #5 07 Lis 2012 10:09
    dziczka
    Poziom 7  

    Oba zaprezentowane przeze mnie przykłady nie wysyłają nic przez Uarta

    Wyzerowałam zmienna 'i' i dodałam bibliotekę, ale to nic nie dało.

    Uarta mam dobrze skonfigurowanego i podłączonego, więc powinno działać...
    Zasugerowałam się opinią tmf i aktualny kod:

    Code:

    #include <avr/io.h>
    #include <inttypes.h>
    #include <util/delay.h>
    #include <stdio.h>
    #include <stdlib.h>

    int i;
    char buf[10];

    void Usart_init(unsigned int ubrr)
    {
       UBRR0H = (unsigned char)(ubrr>>8);
       UBRR0L = (unsigned char)ubrr;
       UCSR0B = (1<<RXEN)|(1<<TXEN);
       UCSR0A = (0<<U2X0);
       UCSR0C = (1<<USBS)|(3<<UCSZ0);
    }

    void Usart_wysylanie(unsigned char data)
    {
       i=0;
       itoa(data, buf, 10);
       while(buf[i]!=0){
          while(!(UCSR0A & (1<<UDRE)));
          UDR0 = buf[i];
          i++;
       }
       
    }
    void USARTInteger(int liczba)
    {
        char str[7];
     
            str[3]=liczba%10+'0';
            liczba=liczba/10;   
            str[2]=liczba%10+'0';
            liczba=liczba/10;
            str[1]=liczba%10+'0';
            liczba=liczba/10;
            str[0]=liczba%10+'0';
            str[4]='\r';
            str[5]='\n';
            str[6]='\0';
            Usart_wysylanie(str);
    }



    void main()
    {

       Usart_init(71);//baud rate 9600
       
       while(1){
       USARTInteger(12);
       
       
       }
       //return 0;
    }



    Zamieniłam funkcję odpowiadającą za samo wysyłanie i działa :)

    Dodano po 18 [minuty]:

    Teraz mam jeszcze problem z tym, że uart nie chce wysyłać liczb większych niż 3 cyfrowe. Nie wiem co prawda jakiego rzędu wielkości uzyskam na ADC (mój układ jest zasilany 3.3V i na ADC będzie szedł sygnał z fotodiody).

    Nawet jeśli zwiększy się bufor str, ja zrobiłam to tak:
    Code:
    void USARTInteger(int liczba)
    
    {
        char str[9];
     
            str[5]=liczba%10+'0';
          liczba = liczba/10;
          str[4]=liczba%10+'0';
          liczba = liczba/10;
          str[3]=liczba%10+'0';
            liczba=liczba/10;   
            str[2]=liczba%10+'0';
            liczba=liczba/10;
            str[1]=liczba%10+'0';
            liczba=liczba/10;
            str[0]=liczba%10+'0';
            str[6]='\r';
            str[7]='\n';
            str[8]='\0';
            Usart_wysylanie(str);
    }


    ustawiłam char buf[12];

    0
  • #6 07 Lis 2012 15:51
    szelus
    Specjalista - Mikrokontrolery

    A kompilator nie krzyczy ostrzeżeniami?
    Twoja funkcja Usart_wysylanie() przyjmuje na wejściu unsigned char, a w wywołaniu przekazujesz wskaźnik na char. Normalnie kompilator rzuca ostrzeżeniem.

    Teraz tak - Usart_wysylanie() przyjmuje na wejściu bajt danych binarnie i wysyła jego wartość tekstowo - nic dziwnego, że nie da się wysłać liczby wiekszej, niż trzyznakowa.
    Zdecyduj się, czy do tej fukcji chcesz przekazywać liczbę, czy bufor. Jeżeli bufor, to argument powinien być typu wskaźnik na char i oczywiście usuń z niej konwersję na postać tekstową. Wtedy powinno działać.

    0
  Szukaj w 5mln produktów