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

C AVR bufor dla uarta, odbieranie znaków

figa_miga 30 Mar 2011 20:17 1617 2
REKLAMA
  • #1 9342121
    figa_miga
    Poziom 19  
    #include <avr/io.h> 
    #include <avr/interrupt.h> 
    #define F_CPU 11059200UL
    #include <util/delay.h>
    
    #define UART_BAUD 19200 
    #define UART_SPD (F_CPU/(16ul*UART_BAUD))-1 
    
    #define clr(PORT, BIT) (_SFR_BYTE(PORT) &= ~_BV(BIT)) 
    #define set(PORT, BIT) (_SFR_BYTE(PORT) |= _BV(BIT)) 
    #define toggle(PORT, BIT) (_SFR_BYTE(PORT) ^= _BV(BIT)) 
    
    
    
    #define IO_DDR DDRC 
    #define IO_PORT PORTC 
    #define IO_PIN PINC 
    #define LED1 0 
    #define LED2 1 
    #define BUZ 7 
    volatile char BUF_RX[5];
    
    volatile char UDR_KO=1; 
    char UA_PREV=0;			//poprzednio odebrany znak
    char UA_WSK=0;			//wskaznik wysokosci bufora
    
    
    
    int main() 
    {    
    
    [inContentAd]
    
       IO_PORT=255; 
       IO_DDR= 255; //1<<LED1|1<<LED2|1<<BUZ;
        _delay_ms  (50);
    
    //======================================================= 
       UBRRL=UART_SPD; //wpisanie predkosci uarta 
       UCSRB= 1<<RXCIE|1<<RXEN|1<<TXEN;      // przerwania tylko od RX, odb i nad. wlaczone             
       sei();    
          UDR=UART_SPD; 
       while(1) 
          { 
          if (UDR_KO==48) toggle(IO_PORT, BUZ), UDR_KO=0; 
    	 // toggle(IO_PORT, LED2); 
    	  _delay_ms  (50);
          } 
           
    return 0; 
    } 
    
    
    
    SIGNAL (USART_RXC_vect) 
    { 
       UDR_KO=UDR; 
     //UDR=UDR_KO; 
      
      
      	if (UDR_KO==48 && UA_PREV==49)	UA_WSK=0,UA_PREV=UDR_KO,toggle(IO_PORT, LED1), return ;
    		
    	BUF_RX[UA_WSK]=UDR_KO;
    	UA_PREV=UDR_KO;
    	UA_WSK++;
    	if (UA_WSK==6) UA_WSK=5;  
    } 
    
    
    SIGNAL (USART_TXC_vect) 
    { 
      
    
    } 
    


    Build started 30.3.2011 at 20:07:17
    avr-gcc  -mmcu=atmega32 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT UART.o -MF dep/UART.o.d  -c  ../UART.c
    ../UART.c: In function '__vector_13':
    ../UART.c:59: error: expected expression before 'return'
    ../UART.c:61: warning: array subscript has type 'char'
    make: *** [UART.o] Error 1
    Build failed with 1 errors and 1 warnings...
    



    Programik ma za zadanie wykryć nadejscie 0 i 1, spowoduje to wyzerowanie wskaznika dla buforu dla zapisu odebranych znaków i wyjście z procedury przerwania. Każdy następny odebrany znak ma być wpisany do bufora, który ograniczony jest do 5 znaków.

    Nie mogę zrozumiec błędów, oraz nie jestem pewniem czy sposób z returnem faktycznie spowoduje wyjscie z przerwania (błąd=brak kompilacji=brak symulacji)
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #2 9342873
    Andrzej__S
    Poziom 28  
    
    ../UART.c:59: error: expected expression before 'return'
    

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Poszczególne instrukcje powinny być oddzielone średnikami, a nie przecinkami. Ponadto, jeśli chcesz, by wszystkie te 4 instrukcje wykonały się tylko po spełnieniu warunku, powinieneś je ująć w nawiasy klamrowe, bo w innym przypadku wykonanie tylko pierwszej instrukcji będzie zależne od warunku, pozostałe będą wykonywane zawsze.

    
    ../UART.c:61: warning: array subscript has type 'char'
    

    Zmienna UA_WSK użyta do indeksowania tablicy powinna być typu 'unsigned char', a nie 'char'.
  • #3 9343190
    figa_miga
    Poziom 19  
    racja, a co do wskaźnika to zmieniłem na uint8_t i przeszło (w sumie to to samo co unsigned char)
REKLAMA