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

Elektroniczna perkusja - komunikacja układu z kartą SD

szpada89 17 Lut 2012 14:34 3791 23
  • #1 10558549
    szpada89
    Poziom 9  
    Witam, niedawno udało mi się do końca poskładać mój układzik (elektroniczną perkusje), zawiera on :
    - klawiaturę składającą się z 12 przycisków (krążące 0) [podłączona,przetestowana, działa]
    - czytnika kart SD [podłączony]
    - wyjście PWM przez wzmacniacze na jacka [podłączone, działa]

    Próbuje się komunikować przy pomocy funkcji, które znalazłem na tej stronce :
    http://www.avrprojects.info/avr-interfacing/reading-and-writing-sd-card-using-atmega16/

    Po pierwszej próbie zepsułem karte microSD (wsadzoną do układu przez adapter). Co jest nie tak?

    Układ oparty na atmega32
  • #2 10558703
    piotrva
    VIP Zasłużony dla elektroda
    Hmm, na pewno pin 99 układu IC12 na płytce #5 jest upalony.
    A tak na serio, jak mamy Ci pomóc skoro nie wiemy nic:
    1. jak wszystko połączone - schemat
    2. jaki masz program - załącz
    3. co robiłeś
    Na razie do poczytania:
    http://mikrokontrolery.blogspot.com/2011/04/fora-dyskusyjne-sa-bardzo-pomocne.html
    http://mikrokontrolery.blogspot.com/2011/04/pieklo-poczatkujacych.html
  • #3 10558822
    szpada89
    Poziom 9  
    ad1) Schemat mojego układu :
    Elektroniczna perkusja - komunikacja układu z kartą SD

    ad2) Używam Avr Studio

    Oto mój program :

    
    #include <avr/io.h> 
    #include <util/delay.h>
    #include <avr/signal.h>
    #include <avr/pgmspace.h>
    #include <avr/interrupt.h>
    
    #define SAMPLE_RATE 8000;
    
    #define _NOP() asm ("nop")
    
    #define DI 6                        // Port B bit 6 (pin7): data in (data from MMC)
    
    #define DT 5                        // Port B bit 5 (pin6): data out (data to MMC)
    
    #define CLK 7                       // Port B bit 7 (pin8): clock
    
    #define CS 4						// Port B bit 4 (pin5): chip select for MMC
    
    #define FOSC 6400000
    
    char chars[512];
    /////////////////////////////////////////
    //  PORTA &= ~_BV(7);  <- CLEAR pin 7  //
    //  PORTA |= _BV(7);   <- SET   pin 7  //
    ////////////////////////////////////////
    ;
    
    void play(){
    	for(int i=0; i< 512; i++){
    		SetPWMOutput(chars[i]);
    	}
    }
    
    void turnOn(int times){
    	for(int i=0; i < times; i++){
    		PORTA &= ~_BV(7);
    		_delay_ms(100);
    		PORTA |= _BV(7);
    		_delay_ms(100);
    	}
    }
    
    void SetPWMOutput(uint8_t duty){
       OCR0=duty;
    }
    
    void Wait()
    {
     _delay_loop_2(100);
    }
    
    void ini_SPI(void) {
         DDRB &= ~(_BV(DI));                     //input
         DDRB |= _BV(CLK);                     //outputs
         DDRB |= _BV(DT);                     //outputs
         DDRB |= _BV(CS);                     //outputs
         SPCR |= _BV(SPE);                     //SPI enable
         SPCR |= _BV(MSTR);                     //Master SPI mode
         SPCR &= ~(_BV(SPR1));                    //fosc/16
         SPCR |= _BV(SPR0);                    //fosc/16
         SPSR &= ~(_BV(SPI2X));                    //speed is not doubled
         PORTB &= ~(_BV(CS));                     //Enable CS pin for the SD card
    }
    
    char SPI_sendchar(char chr) {
         char receivedchar = 0;
         SPDR = chr;
         while(!(SPSR & (1<<SPIF)));
         receivedchar = SPDR;
         return (receivedchar);
    }
    
    char Command(char cmd, uint16_t ArgH, uint16_t ArgL, char crc ) {
         SPI_sendchar(0xFF);
         SPI_sendchar(cmd);
         SPI_sendchar((uint8_t)(ArgH >> 8));
         SPI_sendchar((uint8_t)ArgH);
         SPI_sendchar((uint8_t)(ArgL >> 8));
         SPI_sendchar((uint8_t)ArgL);
         SPI_sendchar(crc);
         SPI_sendchar(0xFF);
         return SPI_sendchar(0xFF);                // Returns the last byte received
    
    }
    
    void ini_SD(void) {
         char i;
         PORTB |= _BV(CS);                    //disable CS
         for(i=0; i < 10; i++){ 
           SPI_sendchar(0xFF);
    	 }                				// Send 10 * 8 = 80 clock pulses 400 kHz
         PORTB &= ~(_BV(CS));                 //enable CS
         for(i=0; i < 2; i++){ 
           SPI_sendchar(0xFF);  
    	 }              				// Send 2 * 8 = 16 clock pulses 400 kHz
         Command(0x40,0,0,0x95);              // reset
    
    idle_no:
         if (Command(0x41,0,0,0xFF) !=0) 
         goto idle_no;                        //idle = L?
         SPCR &= ~(_BV(SPR0));                //fosc/4
    }
    
    int read(void) {
        int i;
        uint16_t ix;
        char r1 =  Command(0x51,0,512,0xFF);
        for (ix = 0; ix < 50000; ix++) {
            if (r1 == (char)0x00) break;
            r1 = SPI_sendchar(0xFF);
        }
    
        if (r1 != (char)0x00) {
        return 1;
        }
        //read from the card will start after the framework
        while(SPI_sendchar(0xFF) != (char)0xFE);
        for(i=0; i < 512; i++) {
            while(!(SPSR & (1<<SPIF)));
            chars[i] = SPDR;
            SPDR = SPI_sendchar(0xFF);
        }
        SPI_sendchar(0xFF);
        SPI_sendchar(0xFF);
        return 0;
    }
    
    /****************************************************
    *				|\	/|	_  o						*
    *				| \/ | |-| | |\ |					*
    *				|	 | | | | | \|					*
    *****************************************************/
    int main(void){
    	DDRA = 0xf0;
    	DDRD = 0xff;
    	PORTA = 0xff;
    	PORTA |= _BV(7);
    	TCCR0|=(1<<WGM00)|(1<<WGM01)|(1<<COM01)|(1<<CS00);
    
       	DDRB|=(1<<PB3);
    	while(1){
    	//-------KOLUMNA 3------------//
    		PORTA &= ~_BV(6);
    		_NOP();
    		PORTA |= _BV(5);
    		_NOP();
    		PORTA |= _BV(4);
    		_NOP();
    		if(!(PINA & 0x01)){
    			turnOn(9);
    		}
    		if(!(PINA & 0x02)){
    			turnOn(10);
    		}
    		if(!(PINA & 0x04)){
    			turnOn(11);
    		}
    		if(!(PINA & 0x08)){
    			turnOn(12);
    			ini_SPI();
        		ini_SD();
        		sei();
    		}
    		_delay_ms(50);
    	
    	//-------KOLUMNA 2------------//	
    		PORTA |= _BV(6);
    		_NOP();
    		PORTA &= ~_BV(5);
    		_NOP();
    		PORTA |= _BV(4);
    		_NOP();
    		if(!(PINA & 0x01)){
    			turnOn(5);
    		}
    		if(!(PINA & 0x02)){
    			turnOn(6);
    		}
    		if(!(PINA & 0x04)){
    			turnOn(7);
    		}
    		if(!(PINA & 0x08)){
    			turnOn(8);
    		}
    		_delay_ms(50);	
    
    	//-------KOLUMNA 1------------//
    		PORTA |= _BV(6);
    		_NOP();
    		PORTA |= _BV(5);
    		_NOP();
    		PORTA &= ~_BV(4);
    		_NOP();
    		if(!(PINA & 0x01)){
    			turnOn(1);
    			if(read() == 0){
    				play();
    			}
    		}
    		if(!(PINA & 0x02)){
    			turnOn(2);
    		}
    		if(!(PINA & 0x04)){
    			turnOn(3);
    		}
    		if(!(PINA & 0x08)){
    			turnOn(4);
    		}
    		_delay_ms(50);
    	}
    	return 0;
    }
    


    ad3) Wgrałem hexa (przy pomocy Extreme Burnera) wsadziłem karte SD (Adapter z wsadzoną microSD) po wciśnięciu 12 klawisza (inicjalizacji karty) zauważyłem że karta zrobiła się ciepła więc wyłączyłem układ wyjąłem kartę i sprawdziłem w komputerze czy działa - była ok. Później przy drugiej próbie widocznie za długo ją "smażyłem" bo teraz komputer jej nie widzi.
  • #4 10558912
    piotrva
    VIP Zasłużony dla elektroda
    W ogóle jej nie widzi? Czy widzi jako niesformatowaną?
    Z błędów wynikających ze schematu:
    1. Niepodłączone avcc
    2. reset w powietrzu
    3. pokaż jak masz podłączone zasilanie do karty
    4. najlepiej byłoby zrobić dokładny schemat z nieukrytymi vcc i gnd
    5. czy karta grzeje się po samym włożeniu, czy dopiero po wciśnięciu przycisku?
    6. czy piny procesora podłączone z kartą są sprawne?
    7. pokaż jeszcze dobrej jakości zdjęcie układu - może coś wypatrzymy
  • #5 10559119
    szpada89
    Poziom 9  
    Schemat jest raczej poglądowy i tak :
    Cytat:
    Niepodłączone avcc

    zgadza się nie podłączyłem avcc

    Cytat:
    reset w powietrzu

    reset podpięty pod gniazdo programatora

    zasilanie podpięte dokładnie tak :

    Elektroniczna perkusja - komunikacja układu z kartą SD

    gdzie :
    Czarny kabelek - GND
    Czerwony kabelek - +Vcc

    Cytat:
    czy karta grzeje się po samym włożeniu, czy dopiero po wciśnięciu przycisku?

    karta grzeje się po samym włożeniu.
    Cytat:
    czy piny procesora podłączone z kartą są sprawne?

    wydaje mi się że tak

    mało co będzie widać bo kable są poprowadzone niechlujnie :

    Elektroniczna perkusja - komunikacja układu z kartą SD
  • #6 10559153
    piotrva
    VIP Zasłużony dla elektroda
    1. Hmm, jeśli nie pomyliłeś kabelków lub napięć to wygląda to dobrze, sprawdź jeszcze na 200% czy nie są styki jakoś dziwnie połączone (przesunięte) wewnątrz slotu...
    2. Dalej, czy procesor też zasilany z 3,3V?
    3. wepnij się w pin Vcc i zmierz jaki prąd pobiera karta po włożeniu
  • #7 10559386
    szpada89
    Poziom 9  
    piotrva napisał:
    1. Hmm, jeśli nie pomyliłeś kabelków lub napięć to wygląda to dobrze, sprawdź jeszcze na 200% czy nie są styki jakoś dziwnie połączone (przesunięte) wewnątrz slotu...
    2. Dalej, czy procesor też zasilany z 3,3V?
    3. wepnij się w pin Vcc i zmierz jaki prąd pobiera karta po włożeniu


    ad2. Tak procesor też jest zasilany 3,3 V

    ad3. Karta po wpięciu pobiera 0,24 mA (nie wiem czy się nie pomyliłem w jednostkach O_o )
  • #8 10559476
    Konto nie istnieje
    Konto nie istnieje  
  • #9 10559532
    szpada89
    Poziom 9  
    Sprawdziłem taki prąd pobiera. Niestety grzeje się nadal (nawet po odłączeniu DO)
  • #10 10559589
    Konto nie istnieje
    Konto nie istnieje  
  • #11 10559615
    szpada89
    Poziom 9  
    Ok wielki dzięki. Jutro rano zacznę testy i pochwalę się co z tego wyszło :)
  • #12 10559695
    Konto nie istnieje
    Konto nie istnieje  
  • #13 10559762
    mmacura
    Poziom 18  
    Sprawdź miernikiem czy masz na pewno zasilanie 3,3V bo ze schematu to coś nie wynika.
    Masz stabilizator 7805, na wejście podajesz 4,5V a na wyjściu oczekujesz 3,3V - to jest nierealne - więc albo schemat jest zły albo zasilanie układu totalnie niepoprawne.

    Marek
  • #14 10562255
    szpada89
    Poziom 9  
    Schemat jest tak jak mówię tylko poglądowy. W układzie jest równiutko 3,3 V :)
    Cytat:
    Połącz wszystkie linie do karty przez oporniki


    Wszystkie mogę podłączyć przez opornik 330 omów ?
  • #15 10562306
    Konto nie istnieje
    Konto nie istnieje  
  • #16 10562516
    szpada89
    Poziom 9  
    W układzie używam LF33CV (zbija mi dokładnie do 3,3 V).
    Zaraz będę sprawdzał czy się grzeje z samym GND i VCC.
  • #17 10568350
    szpada89
    Poziom 9  
    Zrobiłem test z samym GND i VCC - nadal się grzeje.
  • #18 10569291
    Konto nie istnieje
    Konto nie istnieje  
  • #19 10569793
    piotrva
    VIP Zasłużony dla elektroda
    no i daj sobie te rezystory na wejściach żeby na przyszłość nie mieć kaloryferka
  • #20 10571627
    Konto nie istnieje
    Konto nie istnieje  
  • #21 10575700
    szpada89
    Poziom 9  
    Ok podłączyłem opornik pod DO. Wsadziłem dla pewności starą kartę do gniazda i nadal się grzeje o_O
  • #22 10576452
    Konto nie istnieje
    Konto nie istnieje  
  • #23 10576624
    piotrva
    VIP Zasłużony dla elektroda
    Po co wyrzucać, można rozebrać i mieć ładny eksponat do kolekcji :D
    I na serio kup sobie na alledrogo jakieś karty (nawet takie malutkie) do testów - nie będzie szkoda (nawet jakby co), ze coś spalisz :D
  • #24 10596831
    szpada89
    Poziom 9  
    Ok działa ! Tzn karta się nie pali - kable tak się rozgrzały że puściła na nich izolacja i było zwarcie w jednym miejscu. Już nie dużo brakuje żeby to grało :D, mam zaimplementowaną funkcje do obsługi PWM ale nie potrafię czytać z karty SD. Czy istnieje jakaś wygodna biblioteka do czytania wav-ów z SD ? Znalazłem w internecie Wave Shield ale wymaga c++ a w moim AVR Studio pomimo zmiany z avr-gcc na avr-cpp kompilator dalej się pluje o wszystko.
REKLAMA