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

UART , krzaki zmiast dobrych danych

donelbaron 20 Cze 2009 17:44 3244 12
REKLAMA
  • #1 6681085
    donelbaron
    Poziom 15  
    Witajcie mam następujący problem, mam prosty program do wysyłania 1 oraz 0 w odstępie co sekundę. Jednak zamiast tego są jakieś krzaki. Moje pytanie w czym może leżeć problem, załączam kod, oraz wygląd na terminalu, kolejne pytanie to czy muszę programować fuse bity do odpowiedniego działania UARTA czy to właśnie przez to jest problem, oraz co się mogło by stać jeśli np zamienie wejścia z kości max232 do mikrokontrolera TXD z RXD??

    
    #include <avr/io.h>                // dostęp do rejestrów
    #include <util/delay.h>
    
    #define F_CPU            1000000ul         // częstotliwość zegara w Hz
    #define UART_BAUD        9600ul                // prędkość transmisji bit/s
    
    
    #define cbi(sfr, b) (sfr &= ~(1<<b))
    #define sbi(sfr, b) (sfr |= (1<<b))
    
    #define LED_PORT        PORTD                // port diody LED
    #define LED_BIT                4                // bit diody LED
    
    #define DDR(x) _SFR_IO8(_SFR_IO_ADDR(x)-1) // adr. rej. kier. PORTx
    #define PIN(x) _SFR_IO8(_SFR_IO_ADDR(x)-2) // adr. rej. wej. PORTx
    
    #define LED_PORT_O        LED_PORT             // rejestr wyjściowy
    #define LED_PORT_D        DDR(LED_PORT)   // rejestr kierunkowy
    #define LED_PORT_I        PIN(LED_PORT)   // rejestr wejściowy
    
    #define UART_CONST        (F_CPU/(16ul*UART_BAUD)-1)
    
    // _UCR_
    
    #ifdef        UCR
    #define _UCR_        UCR
    #endif
    
    #ifdef        UCSRB
    #define _UCR_        UCSRB
    #endif
    
    #ifdef        UCSR0B
    #define _UCR_        UCSR0B
    #endif
    
    // _USR_
    
    #ifdef        USR
    #define _USR_        USR
    #endif
    
    #ifdef        UCSRA
    #define _USR_        UCSRA
    #endif
    
    #ifdef        UCSR0A
    #define _USR_        UCSR0A
    #endif
    
    // Definicje funkcji
    
    // inicjalizacja portu szeregowego
    void UART_init(void)
    {
      UBRRL = (unsigned char)UART_CONST;         // ustaw prędkość transmisji
      _UCR_ = _BV(RXEN)|_BV(TXEN);                // załącz tx, rx
    }
    
    // wysyła znak podany jako parametr na port szeregowy
    void UART_putchar (char c)
    {
      UDR = c;                                // wpisz c do rejestru UDR
      loop_until_bit_is_set(_USR_,TXC);        // czekaj na zakończenie transmisji
      sbi(_USR_,TXC);                                // ustaw bit TXC w rej. USR
    }
    
    // odbiera znak z portu szeregowego i zwraca go jako wartość funkcji
    char UART_getchar (void)
    {
      loop_until_bit_is_set(_USR_,RXC);        // czekaj na zakończenie odbioru
      cbi(_USR_,RXC);                                // skasuj bit RXC w rej. USR
      return UDR;                                // zwróć zawartość rejestru UDR
    }
    
    void delay_ms( int ms)
    	{
    	volatile long unsigned int i;
    	for(i=0;i<ms;i++)
    		_delay_ms(1);
    	}
    
    int main(void)                        // program główny
    {
      UART_init();                        // inicjalizacja portu szeregowego
    
      sbi(LED_PORT_D,LED_BIT);        // użyj linii jako wyjścia
    
      while(1)                        // pętla nieskończona
      {
        cbi(LED_PORT_O,LED_BIT);        // zapal diodę LED
        UART_putchar('A');                // wyślij '1' na port szeregowy
        //UART_getchar();                // czekaj na znak z portu szeregowego
        sbi(LED_PORT_O,LED_BIT);        // zgaś diodę LED
        UART_putchar('D');                // wyślij '0' na port szeregowy
        delay_ms(500);
        //UART_getchar();                // czekaj na znak z portu szeregowego
      }
    }
    


    UART , krzaki zmiast dobrych danych

    Dodano po 34 [minuty]:

    przerobiłem troche kod ale dalej to samo, krzaki mi wysyła.

    
    #include <avr/io.h>                // dostęp do rejestrów
    #include <util/delay.h>
    
    #define F_CPU      1000000    //częstotliwość zegara w Hz
    #define UART_BAUD   9600         //prędkość transmisji
    #define UART_CONST   (F_CPU/(16ul*UART_BAUD)-1)               // prędkość transmisji bit/s
    
    
    
    void delay_ms( int ms)
    	{
    	volatile long unsigned int i;
    	for(i=0;i<ms;i++)
    		_delay_ms(1);
    	}
    
    int main(void)                        // program główny
    {
    	DDRB=0x00;
    	PORTB=0xFF;
    	UART_init();
    
    
    	 while(1)
    	 {
    	 UART_putc(2);
    	 delay_ms(1000);
    	 }
    
    }
    void UART_init(void)
    {
      // ustaw prędkość transmisji
      UBRRH = (unsigned char)(UART_CONST >> 8);
      UBRRL = (unsigned char)(UART_CONST & 0xFF);
      // załącz odbiornik i nadajnik
      UCSRB = _BV(RXEN)|_BV(TXEN);
      // ustalenie formatu ramki: 8bit, 2 bity stopu
      UCSRC = _BV(URSEL)|_BV(USBS)|_BV(UCSZ1)|_BV(UCSZ0);
    }
    
    
    
    void UART_putc( unsigned char data )
     {
       while (!( UCSRA & (1<<UDRE)) );     //(bit_is_clear(UCSRA,UDRE));
            {
             UDR = data;
            }
     }
    
  • REKLAMA
  • Pomocny post
    #2 6681231
    dawid512
    Poziom 32  
    Twoja inicjalizacja Uarta wygląda ubogo. Spróbuj z taką:
    void UART_init(void)
    {
      // ustaw prędkość transmisji
      UBRRH = (unsigned char)(UART_CONST >> 8);
      UBRRL = (unsigned char)(UART_CONST & 0xFF);
      // załącz odbiornik i nadajnik
      UCSRB = _BV(RXEN)|_BV(TXEN)|_BV(RXCIE);
      // ustalenie formatu ramki: 8bit, 2 bity stopu
      UCSRC = _BV(URSEL)|_BV(USBS)|_BV(UCSZ1)|_BV(UCSZ0);
  • REKLAMA
  • #3 6681282
    donelbaron
    Poziom 15  
    tez probowałem, patrz wyżej, i wciąż nie działa, ponowiam prośbe o pytania z początku postu. Czy coś nie tak z częstotliwościa procka, albo szybkością transmisji?
  • REKLAMA
  • Pomocny post
    #4 6681318
    dawid512
    Poziom 32  
    Zmieniłeś ustawienia w terminalu dla nowego init'a ?
  • #5 6681498
    donelbaron
    Poziom 15  
    oczywiście
  • Pomocny post
    #6 6681513
    dawid512
    Poziom 32  
    W takim razie pokaż schemat połączeń.
  • #7 6681557
    donelbaron
    Poziom 15  
    ech teraz to pewnie dopiero w pon do tego wrócę , narazie umieściłem jeszcze jeden temat bo mi sie atemega zablkowała , może masz jakiś pomysł na to? to już druga.
  • REKLAMA
  • #9 6682223
    donelbaron
    Poziom 15  
    mam tylko kwarc 16 Mhz, oraz 8 Mhz, troche opornikow, jakieś kondesaotry, jak mogłbym taki gen zbudować? w najprostysz sposób? bo nie mam elementów do colpitsa ani minera
  • #11 6682443
    donelbaron
    Poziom 15  
    chciałem to zrobić dzisiaj, ale nie mam invertera. Mam bramki NAND, gen 555, kondesatory 10, 20 micro, rezystory glownei 20 kilo , jeden 10 kilo, i jakies słabsze po 100 ohm. do tego dwa kwarce, 8 Mhz, 16 Mhz. da sie z tego jakis przebieg zbudowac? i 200k ma wystarczy? ja słyszałem ze 1Mhz, to minimum żeby to odblokowac.

    Dodano po 46 [sekundy]:

    i jeszcze 10 piko kondensator sie znajdzie.

    Dodano po 1 [godziny] 41 [minuty]:

    dobra panowie, sprawiłem nowy procek, w sumie to tak ten nowy sprawdziłem czy działa, wyjąłem z płytki podłaczylem tylko zasialnie , i wyjście XTAL2 do XTAL1 tego padnietego którego włozyłem do płytki mimo wszytko nie dało się go ruszyć, ale to już nieważne, na tym nowym ustawiłęm fuse bity odpowiednio do kwarcu 16 Mhz. i co mnie zdziwiło to jak w make file i w programie ustawiłęm F_CPU na 16000000 i chciałem pomrugać diodą co sekunde to mrugała z częstotliwością z 5 Hz. ale jak usatwiłem prędkość na 14745600 to zaczęło działać , dlaczego tak jest?

    Dodano po 27 [minuty]:

    a więc tak, zmieniłem kod programu , teraz wygląda innaczej, dołożyłem kwarc 16 mega, zmienilem fusy, a znaki dalej jako krzaki załączone na widoku terminalu , na innych to samo. Moje pytanie, co z tym można zrobić?
    
    #include <avr/io.h>                // dostęp do rejestrów
    #include <util/delay.h>
    
    #define F_CPU      14745600    //częstotliwość zegara w Hz
    #define UART_BAUD   19200        //prędkość transmisji
    #define UART_CONST   (F_CPU/(16ul*UART_BAUD)-1)               // prędkość transmisji bit/s
    
    
    
    void delay_ms( int ms)
    	{
    	volatile long unsigned int i;
    	for(i=0;i<ms;i++)
    		_delay_ms(1);
    	}
    
    void USART_Init ( unsigned int ubrr)
    {
    	UBRRH= (unsigned char)(ubrr>>8);
    	UBRRL= (unsigned char)(ubrr);
    
    	UCSRB= (1<< RXEN)|(1<<TXEN);
    
    	UCSRC= (1<<URSEL)|(3<<UCSZ0);
    }
    
    void USART_Transmit ( unsigned char data)
    {
    	while (!(UCSRA&(1<<UDRE)));
    
    	UDR = data;
    }
    
    int main(void)                        // program główny
    {
    	USART_Init( UART_CONST);
    
    
    	 while(1)
    	 {
    			USART_Transmit('Ad');
    			delay_ms(1000);
    	 }
    
    }
    


    UART , krzaki zmiast dobrych danych
  • #12 6683744
    donelbaron
    Poziom 15  
    dobra w sumie dochodzę do następujących wniosków, mam kwarc 16 Mhz, jeśli dodaje definicje
    #define F_CPU 14745600 to transmisja nie dziala, jesti ustawiawm na 16000000 to wszystko pięknie chodzi. No ale przy takiej szybkości dioda mi dziwnie szybko mruga, może mi ktoś wytłumaczyć o co w tym wszystkim chodzi z tą częstotliwością?
  • #13 7176674
    ATPAW
    Poziom 20  
    Wydaje mi się że jak podajesz #define F_CPU 14745600UL to taki musisz zastosować fizycznie kwarc. Program podczas kompilacji nie wie jaki masz zegar podpięty, dlatego musisz go o tym poinformować. Podając błędne informacje, wszystkie wykonywane przerwania opóźnienia mają poważny błąd dokładności
REKLAMA