Advertisement
Ostu

Untitled

Apr 27th, 2021
411
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.57 KB | None | 0 0
  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3.  
  4.  
  5. uint8_t inc=0,turn=0, c=0;
  6. int main()
  7. {
  8.     DDRC = 0xff;
  9.     DDRB = 0xff;
  10.     TCCR0 =(1 << CS00) | (1 << WGM01) | (1 << WGM00)| (1<< COM01); //pwm bez preskalera
  11.     TCCR2 =(1<<WGM21)|(1<<CS20)|(1<<CS21)|(1<<CS22); //timer2 w trybie CTC preskaler 1024
  12.     OCR2=160; //przerwanie co 10ms
  13.  
  14.     TIMSK|=(1<<OCIE2); // maska przerwań
  15.     sei();
  16.  
  17.  
  18.  
  19.     ADMUX = 0x60;            // ADC Multiplexer Selection Register
  20.                             // REFS1 = 0 - AVCC with external capacitor at AREF pin
  21.                             // REFS0 = 1 - AVCC with external capacitor at AREF pin
  22.                             // ADLAR = 1 - left adjust the result
  23.                             // MUX4  = 0 - single end input ADC0
  24.                             // MUX3  = 0 - single end input ADC0
  25.                             // MUX2  = 0 - single end input ADC0
  26.                             // MUX1  = 0 - single end input ADC0
  27.                             // MUX0  = 0 - single end input ADC0
  28.  
  29.     ADCSRA = 0x87;            // ADC Control and Status Register A dla 4MHz
  30.                             // ADEN  = 1 - ADC Enable
  31.                             // ADSC  = 0 - ADC Start Conversion
  32.                             // ADATE = 0 - ADC Single mode conversion
  33.                             // ADIF  = 0 - ADC Interrupt Flag
  34.                             // ADIE  = 0 - ADC Interrupt Enable
  35.                             // ADPS2 = 1 - ADC Prescaler Select Bits - fosc/128 dla 16MHz
  36.                             // ADPS1 = 1 - ADC Prescaler Select Bits - fosc/128 dla 16MHz
  37.                             // ADPS0 = 1 - ADC Prescaler Select Bits - fosc/128 dla 16MHz
  38.  
  39.     ADCSRA = ADCSRA | 0x40;        // start konwersji
  40.  
  41.     while (1)
  42.           {
  43.           if(turn == 0)
  44.             {
  45.                 OCR0=turn+inc; // zwiększanie wartości rejestru
  46.             }
  47.             else
  48.             {
  49.                 OCR0=turn-inc; // zmniejszanie wartości rejestru
  50.             }
  51.            if ( ADCSRA & 0x10)
  52.              {
  53.               PORTC = ADCH;
  54.               ADCSRA = ADCSRA | 0x10;        // skasowanie flagi zakończenia konwersji
  55.               ADCSRA = ADCSRA | 0x40;        // start konwersji
  56.              }
  57.           }
  58. }
  59.  
  60. ISR(TIMER2_COMP_vect)
  61.  
  62. {
  63.     c++;
  64.     if(c%25==0) // spowolnienie zmian wartości rejestru OCR2
  65.     {
  66.         inc++; // inkrementacja zmiennej inc
  67.         if(inc==160) // odwrócenie kierunku "przekręcania potencjometrem"
  68.         {
  69.             c=0;
  70.             turn ^=160;
  71.             inc=0;
  72.         }
  73.     }
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement