Advertisement
Guest User

Untitled

a guest
Apr 8th, 2020
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.24 KB | None | 0 0
  1. #define F_CPU 16000000
  2.  
  3. #include <avr/io.h>
  4. #include <stdlib.h>
  5. #include <util/delay.h>
  6. #include <math.h>
  7. #include <avr/interrupt.h>
  8. #include <avr/eeprom.h>
  9. #include "hd44780.h"
  10.  
  11.  
  12. int inicjalizacja_lcd(void);
  13. int inicjalizacja_adc(void);
  14. void wyswietlanie_temp_aktualnej(float pomiar);
  15. void wyswietlanie_temp_dokladnej(float last);
  16. float pomiar_adc(void);
  17. void delta(void);
  18.  
  19.  
  20. int main(void)      {
  21.  
  22.  
  23.     DDRB &= ~(1 << DDB0);         // Clear the PB0 pin
  24.     // PB0 (PCINT0 pin) is now an input
  25.  
  26.     PORTB |= (1 << PORTB0);        // turn On the Pull-up
  27.     // PB0 is now an input with pull-up enabled
  28.  
  29.     PCICR |= (1 << PCIE0);     // set PCIE0 to enable PCMSK0 scan
  30.     PCMSK0 |= (1 << PCINT0);   // set PCINT0 to trigger an interrupt on state change
  31.  
  32.     float temperatura;
  33.     //float dokladne;
  34.  
  35.     inicjalizacja_lcd();
  36.     inicjalizacja_adc();
  37.  
  38.     sei();                     // turn on interrupts
  39.            
  40.     //pomiar = pomiar_adc();
  41.     //wyswietlanie_temp_aktualnej(pomiar);
  42.    
  43.  
  44.     while(1)        {
  45.        
  46.         temperatura = pomiar_adc();
  47.         wyswietlanie_temp_aktualnej(temperatura);
  48.         _delay_ms(250);
  49.     }
  50.  
  51. }
  52.  
  53.  
  54. int inicjalizacja_lcd(void)     {
  55.     lcd_init();
  56.     return 0;
  57. }
  58.  
  59. int inicjalizacja_adc(void)     {
  60.    
  61.     ADCSRA |= (1 <<ADEN);  // zezwolenie na prace ADC
  62.  
  63.     ADMUX |= (1 << MUX0);  // wybor wejscia
  64.     ADMUX |= (1 << MUX1);  // dla przetwornika
  65.  
  66.     //ADMUX |= (1 << REFS0);  // ustaw wewnetrzne napiecie
  67.     ADMUX &= ~(1 << REFS0); // odniesienia na AVCC
  68.     ADMUX &= ~(1 << REFS1); // odniesienia na AVCC
  69.     //ADMUX |= (1 << REFS1);  // ustaw wewnetrzne napiecie
  70.    
  71.     //ADCSRA |= (1 << ADPS0); // wybór czestotliwosci
  72.     ADCSRA |= (1 << ADPS0); // pracy przetwornika
  73.     //ADCSRA &= ~(1 << ADPS0);
  74.     ADCSRA |= (1 << ADPS1); // pracy przetwornika
  75.     ADCSRA |= (1 << ADPS2); // pracy przetwornika
  76.  
  77.     //ADCSRA &= ~(1 << ADPS1);
  78.  
  79.     //ADCSRA |=(1<<ADEN)|(1<<ADATE)|(1<<ADPS0)|(1<<ADPS1)|(1<<ADPS2);
  80.    
  81.     return 0;
  82. }
  83.  
  84. float pomiar_adc(void)      {
  85.    
  86.     float aktualna;
  87.  
  88.     ADCSRA |= (1 << ADSC); // rozpocznij przetwarzanie
  89.     //_delay_ms(5);
  90.  
  91.     while(bit_is_set(ADCSRA, ADSC))
  92.     {};                 // czekaj na koniec przetwarzania
  93.     _delay_ms(5);
  94.  
  95.     aktualna = ADC;
  96.     aktualna *= (0.7/1024.0); // bity na volty
  97.     aktualna *= 100; // volty na celsjusze
  98.     //pomiar -= 273; // kelwiny na kelwiny
  99.     aktualna -= 2.3;
  100.  
  101.     return aktualna;
  102.    
  103. }
  104.  
  105. void delta(void)        {
  106.    
  107.     float pomiar;
  108.     float delta=0;
  109.     float last=0;
  110.    
  111.     //float zmierzono=0;
  112.    
  113.    
  114.     for(int i=1 ; i<=10 ; i++)      {
  115.        
  116.        
  117.         pomiar = pomiar_adc();
  118.        
  119.         wyswietlanie_temp_aktualnej(pomiar);
  120.        
  121.         delta = pomiar - last;
  122.        
  123.         last = pomiar;
  124.        
  125.         wyswietlanie_temp_dokladnej(delta);
  126.        
  127.         _delay_ms(250);
  128.        
  129.         //zmierzono = pomiar;
  130.  
  131.         //if ( (delta > -0.2) && (delta < 0) && ( i > 40 ) )   
  132.        
  133.         //break;
  134.        
  135.                    
  136.         }
  137.        
  138.         wyswietlanie_temp_dokladnej(pomiar);
  139.         _delay_ms(5000);
  140.        
  141.         //return zmierzono;
  142.        
  143. }
  144.  
  145. void wyswietlanie_temp_aktualnej(float pomiar)      {
  146.    
  147.     char str[8];
  148.     lcd_clrscr();
  149.     dtostrf(pomiar, 4, 1, str);
  150.     lcd_puts(str);
  151.     lcd_goto(0x05);
  152.     lcd_putc('C');
  153.     //return 0;
  154. }
  155.  
  156. void wyswietlanie_temp_dokladnej(float last)        {
  157.    
  158.     char temp[8];
  159.     //lcd_clrscr();
  160.     dtostrf(last, 4, 1, temp);
  161.     lcd_goto(0x40);
  162.     lcd_puts(temp);
  163.     lcd_goto(0x45);
  164.     lcd_putc('C');
  165.     //return 0;
  166. }
  167.  
  168. ISR (PCINT0_vect)
  169. {
  170.    
  171.     delta();
  172.        
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement