Witam. Projektuję czujnik koloru na kontrolerze Atmega8.
Mam już schemat oraz program w języku C, ale jestem początkujący w programowaniu i dlatego proszę o sprawdzenie programu lub ewentualne porady. Program starałem się napisać jak najprościej nie jestem pewien końcówki tego programu związanego z porównywaniem zmiennych i wystawianiem stanu wysokiego na poszczególne wyjścia w zależności od rozpoznanego koloru. Z góry bardzo dziękuję.
Czujnik ma rozpoznawać trzy kolory przedmiotów (klocków) czerwony, zielony, niebieski.Po położeniu przedmiotu na przycisku Z1 (patrz schemat) rozpoczyna się procedura oświetlania przedmiotu. Jeśli przycisk Z1 nie jest wciśnięty powinna mrugać dioda bezczynności. Najpierw oświetlany jest światłem czerwonym (dioda LED) światło odbija się od przedmiotu i trafia do fotorezystora. Fotorezystor podłączony jest do przetwornika ADC ukontrolera. Wartość pomiaru jest zapisywana w zmiennych. Ten sam schemat pomiaru powtarza się dla 2 pozostałych kolorów. Po oświetleniu klocka trzema różnymi barwami światła jeden z pomiarów będzie po porównaniu największy. Np. po oświetleniu czerwonego klocka czerwonym światłem fotorezystor „odbierze” większą ilość światła niż po oświetleniu go innym kolorem. Wtedy wysterowane jest odpowiednie wyjście w stan wysoki inne dla każdego z kolorów.
Mam już schemat oraz program w języku C, ale jestem początkujący w programowaniu i dlatego proszę o sprawdzenie programu lub ewentualne porady. Program starałem się napisać jak najprościej nie jestem pewien końcówki tego programu związanego z porównywaniem zmiennych i wystawianiem stanu wysokiego na poszczególne wyjścia w zależności od rozpoznanego koloru. Z góry bardzo dziękuję.
Czujnik ma rozpoznawać trzy kolory przedmiotów (klocków) czerwony, zielony, niebieski.Po położeniu przedmiotu na przycisku Z1 (patrz schemat) rozpoczyna się procedura oświetlania przedmiotu. Jeśli przycisk Z1 nie jest wciśnięty powinna mrugać dioda bezczynności. Najpierw oświetlany jest światłem czerwonym (dioda LED) światło odbija się od przedmiotu i trafia do fotorezystora. Fotorezystor podłączony jest do przetwornika ADC ukontrolera. Wartość pomiaru jest zapisywana w zmiennych. Ten sam schemat pomiaru powtarza się dla 2 pozostałych kolorów. Po oświetleniu klocka trzema różnymi barwami światła jeden z pomiarów będzie po porównaniu największy. Np. po oświetleniu czerwonego klocka czerwonym światłem fotorezystor „odbierze” większą ilość światła niż po oświetleniu go innym kolorem. Wtedy wysterowane jest odpowiednie wyjście w stan wysoki inne dla każdego z kolorów.
#include <avr/io.h>
#include <until/delay.h>
unsigned int r, g, b, max; //zmienne
unsigned char i;
int main()
{
TCCR0 |= ((1 << CS00) | (1 << CS02)); //Ustawia timer0 z preskalerem Fcpu/1024
DDRB=0; //linie portu B wejściowe
PORTB=0x01; //stan wysoki na lini PB0
DDRD=0x7F; //linie PD0 PD1 PD2 PD3 PD4 PD5 PD6 wyjściowe
PORTD=0x7F; //stan wysoki na liniach PD0 PD1 PD2
ADMUX=0; //wybierz kanał 0 przetwornika ADC
ADCSR = _BV(ADEN)|_BV(ADSC)|_BV(ADFR)|_BV(ADIE)|_BV(ADPS1)|_BV(ADPS1)|_BV(ADPS0);
//włączenie przetwornika
//rozpocznij konwersję
//tryb samobieżny
//uruchom generowanie przerwań
//częstotilwość taktowania F_ADC=F_CPU/64 przy F_CPU=8MHz : F_ADC=125 kHz
while(1)
{
for(i=1;i<=3;i++) //trzy fazy czerwona, zielona, niebieska
{
if(!PINB & 0x01)) i = 0; //jeśli na PB0 stan niski
switch(i)
{
case 1:
PORTD &= ~(_BV(PD0)); //stan niski na PB0 dioda czerwona zaswiecona
_delay_ms(1000);
int value = ((ADCH << 8) | (ADCL)); //czytaj wartość z przetwornika ADC
r=ADCW; //wpisz wartość z przetwornika do zmiennej r (r -czerwona)
PORTD |=_BV(PD0); //stan wysoki na Pb0 dioda czerwona zgaszona
break;
case 2:
PORTD &= ~(_BV(PD1)); //stan niski na PB1 dioda zielona zaswiecona
_delay_ms(1000);
int value = ((ADCH << 8) | (ADCL)); //czytaj wartość z przetwornika ADC
g=ADCW; //wpisz wartość z przetwornika do zmiennej g (g -zielona)
PORTD |=_BV(PD1); //stan wysoki na Pb1 dioda zielona zgaszona
break;
case 3:
PORTD &= ~(_BV(PD2)); //stan niski na PB1 dioda niebieska zaswiecona
_delay_ms(1000);
int value = ((ADCH << 8) | (ADCL)); //czytaj wartość z przetwornika ADC
b=ADCW; //wpisz wartość z przetwornika do zmiennej b (b -niebieska)
PORTD |=_BV(PD2); //stan wysoki na Pb1 dioda niebieska zgaszona
break;
default; //gdy PB0 stan niski
PORTD &= ~(_BV(PD3); //stan niski na PD3 dioda bezczynności zaświecona
_delay_ms(1000);
PORTD |=_BV(PD3); //stan wysoki na PD3 dioda bezczynności zgaszona
_dealy_ms(1000);
}
}
}
if(r>g) //jeśli r jest wieksze od g to
{
max=r; //wartość w zmiennej r jest przypisana do zmiennej max
}
if(max=r) //jeśli max=r
{
PORTD &= ~(_BV(PD4); //to zmień stan PD4 na wysoki
}
else
{
max=g; //jeśli r nie jest wieksze od g to max=g
}
if(max=g) //jesli max=g
{
PORTD &= ~(_BV(PD5); //to Zmien stan PD5 na wysoki
}
if(b>max) //jeśli b jest wieksza od max to
{
max=b; //wartość w zmiennej b jest przypisana do zmiennej max
}
if(max=b) //jesli max=b
{
PORTD &= ~(_BV(PD6); //to zmien stan PD6 na wysoki
}
return 0;
}
