Автор Тема: fatal error: time.h: No such file or directory  (Прочетена 5335 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3623
Re: fatal error: time.h: No such file or directory
« Отговор #15 -: 10 Ноември 2016, 03:48:09 »
Добре стигнах до тук:

Код: C
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <avr/io.h>
  4. #include <util/delay.h>
  5.  
  6. #define NUM_READINGS 10
  7. #define ADC_CHANNEL 0
  8. #define USART_BAUDRATE 9600
  9. #define UBRR_VALUE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
  10. #define RX_BUFF_SIZE 50
  11.  
  12. void USART0Init(void)
  13.  
  14. {
  15.  
  16. // Set baud rate
  17.  
  18. UBRR0H = (uint8_t)(UBRR_VALUE>>8);
  19.  
  20. UBRR0L = (uint8_t)UBRR_VALUE;
  21.  
  22. // Set frame format to 8 data bits, no parity, 1 stop bit
  23.  
  24. UCSR0C |= (1<<UCSZ01)|(1<<UCSZ00);
  25.  
  26. //enable transmission and reception
  27.  
  28. UCSR0B |= (1<<RXEN0)|(1<<TXEN0);
  29.  
  30. }
  31.  
  32. void USART0SendByte(char u8Data, FILE *stream) {
  33.  
  34.     if(u8Data == '\n')
  35.     {
  36.         USART0SendByte('\r', stream);
  37.     }
  38.     //wait while previous byte is completed
  39.     while(!(UCSR0A&(1<<UDRE0))){};
  40.     // Transmit data
  41.     UDR0 = u8Data;
  42. }
  43.  
  44. uint8_t USART0ReceiveByte() {
  45.  
  46. // Wait for byte to be received
  47.  
  48. while(!(UCSR0A&(1<<RXC0))){};
  49.  
  50. // Return received data
  51.  
  52. return UDR0;
  53.  
  54. }
  55.  
  56. void InitADC(void) {
  57.  
  58.         // Select Vref=AVcc
  59.         ADMUX |= (1<<REFS0);
  60.         //set prescaller to 128 and enable ADC
  61.         ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADEN);    
  62. }
  63.      
  64. uint16_t ReadADC(uint8_t ADCchannel) {
  65.        
  66.         ADMUX = (ADMUX & 0xF0) | (ADCchannel & 0x0F);
  67.    
  68.         ADCSRA |= (1<<ADSC);
  69.      
  70.         while( ADCSRA & (1<<ADSC) );
  71.        
  72.         return ADC;
  73. }
  74.  
  75. float ReadAndReturnAVG(uint8_t channel,  uint16_t *values, int sizeOfValues) {
  76.  
  77.        int i = 0;
  78.        
  79.        int  total = 0;
  80.  
  81.        float average = 0.0f;
  82.  
  83.         for (i = 0; i < sizeOfValues; i++) {
  84.  
  85.             values[i] = ReadADC(channel); // тука може да ползваме функцията ReadADC,защото
  86.                                            
  87.             total = total + values[i];    // няма нужда от екстра loop за сбора
  88.             _delay_ms(300);
  89.         }
  90.  
  91.         average = (float)total / (float)sizeOfValues;
  92.  
  93.         return average;
  94.        
  95. }
  96.  
  97. //set stream pointer
  98. FILE usart0_str = FDEV_SETUP_STREAM(USART0SendByte, NULL, _FDEV_SETUP_WRITE);
  99.  
  100. int main (void)
  101. {
  102.  
  103. DDRB = 0xff; // Set Port B as Output
  104.  
  105. PORTB = 0x00;
  106.  
  107. //initialize ADC
  108. InitADC();
  109.  
  110. float sensorData = 0.0f;
  111.  
  112. int reading;
  113.  
  114. uint16_t values[NUM_READINGS] = {0};
  115.  
  116. //Initialize USART0
  117.  
  118. USART0Init();
  119.  
  120. while(1) {
  121.  
  122. // Receive data
  123. //u8TempData = USART0ReceiveByte();
  124.  
  125. stdout = &usart0_str;
  126.  
  127. sensorData = ReadAndReturnAVG(ADC_CHANNEL, values, NUM_READINGS);
  128.  
  129. reading = ISR();
  130.  
  131. printf("mV: %d reading: %d\n", (int)(round(sensorData)),reading);
  132.  
  133. //Increment received data
  134.  
  135. //u8TempData++;
  136.  
  137. //Send back to terminal
  138. //USART0SendByte(u8TempData);
  139.   }
  140. }
  141.  
  142. volatile unsigned char lineBuffer[RX_BUFF_SIZE] = {0};
  143.  
  144. volatile uint8_t idx = 0;
  145.  
  146. ISR(USART_RXC_vect)
  147. {
  148.   unsigned char c;
  149.   c = UDR0;                              // четем от регистъра съдържащ полученият байт
  150.   lineBuffer[idx] = c;                  // пишем го в буфера
  151.   idx++;
  152.    if(c == '\n') {                       // ако видим line feed , значи сме прочели цял ред -> цяла команда
  153.      lineBuffer[idx] = '\0';            // терминираме стринга с една 0
  154.     // interpretCmd(lineBuffer);          // интерпретираме командата
  155.      idx = 0;                           // зануляваме индекса, за да пишем от началото на буфера при следващ получен байт
  156.   }
  157. return (int) lineBuffer;
  158. }
  159.  

