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

Atmega162 i SD card: Zawieszanie się przy wywołaniu procedury flush_mmc

ziomal155 11 Lut 2007 13:15 1505 2
REKLAMA
  • #1 3555805
    ziomal155
    Poziom 15  
    Posty: 211
    Pomógł: 6
    Ocena: 13
    Witam mam pewien problem. Otóż umiem Bascoma bardzo dobrze umnie tak sobie ASM no i ucze sie C kilka małych programów już napisałem ale coś nie działają mi procedury. Z tego co wiem to procedury pisze sobie w oddzielnym pliku u mnie procedury.c i mmc.c do mmc.c jest dołączony mmc.h a program główny to laser.c i dołączony laser.h z definicjami otoz port szeregowy już mi dziala(USART) ale w mmc.h była sekcja "Prototypy funkcji", i jak one były czyli same nazwy funkcji(procedur) wypisane. I własnie jak odwoływał się program główny do tych procedur w mmc.c to sie procesor zawieszał dopiero jak usunolem "prototypy funkcji" z mmc.h(zrobiłem je tylko jako komentarz) to program poszedł dalej ale teraz zacina sie przy "flush_mmc" nie wchodzi juz do tej procedury. Proszę o pomoc program nie jest mój bo nie obsługiwałem jeszcze karty sd. Program rozumiem symulacja w AVR Studio działa. Używam AVR Studio 4.13 i najnowsze WINAVR. Dołączam pliki. Debuguje sobie uartem dlatego są powstawiałem print(x)
    Pozdrawiam

    ps. usunołem sekcje aktywacji i dezaktywacji lini CS ponieważ mam ja w karcie zwarta na stałe do masy.
    Załączniki:
    • procedury.c (909 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
    • mmc.h (1.21 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • mmc.c (5.64 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • laser.h (317 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
    • laser.c (1.61 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #2 3556475
    VanThor
    Poziom 19  
    Posty: 224
    Pomógł: 34
    Ocena: 5
    Funkcja flush_mmc z mmc.c powinna chyba wyglądać tak:

    
    void flush_mmc(u08 count)	// odbierz i odrzuć "count" bajtów z karty
    {
    	print('a');
    	while(count--)
    	{
    		print('b');
    	  	spi_tx_rx(0xff);
    		print('c');
    	}
    }
    


    Dodano po 8 [minuty]:

    Poza tym - w plikach *.c dołącza się poprzez #include pliki *.h a nie *.c tak jak Ty to robisz. I jeszcze kilka innych rzeczy jest nie tak, jak trzeba.
    Może zapoznaj się z książką "Język ANSI C" autorstwa Kernighan / Richie.
  • #3 3557017
    ziomal155
    Poziom 15  
    Posty: 211
    Pomógł: 6
    Ocena: 13
    witam
    dziekuje za informacje o ksiazce ale to niestety musi poczekac do wakacji. Teraz zaczyna sie szkoła jestem w 2klasie LO i mam mało czasu na elektronike, a na ksiazki jeszcze mniej. CO do dołączania pliku *.c wyczytałem to na stronie http://www.patron.net.pl w publikacjach jest krotki kurs C dla AVR. i jest tam fragment:

    #include <avr/io.h>
    #include "beep.h"


    #include "poprzednie.c"

    możesz mi wytłumaczyć co jeszcze jest nie tak??
    Pozdrawiam

    czym różnią się te funkcje

    u08 spi_tx_rx(u08 byte)
    void mmc_finish(void)
    void flush_mmc(u08 count)


    wiem że ta w nawiasie ze słowem (void) nie ma parametrów, a czy ta ze słowem void przez funkcja to poprostu nie zwraca wartości??

    dlaczego jak dołączam w takim razie same pliki *.h to funkcji w pliku *.c nie są widziane??

    no to teraz mam dolaczone same pliki *.h i mi wyskakuje:
    ../laser.c:13:1: warning: "F_CPU" redefined
    (dlaczego redefine?? mam zadeklarowane tylko raz)

    <command line>:1:1: warning: this is the location of the previous definition
    avr-gcc.exe -mmcu=atmega162 laser.o -o laser.elf
    laser.o: In function `send_buf':
    ../laser.c:25: undefined reference to `mmc_sbuf'
    ../laser.c:25: undefined reference to `mmc_sbuf'
    laser.o: In function `main':
    ../laser.c:61: undefined reference to `UART_init'
    ../laser.c:62: undefined reference to `printe'
    ../laser.c:64: undefined reference to `printe'
    ../laser.c:65: undefined reference to `mmc_reset'
    ../laser.c:66: undefined reference to `printe'
    ../laser.c:67: undefined reference to `mmc_get_cid'
    ../laser.c:70: undefined reference to `printe'
    ../laser.c:71: undefined reference to `mmc_capacity'
    ../laser.c:74: undefined reference to `printe'
    ../laser.c:77: undefined reference to `mmc_read_sector'

    Dodano po 2 [godziny] 27 [minuty]:

    widze ze dużo ludzi mi tu odpisuje :)
    mam nastepny problem otóż jak dolaczam pliki *.c to nie ma błędów oczywiście funkcje nie działają z innych plików jak procesor w nie wchodzi to się zawiesza. Ale napisałem swoją funkcje do wysylania przez uart:

    void UART_init(void)
    {
    UBRR1H = 0x00;
    UBRR1L = (unsigned char)UART_CONST; // ustaw prędkość transmisji
    UCSR1C = (1 << URSEL1) | (1 << UCSZ10) | (1 << UCSZ11);
    UCSR1B = (1 << RXCIE1) | (1 << RXEN1) | (1 << TXEN1);


    }

    // wysyła znak podany jako parametr na port szeregowy
    void wysli (u08 c)
    {
    UDR1 = c; // wpisz c do rejestru UDR
    loop_until_bit_is_set(UCSR1A,TXC1); // czekaj na zakończenie transmisji
    sbi(UCSR1A,TXC1); // ustaw bit TXC w rej. USR
    }


    wywołuje ją wysli(1); i działa ale tylko raz jak w programie umieszcze dwa razy odwołanie to kompilator wywala błąd:

    ../mmc.c:103: warning: implicit declaration of function `wysli'
    In file included from ../laser.c:7:
    ../laser.h: At top level:
    ../laser.h:11: error: conflicting types for 'wysli'
    ../mmc.c:103: error: previous implicit declaration of 'wysli' was here
REKLAMA