Witam!
Próbuję poradzić sobie z zapisem i odczytem zmiennej z EEPROM'u.
Gdy po zapisaniu do pamięci zmiennej resetuję procka przy użyciu programatora to jest ona prawidłowo odczytywana. Gdy natomiast odłączę zasilanie to niestety procek odczytuje mi inną wartość. Ta źle odczytana wartość równa jest '1' czyli takiej wartości jaką wpisuję do EEpromu w przerwaniu po załadowaniu nowego programu.
Będę wdzięczny za pomoc
schemat polaczen:
Kod:
Próbuję poradzić sobie z zapisem i odczytem zmiennej z EEPROM'u.
Gdy po zapisaniu do pamięci zmiennej resetuję procka przy użyciu programatora to jest ona prawidłowo odczytywana. Gdy natomiast odłączę zasilanie to niestety procek odczytuje mi inną wartość. Ta źle odczytana wartość równa jest '1' czyli takiej wartości jaką wpisuję do EEpromu w przerwaniu po załadowaniu nowego programu.
Będę wdzięczny za pomoc
schemat polaczen:
Kod:
#include <avr/io.h>
#include <avr/interrupt.h>
//#include<avr/signal.h>
#include <avr/eeprom.h>
#include "font.h"
// definicje UART
#define F_CPU 7372800// Clock Speed
#define BAUD 19200
#define MYUBRR ((F_CPU/(16*BAUD))-1)
// port szyny danych
#define LCD_DATA_PORT PORTA
#define LCD_DATA_PIN PINA
#define LCD_DATA_DDR DDRA
// port sygnałów sterujących
#define LCD_CTRL_PORT PORTC
#define LCD_CTRL_PIN PINC
#define LCD_CTRL_DDR DDRC
// sygnały sterujące
#define LCD_CS1P (PINC, 4)
#define LCD_CS2P (PINC, 3)
#define LCD_EN (PINC, 2)
#define LCD_RW (PINC, 1)
#define LCD_RS (PINC, 0)
// inne sygnaly od LCD
//#define DISPLAY_STATUS_BUSY (PINA, 7)
// instrukcje sterownika KS0108
#define DISPLAY_SET_Y 0x40
#define DISPLAY_SET_X 0xB8
#define DISPLAY_START_LINE 0xC0
#define DISPLAY_ON_CMD 0x3E
#define ON 0x01
#define OFF 0x00
#define DISPLAY_STATUS_BUSY 0x80
// makroinstrukcje ustawienia stanu na linii CS1
#define SET_CS1() (LCD_CTRL_PORT |= (1 << LCD_CS1P))
#define CLR_CS1() (LCD_CTRL_PORT &= ~(1 << LCD_CS1P))
// makroinstrukcje ustawienia stanu na linii CS2
#define SET_CS2() (LCD_CTRL_PORT |= (1 << LCD_CS2P))
#define CLR_CS2() (LCD_CTRL_PORT &= ~(1 << LCD_CS2P))
// makroinstrukcje ustawienia stanu na linii EN
#define SET_EN() (LCD_CTRL_PORT |= (1 << LCD_EN))
#define CLR_EN() (LCD_CTRL_PORT &= ~(1 << LCD_EN))
// makroinstrukcje ustawienia stanu na linii RW
#define SET_RW() (LCD_CTRL_PORT |= (1 << LCD_RW))
#define CLR_RW() (LCD_CTRL_PORT &= ~(1 << LCD_RW))
// makroinstrukcje ustawienia stanu na linii RS
#define SET_RS() (LCD_CTRL_PORT |= (1 << LCD_RS))
#define CLR_RS() (LCD_CTRL_PORT &= ~(1 << LCD_RS))
// makroinstrukcje ustawiajace odpowiednią kombinację sygnałów CS1 i CS2
#define LCD_CS0() CLR_CS1();SET_CS2();
#define LCD_CS1() SET_CS1();CLR_CS2();
#define LCD_NOCS() SET_CS1();SET_CS2();
//inne
#define tau 6
//definicje zmiennych
unsigned char ii=0, n=1, m=0, ii_old = 0, p=0, stan_BTM=0;
char ii_current=0;
long int i=0;
int x=0, k=0, ll=0;
unsigned char znak1 [20], znaczek=0, zmiana=0;
unsigned char znak [30], znak2 [20], znak3;
unsigned char znak4 [30], znak_old [30], znak5 [10], znak6 [30];
char volatile liczba=0;
unsigned char j=0;
unsigned char wartosc=0, wartosc1=8, wartosc_old=8;
unsigned char flaga=0, flaga1=0, flaga2=0, flaga_BTM=0,flaga_BTM_1=0, flaga_BTM2=0, flaga_RS=0;
unsigned char flaga_AT=0, flaga_AT_old=0, flaga_obsluga=0, flaga_BTM_stan=0;
unsigned char urzadzenia_polaczone=0;
unsigned char gg=0, gg1=0, gg11=0x30; //zmienne ktore uzywalem do zapisu do eepromu
/**************************************************************/
void wait1(void) { for(i=0; i<500; i++) asm("nop");}
void wait2(void) { for(i=0; i<1000; i++) asm("nop");}
void wait3(void) { for(i=0; i<8000; i++) asm("nop");}
void wait4(void) { for(i=0; i<80000; i++) asm("nop");}
/****************************************************************/
void USART_Init( unsigned int baud )
{
/* Set baud rate */
UBRRH = (F_CPU/(BAUD*16L)-1) >> 8; //(unsigned char)(baud>>8);
UBRRL = (unsigned char)(F_CPU/(BAUD*16L)-1); //(unsigned char)baud;
/* Enable receiver and transmitter */
UCSRB = (1<<RXCIE)|(1<<TXEN)|(1<<RXEN);//|(1<<TXCIE);
/* Set frame format: 8data, 1stop bit */
UCSRC = (1<<URSEL)|(3<<UCSZ0);//|(1<<USBS)
}
/**************************************************************/
void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & _BV(UDRE)) )
;
/* Put data into buffer, sends the data */
UDR = data;
}
/**************************************************************/
unsigned char USART_Receive( void )
{
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) )
;
/* Get and return received data from buffer */
return UDR;
}
/**************************************************************/
void USART_write_text(char *s)
{
while(*s) // do napotkania 0
{
//tu by sie cos przydalo atoi np
USART_Transmit(*s); // zapisz znak wskazywany przez s na LCD
s++; // zwiększ s (przygotuj nastepny znak)
}
}
/**************************************************************/
int wyszukaj_liczbe(unsigned char *tablica2) // funkcja służąca do wyszukiwania ustawien parametrow transmisji
// zwraca wartosc odpowiadajaca ustawieniom transmisji
{
unsigned char l;
for (l=0; l<5; l++)
{
//if((u>0)&&(tablica2[l-1]==tablica1[u-1])&&(tablica2[l]!=tablica1[u])) {u=0;}
if(tablica2[l]==0x30 ) {return 0;}
if(tablica2[l]==0x31 ) {return 1;}
if(tablica2[l]==0x32 ) {return 2;}
if(tablica2[l]==0x33 ) {return 3;}
if(tablica2[l]==0x34 ) {return 4;}
if(tablica2[l]==0x35 ) {return 5;}
if(tablica2[l]==0x36 ) {return 6;}
if(tablica2[l]==0x37 ) {return 7;}
}
return 8;
}
/**************************************************************/
void wyswietl(unsigned char wyswietl_ustawienia) //funkcja wyswietla ustawienia transmisji szeregowej
{
if(wyswietl_ustawienia!=wartosc1)
{
switch (wyswietl_ustawienia)
{
case 0:
lcdWriteSpeed("4800 bps");
lcdWriteStopBits("stop");
lcdWriteParity("parity");
eeprom_write_byte((char*)0x0001,0x30);
while(eeprom_is_ready()==0);
break;
case 1:
lcdWriteSpeed("9600 bps");
lcdWriteStopBits("stop");
lcdWriteParity("parity");
eeprom_write_byte((char*)0x0001,0x31);
while(eeprom_is_ready()==0);
break;
case 2:
lcdWriteSpeed("19200 bps");
lcdWriteStopBits("stop");
lcdWriteParity("parity");
eeprom_write_byte((char*)0x0001,0x32);
while(eeprom_is_ready()==0);
break;
case 3:
lcdWriteSpeed("38400 bps");
lcdWriteStopBits("stop");
lcdWriteParity("parity");
lcdLocate(8,7);
eeprom_write_byte((char*)0x0001,0x33);
while(eeprom_is_ready()==0);
break;
case 4:
lcdWriteSpeed("57600 bps");
lcdWriteStopBits("stop");
lcdWriteParity("parity");;
break;
case 5:
lcdWriteSpeed("115200 bps");
lcdWriteStopBits("stop");
lcdWriteParity("parity");
break;
case 6:
lcdWriteSpeed("230400 bps");
lcdWriteStopBits("stop");
lcdWriteParity("parity");
break;
case 7:
lcdWriteSpeed("460800 bps");
lcdWriteStopBits("stop");
lcdWriteParity("parity");
break;
}
}
wartosc1=wyswietl_ustawienia;
}
/************************PRZERWANIA****************************/
SIGNAL(SIG_INTERRUPT0) // przerwanie zewnetrzne INT0
{
eeprom_write_byte((char*)0x0001, 0x31); //pierwszy zapis do eepromu po zaladowaniu programu
}
/**************************************************************/
SIGNAL(SIG_INTERRUPT1) // przerwanie zewnetrzne INT0
{
}
/**************************************************************/
SIGNAL(SIG_UART_RECV) //przerwanie od UART'a
{
//znaczek=UDR;
znak[ii]=UDR;
ii++;
if(ii>29) ii=0;
}
/**************************************************************/
int main(void)
{
DDRD=0x02; //0 to wejscie
//1 to wyjscie
GICR=(1<<INT0)|(1<<INT1); //zezwolenie na przerwanie zewnetrzne INT0
MCUCR=(1<<ISC01)|(1<<ISC11); //wjescie INT0 reaguje na zbocze opadajace
TCNT0=tau;
TCCR0=2; //preskaler XTAL/8
USART_Init(BAUD);
sei();
lcdInit();
lcdOn();
lcdCls();
gg = eeprom_read_byte((char*)0x0001); //odczyt z eepromu
while(eeprom_is_ready()==0);
wyswietl(gg-0x30);
while(1)
{
lcdLocate(0,7);
lcdWriteChar(gg); //wyswietla na graicznym odczytana wartosc z eepromu
lcdWriteConnection("CONNECTED");
wyswietl(wyszukaj_liczbe(znak)); //wyswietla parametry transmisji
}
}