Резултата е този:

Цитат
mV: 150 reading: 291
mV: 150 reading: 291
mV: 150 reading: 291
mV: 150 reading: 291
mV: 150 reading: 291
mV: 150 reading: 291
mV: 150 reading: 291
mV: 150 reading: 291
mV: 150 reading: 291
mV: 150 reading: 291


Ако въведа някакъв произволен номер в терминала, да речем - echo 87 > /dev/ttyACM0

Стойноста на reading-a не се променя.

Идеята тук е да съпоставя стойноста въведена в терминала с тази от сензора.
« Последна редакция: 10 Ноември 2016, 03:49:42 от jazzman »
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3623
Re: fatal error: time.h: No such file or directory
« Отговор #16 -: 10 Ноември 2016, 03:58:13 »
Примерно с този код съм способен да вкарвам и чета командите писани в терминала, но не ми идва на акъла как да взема и да съпоставя стойностите излизащи от сензора:


Код: C
  1. #include <avr/io.h>
  2. #define USART_BAUDRATE 9600
  3. #define UBRR_VALUE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
  4. void USART0Init(void)
  5. {
  6. // Set baud rate
  7. UBRR0H = (uint8_t)(UBRR_VALUE>>8);
  8. UBRR0L = (uint8_t)UBRR_VALUE;
  9. // Set frame format to 8 data bits, no parity, 1 stop bit
  10. UCSR0C |= (1<<UCSZ01)|(1<<UCSZ00);
  11. //enable transmission and reception
  12. UCSR0B |= (1<<RXEN0)|(1<<TXEN0);
  13. }
  14. void USART0SendByte(uint8_t u8Data)
  15. {
  16. //wait while previous byte is completed
  17. while(!(UCSR0A&(1<<UDRE0))){};
  18. // Transmit data
  19. UDR0 = u8Data;
  20. }
  21. uint8_t USART0ReceiveByte()
  22. {
  23. // Wait for byte to be received
  24. while(!(UCSR0A&(1<<RXC0))){};
  25. // Return received data
  26. return UDR0;
  27. }
  28. int main (void)
  29. {
  30. uint8_t u8TempData;
  31. //Initialize USART0
  32. USART0Init();
  33.     while(1)
  34.     {
  35.         // Receive data
  36.                 u8TempData = USART0ReceiveByte();
  37.                 // Increment received data
  38.                 u8TempData++;
  39.                 //Send back to terminal
  40.         USART0SendByte(u8TempData);
  41.     }
  42.  
  43.  
  44.  


Код: Bash
  1. dimt@dimt-Satellite-L670 ~/arduino $ echo 87 > /dev/ttyACM0
  2. dimt@dimt-Satellite-L670 ~/arduino $ echo 10 > /dev/ttyACM0
  3. dimt@dimt-Satellite-L670 ~/arduino $ echo 9 > /dev/ttyACM0
  4. dimt@dimt-Satellite-L670 ~/arduino $ echo 1 > /dev/ttyACM0
  5. dimt@dimt-Satellite-L670 ~/arduino $ echo 2 > /dev/ttyACM0
  6. dimt@dimt-Satellite-L670 ~/arduino $ echo 3 > /dev/ttyACM0
  7.  
  8. // output
  9.  
  10. dimt@dimt-Satellite-L670 ~/arduino $ cat /dev/ttyACM0
  11. 87
  12. 10
  13. 9
  14. 1
  15. 2
  16. 3
  17.  

Брадъре идея знам, че имаш :)
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

