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

[ATMega][SN75176][c] - problemy z UARTem (przerwania)

Citek 04 Mar 2009 12:20 2009 3
REKLAMA
  • #1 6234417
    Citek
    Poziom 22  
    Witam
    I mam znowu kolejny z UART, a dokładniej chodzi mi o przerwania wyzwalane przez znak przychodzący.
    Chciałbym odbierać trzy znaki(ramki, bajty) a następnie zapisywać je do zmiennych i sprawdzać czy spełniają warunek znajdujący się w głównym programie.
    Niestety coś nie działa, wygląda to tak jakby wartości zmiennych nie były przenoszone do programu głównego

    Poniżej kod głównego programu:
    
    #include <avr/io.h>              	// dostęp do rejestrów
    #include <inttypes.h>				// 
    #include <util/delay.h>
    #include <avr/interrupt.h>		//obsługa przerwań
    #include <uart.h>
    #include "definicje.h"
    
    
    #define addr 41 			// adres ustalony jest wg schematu, młodsze bity oznaczają adres, starsze rodzaj - dokładny opis w dokumentacji
    
    int odbior=0;
    uint8_t raddr, data, chk;
    
    void piny(void)
    {
    	sbi(DDRC,0);
    	sbi(PORTC,0);
    	sbi(DDRC,1);
    	sbi(PORTC,1);
    	sbi(DDRD,4);
    	cbi(PORTD,4);			//włączenie odbioru
    
    	sbi(DDRC,3);
    	cbi(PORTC,3);			//ustawienie przekaźnika w stanie wyłączony
    }
    
    SIGNAL(SIG_UART_RECV)
    {
    	raddr = UART_odbierz();
    	data = UART_odbierz();
    	chk = UART_odbierz();
    
    	if ((raddr==0x01)&&(data==open))
    	{
    		cbi(PORTC,LED2);
    		odbior=1;//sbi(PORTC,RELAY);
    	//UART_pakiet(addr,OK);
    	}
    
    }
    
    int main(void)                  // program główny
    {
    	UART_Init(2400);              // inicjalizacja portu szeregowego
    	piny();
    	sei();
    	cbi(PORTC,LED1);
    
    	while(1)                      // pętla nieskończona
    	{
    		_delay_ms(100);
    		if (odbior==1)
    		{
    		sbi(PORTC,RELAY);
    		}
    		//if ((raddr==0x01)&&(data==close))
    		//{
    		//sbi(PORTC,RELAY);
    		//}		
    	}
    } 


    Kod podprogramu uart.c:

    #include <avr/io.h> 
    #include <inttypes.h>
    #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
    
    #define GOOD 0xDD
    #define ERROR	0x21
    #define SN 4
    
    // Definicje funkcji odpowiedzialnych za komunikację po UART-cie
    
    void UART_Init(void)
    {
       /* 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_wyslij (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_odbierz (void)
    {
         /* Wait for data to be received */
       while ( !(UCSRA & (1<<RXC)) )
       ;
       /* Get and return received data from buffer */
       return UDR;
    }
    
    void UART_pakiet(uint8_t addr, uint8_t data)
    {
    	sbi(PORTD,SN);
    	//_delay_ms(1);
    	//UART_putchar(SYNC); // Sync
    	UART_wyslij(addr); // Receiver address
    	UART_wyslij(data); // Button status
    	UART_wyslij((addr+data)); // Checksum
    	_delay_ms(1);
    	cbi(PORTD,SN);
    	//_delay_ms(50);
    }
    
    void UART_OK(uint8_t addr)
    {
    	UART_pakiet(addr,GOOD);
    }
    
    void UART_ERROR(uint8_t addr)
    {
    	UART_pakiet(addr,ERROR);
    }
    


    Na początku kod głównego programu wyglądał tak jak kod przerwania, czyli porównanie wartości if ((raddr==0x01)&&(data==open)), niestety nic to nie dawało, dlatego zmodyfikowałem trochę program ale znowu bez skutecznie...
  • REKLAMA
  • Pomocny post
    #2 6234463
    Freddie Chopin
    Specjalista - Mikrokontrolery
    i jak zwykle, odpowiedz standardowa - volatile. ile razy bedzie musiala jeszcze pasc, aby forumowicze znajdywali ja w wyszukiwarce, a nie pytali o nia co chwile?

    4\/3!!
  • REKLAMA
  • #3 6234478
    Citek
    Poziom 22  
    a tak myślałem, że chyba coś takiego będzie trzeba zastosować
    dzięki za pomoc

    Dodano po 13 [minuty]:

    jeżeli chodzi o te częste pytania na forum to może warto napisać temat np. "To warto przeczytać, ponieważ oszczędzi ci wiele czasu i nerwów" i opisać tam właśnie takie "kruczki" z którymi boryka się wielu userów. Oczywiście temat należałoby podpiąć
REKLAMA