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

Atmega8 ADC UART zle dane

djkomprez 24 Sty 2009 01:42 1461 10
  • #1 6045484
    djkomprez
    Poziom 21  
    Witajcie !

    Dopiero przerzucam się z bascoma na C i chciałem sobie odpalić
    UARTA aby podawał mi wartości ADC ...

    Na wyjściu powinienem otrzymać wartości ADC ... i leci coś
    ale zauważyłem że tylko w zakresie 0-255 ... a nie 0-1024
    Gdzie popełniłem błąd ?
    proszę sprawdźcie też pozostałość :)


    Taki oto kod zmontowałem ..

    
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h> 
    #include <util/delay.h>
    
    #include <stdlib.h>
    #include <avr/pgmspace.h>
    
    
    #ifndef F_CPU
    #define F_CPU 11059200UL
    #endif
    
    /* 9600 baud */
    #define UART_BAUD_RATE      9600 
    //
    //
    /////////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////////
    //
    //
    unsigned char buffer;
    
    void InitUSART( unsigned long int baud ) // baud - czyli bitrate portu COM
    {
       
       UBRRH = (unsigned char)(((F_CPU/(16UL*baud))-1)>>8);
       UBRRL = (unsigned char)((F_CPU/(16UL*baud))-1);
       // Otwarty kanal odbioru i nadawania
       UCSRB = (1<<RXEN)|(1<<TXEN);
       // 8bitów, 2bity stopu */
       UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
    }
    
    unsigned char ReceiveUSART( void )  // funkcja odbioru bajtu z RS232
    {
    
       while ( !(UCSRA & (1<<RXC)) );
       //odebrane = UDR;                 //zmienna odebrane przyjmuje wartosc UDR
       return UDR;
    }
    
    void TransmitUSART( unsigned char data )  // funkcja wysłania bajtu po RS232
    {
       while ( !( UCSRA & (1<<UDRE)) );
       UDR = data;
    } 
    
    void ADC_Init(void){
    ADCSRA=0b10000110;
    }
    
       
    unsigned int odczyt_nap(void)
    {
    ADMUX=2;
    ADCSRA |= _BV(ADSC);         
    while(bit_is_set(ADCSRA,ADSC)) 
    {};   
    itoa( ADC, buffer, 10);
    return buffer;
    }
    
    
    
    volatile unsigned char i=0; 
    int main(void){
    InitUSART(9600);
    ADC_Init();
    sei();
    
    
    //i=USART_Receive();
    for(;;){
    _delay_ms(100);
    TransmitUSART(buffer);
    }
    
    
    
    }
    
    SIGNAL(SIG_UART_RECV)
    {
    i=UDR;
    } 
    
    
    
    
    
  • #2 6045505
    dawid512
    Poziom 32  
    Cytat:
    ale zauważyłem że tylko w zakresie 0-255 ... a nie 0-1024

    W końcu wysyłasz tylko jeden bajt :P
  • #3 6045507
    djkomprez
    Poziom 21  
    A możesz to bardziej mi nakreślić :D
    chodzi o funkcje transmit ... tylko jak to rozwiązać ?
  • #4 6045527
    elektryk
    Poziom 42  
    djkomprez napisał:
    A możesz to bardziej mi nakreślić :D
    Jeden bajt=8bitów=wartości od 0 do 255
    djkomprez napisał:
    chodzi o funkcje transmit ... tylko jak to rozwiązać ?
    Dane trzeba by zapakować w jakaś ramkę, dać znak startu i końca, żeby zsynchronizować się etc.
    Nie do końca rozumiem Twój program z tą funkcją itoa, wydaje mi się że źle jej używasz, zamieniasz zmienną na wskaźnik który potem zwracasz jako unsigned. To składniowo kod jest ok, ale funkcjonalnie to jakaś masakra.
  • #5 6045534
    djkomprez
    Poziom 21  
    Generalnie to chciałem wysłać dane z ADC do komputera....

    Problem w tym że korzystałem z jakiejś gotowej biblioteki
    ale nawet że tak powiem nie pierdnęło nic ... może skopana


    btw tą funkcja itoa ratowałem się bo myślałem że gdzieś mi obcina
    zmienna na int-a :)
    Może macie coś godnego polecenia ? :)
  • #6 6045544
    elektryk
    Poziom 42  
    djkomprez napisał:
    Generalnie to chciałem wysłać dane z ADC do komputera....[..]Może macie coś godnego polecenia ? :)
    No ale w jakim formacie chciałbyś te dane odbierać na komputerze.
  • #7 6045548
    djkomprez
    Poziom 21  
    Generalnie to obojętne .. jak wiemy moża sobie konwertować :)

    Ale interesowało by mnie coś takiego .. nie wiem czy będziecie mieli pojęcie jak to zrobić ..

    otóż mam do wysłania więcej danych (3) i teraz żeby po stronie
    kompa wszystko dotarło idealnie pasuje zrobić jakaś sumę kontrolną ..
    w bascomie było cos ala crc8 ale pozwalało tylko liczyć na poziomie
    jednej zmiennej .. a ja chce zrobić coś takiego

    zmienna string = Q0 Dana1 Q1 Dana2 Q2 Dana3

    wpakować to w ramkę jakoś i wysłać z policzoną sumą kontrolną ..
    na razie pojęcia nie mam jak to zrobić no ale ...
    jak uda mi się wysłać to co chce to pewnie sobie poradzę :)
  • #8 6046096
    Freddie Chopin
    Specjalista - Mikrokontrolery
    nikt nie zauwazyl, ze zmienna buffer - w zamierzeniu bufor znakowy - ma pojemnosc 1 znaku? program dziala tylko przypadkiem, bo napisany jest tak, ze ma on calkowite prawo masakrowac pamiec RAM, stos czy cokolwiek mu sie tam trafi za ta zmienna buffer...

    kolejna kosmiczna sprawa jest to, ze po skonwertowaniu liczb na stringa (tablice char'ow) wysylasz przez uarta ... wskaznik na pierwsze miejsce w pamieci zmasakrowane przez zmienna buffer. biorac pod uwage zasady dzialania C, buffer bedzie wskazywac domyslnie na 0, czyli - z tego co mi wiadomo - na rejestry. wniosek - funkcja itoa masakruje ci kilka poczatkowych rejestrow...

    dalszy wniosek - to tylko przypadek, ze ten program sie nie wykrzacza zaraz po tej konwersji... no chyba ze sie jednak wykrzacza, a ty po prostu o tym nie wiesz. w taki sposob jak jest teraz to po prostu nie ma prawa dzialac, bo jest calkowicie niepoprawnie.

    proponuje spokojniej zaczac od przesylania jakichs ustalonych lancuchow znakowych przez UARTa, a potem zabrac sie za ADC i itoa.

    swoja droga - na moje oko kompilator produkuje ci w tym programie conajmniej DWA warningi - miales je gdzies, wiec nie dziw sie, ze nie dziala.

    4\/3!!
  • #9 6046265
    Konto nie istnieje
    Poziom 1  
  • #10 6049364
    djkomprez
    Poziom 21  
    Macie rację !

    Choć nie zwracajcie uwagi typu "to jest nie wykorzystywane"
    ponieważ wrzuciłem tutaj kod "zmasakrowany" po testach
    niestety nie miałem już siły walczyć i wrzuciłem tutaj to to miałem ..

    Co do uwag - trafne, postaram sie zacząć od transmisji..

    w razie W przedstawię opracowany kod obsługi usart-a :)
    później zajmę sie ADC ...

    Na razie dzięki .. w poniedziałek posiedze nad tym
  • #11 6057918
    djkomprez
    Poziom 21  
    No więc tak .. przysiadłem dziś do tego ..

    Mam taka bibliotekę pobraną stąd :
    http://homepage.hispeed.ch/peterfleury/uartlibrary.zip

    Kompilacja bezbłędna (załączone źródła testowe)
    wrzuciłem do proca ... i tak ..

    Z tego dostaje śmieci :
    
    uart_puts("String stored in SRAM\n");
    uart_puts_P("String stored in FLASH\n");
    


    natomiast to echo działa, literki z klawiatury są ok
    
    c = uart_getc();
    uart_putc( (unsigned char)c );
    


    co może być źle ? oczywiście transmisja ustawione prawidłowo 8N1
REKLAMA