kjufte

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 1
  • -Получени: 51
  • Публикации: 308
Re: fatal error: time.h: No such file or directory
« Отговор #17 -: 10 Ноември 2016, 20:44:08 »
Ако искаш това, което е получено да го пишеш като ехо обратно, то трябва примерно този ред
Код: C
  1. interpretCmd(lineBuffer);
да замениш с този
Код: C
  1. printf("echo: %s\n", lineBuffer);

Ако искаш да правиш нещо друго с получените данни, то ще трябва да си имплементираш една функция, която да обработва полученото. ISR не е функция, която може да викаш в кода. Тя е независима от него и се изпълнява автоматично всеки път когато микриконтролера получи един байт. Т.е. микроконтролера прекъсва изпълнението на твоя код (това ще е най-вероятно някъде в main loop-а), скача в тази функция и изпълнява каквото има да се изпълнява в нея. И после се връща на същото място, на което изпълнението на кода е било прекъснато и то продължава. За това е важно тези ISR функции да са възможно най-кратки и нямаш право да от тях да викаш други функции осланящи се на inerrupt-и като sleep.

Примерно можеш да направиш sensorData глобална променлива и така тя ще е достъпна и в interpretCmd.
Код: C
  1. void interpretCmd(char *line)
  2. {
  3.    if(line == 0 || strlen(line) == 0) {
  4.       return;
  5.    }
  6.    
  7.    int reading= atol(line);   // обръщаме стринга в интиджър
  8.    printf("mV: %d reading: %d\n", (int)(round(sensorData)), reading); // sensorData може да я ползваме щото е глобална
  9. }

« Последна редакция: 10 Ноември 2016, 20:46:35 от kjufte »

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3623
Re: fatal error: time.h: No such file or directory
« Отговор #18 -: 10 Ноември 2016, 21:10:51 »
Цитат
interpretCmd(lineBuffer);
Компилатора изплю някаква грешка снощи, за тва и съм я коментирал в кода. Да не би да е част от някаква библиотека дето трябва да инклудна в хедъра? Не знаех, че ISP() - то e някаква по-специална от другите :)
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3623
Re: fatal error: time.h: No such file or directory
« Отговор #19 -: 10 Ноември 2016, 21:50:44 »
Цитат
Т.е. микроконтролера прекъсва изпълнението на твоя код (това ще е най-вероятно някъде в main loop-а), скача в тази функция и изпълнява каквото има да се изпълнява в нея
Това абсолютно неприемливо за мен. Имам награветели на водаата, които се управляват от сензори. Ако кода прекъсне дори за половин час, при минус 20 на вън водата в тръбата през която вземам вода от езерото може да замръзне. Нека все пак да повторя каква е целта още веднъж......

Веднъж на две седмици ходим на къщата, която е извън Торонто, средно около 2 часа от него. В момента имам 3 основни хардуерни устройства вързани към Ардуино:

1. 70 feet подгравящ кабел който е вътре в тръбата 1-1/4" през която вземам вода от езерото, това е най-важното устройство за мен през зимата.

