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