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;
}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
}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?