logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[AVR][C] + [SD/MMC] - Nie da sie programować po ISP ani czytać z karty.

Osmo 14 Lip 2011 14:44 6187 27
  • #1 9717413
    Osmo
    Poziom 18  
    Witam,
    Od 3 dni próbuję skomunikować się przy pomocy AVR z kartami sd/mmc, jak narazie bez skutku.
    Próbowałem zastosować biblioteki:
    http://www.roland-riegel.de/sd-reader/index.html
    http://www.dharmanitech.com/2009/01/sd-card-interfacing-with-atmega8-fat32.html

    W obu przypadkach stosowałem się do schematu podłączenia karty z pierwszej biblioteki:
    [AVR][C] + [SD/MMC] - Nie da sie programować po ISP ani czytać z karty.
    Usuwając jedynie obwody podłączone do PC4 i PC5 (sprawdzanie czy karta wsunięta do czytnika). Autor pierwszej biblioteki przewidział taką opcje i opisał co trzeba zmienić w pliku konfiguracyjnym.
    Karta zasilana zasilaczem stabilizowanym z 3.3V, uC z 5V, podłączenie linii wejściowych karty poprzez dzielniki napięcia.

    Układ zmontowałem na płytce uniwersalnej, w pierwszej wersji karta na osobnej płytce, połączonej z płytka uC taśmą 10cm, w drugiej wersji gniazdo wlutowane bezpośrednio obok uC (najdłuższe połączenie od karty do uC ma 4cm).
    Połączenia wykonane poprawnie, wielokrotnie sprawdzałem poziomy napięć i oporności.

    Jako że używam laptopa, nie mam coma, ani stosownej przejściówki, stąd do debuggowania używam LCD 2x16.
    W tym celu usunąłem z przykładowych implementacji komunikacje USART, a dodałem biblioteke obsługi LCD, ograniczyłem komunikaty do niezbędnego minimum.

    uC to AtMega 32 / AtMega16 / AtMega644 wszystkie z kwarcem 16MHz.

    Testuje na kartach SD 16 MB oraz 2GB (2 sztuki różnych producentów) oraz 3 różnych kartach MMC 32 MB.

    Niestety, jak do tej pory nie udało mi się nic sensownego osiągnąć.

    Druga biblioteka każdorazowo nie potrafi zainicjalizować połączenia z kartą.

    Pierwsza, tu bywa różnie. W przykładowej realizacji inicjalizacja wywoływana jest w nieskończonej pętli, wykorzystałem to by sprawdzić czy układ reaguje na włożenie karty. Reaguje, gdy karta jest włożona inicjalizacja zachodzi, gdy nie jest nie. Przy czym zdarzają się pomyłki kiedy karty nie ma w czytniku a inicjalizacja podobno zachodzi... (jakieś 5-10 % przypadków). Próba oczytania partycji (funkcja biblioteki) zawsze kończy się porażka, natomiast próba odczytania danych w trybie raw (lub zapisu) zawsze kończy się sukcesem (funkcja zwraca 1) nawet gdy w podstawce nie ma karty...
    By nieco rozjaśnić sytuacje, postanowiłem cyklicznie 'czytać' kolejno po 16 bajtów danych z przesunięciem ofsetu o 8 tak by czytać te same 8 bajtów dwukrotnie i zobaczyć czy wartości będą się zmieniać. Dane wyświetlam hexadecymalnie na LCD. Co jest zaskakujące, nie zmieniaja się, czytanie działa tak jakby rzeczywiście odczytywało takie wartości z karty gdyż za każdym razem są to te same dane, przy czym, odczytywane wartości są te same niezależnie od karty (poza 2 z 3 kart MMC dla których odczytywane są zera). Problem w tym że nigdzie na kartach nie ma takich ciągów danych, sprawdzałem karty winhexem.
    Co ciekawe, gdy jedną karte w całości nadpisałem zerami, uC dalej odczytywał ten sam ciąg.
    Gdy czytam dane gdy karta jest wyjęta z podstawki wartości wyglądają na pseudolosowe.


    Przy kompilacji korzystam z dostarczonego z bibliotekami MakeFile.

    Za kilka minut wrzucę moje wersje main.c

    Szczerze mówiąc, wymiękam.


    Drugi problem, polega na tym że gdy układ czytnika jest podłączony do uC, nie mogę programować go poprzez ISP. AVR Dude wyrzuca bład:
    
    avrdude.exe: stk500v2_command(): command failed
    avrdude.exe: initialization failed, rc=-1
                 Double check connections and try again, or use -F to override
                 this check.
    
    
    avrdude.exe done.  Thank you.

    (jest połączenie z programatorem). Programuję przy użyciu programatora AVRDoper, zgodny z STK500v2 (pod USB). Problem stał się nad wyraz dokuczliwy kiedy wlutowałem podstawkę i dzielniki na stałe w płytkę z uC.


    Czuję, że bez Waszej pomocy nie dam rady znaleźć i rozwiązać problemów przez które nie mogę dokończyć projektu.

    Rafał.




    KOD: (od notorycznego sprawdzania różnych koncepcji zrobił mi się spory bałagan w kodzie).
    
    //#define F_CPU 16000000
    #include <avr/io.h>
    #include <util/delay.h>
    #include <inttypes.h>  
    #include <string.h>
    #include <avr/pgmspace.h>
    #include <avr/sleep.h>
    #include "fat.h"
    #include "fat_config.h"
    #include "partition.h"
    #include "sd_raw.h"
    #include "sd_raw_config.h"
    
    #define DEBUG 1
    //deklaracje dla AtMega644 (nie przewidziane w oryginalnej bibliotece)
        #define configure_pin_mosi() DDRB |= (1 << DDB5)
        #define configure_pin_sck() DDRB |= (1 << DDB7)
        #define configure_pin_ss() DDRB |= (1 << DDB4)
        #define configure_pin_miso() DDRB &= ~(1 << DDB6)
    
        #define select_card() PORTB &= ~(1 << PORTB4)
        #define unselect_card() PORTB |= (1 << PORTB4)
    
    //sterownik wyswietlacza
    #include "HD44780.h"
    
    
    void waw(char * a){
    	 LCD_Clear();
    	 LCD_WriteText(a);
    	 _delay_ms(500);
    }
    
    void wawt(char * a, unsigned int i){
    	 LCD_Clear();
    	 LCD_WriteText(a);
    	 _delay_ms(i);
    }
    
    void lcd_putc_hex(uint8_t b)
    {	char a,c;
        /* upper nibble */
        if((b >> 4) < 0x0a)
            a = ((b >> 4) + '0');
        else
    		a = ((b >> 4) - 0x0a + 'a');
    
        /* lower nibble */
        if((b & 0x0f) < 0x0a)
            c = ((b & 0x0f) + '0');
        else
            c = ((b & 0x0f) - 0x0a + 'a');
    	LCD_WriteData(a);
    	LCD_WriteData(c);	
    }
    
    void lcd_putw_hex(uint16_t w)
    {
        lcd_putc_hex((uint8_t) (w >> 8));
        lcd_putc_hex((uint8_t) (w & 0xff));
    }
    
    void lcd_putdw_hex(uint32_t dw)
    {
        lcd_putw_hex((uint16_t) (dw >> 16));
        lcd_putw_hex((uint16_t) (dw & 0xffff));
    }
    
    
    int main(void)
    { 
    	LCD_Initalize();
    	 LCD_Clear();
    	 LCD_WriteText("test");
    	 
    	  lcd_putc_hex(sd_raw_init());
    	_delay_ms(900);
    	 lcd_putc_hex(sd_raw_available());
    	_delay_ms(900);
    	uint8_t buf[512];
    	unsigned int i;
    	unsigned int pos=0;
    	
    	 //set_sleep_mode(SLEEP_MODE_IDLE);
    	 
    	while(1)
    	{
    	for(i=0; i<512; i++) buf[i] &= 0x00;
    
    	if(!sd_raw_init())
            {
    	waw("z");
            }//else{waw("zdechlo");}
    		
    		
    	
    	LCD_Clear();
    	if(sd_raw_read(pos, buf, 8)){
    		for(i=0; i<8; i++) lcd_putc_hex(buf[i]);
    	}else{ waw("n"); }	
    	LCD_GoTo(0,1);
    	
    	if(sd_raw_read(pos+4, buf, 8)){
    		for(i=0; i<8; i++) lcd_putc_hex(buf[i]);
    	}else{ waw("n"); }	
    	
    	_delay_ms(900);
    	_delay_ms(900);
    	wawt("s", 500);
    	pos+=8;
    	}
    	return 0;
    }
    
  • #2 9717799
    drzasiek
    Specjalista CNC
    Ale się rozpisałeś, nie mam teraz czasu ani nie za bardzo lubię analizować czyjś kod ale tak na szybko co mi przychodzi do głowy.
    Zakładając, że wszystkie połączenia dobre, program dobry, jest jeszcze możliwość błędu odczytu na MISO. Podłączasz bezpośrednio 3,3V do 5V. Ma działać ale często właśnie z użyciem kart pamięci nie działa. Jak poszukasz to na samej elektrodzie znajdziesz kilka takich przypadków wraz z rozwiązaniami problemów.
    Druga sprawa to nie jestem pewien ale wydaje mi się, że dzielniki napięcia przeszkadzają programatorowi. Dla programatora masz na wejściu tych pinów SPI rezystor 5.1k do masy (pomijając rezystancję wewnętrzną), może sobie programator z tym nie radzi? Spróbuj dać dzielniki na większych rezystorach.
    I nie podoba mi się podłączenie CS. CS uC zostaw programatorowi a jako wyjście CS do karty pamięci zastosuj jakiś inny pin. Przecież wysyłając/czytając dane do/z karty masz jakąś funkcję więc w tej funkcji ustawiasz sobie ten port odpowiednio na "0" lub "1" i wywołujesz funkcję wysyłającą(sprzętowo lub programowo) bajt do karty.
    Trzecia sprawa, to ja uruchamiałem bibliotekę dharmanitech oraz obydwie FatFS. Choć z tą drugą miałem niesamowite problemy żeby się udało, uważam ją za lepszą. Może się zainteresuj Petit Fat np? Na forum jest nawet na 100% działająca wrzucona przeze mnie biblioteka na M32.
  • #3 9718248
    Osmo
    Poziom 18  
    Cholewa, odpaliłem Twoją bibliotekę i to samo.
    Objawy takie:
    układ rozlutowany by móc programować -> pf_mount(&fs)) zwraca 02 (FR_NOT_READY)

    układ na powrót zlutowany, program zawiesza się na pf_mount(&fs)). Połączenia są ok, ale jeszcze sprawdzę, będzie ze 30 raz.

    Zmieniłem nawet port z którego korzystało kilka linii LCD ale nie pomogło.

    EDIT: Połączenia są wykonane poprawnie, karta ma 3.1V na wejsciu, uC 5V.
    Między stykami MOSI, SS, SCK podstawki a pinami uC jest 1k7 wg. mojego miernika.
    MOSI -> MOSI bezpośrednio.

    No kura wodna nie wiem co to moze być, kwarc 16 MHZ może coś nabroić?


    Sprawdziłem też co się stanie jak wylutuje kable prowadzące do programatora, to samo.

    EDIT2.
    Nie wiem na ile ta metoda jest dobra gdyż powoduje przerwy w wykonywaniu kolejnych faz funkcji, ale dzięki niej udało mi się ustalić że zawieszenie następuje w funkcji pf_mount na etapie:
    if (disk_initialize() & STA_NOINIT)	/* Check if the drive is ready or not */
    		return FR_NOT_READY;


    Testowałem poprzez wyświetlanie komunikatów, zawieszało się na "if(!is)"

    FRESULT pf_mount (
    	FATFS *fs		/* Pointer to new file system object (NULL: Unmount) */
    )
    {
    	BYTE fmt, buf[36];
    	DWORD bsect, fsize, tsect, mclst;
    
    	LCD_Clear();	LCD_WriteText("mount");	_delay_ms(500);
    	
    	FatFs = 0;
    	if (!fs) return FR_OK;				/* Unregister fs object */
    	LCD_Clear();	LCD_WriteText("if(!is)");	_delay_ms(500);
    
    	if (disk_initialize() & STA_NOINIT)	/* Check if the drive is ready or not */
    		return FR_NOT_READY;
    	LCD_Clear();	LCD_WriteText("disk_initialize()");	_delay_ms(500);
    	/* Search FAT partition on the drive */
    	bsect = 0;
    	fmt = check_fs(buf, bsect);			/* Check sector 0 as an SFD format */
    	if (fmt == 1) {						/* Not an FAT boot record, it may be FDISK format */
    		/* Check a partition listed in top of the partition table */
    		if (disk_readp(buf, bsect, MBR_Table, 16)) {	/* 1st partition entry */
    			fmt = 3;
    		} else {
    			if (buf[4]) {					/* Is the partition existing? */
    				bsect = LD_DWORD(&buf[8]);	/* Partition offset in LBA */
    				fmt = check_fs(buf, bsect);	/* Check the partition */
    			}
    		}
    	}
    	LCD_Clear();	LCD_WriteText("ftm==1");	_delay_ms(500);
    	if (fmt == 3) return FR_DISK_ERR;
    	if (fmt) return FR_NO_FILESYSTEM;	/* No valid FAT patition is found */
    
    	/* Initialize the file system object */
    	if (disk_readp(buf, bsect, 13, sizeof(buf))) return FR_DISK_ERR;
    
    	fsize = LD_WORD(buf+BPB_FATSz16-13);				/* Number of sectors per FAT */
    	if (!fsize) fsize = LD_DWORD(buf+BPB_FATSz32-13);
    
    	fsize *= buf[BPB_NumFATs-13];						/* Number of sectors in FAT area */
    	fs->fatbase = bsect + LD_WORD(buf+BPB_RsvdSecCnt-13); /* FAT start sector (lba) */
    	fs->csize = buf[BPB_SecPerClus-13];					/* Number of sectors per cluster */
    	fs->n_rootdir = LD_WORD(buf+BPB_RootEntCnt-13);		/* Nmuber of root directory entries */
    	tsect = LD_WORD(buf+BPB_TotSec16-13);				/* Number of sectors on the file system */
    	if (!tsect) tsect = LD_DWORD(buf+BPB_TotSec32-13);
    	mclst = (tsect						/* Last cluster# + 1 */
    		- LD_WORD(buf+BPB_RsvdSecCnt-13) - fsize - fs->n_rootdir / 16
    		) / fs->csize + 2;
    	fs->n_fatent = (CLUST)mclst;
    
    	fmt = FS_FAT16;							/* Determine the FAT sub type */
    	if (mclst < 0xFF7) 						/* Number of clusters < 0xFF5 */
    #if _FS_FAT12
    		fmt = FS_FAT12;
    #else
    		return FR_NO_FILESYSTEM;
    #endif
    	if (mclst >= 0xFFF7)					/* Number of clusters >= 0xFFF5 */
    #if _FS_FAT32
    		fmt = FS_FAT32;
    #else
    		return FR_NO_FILESYSTEM;
    #endif
    
    	fs->fs_type = fmt;		/* FAT sub-type */
    	if (_FS_FAT32 && fmt == FS_FAT32)
    		fs->dirbase = LD_DWORD(buf+(BPB_RootClus-13));	/* Root directory start cluster */
    	else
    		fs->dirbase = fs->fatbase + fsize;				/* Root directory start sector (lba) */
    	fs->database = fs->fatbase + fsize + fs->n_rootdir / 16;	/* Data start sector (lba) */
    
    	fs->flag = 0;
    	FatFs = fs;
    
    	return FR_OK;
    }
    
    
  • #4 9719423
    drzasiek
    Specjalista CNC
    Pokaż schemat jak podłączyłeś używają biblioteki którą ja wrzuciłem.

    Dodano po 1 [godziny] 48 [minuty]:

    Jest już trochę późno więc mogę coś pokręcić ale ten twój schemat w pierwszym poście mi się kupy nie trzyma. Możesz mi wyjaśnić co ma robić ten tranzystor na CS uC? P-MOS więc w momencie resetu podłącza ci CS pod 5V, a więc w momencie programowania też. Jak więc programator ma ściągnąć CS do masy skoro jest on podłączony przez ten tranzystor do VCC?
    Ale tak jak mówiłem, jest już późno więc jakbym co pokręcił to mnie poprawiać proszę..
  • #5 9719965
    Osmo
    Poziom 18  
    Kura wodna, zapomniałem napisać że tranzystor też pominąłem. Generalnie chciałem powiedzieć że piny mam podpiete jak na schemacie przez dzielniki, a reszta jest wywalona.
  • #6 9720173
    drzasiek
    Specjalista CNC
    Narysuj schemat tak jak jest teraz i pokaż. I nie rysuje tego co pominąłeś. Inaczej to sobie można mówić.
  • #7 9721686
    Osmo
    Poziom 18  
    [AVR][C] + [SD/MMC] - Nie da sie programować po ISP ani czytać z karty.

    To mój pierwszy schemat w eagle więc musicie mi wybaczyć błędy i nieco pomyloną symbolikę.

    R1, R2, R3 - 1k8
    R4, R5, R6 - 3k3

    C1 - 100 nF, tuż przy karcie
    C2 - 47 uF
  • #8 9721856
    drzasiek
    Specjalista CNC
    Mam nadzieje, że pomyliłeś się przy rysowaniu schematu a nie podłączyłeś karty do uC tak jak to jest na schemacie.
  • #9 9721884
    Osmo
    Poziom 18  
    9h jazdy samochodem dzisiaj, do tego pogoda, po prostu padam. Schemat narysowałem z pamięci, bo jeszcze nie jestem w domu, ale wydaje mi się że zrobiłem to dokładnie tak jak na schemacie.
    Naprawdę w tej chwili nie wiem co jest nie tak na schemacie.

    PS. Ale masło maślane napisałem.


    EDIT. Dobra widzę co jest nie tak. Tak zbudowane dzielniki rezystorowe miały by sens gdyby to karta podawała 5V na uC zasilany z 3V3. Jak wrócę, sprawdzę czy naprawdę taki numer odwaliłem, jeśli tak, okryję się wstydem...


    AVR'y mam same w wersjach 'wysokonapięciowych', już sprawdzałem.

    Będę robił jakieś wieksze zakupy, to kupie wreszcie te bufory, są tanie jak barszcz i widzę, że warto je mieć.
  • #10 9721910
    drzasiek
    Specjalista CNC
    Dokładnie sprawdź jak będziesz w domu, czy dzielniki napięcia podłączone są tak jak na schemacie tym drugim który podałeś czy może jednak prawidłowo.
    Poza tym podłączenie MISO. Jak będziesz potem to programował programatorem poziomem 5V to na DO karty też będzie ten 5V sygnał.
    Dobrze by było, gdyby ktoś podpowiedział kto robił to na takich dzielnikach. Ja zasilałem 3.3V uC jak i kartę.
    Nie wiem czemu w tym temacie prócz mnie nikt się nie wypowiada, nie czuję się jakoś specjalistą od tego, może ktoś inny coś jeszcze doradzi, zauważy to czego ja nie widzę.

    Dodano po 20 [minuty]:

    Poza tym zobacz jeszcze to:
    http://mikrokontrolery.blogspot.com/2011/04/minimalne-podlaczanie-pinow.html
  • #11 9722016
    Osmo
    Poziom 18  
    drzasiek napisał:


    Wiem o tym, mimo to dzieki za przypomnienie, na płytce wszystko zgadza się z opisem w linku, poza podciągniętym do Vcc resetem, poprostu nie pamiętałem o naniesieniu tego na schemat, tak jak o kondensatorach 2x1000uF między Vcc 5V a GND.
  • #12 9722018
    drzasiek
    Specjalista CNC
    A tutaj:
    https://www.elektroda.pl/rtvforum/topic1089632.html
    Piszesz, że uruchomiłeś kartę i działa. Co prawda temat starszy trochę ale jak kiedyś uruchomiłeś to do dziś nie masz programu i schematu wg którego Ci się udało?
  • #13 9722049
    Osmo
    Poziom 18  
    3 lata temu, układ dawno rozlutowałem, a kod niestety gdzieś się zapodział, jedyne co zostało to gniazdo, karda (mikroSD 128MB) i procesorki. Do tego 3 lata przerwy w działania na uC, no i mam problem, wiele rzeczy muszę sie uczyć od nowa.

    PS. Czym programujesz XMegi ?
  • #15 9724239
    Osmo
    Poziom 18  
    Tak, wstyd się przyznać, ale były na odwrót. Przelutowałem je, ale dalej to samo, ale to już chyba wina bałaganu na płytce. Zlutowałem wczoraj układ na nowej, czystej uniwersalce, dzis w wolnej chwili uruchomię go.
  • #16 9724695
    drzasiek
    Specjalista CNC
    Osmo napisał:
    Tak, wstyd się przyznać, ale były na odwrót. Przelutowałem je, ale dalej to samo, ale to już chyba wina bałaganu na płytce. Zlutowałem wczoraj układ na nowej, czystej uniwersalce, dzis w wolnej chwili uruchomię go.

    Jak masz czytnik do komputera to sprawdź czy się karta nie uszkodziła.
  • #17 9724766
    Osmo
    Poziom 18  
    Mam czytnik w laptopie, wszystkie karty z których korzystałem działają. Podczas testów karty na przemian lądowały w układzie i w czytniku (sprawdzałem winhexem zawartość).
  • #18 9728625
    Osmo
    Poziom 18  
    Złożyłem układ na nowej płytce, zgodnie z nowym schematem (wszystko po staremu poza dzielnikami wpiętymi tym razem poprawnie). Dalej ten sam scenariusz, kod wiesza się na etapie "if(!is)".

    Sprawdziłem połączenia 3 razy, rękę bym sobie dał uciąć że są poprawnie.
    Wylutowanie ISP nie pomaga.
    Poza tym, gdy wlutowane są oporniki 3k3 [ (SS, SCK, MISO) -> 1k8 -> 3k3 do masy ]
    programator nie potrafi skomunikować się z układem.

    Karta dostaje 3.15 V.

    Opory zmierzone po między pinami SS, SCK, MOSI uC, a odpowiadającymi im pinami karty wynoszą 1k8.
    Opory po między pinami SS, SCK, MOSI uC, a masą wynoszą 5k1.
    Po między liniami SS, SCK, DI karty a masą 3k3.
    Połączenie DO - MISO ma opór zaniedbywalny.
    Zasilanie wpięte poprawnie, filtrowane przez 100nf (5mm od gniazda karty), 22uf 1cm od gniazda karty.

    Nie rozumie co robie źle.

    Jak do tej pory nie zdarzyło mi się nigdy napotkać tak kłopotliwego w rozwiązaniu problemu.
  • #19 9728942
    saper_2
    Poziom 18  
    Ja z doświadczenia własnego, wiem ze dzielniki na rezystorach prawie nigdy nie działają (przynajmniej mi nigdy nie chciały działać, tak samo i z diodami zenera, ba nawet próbowałem z driverami-translatorami na '244 i LVX125 i te mi też nie działały (ten drugi z lcd N3310 działa) ).

    Wszystkie problemy rozwiązywały mi się kiedy procesor zasiliłem z 3,3V. Jeśli nie masz procka w wersji L (zresztą to też moje przypuszczenie) to prawdopodobnie procesor nie przyjmuje "1" od karty na poziomie 3,3V (teoretycznie powinien ale nie che...). Aha i normalny procesor też będzie działa na 3,3V .

    Jeszcze spróbuj najpierw zmniejszyć SCK do karty (i w programatorze też) - może za szybko gonisz ,a pojemności swoje (płytka uniwersalna + pajęczynka + resztki pasty, kalafonii...).
  • #20 9728952
    janbernat
    Poziom 38  
    A jakie masz zbocza napięcia na karcie?
    Oscyloskopem.
    A jak nie masz to spróbuj znacznie zmniejszyć prędkość transmisji.
    Albo równolegle do opornika od strony procesora dla SCK dać kondensator ze 20pF.
    Co do pozostałych dwóch oporników- tez można spróbować.
    Ale bufory są lepsze.
  • #21 9728990
    drzasiek
    Specjalista CNC
    Rezystory są dość małe więc nie to chyba..
    A może zrób eksperyment. Kartę możesz zasilać nieco wyżej.
    Daj LM317 i delikatnie podnoś do 3.6V, stopniowo, zobacz czy zaskoczy.
    Daj 3.4V, 3.5V, 3.6 może łapnie. Tylko nie przeskocz za bardzo max napięcia.
    Poza tym tak jak pisał saper_2, jeśli nie masz jakichś szczególnych wymagań to napięcie zasilania uC też można obniżyć, nie musi to być przecież 5V.
    Choćby na chwilę, chodzi przecież o zdiagnozowanie w czym jest problem.
  • #22 9729023
    Osmo
    Poziom 18  
    Kura wodna, nie wpadłem do te pory na pomysł by sprawdzić zakres napięć na jakich może pracować m644, założyłem że jak reszta moich klocków rusza od 4.5V, a tu niespodzianka, od 2.7V. Jeszcze dziś wylutuję rezystory i podłącze całość pod 3V3, zobacze jak sie wtedy zachowa układ, przy czym stracę możliwość debuggowania w oparciu o LCD.
    Tu pytanie, czy uC zasilany z 3.3V zaakceptuje (i przy tym nie zrobi tego jeden jedyny raz w życiu) sygnał od LCD o napięciu 5V ? I czy LCD na sterowniku HD44780 zaakceptuje 3.3 woltowe sygnały sterujące?
  • #23 9729045
    janbernat
    Poziom 38  
    Pare kilo to nie jest tak mało:
    https://www.elektroda.pl/rtvforum/topic2039623.html
    A SPI jest szybkie.
    To można kompensować kondensatorkami, jakimiś koralikami ferrytowymi itp.
    Ale bez oscyloskopu to sie nie da.
    I stąd się bierze- komuś działa a mi nie.
    Płytka, odległości, pojemność oporników- każdy ma inne.
    drzasiek- wkrótce sam to sprawdzisz.
  • #24 9729201
    drzasiek
    Specjalista CNC
    janbernat napisał:

    drzasiek- wkrótce sam to sprawdzisz.

    Z tym, że u mnie będzie pareset kilo a nie parę kolo i sygnał będzie kilkanaście albo nawet kilkadziesiąt razy wolniejszy niż na SPI a więc nie dokładnie to samo choć z jednej kuźni.

    Do autora:
    Najprostszy debugger to dioda. Podłącz diodę/buzer i ustaw w programie odpowiednią ilość mignięć/brzęczeń jako odpowiednia wartość zwrócona przez funkcje i już będziesz wiedział, czy działała przy jednym zasilaniu.
  • #25 9729222
    Osmo
    Poziom 18  
    Pracuję nad tym. Przelutowałem już układ, dodałem 2 diody, zieloną i czerwoną, mam możliwość wyświetlenia 3 komunikatów + dodatkowe poprzez odpowiednie miganie.
    Nie znalazłem u siebie kwarcu niższego niż 12, na razie go wlutowałem, ale w razie w. uruchomię układ na oscylatorze wewnętrznym. Pytanie, czy mój avrDoper (zgodny z STK 500v2, pod usb) da radę zaprogramować układ pracujący na 3.3V ? Czy też muszę go przenosić między podstawkami.
  • #26 9729394
    janbernat
    Poziom 38  
    Z LCD moze być kłopot.
    Jedyny sygnał z LCD to sygnał zajętości- dałbym jakiś opornik w szereg- ze 100ohm.
    Chyba że nie odczytujesz sygnału zajętości.
    Wysterować sygnały do LCD to chyba się da.
    A programator- ściągni dokumentację.
    I sprawdź czy ATmega zasilana z 3.3V pójdzie z kwarcem 12MHz.
  • #27 9734546
    Osmo
    Poziom 18  
    A więc wojna!! :P
    Krótko mówiąc złość przeze mnie przemawia, bo Atmega644 na wewnętrznym 8MHz + SD + zasilanie 3.3V = kolejne nie powodzenie.

    if(pf_mount(&fs)==2) pulse(2,500);

    Efekt, dwukrotne mrygniecie diody led.

    Nie miałem wiele czasu więc oprogramowałem tylko zieloną.


    Obecny kod:
    
    /*---------------------------------------------------------------*/
    /* Petit FAT file system module test program R0.02 (C)ChaN, 2009 */
    /*---------------------------------------------------------------*/
    
    #include <string.h>
    #include <avr/io.h>
    #include <avr/pgmspace.h>
    #include <avr/interrupt.h>
    #include "diskio.h"
    #include "pff.h"
    #include "xitoa.h"
    #include "suart.h"
    #include <util/delay.h>
    
    //#include "HD44780.h"
    
    
    
    /*---------------------------------------------------------*/
    /* Work Area                                               */
    /*---------------------------------------------------------*/
    
    
    char Line[128];		/* Console input buffer */
    
    
    
    static
    void put_rc (FRESULT rc)
    {
    	const prog_char *p;
    	static const prog_char str[] =
    		"OK\0" "DISK_ERR\0" "NOT_READY\0" "NO_FILE\0" "NO_PATH\0"
    		"NOT_OPENED\0" "NOT_ENABLED\0" "NO_FILE_SYSTEM\0";
    	FRESULT i;
    
    	for (p = str, i = 0; i != rc && pgm_read_byte_near(p); i++) {
    		while(pgm_read_byte_near(p++));
    	}
    	xprintf(PSTR("rc=%u FR_%S\n"), (WORD)rc, p);
    }
    
    
    
    static
    void put_drc (BYTE res)
    {
    	xprintf(PSTR("rc=%d\n"), res);
    }
    
    
    
    static
    void get_line (char *buff, BYTE len)
    {
    	BYTE c, i;
    
    	i = 0;
    	for (;;) {
    		c = rcvr();
    		if (c == '\r') break;
    		if ((c == '\b') && i) i--;
    		if ((c >= ' ') && (i < len - 1))
    				buff[i++] = c;
    	}
    	buff[i] = 0;
    	xmit('\n');
    }
    
    
    
    static
    void put_dump (const BYTE *buff, DWORD ofs, int cnt)
    {
    	BYTE n;
    
    
    	xitoa(ofs, 16, -8); xputc(' ');
    	for(n = 0; n < cnt; n++) {
    		xputc(' ');	xitoa(buff[n], 16, -2); 
    	}
    	xputs(PSTR("  "));
    	for(n = 0; n < cnt; n++)
    		xputc(((buff[n] < 0x20)||(buff[n] >= 0x7F)) ? '.' : buff[n]);
    	xputc('\n');
    }
    
    
    
    /*-----------------------------------------------------------------------*/
    /* Main                                                                  */
    
    
    void pulse(int count, int delay)
    {
    	int j=0;
    	for(j=0; j<count; j++)
    	{
    		PORTD |=0b00100000;
    		_delay_ms(delay);
    		PORTD &= 0b11011111;
    		_delay_ms(delay);
    	}
    }
    
    void main (void)
    {
        FATFS fs;          // Work area (file system object) for the volume
        BYTE buff[16];     // File read buffer
        UINT br;           // File read count
        FRESULT res;       // Petit FatFs function common result code
    
    	///LCD_Initalize();
    	//LCD_Clear();
    	//LCD_WriteText("test");
    	DDRD |= 0b00100000;
    	PORTD &= 0b11011111;
    	
    	pulse(1,300);
    	_delay_ms(700);
        if(pf_mount(&fs)==2) pulse(2,500);
    
    	
        // Open a file
        res = pf_open("srcfile.dat");
        //if (res) die(res);
    
        // Read data to the memory
        res = pf_read(buff, 16, &br);    // Read data to the buff[]
        //if (res) die(res);               // Check error
        //if (br != 16) 
    	//die(255);          // Check EOF
    	int i=0;
    	for(i=0; i<16; i++) buff[i] = i;
    
        // Forward data to the outgoing stream
        do
            res = pf_read(0, 512, &br);  // Send data to the stream
        while (res || br != 512);        // Break on error or eof
    
       
    
        // Unregister the work area before discard it
        pf_mount(NULL);
    }
    




    Faktyczne napięcie zasilania 3.12 V
    Linie podłączone poprawnie albo znowu cos przeoczyłem...
    Jesli wyjąc karte, diody nie migają, moze inny komunikat, a może dalej się wiesza, sprawdze.
    Niestety nie mam oscyloskopu.

    PS. Sprawdziłem, bez karty układ się wiesza na tym if'ie.
  • #28 9735122
    drzasiek
    Specjalista CNC
    Pokaż teraz kompletny schemat (ale kompletny, nie omijaj nic, narysuj wszystko co jest a czego nie ma nie rysuj, nie rysuj też z głowy ale patrząc na układ i idąc po przewodach/ścieżkach) oraz cały projekt programu (nie fragment kodu).
REKLAMA