Advertisement
Guest User

Untitled

a guest
Nov 19th, 2017
340
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.08 KB | None | 0 0
  1. /**************************************/
  2. /* ARE 2008 */
  3. /* e-mail: biuro@are.net.pl */
  4. /* www : are.net.pl */
  5. /**************************************/
  6.  
  7. #define F_CPU 8000000UL // 8 MHz
  8.  
  9. #include <util/delay.h>
  10. #include <string.h>
  11. #include <avr/io.h>
  12. #include <stdio.h>
  13.  
  14. void delay_ms(int ms)
  15. {
  16. volatile long unsigned int i;
  17. for(i=0;i<ms;i++)
  18. _delay_ms(1);
  19. }
  20.  
  21. void delay_us(int us)
  22. {
  23. volatile long unsigned int i;
  24. for(i=0;i<us;i++)
  25. _delay_us(1);
  26. }
  27.  
  28. #define RS PC0
  29. #define RW PC1
  30. #define E PC2
  31.  
  32. void LCD2x16_init(void)
  33. {
  34. PORTC &= ~(1<<RS);
  35. PORTC &= ~(1<<RW);
  36.  
  37. PORTC |= (1<<E);
  38. PORTD = 0x38; // dwie linie, 5x7 punktow
  39. PORTC &=~(1<<E);
  40. _delay_us(120);
  41.  
  42. PORTC |= (1<<E);
  43. PORTD = 0x0e; // wlacz wyswietlacz, kursor, miganie
  44. PORTC &=~(1<<E);
  45. _delay_us(120);
  46.  
  47. PORTC |= (1<<E);
  48. PORTD = 0x06;
  49. PORTC &=~(1<<E);
  50. _delay_us(120);
  51. }
  52.  
  53. void LCD2x16_clear(void){
  54. PORTC &= ~(1<<RS);
  55. PORTC &= ~(1<<RW);
  56.  
  57. PORTC |= (1<<E);
  58. PORTD = 0x01;
  59. PORTC &=~(1<<E);
  60. delay_ms(120);
  61. }
  62.  
  63. void LCD2x16_putchar(int data)
  64. {
  65. PORTC |= (1<<RS);
  66. PORTC &= ~(1<<RW);
  67.  
  68. PORTC |= (1<<E);
  69. PORTD = data;
  70. PORTC &=~(1<<E);
  71. _delay_us(120);
  72. }
  73.  
  74. void LCD2x16_pos(int wiersz, int kolumna)
  75. {
  76. PORTC &= ~(1<<RS);
  77. PORTC &= ~(1<<RW);
  78.  
  79. PORTC |= (1<<E);
  80. delay_ms(1);
  81. PORTD = 0x80+(wiersz-1)*0x40+(kolumna-1);
  82. delay_ms(1);
  83. PORTC &=~(1<<E);
  84. _delay_us(120);
  85. }
  86.  
  87. double map(double x, double in_max, double out_max) {// zamienia z jednego przedzialu na drugi, przedzialy od 0
  88. return x * out_max / in_max;
  89. }
  90.  
  91. int main(void){
  92. char tmp[17];
  93. int i;
  94.  
  95. double _sp = 0.4 * 400; // narzucona wartosc
  96. int _h = 0.04 * 400; // histereza
  97. double _pv = 400; // tutaj bedzie wartosc z potencjometru
  98. double _e = 0; // blad
  99. int _cv = 0; // wartosc boolean na diodzie
  100.  
  101. ADMUX = 0x40;
  102. ADCSRA = 0xe0;
  103.  
  104. DDRA = 0x00;
  105. DDRB |= (1<<PB0);
  106. DDRC = 0x00;
  107. DDRC |= (1<<PC0) | (1<<PC1) | (1<<PC2) | (1<<PC7);
  108. DDRD = 0xff;
  109.  
  110. PORTC |= (1 << PC3) | (1 << PC4) | (1 << PC5) | (1 << PC6);
  111. PORTD = 0x00;
  112.  
  113. delay_ms(200);
  114.  
  115. LCD2x16_init();
  116. LCD2x16_clear();
  117.  
  118. delay_ms(400);
  119.  
  120. while(1) { // glowna petla
  121.  
  122. _pv = map((double)ADC, 1023, 400);
  123. _e = _sp - _pv;
  124. if(_e > _h/2) { // dioda zalezna od bledu
  125. _cv = 1;
  126. } else if (_e < -_h/2) {
  127. _cv = 0;
  128. }
  129. // wyswietlacz
  130. LCD2x16_pos(1,1);
  131. sprintf(tmp,"Z=%3dC A=%03d.%1dC ", (int)_sp, (int)_pv, (int)_pv%10);
  132. for(i=0;i < 16;i++) {
  133. LCD2x16_putchar(tmp[i]);
  134. }
  135. LCD2x16_pos(2,1);
  136. sprintf(tmp,"H=%2iC E=%+04d.%1dC ", _h, (int)_e, (unsigned int)_e%10);
  137. for(i=0;i < 16;i++) {
  138. LCD2x16_putchar(tmp[i]);
  139. }
  140. if( !(PINC & (1<<PC3))) { // przyciski
  141. _sp = 0.5 * 400;
  142. }
  143. if( !(PINC & (1<<PC4))) {
  144. _sp = 0.4 * 400;
  145. }
  146. if( !(PINC & (1<<PC5))) {
  147. _h = 0.04 * 400;
  148. }
  149. if( !(PINC & (1<<PC6))) {
  150. _h = 0.1 * 400;
  151. }
  152.  
  153. if(_cv == 1) { // dioda
  154. PORTB |= (1 << PB0);
  155. } else {
  156. PORTB &= ~(1 << PB0);
  157. }
  158. delay_ms(500);
  159. }
  160. return 0;
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement