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

coś nie tak z "TCCR0" AVR 2313

20rafalo 28 Lip 2009 20:18 3096 13
REKLAMA
  • #1 6831947
    20rafalo
    Poziom 19  
    #include<avr\io.h>
    #include<inttypes.h>
    #include<avr\signal.h>
    #include<avr\interrupt.h>
    #include<avr\delay.h>
    
    uint8_t g_AktWyswietlacz = 0;
    uint8_t g_DaneWyswietlacza[4];
    uint8_t g_DaneCom[4] = (~(1<<6),~(1<<5),~(1<<4),~(1<<3));
    
    int main(void)
    {
    PORTB = 0xff;
    DDRD = 1<<6 | 1<<5 | 1<<4 | 1<<3;
    
    TCCR0 =1<<CS01 | 1<<CS00;
    TIMSK = 1<<TOIE0;
    
    sei();
    
    g_DaneWyswietlacza[0] = ~(1<<1 | 1<<2);
    
    g_DaneWyswietlacza[1]= ~( 1<<0 | 1<<1 | 1<<3 | 1<<4 | 1<<5);
    g_DaneWyswietlacza[2]= ~( 1<<0 | 1<<1 | 1<<3 | 1<<4 | 1<<5);
    g_DaneWyswietlacza[3]= ~( 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<5);
    	
    	for(;;)
    	{
    	}
    
    return 0;
    }
    
    
    SIGNAL(SIG_OVERFLOW0) //0-ZERO
    {
    PORTD |= 1<<6 | 1<<5 | 1<<4 | 1<<3;
    
    PORTB = g_DaneWyswietlacza[g_AktWyswietlacz];
    
    PORTB &= g_DaneCom[g_AktWyswietlacz];
    
    ++g_AktWyswietlacz;
    if (g_AktWyswietlacz > 3)
        g_AktWyswietlacz=0;
    }
    


    Wyświetla taki komunikat:

    > "make.exe" all
    
    -------- begin --------
    avr-gcc (WinAVR 20090313) 4.3.2
    Copyright (C) 2008 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    
    Compiling C: w_3znaki.c
    avr-gcc -c -mmcu=attiny2313 -I. -gdwarf-2 -DF_CPU=4000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./w_3znaki.lst  -std=gnu99 -MMD -MP -MF .dep/w_3znaki.o.d w_3znaki.c -o w_3znaki.o 
    In file included from w_3znaki.c:3:
    c:/winavr-20090313/lib/gcc/../../avr/include/avr\signal.h:36:2: warning: #warning "This header file is obsolete.  Use <avr/interrupt.h>."
    In file included from w_3znaki.c:5:
    c:/winavr-20090313/lib/gcc/../../avr/include/avr\delay.h:36:2: warning: #warning "This file has been moved to <util/delay.h>."
    w_3znaki.c:9: warning: left-hand operand of comma expression has no effect
    w_3znaki.c:9: warning: left-hand operand of comma expression has no effect
    w_3znaki.c:9: warning: left-hand operand of comma expression has no effect
    w_3znaki.c:9: error: invalid initializer
    w_3znaki.c: In function 'main':
    w_3znaki.c:16: error: 'TCCR0' undeclared (first use in this function)
    w_3znaki.c:16: error: (Each undeclared identifier is reported only once
    w_3znaki.c:16: error: for each function it appears in.)
    make.exe: *** [w_3znaki.o] Error 1
    
    > Process Exit Code: 2
    > Time Taken: 00:00
    


    Wiem, że jest coś nie tak m. in. z "TCCR0" - wydaje mi się że dyrektywą include załączyłem odpowiedni plik.
    Z góry dziękuję
  • REKLAMA
  • #2 6831979
    michalko12
    Specjalista - Mikrokontrolery
    TCCR0A i TCCR0B a TCCR0 nie ma ;)

    i mocno się zdziwisz jak zadziała ci to:
    uint8_t g_DaneCom[4] = (~(1<<6),~(1<<5),~(1<<4),~(1<<3)); 

    Sprawdź jeszcze dokładnie jak inicjuje się tablice ;)
  • REKLAMA
  • REKLAMA
  • #4 6832113
    michalko12
    Specjalista - Mikrokontrolery
    20rafalo napisał:
    Spisałem kod z elektroniki praktycznej :-/

    Dodano po 32 [sekundy]:

    Programowanie procesorów w języku C część 3


    Sam widzisz do czego prowadzi bezmyślne spisywanie.

    Jesteś pewien że to ten sam procesor?

    A w inicjalizacji tablicy nie te nawiasy!!!!
  • Pomocny post
    #5 6832189
    Maciek4141
    Poziom 22  
    Dla delay.h należy zdefiniować wcześniej #define F_CPU 8000000UL.
    Tablicę definiujesz w taki sposób:
    uint8_t g_DaneCom[4] = {wart1, wart2, wart3, wart4};
  • #6 6832949
    Brutus_gsm
    Poziom 25  
    No i poczytaj datasheet procka, bo kod zapewne jest dla AT90s2313 a podejrzewam, że używasz Attiny2313... Zgadza się? ;)
  • #7 6832956
    20rafalo
    Poziom 19  
    Dzięki wam!!

    Dodano po 1 [minuty]:

    Brutus_gsm zgadza się - bardzo podobne są :-)

    Dodano po 1 [minuty]:

    Te nawiasy jakoś odruchowo takie wpisałem :-/

    Dodano po 4 [minuty]:

    Panowie a gdzie jest wywoływana funkcja SIGNAL(SIG_OVERFLOW0) - bo nigdzie nie widzę
  • #8 6833041
    Maciek4141
    Poziom 22  
    SIGNAL(SIG_OVERFLOW0) - jest to przerwanie generowane automatycznie po przepełnieniu się timera, czyli wtedy kiedy Timer0 osiągnie wartość 255.

    Polecam tę stronę: Link
  • #9 6833161
    Brutus_gsm
    Poziom 25  
    Podobne są, ale nie takie same ;) I rejestry są inne. Warto czytać dokumentację.
  • REKLAMA
  • #11 6833628
    Maciek4141
    Poziom 22  
    W przypadku przerwań są one wywoływane przez "procesor". Dla Timera0 w normalnym trybie pracy przerwanie (sygnał dla wywołania SIGNAL(SIG_OVERFLOW0) ) następuje kiedy się przepełni (uzyska maksymalną wartość - 255). Nie zagłębiałem się dokładnie jak jest to obsługiwane przez procesor, ale kiedy timer się przepełni wówczas w rejestrze TIFR, do bitu TOV0 zostaje wpisana logiczna 1.
    Prościej nie da się chyba tego wytłumaczyć. Poczytaj informacje z linku podanego przezemnie wyrzej.
  • Pomocny post
    #12 6835072
    michalko12
    Specjalista - Mikrokontrolery
    20rafalo napisał:
    Panowie umiem w miarę C++ i przecież musi być miejsce wywołania funkcji a ja tego nie widzę.
    Pozdrawiam


    Wiesz co to są wektory przerwania, ATtiny2313 ma ich razem z resetem 19.
    Jeśli jakieś moduł np Timer, UART itp. zgłosi potrzebę obsługi, CPU przerywa wykonywanie programu, zapisuje swój stan na stosie i zaczyna wykonywać program od innego miejsca. Miejsce to zależy od tego który moduł zgłosił przerwanie. Na początku pamięci FLASH są umieszczone wektory przerwań, czyli adresy procedur przypisanych każdemu przerwaniu. SIGNAL(SIG_OVERFLOW0) jest właśnie takim adresem i adres ten jest umieszczony w pamięci FLASH pod adresem 0x0006 . Jeśli nastąpi przerwanie od przepełnienia TIMERA0, CPU zacznie wykonywać program wskazany przez wektor umieszczony właśnie pod adresem 0x0006.

    Więc jawnego wywołania tej funkcji nie znajdziesz nigdzie, te funkcje to nic innego jak obsługa zdarzeń.
  • #14 6880156
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Cytat:
    Sprawdź jeszcze dokładnie jak inicjuje się tablice ;)

    Może jeszcze tylko dodam, ze inicjować to można swoje życie seksualne. W programowaniu mozna co najwyżej inicjALIZować - błąd popełniany nagminnie w praktycznie każdym temacie.

    4\/3!!
REKLAMA