Advertisement
Guest User

Untitled

a guest
Sep 18th, 2019
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.48 KB | None | 0 0
  1. /**********************************************************
  2. Project : adc_pollaus.c
  3. Hardware: PV-M32 + PV-EMO
  4. Date : 11.11.2007
  5. Author : pva
  6. Comments: mittaa ADC3-inputtiin liitetyn potentiometrin liulla olevaa jännitettä, ja tulostaa sen (A-porttiin kytkettyyn)
  7. LCD-näyttöön Potikka GND ja +5V välillä. Kytke 10 k potentiometrin liuku n.100kohmin vastuksen kautta ADC3-inputtiin.
  8. EMOn ADC1 = ADC3 ==>> korjattu. Säädä potikan liun jännitettä ja resetoi aina välillä.
  9. Jotta DVM näyttää oikein, pidä reset-nappia alhaalla mittauksen ajan.
  10. *********************************************************/
  11.  
  12. #include "defines.h"
  13. #include <ctype.h>
  14. #include <stdint.h>
  15. #include <stdio.h>
  16. #include <avr/io.h>
  17. #include <avr/pgmspace.h>
  18. #include <util/delay.h>
  19. #include "lcd_tat.h"
  20. #include "lcd_tat.c"
  21.  
  22.  
  23. #include "uart.h"
  24. #include "uart.c"
  25.  
  26.  
  27. static void
  28. ioinit(void) {
  29. uart_init();
  30. }
  31.  
  32. FILE uart_str = FDEV_SETUP_STREAM(uart_putchar, uart_getchar, _FDEV_SETUP_RW);
  33. //FILE lcd_str = FDEV_SETUP_STREAM(lcd_putchar, NULL, _FDEV_SETUP_WRITE);
  34.  
  35. static void delay_1s(void) {
  36. uint8_t i;
  37.  
  38. for (i = 0; i < 100; i++)
  39. _delay_ms(10);
  40. }
  41.  
  42.  
  43.  
  44.  
  45. // *** Primitive wait() ***
  46.  
  47. void wait(uint16_t time)
  48. {
  49. volatile uint16_t i;
  50.  
  51. for(i=0;i<2000;i++)
  52. _delay_loop_2(time);
  53. }
  54.  
  55. void Tulosta(void)
  56. {
  57.  
  58.  
  59. int i=0;
  60. uint8_t voltti;
  61. uint32_t adc_data;
  62. uint32_t abc;
  63. abc=ADCW;
  64. adc_data = ADCW; // luetaan muunnostulos muuttujaan
  65.  
  66. adc_data = (adc_data * 5000)/1023;
  67.  
  68. // skaalataan muunnostulos 'volteiksi'
  69. voltti = 0x30 + (adc_data/1000 % 10); // laskee voltit
  70. LCD_WriteChar(voltti); // tulostaa voltit
  71.  
  72.  
  73.  
  74. LCD_WriteChar(0x2C); // tulostaa pilkun
  75. voltti = 0x30 + (adc_data/100 % 10); // 'sadat mV'
  76. LCD_WriteChar(voltti);
  77. voltti = 0x30 + (adc_data % 10); // 'kymmenet mV'
  78. LCD_WriteChar(voltti);
  79. LCD_WriteChar('V');
  80. LCD_SetCursorXY(0, 1);
  81. LCD_WriteINT(abc);
  82.  
  83.  
  84.  
  85.  
  86. wait(50);
  87. LCD_Clear();
  88.  
  89. }
  90.  
  91.  
  92. void ADC_init(void)
  93. {
  94. ADCSRA = (1<< ADEN) ; // ADC käyttöön
  95. ADMUX |= (1<<MUX1) | (1<<MUX0); // valitaan ADC3
  96. ADMUX |= 1 << REFS0;
  97. // Uref = AVcc ja 0,1 uF kerko oltava Vref-pinnissä
  98. ADCSRA |= (1<<ADPS2) | (1<<ADPS0); // clk/32, 125 kHz
  99. ADCSRA |= (1<<ADSC); // aloita muunnos
  100. }
  101.  
  102.  
  103. int main(void)
  104. { ADC_init();
  105. ioinit();
  106. stdout = stdin = &uart_str;
  107. stderr = stdin = &uart_str;
  108. fprintf(stdout, "Hello world!\n");
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119. int i=0;
  120. uint8_t voltti;
  121. uint32_t adc_data;
  122. uint32_t abc;
  123. abc=ADCW;
  124. adc_data = ADCW; // luetaan muunnostulos muuttujaan
  125.  
  126. adc_data = (adc_data * 5000)/1023;
  127.  
  128. // skaalataan muunnostulos 'volteiksi'
  129. voltti = 0x30 + (adc_data/1000 % 10); // laskee voltit
  130. // tulostaa voltit
  131.  
  132. fprintf(stdout,"%c", voltti);
  133.  
  134.  
  135. fprintf(stdout, "V\n");
  136.  
  137.  
  138.  
  139.  
  140. wait(50);
  141.  
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  
  148.  
  149.  
  150.  
  151.  
  152.  
  153.  
  154.  
  155.  
  156.  
  157. //fprintf(stderr, "Hello world!\n");
  158. // printf("LO");
  159.  
  160. DDRC |= 1<<0;
  161. PORTC |= 1<<0; // taustavalo
  162.  
  163. LCD_init(1, 0, 0);
  164. ADC_init();
  165. DDRA &= ~(1<<3); // jännitteen lukupinni "sisään"
  166. // LCD-initin konfiguroinnin "korjaus"
  167. while(1)
  168. {
  169. // eka mittaus, joka hylätään
  170. // koska se on epätarkka
  171. loop_until_bit_is_set(ADCSRA, ADIF);
  172. // muunnos_valmis pollaus
  173.  
  174. ADCSRA |= (1<<ADIF) ; // nollaa lippu
  175. ADCSRA |= (1 << ADSC);
  176. // aloita uusi muunnos, eka hylätään
  177. loop_until_bit_is_set(ADCSRA, ADIF);
  178. Tulosta();
  179. }
  180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement