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

[ATmega128][Ethernut] przerwania, flash

herszt 06 Lis 2009 16:59 1439 1
REKLAMA
  • #1 7223594
    herszt
    Poziom 18  
    Witam!

    Mam pytanie do użytkowników systemu Nut/OS na ATmegach. W jaki sposób wygląda obsługa przerwań? Właśnie zacząłem się bawić tym systemem (a do tego sama ATmega128 jest dla mnie też nieco nowością, bo wcześniej były tylko ATmegi8). Czy wygląda to tak samo jak w przypadku ATmegi8? Czy może są jakieś gotowe funkcje? Tak nieco przybliżając temat chciałbym, aby kontroler w określony sposób reagował np. na narastające zbocze na wejściu jednego z przerwań.

    Przy okazji tematu Nut/OS. Napisałem prostą aplikację która zapisuje/czyta pliki na dołączonej do mikrokontrolera pamięci flash (cału zestaw jest z Propoxu). Wyglą to mniej/więcej tak:

    
    if(wykonaj)
    			{
    			u_char *ptr;
    			int file;
    			char *filename;
    			wykonaj = 0;
    			
    		    ptr="plik.txt\r\n";
                        filename = NutHeapAlloc(strlen(ptr) + 6);
                        strcpy(filename, "FLASH:");
                        strcat(filename, ptr);
    		    printf_P(PSTR("Otwieram plik...!\r\n"));
    		    NutSleep(1000);
                        file = _open(filename, _O_RDWR);
    		    NutHeapFree(filename);
    					
    					if (file != -1)
    					{
    						printf_P(PSTR("Otworzono plik!\r\n"));
    						char *buf;
    						buf = NutHeapAlloc(5) ;
    						//buf="tekst";
    						int size =5;
    						//int r = _write(file, buf, size);
    						int r = _read(file, buf, size);
    						printf_P(PSTR("odczytano bajtow: %u"), r);
    						printf_P(PSTR("Tekst: %s"), buf);
    						NutHeapFree(buf);
    						_close(file);
    					}
    			}
    


    W tym przypadku akurat czyta to co zostało zapisane w części wykomentowanej. I to co pokazuje się na konsoli to zestaw krzaczków. Może ktoś z szanownych forumowiczów ma na to jakąś radę?

    pozdrawiam
    herszt
  • REKLAMA
  • #2 7251784
    herszt
    Poziom 18  
    Z przerwaniami sobie poradziłem, natomiast w dalszym ciągu zapisywanie/odczytywanie z pamięci FLASH nadal sprawia problem.

    Przerwanie:

    
    static void IrqHandler(void *arg)
    {
    	i += 1 ;
    }
    
    /*
    KONIEC OBSLUGI PRZERWANIA
    */
    
    
    int main()
    {
    	DDRD =  0x00 ; // PORTD jako wejscie
    	PORTD = 0xFF ; // podciagniecie wejsc do 1
    	//EICRA = 0xAA ; // wejscie reaguje na opadajace zbocze
    	EICRA = 0xFF ; // wejscie reaguje na zbocze rosnace
    	EIMSK = 0x0F ; // odblokowuje przerwania na wejsciach INT0...INT3
    	
        NutRegisterIrqHandler(&sig_INTERRUPT0, IrqHandler, NULL); // obsluga przerwania
    [...]
    


    Samo urządzenie i system plików jest inicjowany tak:

    
    #ifdef FLASH
    	//flash
    	if (NutRegisterDevice(&devFlashSpi, 0, 0)) {
    #ifdef DEBUG
    		fprintf_P(stdout, PSTR("\r\nRejestracja pamieci FLASH sie nie powiodla!"));
    #endif
    	} else {
    #ifdef DEBUG
    		fprintf_P(stdout, PSTR("\r\nRejestracja pamieci FLASH zakonczona sukcesem!"));
    #endif
    	}
    	devFlash = NutDeviceOpen("flashSpi");
    #endif
    
    #ifdef FLASH
    	//filesystem
    	if (NutRegisterDevice(&devFlashFs, 0, 0)) {
    #ifdef DEBUG
    		fprintf_P(stdout, PSTR("\r\nRejestracja systemu plikow na pamieci FLASH sie nie powiodla!"));
    #endif
    	} else {
    #ifdef DEBUG
    		fprintf_P(stdout, PSTR("\r\nRejestracja systemu plikow na pamieci FLASH zakonczona sukcesem!"));
    #endif
    	}
    
    	devFlashFS = NutDeviceOpen("FLASH"); 
    #endif
    


    Może ktoś już korzystał z zestawów PROPOXu i wie jak poprawnie zrealizować zapis/odczyt? Bo ja się wzorowałem na ich twórczości, ale generalnie to słabo to działa.

    z góry dzięki
    pozdrawiam
    herszt
REKLAMA