2. Сложих и още един около тази част от тръбата която излиза извън земята и влиза в водата, той ще се стартира само когата външната температура падне под -10 и надолу.

3. Фърниса (парното е на нафта) в момента съм го направил така, че да се стартира когато температурата в къщата падне под 37F. Идеята тук е да се поддържа над минусова температура за да не замръзват тръбите  в къщата както и тези в cross space-a. Там имам помпи, бойлери, разширителни съдове и други съоражения. През зимата не се отоплявам с парното, защото имам камина на дърва. Къщата става баня след час с нея обаче..... идеята е преди да тръгна ако е много студено навън да го стартирам отдалечено докато пристигна за това искам ако е възможно тази стойност от 37F да се override-не към 60F,  но само когато пожелая това.

4. Имам и джакузи и температурата е сетната на 40F за да не се заледява  водата. При много студено време би било добра идея да мога и него да го стартирам отдалечено когато температурата е много ниска и се изисква повече време за затоплянето на водата, но това не е с приоритет.

5. Имам и photo cell sensor който връща стойности към ардуино и съответно се пускат лаптите на porch-a когато се стъмни навън.

Това е май за сега, всичко е тествано, работи  и се управлява от едно място. Идеята с флашването на майкроконтролера е неприемлива  също, понеже ре-сетва хардуера за части от секундата. Идеята да пращам стрингове през UART е най-доброто което виждам за момента.     

 
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

kjufte

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 1
  • -Получени: 51
  • Публикации: 308
Re: fatal error: time.h: No such file or directory
« Отговор #20 -: 11 Ноември 2016, 17:22:43 »
Нещо не си ме разбрал явно. Прекъсването за което споменах е с продължителност частици от секундата. Няма как и да е по друг начин. Ти си нагласил примерно UART да работи с 9600 baud и си казал, че пращаш/приемаш по 8 бита на симво с 1 стартов бит и 1 стоп-бит -> 10 бита на символ. Това означава, че можеш да изпращаш и приемаш по 960 символа на секунда.
960 bytes per 1000 millisec -> Максималното ти забавяне, което можеш да си позволиш в ISR e 1000/960 = 1.04 миллисекунди.

Ето примерно в този код, който си дал като работещ
Код: C
  1. uint8_t USART0ReceiveByte()
  2. {
  3.    // Wait for byte to be received
  4.    while(!(UCSR0A&(1<<RXC0))){};
  5.    // Return received data
  6.    return UDR0;
  7. }

този ред блокира програмата ти докато не дойде един байт
Код: C
  1.  while(!(UCSR0A&(1<<RXC0))){};

Значи докато не изпратиш няква команда към контролера, той си чака на този ред.

Като ползваш interrupt, main-loopa си върви и се прекъсва само тогава, когато е получен от някъде 1 байт.

А interpretCmd беше само пример. Функцията трябва сам ди се я дефинираш.
« Последна редакция: 11 Ноември 2016, 19:38:01 от kjufte »

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3623
Re: fatal error: time.h: No such file or directory
« Отговор #21 -: 11 Ноември 2016, 17:51:41 »
Добре. Ще видя какво ще сътворя по-късно, че съм на работа в момента. Щом мога да пращам стринг през UART и да го обръщам в int мисля, че това ще ми свърши работа.
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3623
Re: fatal error: time.h: No such file or directory
« Отговор #22 -: 11 Ноември 2016, 23:22:57 »
Браткиш, виж тва видео - https://www.youtube.com/watch?v=WIetgFpGzfQ&index=11&list=PLA6BB228B08B03EDD

Когато прати "1" през терминала той пали пина, когато прати "0" го чисти. Ся кът се замисля, тво тва ми трябва и на мен. Примерно преди да тръгна за къщата го паля с 1 и когато температурата стигне определената от мен граница (и да речем още съм на пътя) програмата да хвърля 0 и да чисти порта. Кво мислиш за идеята? 
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3623
Re: fatal error: time.h: No such file or directory
« Отговор #23 -: 12 Ноември 2016, 01:51:41 »
Стана.  Поствам кода. Може пък да потрябва на някой ентусиаст като мен :)

