logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak przerobić ten kod programu na obsługę przerwań

mgucio 22 Mar 2010 20:51 980 1
REKLAMA
  • #1 7867205
    mgucio
    Poziom 10  
    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);



    }
    }

    }

    }
  • REKLAMA
  • #2 7867241
    _Robak_
    Poziom 33  
    Po pierwsze to kod daj w znacznikach code. Po drugie, czy to w przerwaniu czy nie, 3 sekundy to wieczność. W skrócie tak
    
    void main(void)
    {
          if(UART_getchar()==jakas wartosc)
          {
                  zapal diode
          }
    }
    
REKLAMA