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

atmega8 i niedziałające porty

BugsdBunny 09 Lut 2009 22:02 1364 12
  • #1 6126979
    BugsdBunny
    Poziom 14  
    Toretycznie wg tego programu powinienem mieć na porcie B same jedynki a nastepnie je wygaszac. Podłączyłem wyjscia portu B pod diody i tylko PB0 i PB1 działają. Nawet PORTD i PORTC nie działa. Dodam że to moje pierwsze starcie z AVRami.

    
    #define F_CPU 1000000L
    #include <avr/io.h>
    #include <util/delay.h>                
    
    int main(void)
    {
        DDRB  |= _BV(0)|_BV(1);
        PORTB |= _BV(0);
        PORTB &= ~_BV(1);
        DDRD  &= ~_BV(0);
        PORTD |=  _BV(0);
    	volatile int liczba = 0;
    
        while (1) 
        {
            PORTB =0xFF;
    		PORTC =0x00;
    		PORTD =0x00;
    
    	_delay_ms(1000);
    	PORTB ^= _BV(0);
    	_delay_ms(1000);
    	PORTB ^= _BV(1);
    	_delay_ms(1000);
    	PORTB ^= _BV(2);
    	_delay_ms(1000);
    	PORTB ^= _BV(3);
    	_delay_ms(1000);
    	PORTB ^= _BV(4);
    	
    	_delay_ms(1000);
    	PORTB ^= _BV(5);
    	_delay_ms(1000);
    	PORTB ^= _BV(6);
    	_delay_ms(1000);
    	PORTB ^= _BV(7);
        }
    }
    
  • #3 6127261
    BugsdBunny
    Poziom 14  
    no właśnie to jest takie moje poznawanie programowanie AVRow na przykłądach kodów. Czyli PORTB jest wejściem a DDRB wyjściem ??

    Dodano po 3 [minuty]:

    jak odróżnia się wejście od wyjścia. I jeszcze jedno takie moje pytanie. Bo zadeklarowałem sobie zmienną np int zmienna = 0; i potem w petli sobie inkremetnuje. W debagerze AVR-studio pokazuje ze nie przydzieliło mi w ogole pamięci dla tej zmiennej.
  • #4 6127310
    Freddie Chopin
    Specjalista - Mikrokontrolery
    RTFM, nie bede powtarzal rzeczy, ktore napisane sa w datasheecie. jesli chcesz sie 'uczyc' to sie 'ucz' a nie pisz na slepo, bez poznania jakichkolwiek podstaw. jak ci sie nie chce czytac datasheeta, to choc jakis kurs avr.

    http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf

    zmienna zostala usunieta przez kompilator, bo jest zbedna. zreszta w kodzie powyzej nawet uzyles volatile, ktore jest odpowiedzia na twoje dylematy w tej akurat kwestii.

    4\/3!!
  • #5 6127766
    BugsdBunny
    Poziom 14  
    doszedłem do prawie działającego czegoś takiego:

    /* "led.c" - programik do testowania środowiska WinAVR */
    /* układ ATmega 1MHz */
    /* PB0,PB1 - diody LED; PD0 - przycisk */
    
    #define F_CPU 1000000L
    #include <avr/io.h>
    #include <util/delay.h>                
    
    uint8_t sign[] = 
    {
    	_BV(0) | _BV(1) | _BV(2) | _BV(3) | _BV(4) | _BV(5) ,  // 0
    	_BV(1) | _BV(2) ,  // 1
    	_BV(0) | _BV(1) | _BV(6) | _BV(4) | _BV(3) ,  // 2
    	_BV(0) | _BV(1) | _BV(2) | _BV(3) | _BV(6) ,  // 3
    	_BV(5) | _BV(6) | _BV(1) | _BV(2) ,  // 4
    	_BV(0) | _BV(5) | _BV(6) | _BV(2) | _BV(3) ,  // 5
    	_BV(0) | _BV(5) | _BV(4) | _BV(3) | _BV(2) | _BV(6),  // 6
    	_BV(0) | _BV(1) | _BV(2) ,  // 7
    	_BV(0) | _BV(1) | _BV(2) | _BV(3) | _BV(4) | _BV(5) | _BV(6),  // 8
    	_BV(0) | _BV(1) | _BV(2) | _BV(3) | _BV(5) | _BV(6),  // 9
    
    };
    SendToDisplay(unsigned int first, unsigned int second);
    
    int main(void)
    {
    
        PORTB |= _BV(0);
        PORTB &= ~_BV(1);
        DDRD  &= ~_BV(0);
        PORTD |=  _BV(0);
    	DDRB  = 0xff;
    	DDRC |= _BV(0) | _BV(1) ;
    	volatile unsigned int sec1 = 0;
    	volatile unsigned int sec2 = 0;
    	volatile unsigned int i = 0;
    	
    	
        while (1) 
        {
    		for(i = 0; i<10000 ; i++);
    			 SendToDisplay(sec1,sec2);
    		
    		sec1++;
    		if(sec1 == 10)
    		{
    			sec2++;
    			sec1 = 0;
    		}
    	
        }
    }
    
    SendToDisplay(unsigned int first, unsigned int second)
    {
    	PORTC = 0x02;
    	PORTB = ~sign[second];
    	
    	_delay_ms(1);
    	
    	PORTC = 0x01;
    	PORTB = ~sign[first];
    	
    	_delay_ms(1);
    
    }
    


    Czemu pojawia mi się tylko najmniejsza cyfra??? Po dodaniu tyche _delay_ms(1) druga cyfra mruga i jest bardzo mało widoczna
  • #6 6128007
    Freddie Chopin
    Specjalista - Mikrokontrolery
    rozwazales opcje ZGASZENIA jednej przed zapaleniem drugiej? na chwile obecna (poza pierwszym wywolaniem tej funkcji) masz zapalone obydwie cyfry. obydwie cyfry TAKIE SAME.

    pozatym w tym momencie twoje 'volatile' sa zbedne.

    4\/3!!
  • #7 6128369
    BugsdBunny
    Poziom 14  
    Nie bardzo wiem jak wygasić porty.

    Zrobiłem więc tak:
    SendToDisplay(unsigned int first, unsigned int second)
    {
    	PORTC = 0x02;
    	PORTB = ~sign[second];
    	
    	PORTB = 0xff;
    
    	
    	PORTC = 0x01;
    	PORTB = ~sign[first];
    
    	PORTB = 0xff;
    
    }


    Jednak teraz nic się nie pali.

    Przy okazji zapytam. Jak zrobić coś takiego, że w pętli while(1) by mi tylko wyświetało wszystko a gdzieś równolegle by zmieniało wartości sec1, sec2. Zeby działało jak zegarek.
  • #8 6128380
    snow
    Poziom 31  
    BugsdBunny napisał:

    Przy okazji zapytam. Jak zrobić coś takiego, że w pętli while(1) by mi tylko wyświetało wszystko a gdzieś równolegle by zmieniało wartości sec1, sec2. Zeby działało jak zegarek.


    Musisz użyć timerów.
  • #10 6128800
    BugsdBunny
    Poziom 14  
    PORTC = 0x02; // ustawiam drugą cyfre jaka akrywna dajac 1 na port
    PORTB = ~sign[second]; // ustawiam cyfre na tym porcie

    PORTB = 0xff; // wygaszam port ustawiajc same jedynki


    PORTC = 0x01; // pierwsza cyfreaktywna
    PORTB = ~sign[first]; //ustawiam pierwsza cyfre

    PORTB = 0xff; // wygaszam

    No trwa to chwile ale jako ze jest wykonywane z bardzo duza czestotliwością to powinno dawać wrażenie ze pali się ciągle.

    Moglibyście dać jakiś przykład użycia tych TIMERÓW??
  • #12 6129139
    BugsdBunny
    Poziom 14  
    NO rozumiem, że wszystko musi się zdążyć przepropagować. Co Do pojemności to chodzi o to że sygnał zostaje jeszcze na ścieżkach po zmianie ? Wydajność prądowa to mam oporniki 10k na wyjściach PORTC. O to chodzi ? Nie wiem jednak jak to uwględnić w kodzie.

    Dodano po 1 [godziny] 36 [minuty]:

    znalazłem podobny program do mojego.

    Link

    Gdzie tutaj jest uwzględniane to wszystko. Mój jest bardzo podobny
  • #13 6130106
    Freddie Chopin
    Specjalista - Mikrokontrolery
    po pierwsze tam jest to robione ciagle, u ciebie dochodzi wejscie do funkcji, potem wyjscie, jakies warunki, inkrementacje, petla, ...

    po drugie - skad mamy wiedziec, czy masz poprawny schemat? czy kompilujesz poprawnie kod? czy poprawnie go wgrywasz? czy plytka jest 100% sprawna?

    wrozki juz dzis nie ma i nie bedzie.

    4\/3!!
REKLAMA