Umpa
Guest
Wed May 12, 2004 12:46 pm
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 >>

;
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;
}
Umpa
Guest
Wed May 12, 2004 1:38 pm
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.
Jurek Szczesiul
Guest
Wed May 12, 2004 4:36 pm
Wed, 12 May 2004 15:46:36 +0200, na pl.misc.elektronika, Umpa napisał(a):
Quote:
FCPU = 8000000,
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 ).
--
Pozdrowienia
Jurek Szczesiul
Umpa
Guest
Wed May 12, 2004 4:57 pm
Quote:
FCPU = 8000000,
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.
EM
Guest
Thu May 13, 2004 9:42 am
Quote:
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.
No to pewnie powinieneś ustawić właśnie:
FCPU = 11059000
Pozdr
EM
Umpa
Guest
Thu May 13, 2004 9:58 am
Quote:
Nie wiem za bardzo co poustawiac.
No to pewnie powinieneś ustawić właśnie:
FCPU = 11059000
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.