Код: C
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <avr/io.h>
  4. #include <util/delay.h>
  5. #include <avr/interrupt.h>
  6.  
  7. #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
  8. #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
  9.  
  10. #define F_CPU 16000000UL
  11. #define BUAD 9600
  12. #define BRC (((F_CPU / (BUAD * 16UL))) - 1)
  13.  
  14. #define RX_BUFFER_SIZE 50
  15. #define ADC_AIR_CHANNEL 0
  16. #define NUM_READINGS 10
  17.  
  18. #define PORT_ON(port,pin) port |= (1<<pin)
  19. #define PORT_OFF(port,pin) port &= ~(1<<pin)
  20.  
  21. char rxBuffer[RX_BUFFER_SIZE];
  22. uint8_t rxReadPos = 0;
  23. uint8_t rxWritePos = 0;
  24.  
  25. // declare all functtions
  26. void USART0Init(void);
  27. void USART0SendByte(char u8Data, FILE *stream);
  28. void InitADC(void);
  29. uint16_t ReadADC(uint8_t ADCchannel);
  30. float ReadAiremp(uint8_t channel,  uint16_t *values_of__air, int sizeOfValues);
  31. char getChar(void);
  32. char peekChar(void);
  33.  
  34. void USART0Init(void) {
  35.         // Set baud rate
  36.     UBRR0H = (BRC >> 8);
  37.     UBRR0L =  BRC;  
  38.      
  39.     UCSR0B = (1 << RXEN0)  | (1 << RXCIE0) |(1<<TXEN0);
  40.  
  41.     UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
  42. }
  43.  
  44. void USART0SendByte(char u8Data, FILE *stream) {
  45.         if(u8Data == '\n')
  46.         {
  47.             USART0SendByte('\r', stream);
  48.         }
  49.         //wait while previous byte is completed
  50.         while(!(UCSR0A&(1<<UDRE0))){};
  51.         // Transmit data
  52.         UDR0 = u8Data;
  53. }
  54.  
  55. //set stream pointer
  56. FILE usart0_str = FDEV_SETUP_STREAM(USART0SendByte, NULL, _FDEV_SETUP_WRITE);
  57.  
  58. void InitADC(void) {
  59.         // Select Vref=AVcc
  60.         ADMUX |= (1<<REFS0);
  61.         //set prescaller to 128 and enable ADC
  62.         ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADEN);    
  63. }
  64.      
  65. uint16_t ReadADC(uint8_t ADCchannel) {
  66.  
  67.         //select ADC channel with safety mask
  68.         //single conversion mode
  69.         while( ADCSRA & (1<<ADSC) );
  70.        
  71.          //select ADC channel with safety mask
  72.          ADMUX = (ADMUX & 0xF0) | (ADCchannel & 0x0F);
  73.  
  74.         // start single convertion
  75.         // write ’1′ to ADSC
  76.         ADCSRA |= (1<<ADSC);
  77.  
  78.   // wait for conversion to complete
  79.   // ADSC becomes ’0′ again
  80.   // till then, run loop continuously
  81.   while(ADCSRA & (1<<ADSC));
  82.  
  83.   return (ADC);
  84. }
  85.  
  86. float ReadAirTemp(uint8_t channel,  uint16_t *values_of__air, int sizeOfValues) {
  87.         int i = 0;
  88.         int  total = 0;
  89.         float average = 0.0f;
  90.  
  91. for (i = 0; i < sizeOfValues; i++) {
  92.  
  93.         values_of__air[i] = ReadADC(channel); // тука може да ползваме функцията ReadADC,защото
  94.                                               // тя вече е декларирана най-отгоре и е позната
  95.         total = total + values_of__air[i];    // няма нужда от екстра loop за сбора
  96.  
  97.         _delay_ms(300);
  98.  }
  99.  
  100.         average = (float)total / (float)sizeOfValues;
  101.  
  102.         return average;
  103. }
  104.  
  105. int main(void) {
  106.     //initialize USART0Init
  107.     USART0Init();
  108.  
  109.     //initialize ADC
  110.     InitADC();
  111.    
  112.     // set port B pin 0 as output
  113.     DDRB = (1 << PORTB0);
  114.  
  115.     //assign our stream to standard I/O streams
  116.     stdout = &usart0_str;
  117.    
  118.     uint16_t values_of__air[NUM_READINGS] = {0};
  119.    
  120.     float tmp_air = 0.0f;
  121.        
  122.     sei();
  123.      
  124.     while(1)
  125.     {
  126.  
  127.         tmp_air = ReadAirTemp(ADC_AIR_CHANNEL, values_of__air, NUM_READINGS);
  128.  
  129.         printf("Air Temperature: %d\n", (int)(round(tmp_air)));
  130.        
  131.         char c = getChar();
  132.          
  133.         if(c == '1')
  134.         {
  135.             sbi(PORTB, PORTB0);
  136.         }
  137.         else if(c =='0')
  138.         {
  139.             cbi(PORTB, PORTB0);
  140.         }
  141.     }
  142. }
  143.  
  144. char peekChar(void)
  145. {
  146.     char ret = '\0';
  147.      
  148.     if(rxReadPos != rxWritePos)
  149.     {
  150.         ret = rxBuffer[rxReadPos];
  151.     }
  152.      
  153.     return ret;
  154. }
  155.  
  156. char getChar(void)
  157. {
  158.     char ret = '\0';
  159.      
  160.     if(rxReadPos != rxWritePos)
  161.     {
  162.         ret = rxBuffer[rxReadPos];
  163.          
  164.         rxReadPos++;
  165.          
  166.         if(rxReadPos >= RX_BUFFER_SIZE)
  167.         {
  168.             rxReadPos = 0;
  169.         }
  170.     }
  171.      
  172.     return ret;
  173. }
  174.  
  175. ISR(USART_RX_vect)
  176. {
  177.     rxBuffer[rxWritePos] = UDR0;
  178.      
  179.     rxWritePos++;
  180.      
  181.     if(rxWritePos >= RX_BUFFER_SIZE)
  182.     {
  183.         rxWritePos = 0;
  184.     }
  185. }
  186.  

