Witam wszystkich mam pewien problem z działaniem kodu umieszczonego w w przerwaniach. Sytuacja ta zdarzyła mi się już poraz drugi i nigdzie nie mogę znaleźć żadnych wskazówek jak sobie z tym poradzić. Otoż problem polega na tym, że funkcja która działa bez problemu w pętli głównej, po umieszczeniu jej wywołania w przerwaniu powoduje wykrzaczenie sie programu. Przed przesiadka z CAVR na AVRGCC tego problemu nie zaobserwowałem. Poniżej zamieściłem program z, którym mam mały problem, na potrzeby tematu odpowiednio go spreparowałem tak aby uwidocznić sedno sprawy. Otóż funkcja PRINT(); wysyłająca komunikat na UARTw momencie wprowadzenia dowolnego znaku umieszczona jest przerwaiu SIGNAL(SIG_UART_RECV), zachowuje się dosyć dziwacznie. Jesli argumentem jest string który nie przekracza trzech znaków wszystko jest ok, natomiast jeśli znakow jest wiecej na wyjsciu nie pojawia się nic. Umieszczenie bardziej obszernych fragmentów kodu wydaje się być nie możliwe, czy ktoś z szanownych kolegów spotkał się z podobnym problemem, dodam, że używam biblioteki RKlibAVR.
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <string.h>
#include <stdlib.h>
//#include <avr/eeprom.h>
#include "global.h"
#include "uart.h"
prog_char ANSI_NEWLINE[] = {'\n','\r',0};
prog_char ANSI_CLEAR[] = {27,'[','H',27,'[','2','J',0};
#define PRINT(p) UART_putstr_P(PSTR(p))
#define CLEAR() UART_putstr_P(ANSI_CLEAR)
#define NEWLINE() UART_putstr_P(ANSI_NEWLINE)
#define PRINT(p) UART_putstr_P(PSTR(p))
/* ------------------------------------------------------------------------- */
/* ---------------- Program glowny ---------------- */
/* ------------------------------------------------------------------------- */
SIGNAL(SIG_UART_RECV)
{
char c;
c = _UDR_; // Get received char
UART_rbuf[UART_r_in & UART_RMASK] = c;
UART_r_in++;
// PRINT("zzz"); /////////funkcja wykonuje się jest komunikat z uarta
//PRINT("zzzzzzzz"); ///funkcja nie wykonuje, nic nie pojawia się na wyjsciu uarta
}
int main(void)
{
UART_init();
sei();
while(1)
{
_delay_ms(1000);
}
return;
}