Proszę Was o pomoc
Ponieżej umieszczam kod programu którego zadaniem jest zgaszenie i mruganie odpowiednimi diodami w zależności od naciśniętego klawisza na kompie.Komunikacja odbywa sie przez RS.
Chciałbym ten program zmienić by stan zczytywania klawiszy był w przerwaniu a nie przy pomocy peli "if" poniewaz widać ze diody gasną lub mrugają po pewnym opóźnieniu od naciśnięcia klawiszy(ok 3 s).Chyba ze istnieje inny sposób na zmniejszenie tego opóźnienia.
#include <avr/io.h> // dostęp do rejestrów
#include<avr/interrupt.h>
#define F_CPU 8000000ul // częstotliwość zegara w Hz
#include<util/delay.h>
#define cbi(sfr, b) (sfr &= ~(1<<b)) // bit 0 na pin portu
#define sbi(sfr, b) (sfr |= (1<<b)) // bit 1 na pin portu
unsigned char byte;
// Definicje funkcji
// inicjalizacja portu szeregowego
void UART_Init( unsigned int baud )
{
/* Set baud rate */
UBRRH = 0;
UBRRL = 51;
/* Enable receiver and transmitter */
UCSRB = (1<<RXCIE)|(1<<TXEN)|(1<<RXEN);
/* Set frame format: 8data, 1stop bit */
UCSRC = (1<<URSEL)|(3<<UCSZ0);
}
// wysyła znak podany jako parametr na port szeregowy
void UART_putchar (unsigned char c)
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & _BV(UDRE)) )
;
/* Put data into buffer, sends the data */
UDR = c;
}
// odbiera znak z portu szeregowego i zwraca go jako wartość funkcji
unsigned char UART_getchar (void)
{
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) )
;
/* Get and return received data from buffer */
return UDR;
}
int main(void) // program główny
{
DDRB=0xff;
DDRA=0xff;
DDRC=0xff;
UART_Init(19200); // inicjalizacja portu szeregowego
//////////////////////////////////////////////////////////////
while(1) // pętla nieskończona
{
cbi(PORTB,0);
cbi(PORTB,1);
cbi(PORTB,3);
cbi(PORTB,4);
if( UART_getchar()==0x73)
{
//////////////////////////////////////////////////////////
sbi(PORTB,0);
sbi(PORTB,1);
do
{
cbi(PORTB,2);
_delay_ms(250);
sbi(PORTB,2);
_delay_ms(250);
} while (UART_getchar()==0x73);
if( UART_getchar()==0x72)
{
sbi(PORTB,3);
sbi(PORTB,4);
do
{
cbi(PORTB,5);
_delay_ms(250);
sbi(PORTB,5);
_delay_ms(250);
}while (UART_getchar()==0x72);
}
}
}
}
Ponieżej umieszczam kod programu którego zadaniem jest zgaszenie i mruganie odpowiednimi diodami w zależności od naciśniętego klawisza na kompie.Komunikacja odbywa sie przez RS.
Chciałbym ten program zmienić by stan zczytywania klawiszy był w przerwaniu a nie przy pomocy peli "if" poniewaz widać ze diody gasną lub mrugają po pewnym opóźnieniu od naciśnięcia klawiszy(ok 3 s).Chyba ze istnieje inny sposób na zmniejszenie tego opóźnienia.
#include <avr/io.h> // dostęp do rejestrów
#include<avr/interrupt.h>
#define F_CPU 8000000ul // częstotliwość zegara w Hz
#include<util/delay.h>
#define cbi(sfr, b) (sfr &= ~(1<<b)) // bit 0 na pin portu
#define sbi(sfr, b) (sfr |= (1<<b)) // bit 1 na pin portu
unsigned char byte;
// Definicje funkcji
// inicjalizacja portu szeregowego
void UART_Init( unsigned int baud )
{
/* Set baud rate */
UBRRH = 0;
UBRRL = 51;
/* Enable receiver and transmitter */
UCSRB = (1<<RXCIE)|(1<<TXEN)|(1<<RXEN);
/* Set frame format: 8data, 1stop bit */
UCSRC = (1<<URSEL)|(3<<UCSZ0);
}
// wysyła znak podany jako parametr na port szeregowy
void UART_putchar (unsigned char c)
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & _BV(UDRE)) )
;
/* Put data into buffer, sends the data */
UDR = c;
}
// odbiera znak z portu szeregowego i zwraca go jako wartość funkcji
unsigned char UART_getchar (void)
{
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) )
;
/* Get and return received data from buffer */
return UDR;
}
int main(void) // program główny
{
DDRB=0xff;
DDRA=0xff;
DDRC=0xff;
UART_Init(19200); // inicjalizacja portu szeregowego
//////////////////////////////////////////////////////////////
while(1) // pętla nieskończona
{
cbi(PORTB,0);
cbi(PORTB,1);
cbi(PORTB,3);
cbi(PORTB,4);
if( UART_getchar()==0x73)
{
//////////////////////////////////////////////////////////
sbi(PORTB,0);
sbi(PORTB,1);
do
{
cbi(PORTB,2);
_delay_ms(250);
sbi(PORTB,2);
_delay_ms(250);
} while (UART_getchar()==0x73);
if( UART_getchar()==0x72)
{
sbi(PORTB,3);
sbi(PORTB,4);
do
{
cbi(PORTB,5);
_delay_ms(250);
sbi(PORTB,5);
_delay_ms(250);
}while (UART_getchar()==0x72);
}
}
}
}