//output

Код: Bash
  1. Air Temperature: 146
  2. Air Temperature: 146
  3. Air Temperature: 146
  4. Air Temperature: 146
  5. Air Temperature: 146
  6. Air Temperature: 146
  7. Air Temperature: 146
  8. Air Temperature: 146
  9. Air Temperature: 146
  10. Air Temperature: 146
  11. Air Temperature: 146
  12. Air Temperature: 146
  13. Air Temperature: 146
  14. Air Temperature: 146
  15. Air Temperature: 146
  16. Air Temperature: 146
  17.  
  18. // send 1 bit / clear it up
  19.  
  20. dimt@dimt-Satellite-L670 ~/arduino $ echo 1 > /dev/ttyACM0
  21. dimt@dimt-Satellite-L670 ~/arduino $ echo 0 > /dev/ttyACM0
  22.  
  23.  
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

kjufte

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 1
  • -Получени: 51
  • Публикации: 308
Re: fatal error: time.h: No such file or directory
« Отговор #24 -: 12 Ноември 2016, 11:32:45 »
Кода изглежда добре с няколко забележки.
1. Твоят микроконтролер не може да е на 16MHz, освен ако не си закачил външен кварц към него. Ако си нагласял fuses максимума ти е 8MHz.
2. Указателите към опашхата и главата на ring buffer-а трябва да са задължително декларирани volatile, тъй като са глобални променливи, които биват модифицирани в interrupt.
Код: C
  1. volatile uint8_t rxReadPos = 0;
  2. volatile uint8_t rxWritePos = 0;
