Witam.
Buduje dialer GSM, który będzie porównywał dzwoniący nr i jeżeli będzie prawidłowy to będzie sterował jednym z wyjść uP. Niestety trafiłem na problem z porównaniem tablicy poprzez polecenie strncmp, ponieważ dostaję warninga.
Oto opis z AVRStudio:
../C35i_RC1.c:121: warning: passing argument 1 of 'strcmp' discards qualifiers from pointer target type
Chciałem też wyłączać przerwanie w przerwaniu, czy tak można robić. Pytam się dlatego, bo nie chciało mi to za bardzo działać.
Oto mój kod:
Buduje dialer GSM, który będzie porównywał dzwoniący nr i jeżeli będzie prawidłowy to będzie sterował jednym z wyjść uP. Niestety trafiłem na problem z porównaniem tablicy poprzez polecenie strncmp, ponieważ dostaję warninga.
Oto opis z AVRStudio:
../C35i_RC1.c:121: warning: passing argument 1 of 'strcmp' discards qualifiers from pointer target type
Chciałem też wyłączać przerwanie w przerwaniu, czy tak można robić. Pytam się dlatego, bo nie chciało mi to za bardzo działać.
Oto mój kod:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <string.h>
#include <stdlib.h> // itoa, atoi
#include <util/delay.h>
#include <hd44780_at8.c>
#include <string.h>
#include <avr/io.h> // dostęp do rejestrów
#include <inttypes.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define FOSC 4000000
#define BAUD 19200
#define MYUBRR FOSC/16/BAUD-1
unsigned char wys;
volatile int odbior=0;
volatile int licz=0;
volatile char bufor[100]="Test\0";
//char bufor1[10]="S\0";
void usart_init(unsigned int ubrr)
{
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;
UCSRB = (1<<RXCIE)|(1<<TXEN)|(1<<RXEN);
//UCSRB = (1<<RXEN)|(1<<TXEN);
UCSRC = (1<<URSEL)|(0<<USBS)|(3<<UCSZ0);
}
void nadaj_znak(unsigned char data)
{
while(!(UCSRA&(1<<UDRE)));
UDR=data;
}
unsigned char odbierz_znak(void)
{
while(!(UCSRA & (1<<RXC)) );
return UDR;
}
void wyslij_slowo(char *dana)
{
int dlugosc_slowa, k =0 ;
dlugosc_slowa = strlen(dana);
for(k = 0; k<dlugosc_slowa; k++)
{
nadaj_znak(dana[k]);
}
}
SIGNAL(SIG_UART_RECV)
{
//cli(); - tu próbowałem wyłączyć przerwanie
//_delay_ms(100);
LCD_WriteText("1");
do
{
wys=odbierz_znak();
}
while ((wys==0x0A)||(wys==0x0D));
licz=-1;
while ((wys!=0x0A)&&(wys!=0x0D))
{
licz++;
bufor[licz]=wys;
LCD_WriteData(wys);
wys=odbierz_znak();
}
wys=odbierz_znak(); //odebranie ostatniego 0x0A
//cli(); - i tu także niestety nic to nie dało
odbior=1;
}
int main(void)
{
LCD_Initalize();
LCD_Clear();
LCD_WriteText("LCD@TEST");
_delay_ms(100);
usart_init(MYUBRR);
_delay_ms(1000); //dłuższe opóźnienie, aby uruchomił się UART
wyslij_slowo("ATE0"); //wyłączenie ECHA
nadaj_znak(0x0D);
_delay_ms(100);
wyslij_slowo("ATD+48500600700;"); //dzwonienie
nadaj_znak(0x0D);
_delay_ms(2000);
wyslij_slowo("ATH"); //rozłączenie
nadaj_znak(0x0D);
_delay_ms(100);
LCD_WriteText("Wysłano numer");
_delay_ms(1000);
LCD_Clear();
LCD_WriteText("Odbieram znaki");
LCD_Clear();
wys=odbierz_znak();
wys=odbierz_znak();
wys=odbierz_znak();
sei();
_delay_ms(1000);
while(1)
{
LCD_WriteText("*");
_delay_ms(5500);
if (odbior==1)
{
for (int k=0;k<licz+1;k++)
{
LCD_WriteData(bufor[k]);
}
if (strncmp (bufor, "RING", 4) == 0)
{
LCD_WriteText("OKI?");
}
odbior=0;
//cli(); - tu jak wyłączałem przerwanie to działało
}
}
}