Witam serdecznie,
mam mały problem z moim urządzeniem. Zbudowałem kiedyś płytkę ewaluacyjna dla Atmegi128, nigdy nie miałem z nią większego problemu. Mam teraz jednak problem. Jak zawsze chciałem ją oprogramować ale cos jest nie tak. Poniżej zamieszczam kod i tłumacze o co mi chodzi.
Powyżej przedstawiony kod ma za zadanie odbieranie ciągów znaków do tablicy rxGSM. W momencie kiedy moduł otrzyma znak końca linii 0x0D wówczas na wyświetlaczu ma sie pojawić ciąg literek p. Niestety tak sie nie dzieje. Po odebraniu znaku końca linii wyświetla literkę "e", zablokowany zostaje odbiór ale program nigdy nie wchodzi do pętli while(1).
Najśmieszniejsze w tym wszystkim jest to, że cała ta procedura działa kiedyś.
Kod tworze w AvrStudio a kompilator to WinAVR.
Zastanawiam sie teraz czy wina leży po stronie sprzętu(płyta ewalucayjna służy mi juz dłuższy czas) czy tez może z kompilatorem coś jest nie tak.
Czy kompilator przez przypadek nie powinien ostrzegać mnie o tym ze została zdefiniowaną zmienna
a nigdzie jej nie używam???
Będę wdzięczny za wszelka pomoc
Pozdrawiam
Paweł
mam mały problem z moim urządzeniem. Zbudowałem kiedyś płytkę ewaluacyjna dla Atmegi128, nigdy nie miałem z nią większego problemu. Mam teraz jednak problem. Jak zawsze chciałem ją oprogramować ale cos jest nie tak. Poniżej zamieszczam kod i tłumacze o co mi chodzi.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
//#define F_CPU 14.7456E6
#define F_CPU 16E6
#include <util/delay.h>
#define LCD PORTA
#define E 3
#define RS 2
#include "lcd.h"
#define BAUD 4800
#define MYUBRR F_CPU/16/BAUD-1
/******************************************************************************/
/****** ** * OBŁUGA USART0 * ** ******/
/******************************************************************************/
/************************Zmienne globalne portu USART0*************************/
char rxGsm[30]; //bufor znaków odebranych z modułu GSM
int iterGsm = 0; //iterator odbieranych znaków
int enterRx = 0;
char x; //flaga odebrania wiadomosci
/**********************Ustawienei parametrów portu USART0**********************/
void USART_Init( unsigned int baud ) {
UBRR0H = (unsigned char)(baud>>8);
UBRR0L = (unsigned char)baud;
UCSR0A = 0;
UCSR0B = 0;
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
}
/*****************************Odbiór danych z USART0***************************/
SIGNAL(SIG_USART0_RECV){
rxGsm[iterGsm] = UDR0;
if(rxGsm[iterGsm] == 0x0D){
UCSR0B = (0<<RXEN0)|(0<<RXCIE0); // zakończ przerwania i odbiór
iterGsm = 0; // wyzeruj licznik
enterRx=1;
write_text("e");
}
else{
iterGsm++;
write_char(rxGsm[iterGsm]); //iteracja
}
}
/******************************************************************************/
/****** ** * PROGRAM GŁÓWNY * ** ******/
/******************************************************************************/
int main(void)
{
sei();
DDRA = 0xFF;
PORTA = 0xFF;
lcd_init();
USART_Init(MYUBRR);
UCSR0B = (1<<RXEN0)|(1<<RXCIE0);
while(1)
{
if(enterRx == '1'){
enterRx = 0;
write_text("p");
UCSR0B = (1<<RXEN0)|(1<<RXCIE0);
}
}
return 0;
}
Powyżej przedstawiony kod ma za zadanie odbieranie ciągów znaków do tablicy rxGSM. W momencie kiedy moduł otrzyma znak końca linii 0x0D wówczas na wyświetlaczu ma sie pojawić ciąg literek p. Niestety tak sie nie dzieje. Po odebraniu znaku końca linii wyświetla literkę "e", zablokowany zostaje odbiór ale program nigdy nie wchodzi do pętli while(1).
Najśmieszniejsze w tym wszystkim jest to, że cała ta procedura działa kiedyś.
Kod tworze w AvrStudio a kompilator to WinAVR.
Zastanawiam sie teraz czy wina leży po stronie sprzętu(płyta ewalucayjna służy mi juz dłuższy czas) czy tez może z kompilatorem coś jest nie tak.
Czy kompilator przez przypadek nie powinien ostrzegać mnie o tym ze została zdefiniowaną zmienna
char x;
a nigdzie jej nie używam???
Będę wdzięczny za wszelka pomoc
Pozdrawiam
Paweł
