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:
Kod podprogramu uart.c:
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...
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...