Skocz do zawartości

GPS zapisujący pozycje na karcie SD


Pomocna odpowiedź

Napisano

Witam, nie wiem czy wybrałem dobry temat bo z robotyką mało to ma wspólnego ale może komuś się przyda. Otóż mam taki projekcik do zrobienia żeby na karcie SD zapisywało się wszystko co wyrzuci po UART modulik GPS a konkretnie Gms-u5LP firmy GlobalTop, taki rejestrator trasy. Na forum znalazłem temat w którym coś poruszone było o FatFS ale chyba umarł śmiercią naturalną. I tu pojawia się problem, otóż w żaden sposób nie jestem w stanie uruchomić kartę poprzez FatFS, już mi się pomysły kończą co robię źle i nikt za bardzo nie jest mi wstanie podpowiedzieć gdzie może leżeć problem. Używam ATmegi 32 (na kwarcu 14.7456MHz), GPS ten co wyżej, karta microSD z adapterem na SD. Na innym forum w jakimś temacie ktoś napisał, że długość ścieżek może mieć znaczenie i faktem jest, że na płytce od nóżek MOSI, SS, SCK i tak dalej do karty jest około 14cm to może mieć AŻ takie znaczenie? Biblioteke FatFs (najnowsza jaka jest) przerabiam według pewniej książki, jota w jotę, potem usuwając tylko UART który był potrzebny do komunikacji z komputerem, i nadal funkcja inicjalizująca dysk zwraca STA_NOINIT. Jeśli ktokolwiek używał w swoich projektach FatFS i mógłby popatrzeć co ja mogę źle robić to byłbym ogromnie wdzięczny bo ja bladego pojęcia już nie mam co jest nie tak... Załączam schemat (jedna zmiana to diody LED są na pinach PC0, 1, 2):

Całość zasilana z baterii (razem 6V) wtedy na uC idzie 4.5V (spadki?), zasilanie karty to 3.29V a stan wysoki na pinach MOSI, MISO i tak dalej to 2.8v (nie za mało, żeby karta uznała to za stan wysoki?).

Zmiany w kodzie:

/* Port Controls  (Platform dependent) */
#define CS_LOW()	PORTB &= ~(1<<PB4)			/* MMC CS = L */
#define	CS_HIGH()	PORTB |= (1<<PB4)			/* MMC CS = H */

#define	FCLK_SLOW()	(SPCR |= (1<<SPR1)|(1<<SPR0)) 		/* Set slow clock (100k-400k) */
#define	FCLK_FAST()	(SPCR |= (1<<SPR1))//(SPCR &= (~((1<<SPR0)|(1<<SPR1)))) 		/* Set fast clock (depends on the CSD) */

static
int power_status(void)		/* Socket power state: 0=off, 1=on */
{
//return (PORTE & 0x80) ? 0 : 1;
return 1;
}


static
void power_on (void)
{
//PORTE &= ~0x80;				/* Socket power on */
for (Timer1 = 2; Timer1; );	/* Wait for 20ms */

DDRB  |= (1<<PB4)|(1<<PB5)|(1<<PB7);/* Enable drivers */
DDRD |= (1<<PD4)|(1<<PD5);
PORTB  |= (1<<PB4)|(1<<PB5);

SPCR |= (1<<SPE)|(1<<MSTR);
}


static
void power_off (void)
{
SPCR = 0;				/* Disable SPI function */
DDRB  = 0b00000000;		/* Disable drivers */
PORTB = 0b00000000;

//PORTE |=  0x80;			/* Socket power off */
Stat |= STA_NOINIT;
}

Całkowicie usunąłem sprawdzanie czy karta jest w slocie i czy nie jest zabezpieczona przed zapisem (bo nie mam tych linii):

void disk_timerproc (void)
{
BYTE n, s;


n = Timer1;				/* 100Hz decrement timer */
if (n) Timer1 = --n;
n = Timer2;
if (n) Timer2 = --n;

s = Stat;

	/* Write enabled */
	s &= ~STA_PROTECT;

	/* Card inserted */
	s &= ~STA_NODISK;


Stat = s;				/* Update MMC status */
}

I w main.c ustawienia przerwań(co 10ms):

static
void IoInit ()
{
TCCR2 = (1<<WGM21);
TCCR2 = (1<<CS22)|(1<<CS20);
OCR2 = 144;
TIMSK = (1<<OCIE2);

sei();
}

a disk_initialize(0); zwraca STA_NOINIT...

Znam link niestety te biblioteki są jeszcze bardziej pokręcone niż FatFS... przynajmniej ja nie znalazłem dokumentacji jak w przypadku FatFs bo tak strzelać z czyjegoś kodu co jest do czego i czym to uruchomić to... Uruchamiałeś tą bibliotekę z linku na swoich projektach? Doprosić się nie mogę żeby ktoś kto miał już FatFs w rękach spojrzał i powiedział mniej więcej że tu może Ci coś psocić, bo z tego wychodzi, że schemat ok, kod ok a nadal nie działa no to czary? Ja nie rozumiem...

Wgrywałem bibliotekę z linku i bez problemu zapisywała na karcie, tylko karte musiałem zmienić bo mojego kingstona 2gb wykrywała raz na 10 albo wcale. Uruchamiałem też drugą bibliotekę z tej strony (właściwie przerobiona, dataloger się nazywa chyba) wystarczy w niej wywołać funkcję do zapisu i jako argument podać jakiegoś stringa. Obie są chyba przeróbką FatFs.

Oo rozumiem, że mówisz o tym: http://www.dharmanitech.com/2009/01/sd-card-interfacing-with-atmega8-fat32.html i tym: http://www.dharmanitech.com/search/label/microSD%20%2F%20SDHC to mam pytanie zapis na karcie jest oparty o jakiś system plików czy wszystko raw, i trzeba jakimś hexeditorem odczytywać sektory? Pytam bo widziałem w bibliotekach z pierwszego linku funkcje które miały w nazwie to złowrogie RAW. Mógłbyś podesłać te przerobione kody swoje (jaki mikrokontroler) od razu zaznaczając które kawałki przerobiłeś?

taaak o tym mowie. Autor napisał(albo przerobił FatFS) bibliotekę wspierającą w pełni FAT32. Formatujesz kartę w tym systemie, w programie podajesz nazwę pliku i poprzez wywołanie odpowiedniej funkcji wysyłasz do niego dane, potem plik można odczytać za pomocą notatnika czy innego edytora tekstu. Uruchamiałem wszystko na Atmedze32 na płytce testowej EVB(w internecie można znaleźć do niej instrukcje gdzie jest min. pokazane jak jest podłączone gniazdo na kartę).

W datalogerze edytujesz wlasciwie tylko plik main (ewentualnie FAT32 jesli np nie masz podłączonego zegara RTC). Do tablicy fileName podajesz nazwę pliku, a do dataString wysyłasz ciąg znaków do zapisania. Na koniec dajesz writeFile(fileName) i to wszystko..🙂

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...