Witam Was!
Programuję sobie właśnie mój sterownik do terrarium i napotkałem wczoraj na problem którego nie mogę za Chiny przeskoczyć... otóż wczoraj przed nabrojeniem miałem sobie kod:
Kod jest we wczesnej fazie testów więc nie zwracajcie uwagi na sprawy optymalizacyjne, chodzi mi o jedną sprawę...
Na początku po kompilacji kodu na LCD wyświetla mi sie ładnie godzina w formacie (np. dla 9:47):
09:
47
Otóż chciałem spróbować czy zadziała mi EEPROM, bo miałem zapisywać do niego jakieś tam zmienne. Dodałem odpowiedni plik nagłówkowy avr/eeprom.h no i zastosowałem takie oto funkcje:
potem
a następnie przy odczycie:
Instrukcje powyżej stosowałem kilkakrotnie w różnych miejscach programu dla testu - i teraz zaczyna sie mój problem - po usunięciu wszystkich powyższych instrukcji (tzn po skopiowaniu kodu sprzed zastosowaniu EEPROMu) LCD wyświetla mi jakieś dodatkowe śmieci, teraz wygląda to tak:
09||E
:47||E
wczoraj przykładowo miałem coś takiego:
0055627
:1055627
Czyli dodaje do godziny COŚ, jakiś adres albo inne odpady. Najlepsze że nie mogę tego okroić, tzn zamienić na łańcuch znaków i wyświetlić tylko dwóch pierwszych znaków - takie sztuczki nic nie dają.
Czy namieszałem coś przez użycie EEPROMa w danych komórkach? Co sie stało że wyświetla mi takie głupoty? Bardzo proszę o jakieś wskazówki
Edit: zapomniałem dodać, że chodzi o PCF8583, biblioteki ściągnąłem z elektrody i wszystko hulało póki nie ruszyłem tego EEPROMa... idę malować jajka, musze troche ochłonąć...
Programuję sobie właśnie mój sterownik do terrarium i napotkałem wczoraj na problem którego nie mogę za Chiny przeskoczyć... otóż wczoraj przed nabrojeniem miałem sobie kod:
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 1000000UL
#include "HD44780.c"
#include "config.h"
#include "i2c.h"
#include "PCF8583.h"
#define PODSWIETLENIE_ON PORTB |= _BV(3)
#define PODSWIETLENIE_OFF PORTB &= ~_BV(3)
#define C11_ON PORTD |= _BV(6)
#define C12_OFF PORTD &= ~_BV(7)
#define P2_ON PORTD |= _BV(3)
#define P2_OFF PORTC &= ~_BV(7)*/
#define C3a_ON PORTD |= _BV(3)
#define C3a_OFF PORTD &= ~_BV(3)
#define C3b_ON PORTC |= _BV(7)
#define C3b_OFF PORTC &= ~_BV(7)
#define UP 4
#define DOWN 3
#define RIGHT 6
#define LEFT 2
#define ENTER 5
void konwert2(char tekst[], int liczba)
{
tekst[0]=(liczba%100-liczba%10)/10+48;
tekst[1]=liczba%10+48;
}
uint8_t godz, min, sek, hsek;
uint8_t dzien, miesiac;
uint16_t rok;
uint8_t tekst[17];
int main(void)
{
DDRB=0xFF;
DDRA = 0xFF;
PORTA= 0x00;
//char buforek[12];
DDRC = 0x00;
PORTC = 0xFF;
LCD_Initalize();
i2cInit();
PCF8583_init();
PCF8583_set_time(0, 10, 0,0 );
PODSWIETLENIE_ON;
LCD_GoTo(4,0);
LCD_WriteText("Witaj w");
LCD_GoTo(1,1);
LCD_WriteText("sterowniku v 1.0");
_delay_ms(3000);
LCD_Clear();
PODSWIETLENIE_OFF;
volatile char wyswietl[1];
wyswietl[0]='0';
unsigned int cozegar=1, godzina, minuta;
char pomoc;
while(1)
{
switch(wyswietl[0])
{
//==================================================0
case '0':
LCD_Clear();
while(wyswietl[0]=='0')
{
LCD_Home();
LCD_GoTo(0,0);
PCF8583_get_time( &godz, &min, &sek, &hsek );
konwert2(pomoc,godz);
LCD_WriteText(pomoc);
LCD_GoTo(0,1);
if(hsek<50)
LCD_WriteText(":");
else
LCD_WriteText(" ");
konwert2(pomoc,min);
LCD_WriteText(pomoc);
if(bit_is_clear(PINC, RIGHT))
{
wyswietl[0]='3';
_delay_ms(200);
}
if(bit_is_clear(PINC, LEFT))
{
wyswietl[0]='2';
_delay_ms(200);
}
if(bit_is_clear(PINC, ENTER))
{
wyswietl[0]='4';
_delay_ms(200);
}
}
break;
//===============================================2
case '2':
/* dalsza, nieistotna część menu */
}
}
return 0;
}Kod jest we wczesnej fazie testów więc nie zwracajcie uwagi na sprawy optymalizacyjne, chodzi mi o jedną sprawę...
Na początku po kompilacji kodu na LCD wyświetla mi sie ładnie godzina w formacie (np. dla 9:47):
09:
47
Otóż chciałem spróbować czy zadziała mi EEPROM, bo miałem zapisywać do niego jakieś tam zmienne. Dodałem odpowiedni plik nagłówkowy avr/eeprom.h no i zastosowałem takie oto funkcje:
uint8_t EEMEM pierwszy=5;potem
eeprom_busy_wait();
eeprom_write_byte((uint8_t*)2,42);
eeprom_busy_wait();
eeprom_write_byte((uint8_t*)1,52);
eeprom_busy_wait();
eeprom_write_byte((uint8_t*)0,3);a następnie przy odczycie:
eeprom_busy_wait();
konwert2(pomoc,eeprom_read_byte((uint8_t*)2));
eeprom_busy_wait();
LCD_WriteText(pomoc);
LCD_WriteText("-");
eeprom_busy_wait();
konwert2(pomoc,eeprom_read_byte((uint8_t*)1));
eeprom_busy_wait();
LCD_WriteText(pomoc);Instrukcje powyżej stosowałem kilkakrotnie w różnych miejscach programu dla testu - i teraz zaczyna sie mój problem - po usunięciu wszystkich powyższych instrukcji (tzn po skopiowaniu kodu sprzed zastosowaniu EEPROMu) LCD wyświetla mi jakieś dodatkowe śmieci, teraz wygląda to tak:
09||E
:47||E
wczoraj przykładowo miałem coś takiego:
0055627
:1055627
Czyli dodaje do godziny COŚ, jakiś adres albo inne odpady. Najlepsze że nie mogę tego okroić, tzn zamienić na łańcuch znaków i wyświetlić tylko dwóch pierwszych znaków - takie sztuczki nic nie dają.
Czy namieszałem coś przez użycie EEPROMa w danych komórkach? Co sie stało że wyświetla mi takie głupoty? Bardzo proszę o jakieś wskazówki
Edit: zapomniałem dodać, że chodzi o PCF8583, biblioteki ściągnąłem z elektrody i wszystko hulało póki nie ruszyłem tego EEPROMa... idę malować jajka, musze troche ochłonąć...