3. Имаш непокрит случай, когато пишещият указател надмине четящия.
4. Команди съставени от един символ работят в твоя случай, но ако решиш да добавиш допълнително други команди/функции ще стане мъка. Примерно както си ги изброил в предния пост можеш да имаш команди от сорта на
Код: Text
  1. furnace=1         // включваш фърниса
  2. furnace=0         // изключваш фърниса
  3. hottub=temp       // проверяваш температурата на джакузито
  4. hottub=1          // загряваш джакузито
  5. hottub=0          // изключваш нагревателя на джакузито
  6. lights=porch,1    // включваш лампите на верандата
  7. lights=porch,0    // изключваш лампите на верандата
  8. ....
По този начин може да си направиш не само автоматизация, но и команден интерфейс през web примерно. Или за смартфона през BT/Wi-Fi.
 
Освен това може да се оптимизира програмата доста. Примерно ти правиш 10 четения с по 300 милисекунди пауза между тях, което означава, че main loop-a проверява каква е температурата на приблизително всеки 3 секунди. Е па колко да се е променила за това време таз температура?  ;D

Ако ти се чете и занимава можеш да направиш нещо подобно на това
Код: Text
  1. while(1)
  2. {
  3.     вземи актуална температура
  4.     реагирай ако трябва според прочетената температура
  5.     ако е получена команда я интерпретирай
  6.     постави микроконтролера в deep sleep за Х секунди
  7. }

Поставяйки контролера в deep sleep той не консумира почти никаква енергия. Бива събуден от интеръпт след X секунди, което е смисления интервал за проверка на температурата, или от интеръпт генериран от получена uart команда.
« Последна редакция: 12 Ноември 2016, 12:22:07 от kjufte »

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3623
Re: fatal error: time.h: No such file or directory
« Отговор #25 -: 12 Ноември 2016, 13:27:02 »
Цитат
1. Твоят микроконтролер не може да е на 16MHz, освен ако не си закачил външен кварц към него. Ако си нагласял fuses максимума ти е 8MHz.

До 20MHz го дават - http://www.atmel.com/devices/atmega328.aspx

Цитат
2. Указателите към опашхата и главата на ring buffer-а трябва да са задължително декларирани volatile, тъй като са глобални променливи, които биват модифицирани в interrupt.
Оправих го :)

Цитат
3. Имаш непокрит случай, когато пишещият указател надмине четящия.
Не се ли обезмисля тази проверка, при положение, че когато буфера се напълни rxRead and rxWritePos се сетват към 0 ?

Цитат
Команди съставени от един символ работят в твоя случай, но ако решиш да добавиш допълнително други команди/функции ще стане мъка. Примерно както си ги изброил в предния пост можеш да имаш команди от сорта на..... По този начин може да си направиш не само автоматизация, но и команден интерфейс през web примерно. Или за смартфона през BT/Wi-
Мога да го направя - 1 / 0 за фърниса, 2 / 3 за джакузито примерно. Напълно съгласен съм, че може да се направи един добър графичен апликейшън да пали устройствата през мрежата, но и един прост терминал ме устройва за момента :)

Цитат
Поставяйки контролера в deep sleep той не консумира почти никаква енергия. Бива събуден от интеръпт след X секунди, което е смисления интервал за проверка на температурата, или от интеръпт генериран от получена uart команда.
Тва е интересно. Ще потърся инфо и шъ та ъпдейтвам ;) 


Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

kjufte

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 1
  • -Получени: 51
  • Публикации: 308
Re: fatal error: time.h: No such file or directory
« Отговор #26 -: 12 Ноември 2016, 14:06:15 »
До 20MHz го дават - http://www.atmel.com/devices/atmega328.aspx

Това е максимална стойност при използване на външен кварц. До колкото разбрах от предните ти постове, ти използваш вградения RC oscilator, който има максимум от 8Mhz, но е конфигуриран за 1MHz.

Ардуиното ти има ектра кварц, който е на 16MHz.


Ако ти е интересно защо в това видео един тинейджър ги съпоставя.


