AVR, UART, zewnetrzny oscylator

May 12, 2004 0 Replies

Witam,



Programuje UART.



Mam procesor AVR ATmega16. Obecnie mam zewnetrzny oscylator 11059000 Hz podlaczony do XTAL1 i 2 (+ kondensatory).



Mam programator Combo3. W ustawieniach w programie od programatora jest najwyzszy XTAL 3-8MHz. Ja mam oscylator ponad 11MHz. Nie wiem co ustawic.



W chwili obecnej cos moge przetransmitowac z komputera do procesora, ale otrzymuje inne znaki -- zapewne zle dostrojona czestotliwosc kwarcu.



Prosze o podpowiedz co i jak poustawiac, aby UART zaczal pracowac z moim kwarcem.



Oto fragment kodu programu:



UART.h:



----------



#ifndef _UART_H_ #define _UART_H_



enum { RECVBUF_MAX = 16, FCPU = 11059000, VUART = 57600, VUBRR = FCPU / (VUART * 16) - 1 };



void initUART(void);



#endif


UART.c:



----------



#include <avr/io.h>



#include <avr/interrupt.h>



#include <avr/signal.h>



#include <string.h>



#include "uart.h"



void initUART(void) { /* ustawienie predkosci transmisji */ UBRRH = (unsigned char)(VUBRR >> 8); UBRRL = (unsigned char)VUBRR;



/* zezwolenie na przerwania od odbiornika i nadajnika */ UCSRB = (1 << RXCIE) | (1 << TXCIE) | (1 << RXEN);



/* ustawienie formatu ramki: 8, 1 stop */ UCSRC = (1 << UCSZ1) || (1 << UCSZ0);



/* zezwolenie na przerwania */ sei(); }


char recvBuf[RECVBUF_USER_MAX] = "\0"; volatile char *recvBufPtr = recvBuf;



/* SIG_UART_RECV: obsluguje odbiornik */ SIGNAL (SIG_UART_RECV) { if (recvBufPtr - recvBuf < RECVBUF_MAX) *recvBufPtr++ = UDR; }


Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required