AVR, UART

May 12, 2004 5 Replies

Witam,



Pisze program, ktory na razie ma odbierac dane z UART. Procesor: Atmel AVR ATmega16. Uzywam zestawu uruchomieniowego AVT-992. Kabel null-modem.



Co jest nie tak ?



Podlaczylem do LEDow nastepujace piny:



- PD0,



- PD1,



- PD6 -- na przemian swieci/nie swieci (sterowanie z funkcji obslugi przerwania SIG_UART_RECV).



Uruchamiam hyperterminal pod windows (wylaczam sprzetowa kontrole przeplywu).



Pisze na klawiaturze -- nic.



Klikam ikonke telefonu z podniesiona sluchawka: dioda PD0 zmienia swoj stan.



Klikam ikonke telefonu z opuszczona sluchawka: dioda PD0 zmienia swoj stan, dioda PD6 zmienia swoj stan.



Klikam ikonke telefonu z podniesiona sluchawka: dioda PD0 zmienia swoj stan.



i tak caly czas.


Oto fragmenty programu:



UART.h:



----------



#ifndef _UART_H_ #define _UART_H_



enum { RECVBUF_MAX = 16, FCPU = 8000000, 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) { DDRD |= 64; /* dioda informacyjna */



/* 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; volatile int flagaaa = 0;



/* SIG_UART_RECV: obsluguje odbiornik */ SIGNAL (SIG_UART_RECV) { if (flagaaa == 0) sbi(PORTD, PD6), flagaaa = 1; else cbi(PORTD, PD6), flagaaa = 0;



if (recvBufPtr - recvBuf < RECVBUF_MAX) *recvBufPtr++ = UDR; }


Eksperyment:

Wysylam znak "a":

Zwarlem PD0 i PD1: nic nie otrzymano,

Rozwarlem PD0 i PD1: otrzymalem znak o kodzie 79.

Wyslalem znak "b":

Zwarlem PD0 i PD1: nic nie otrzymano,

Rozwarlem PD0 i PD1: otrzymalem znak o kodzie 16.

Wed, 12 May 2004 15:46:36 +0200, na pl.misc.elektronika, Umpa napisał(a):

Pytanie #1 - to fcpu oznacza wewnetrzny oscylator ? Jesli tak, to czy wstawiles odpowiedni kalibrator ( domyslnie zawsze jest uzyty dla 1 MHz, dla innych f program musi sam o to zadbac ).

Zewnetrzny. 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.

Nie wiem za bardzo co poustawiac.

Umpa.

No to pewnie powiniene¶ ustawiæ w³a¶nie: FCPU = 11059000 Pozdr EM

Oczywiscie ustawilem prawidlowo FCPU. Zamieszczony program to stara wersja.

Niemniej interesuje mnie czy musze ustawic jakies bity fuse, aby UART dzialal z zewnetrznym oscylatorem. A jesli mam ustawic XTAL, to w programie od Combo3 max. jest XTAL3-8 MHz, a ja mam kwarc ponad 11MHz.

Umpa.

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required