Не се ли обезмисля тази проверка, при положение, че когато буфера се напълни rxRead and rxWritePos се сетват към 0 ?
Не се обезмисля, защото пишещия указател се инкрементира от interrupt. Т.е променя се асинхронно. Това значи, че може преди да си прочел съдържанието на буфера, той да се е напълнил.

Примерно, както ти бях писал вече, имаш 9600 baud с 1 стартов и 1 стоп бит, което  означава, че може да получиш 960 знака в секунда. Твоят буфер е с капацитет 50. Четенето на температурата ти отнема 3 секунди.
Т.е. ти преди да стигнеш до реда, в който четеш един единствен знак от буфера
Код: C
  1. char c = getChar();

може вече да си получил до 2880 символа (3сек * 960 символа). Къде къде повече от размера на буфера ти. Тъй като не проверяваш дали пишещият указател не е настигнал четящия, ти ще презапишеш стойностите на целия буфер 57 пъти.

« Последна редакция: 12 Ноември 2016, 14:37:21 от kjufte »

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3623
Re: fatal error: time.h: No such file or directory
« Отговор #27 -: 12 Ноември 2016, 14:46:49 »
Взех едно ардуино преди няколко дни на много тънка цена за да мога да правя тестове през UART докато пристигне обръщача, а пък да имам и back-up ако стане нещо с това на къщата. Айде...... излизам, че работя този weekend ;)
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3623
Re: fatal error: time.h: No such file or directory
« Отговор #28 -: 12 Ноември 2016, 19:52:49 »
Интересен репорт получих тази сутрин в 7. Направил съм скрипт да ми праща температурата и ежедневният трафик на джаджата която ползвам:

Код: Bash
  1. ipaddress: 184.151.37.61
  2. Water Temperature: 75
  3. Outside Temperature: 47
  4. Cottage Temperature: 87
  5.  eth0  /  daily
  6.        day                  rx        |     tx            |    total         |   avg. rate
  7.       11/01/16        73 KiB |     364 KiB |     437 KiB |    0.04 kbit/s
  8.       11/02/16        69 KiB |     401 KiB |     470 KiB |    0.04 kbit/s
  9.       11/03/16        70 KiB |     362 KiB |     432 KiB |    0.04 kbit/s
  10.       11/04/16      5.04 MiB |    1.28 MiB |    6.32 MiB |    0.60 kbit/s
  11.       11/05/16     24.57 MiB |    3.34 MiB |   27.92 MiB |    2.65 kbit/s
  12.       11/06/16      7.34 MiB |     765 KiB |    8.09 MiB |    0.77 kbit/s
  13.       11/07/16        87 KiB |      86 KiB |     173 KiB |    0.02 kbit/s
  14.       11/08/16       108 KiB |     108 KiB |     216 KiB |    0.02 kbit/s
  15.       11/09/16        90 KiB |      89 KiB |     179 KiB |    0.02 kbit/s
  16.       11/10/16       111 KiB |     109 KiB |     220 KiB |    0.02 kbit/s
  17.       11/11/16       108 KiB |     162 KiB |     270 KiB |    0.03 kbit/s
  18.       11/12/16        30 KiB |      30 KiB |      60 KiB |    0.02 kbit/s
  19.  

Изглежда кабела в тръбата се е включвал вчера. Сутринта беше -5 на къщата.

Данните които се връщат са в mV. За да се изчисли температурата в Fahreinheit, формулата е ( примерно водата) - 75*(5000/1024)/10
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

kjufte

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 1
  • -Получени: 51
  • Публикации: 308
Re: fatal error: time.h: No such file or directory
« Отговор #29 -: 12 Ноември 2016, 20:21:21 »
Това от сензора ли са данни? И ако да, какъв сензор ползваш?
Ако е TMP36, то формулата изглежда да е
(mV - 500) / 10
Или в твоя случай
( (75 * (5000 / 1024))  - 500 ) /10 или -13.37°C, което ми се вижда голям студ  ;D
 
« Последна редакция: 12 Ноември 2016, 20:27:01 от kjufte »