Witam serdecznie.
Napisałem bardzo prosty kod do obsługi UARTu. Jest on w pełni sprawny. ATmega128 z zewnętrznym kwarcem 14745600Hz.
Problem polega na tym, że gdy komunikuję się za pomocą terminala to gdy wcisnę na klawiaturze literę "w" dioda podłączona do PD4 świeci ciągle.
Nie chcę by świeciła ona ciągle, a jedynie wtedy, gdy przytrzymam "w". Gdy puszczę dioda ma zgasnąć.
Stosunkowo bardzo proste się to wydaje, ale nie mogę jakoś sobie z tym poradzić
Kod programu:
Napisałem bardzo prosty kod do obsługi UARTu. Jest on w pełni sprawny. ATmega128 z zewnętrznym kwarcem 14745600Hz.
Problem polega na tym, że gdy komunikuję się za pomocą terminala to gdy wcisnę na klawiaturze literę "w" dioda podłączona do PD4 świeci ciągle.
Nie chcę by świeciła ona ciągle, a jedynie wtedy, gdy przytrzymam "w". Gdy puszczę dioda ma zgasnąć.
Stosunkowo bardzo proste się to wydaje, ale nie mogę jakoś sobie z tym poradzić
Kod programu:
/* Prędkość transmisji 9600 */
#define BAUD 9600
#define MYUBRR F_CPU/BAUD/16-1
#include <stdio.h>
#include <avr/io.h>
#include <util/delay.h>
/************** Inicjuje port szeregowy AVRa ************/
void USART_init(unsigned int myubrr)
{
/* Ustala prędkość transmisji */
UBRR0H = (unsigned char)(myubrr>>8);
UBRR0L = (unsigned char)myubrr;
/* Włącza nadawanie i odbiór*/
UCSR0B = (1<<RXEN) | (1<<TXEN);
/* Format ramki: 1 bit stopu, 8 bitów danych */
UCSR0C = (0<<USBS0)| (1<<UCSZ1) | (1<<UCSZ0);
}
/***************** Funkcja nadawania znaku ********************/
void uart_putc(uint8_t data)
{
/* Oczekiwanie na zakończenie nadawania */
while(!(UCSR0A & (1<<UDRE0)));
/* Wysyłanie danych */
UDR0 = data;
}
/***************** Funkcja odbioru znaku **********************/
uint8_t uart_getc(void)
{
/* Sprawdzanie danych w buforze */
while ( !(UCSR0A & (1 << RXC)) );
/* Dane z bufora */
return UDR0;
}
/*************** Funkcja wysyłająca ciąg znaków ***************/
void uart_puts(const char *s )
{
while (*s)
uart_putc(*s++);
}
/**************** Funkcja włączajaca port PD4 *****************/
void przycisk(uint8_t c)
{
if (c=='w')
{
PORTD =_BV(PD4);
}
}
/******** Głowna funkcja*******/
int main(void)
{
DDRD=0xFF; //Wszystkie linie portu D będą wyjściami
uint8_t c; //deklaracja zmiennej c
USART_init(MYUBRR); //inicjalizacja UARTa
uart_puts("Witaj!\r\n");
while(1)
{
c = uart_getc();
przycisk(c);
}
}