Poprzedni temat «» Następny temat
Attiny44 C bity ze zmiennej na poszczególne piny
Autor Wiadomość
siekierzyński 
Że niby co?



Wiek: 27
Dołączył: 01 Cze 2010
Posty: 416
Skąd: Nareszcie Polska
Wysłany: 2015-07-19, 14:20   Attiny44 C bity ze zmiennej na poszczególne piny

Kod:
#include <avr/io.h>
#include <avr/interrupt.h>

uint8_t pomiar;

ISR(ADC_vect)
{

    pomiar = ADCH;            // Output ADCH to PortD

//przeniesienie bitów zmiennej na porty
    PORTB.0 = pomiar.0;
    PORTB.1 = pomiar.1;
    PORTB.2 = pomiar.2;
    PORTA.7 = pomiar.3;
    PORTA.1 = pomiar.4;
    PORTA.2 = pomiar.5;
    PORTA.3 = pomiar.6;
    PORTA.4 = pomiar.7;
//przeniesienie bitów zmiennej na porty

    ADCSRA |= 1<<ADSC;        // Start Conversion
}

int main(void) {
    DDRB |= (1<<PB0) | (1<<PB1) | (1<<PB2); /* set PB0, PB1, PB2 to output */
    DDRA |= (1<<PA7) | (1<<PA4) | (1<<PA3) | (1<<PA2) | (1<<PA1); /* set PA1, PA2, PA3, PA4, PA7  to output */

    //właczenie ADC, preskaler na 8, nap odniesienia z Vcc
    ADCSRA |= (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0) | (1<<ADIE);

    sei();//właczenie przerwań

    ADCSRA |= 1<<ADSC;//Rozpoczęcie pomiaru
    while(1) {
        //PORTB &= ~(1<<PB0); /* LED on */
        //PORTB |= 1<<PB0; /* LED off */
    }
    return 0;
}


Witam,

dopiero się uczę C. Z racji, że przyszły projekt będzie na Attiny44, potrzebuje pobawić się przetwornikiem ADC, i wartość pomiaru z portu PD0 wyrzucić na poszczególne piny do zapalenia diod.

Jak w C poszczególne bity przenieść na porty - tak jak wyżej?

I nie działa mi przerwanie ADC, mam tak:
Kod:
ISR(ADC_vect)
{

    pomiar = ADCH;            // Output ADCH to PortD
    //PORTB.0 = pomiar.0;
    //PORTB.1 = pomiar.1;
    //PORTB.2 = pomiar.2;
    //PORTA.7 = pomiar.3;
    //PORTA.1 = pomiar.4;
    //PORTA.2 = pomiar.5;
    //PORTA.3 = pomiar.6;
    //PORTA.4 = pomiar.7;
    if(129>127)
        PORTB &= ~(1<<PB0);
    else
        PORTB |= 1<<PB0;

    ADCSRA |= 1<<ADSC;        // Start Conversion
}


Przy if(129>127) i przy if(127>127) nic się nie dzieje, nie zapala się. jak wrzucę do pętli głównej to działa.

EDIT:
Co do przerwań, wystarczyło uruchomić globalne przerwania (dziwne, że tego funkcja sei() nie robi). Do SREG wpisałem 128.

EDIT:
Ja dobrze rozumiem, że żeby mieć wewnętrzne źródło odniesienia z Vcc i robić pomiar z pinu ADC0 to cały rejestr ADMUX musi być wyzerowany?
 
     
siekierzyński 
Że niby co?



Wiek: 27
Dołączył: 01 Cze 2010
Posty: 416
Skąd: Nareszcie Polska
Wysłany: 2015-07-19, 22:18   

Temat do wywalenia, udało mi się wszystko ogarnąć :)
 
     
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  


Powered by phpBB modified by Przemo © 2003 phpBB Group
Strona wygenerowana w 0,04 sekundy. Zapytań do SQL: 11