AVR, UART

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; }

Reply to
invalid unparseable
Loading thread data ...

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.

Reply to
invalid unparseable

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

Reply to
Jurek Szczesiul

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.

Reply to
invalid unparseable
Reply to
invalid unparseable

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.