Attiny44 C bity ze zmiennej na poszczególne piny

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Awatar użytkownika
siekierzyński
Użytkownik
Posty: 484
Rejestracja: 01 cze 2010, 23:12
Lokalizacja: Nareszcie Polska

Attiny44 C bity ze zmiennej na poszczególne piny

Post autor: siekierzyński » 19 lip 2015, 14:20

Kod: Zaznacz cały

#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: Zaznacz cały

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?

Awatar użytkownika
siekierzyński
Użytkownik
Posty: 484
Rejestracja: 01 cze 2010, 23:12
Lokalizacja: Nareszcie Polska

Post autor: siekierzyński » 19 lip 2015, 22:18

Temat do wywalenia, udało mi się wszystko ogarnąć :)

ODPOWIEDZ