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

czujnik koloru AVR atmega8 program w C Prośba o pomoc

avo3 07 Lis 2010 13:26 1962 1
  • #1 8713336
    avo3
    Poziom 11  
    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 koloru AVR atmega8 program w C Prośba o pomoc


    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;
    }
    
    
  • #2 8713602
    Samuraj
    Poziom 35  
    Zrób wcięcia w kodzie, umieść go w znacznikach Code wtedy będzie co analizować. Jak na tę chwilę to kod przypomina miszmasz i nie sposób powiązać warunków i pętli do stanu faktycznego.
REKLAMA