Зарегистрирован: Вс сен 11, 2011 12:35:11 Сообщений: 378
Рейтинг сообщения:0
Всем привет. Сделал копипаст с одного проекта в другой и на дисплей выводится какая то дрянь то с отрицательными числами то многозначные числа. Копаюсь весь день, уже не знаю что сделать. Копировал с 18F46k22
Код:
#define _XTAL_FREQ 4000000 #include <HTC.H> #include "d:\mplab\TermoScooter\include\1wireTermo.h" #include <stdio.h> // Для работы Sprintf
long sys1 = 0, SData = 0; unsigned int lowByte=0 , highByte=0; int i = 0, TempWater = 0, TempWaterInt=0, bt1=0, bat1=0; char string = 0, commands = 0, commands1 = 0, commands2 = 0; float TempWaterDec = 0;
void Delay(unsigned int tick) // Delay 100 us per tick { while(tick--) { __delay_ms(1); // Delay 90 us } } void Delay_sound(unsigned int tick) // Delay 100 us per tick { while(tick--) { __delay_us(90); // Delay 90 us } } void Sound(unsigned int freq,unsigned int time) {
unsigned int dt=0,m=0; // Keep value and dt = 5000/freq; // Keep active logic delay time = (5*time)/dt; // Keep counter for generate sound for(m=0;m<time;m++) // Loop for generate sound(Toggle logic P0.12) { LATA2 = 1; // RC0=1 Delay_sound(dt); // Delay for sound LATA2 = 0; // RC0=0 Delay_sound(dt); // Delay for sound }
void readAddr(void) { for(int i=0; i<8; i++){ tempRom[i]=0; } char err_status2; // Keep respond status err_status2 = onewire_reset2(); // Reset onewire bus if(err_status2==0) // Check connection to DS1820 { onewire_write_byte2(0x33); // Read ROM // onewire_reset2(); // Restart for(int i=0; i<8; i++){ tempRom[i]=onewire_read_byte2(); } } } void startTempConvert() { unsigned char temp_buff2[2]; // Keep raw temp. char err_status2; // Keep respond status err_status2 = onewire_reset2(); // Reset onewire bus if(err_status2==0) // Check connection to DS1820 { onewire_write_byte2(0xCC); // Skip ROM onewire_write_byte2(0x44); // Start Conversion } }
int readTemp(void) { unsigned char temp_buff2[]; // Keep raw temp. char err_status2; // Keep respond status err_status2 = onewire_reset2(); // Reset onewire bus if(err_status2==0) // Check connection to DS1820 { onewire_write_byte2(0xCC); // Skip ROM onewire_write_byte2(0x44); // Start Conversion // __delay_us(120); // Delay 120 us for state onewire_reset2(); // Restart onewire_write_byte2(0xCC); // Skip ROM onewire_write_byte2(0xBE); // Read Scratch Pad
temp_buff2[0] = onewire_read_byte2(); // Keep raw data temp_buff2[1] = onewire_read_byte2(); // Keep raw data } return((temp_buff2[1]<<8)+temp_buff2[0]); // Return raw data //return 51; }
//----------// // Compiler: Hitech C // Library for 1-Wire bus // Hardware: // RC0 ==> 1-Wire bus //----------// #ifndef _1WIRE2_H_ #define _1WIRE2_H_ #include <stdlib.h> #include <string.h> // Include Library for i2c bus
#define ONEWIRE_TRIS2 TRISC0 #define ONEWIRE_PIN2 LATC0 void onewire_dir_out2() { ONEWIRE_TRIS2 = 0; } void onewire_dir_in2() { ONEWIRE_TRIS2 = 1; } char onewire_reset2() // инициализация { char err2 = 0; // Переменная для статуса ответа char GIE_tmp2; // Переменная для прерывания ONEWIRE_PIN2 = 0; // Делаем пин = 0. onewire_dir_out2(); // Меняем порт на выход. __delay_us(480); // Задержка 480 us GIE_tmp2 = GIE; // сохраняем состояние прерывания GIE = 0; //Выключаем все прерывания onewire_dir_in2(); // Меняем порт на вход. __delay_us(70); // Задержка 70 us err2 = RC0; // Читаем что записалось в пине 1 или 0. GIE = GIE_tmp2; // Возвращаем статус прерывания __delay_us(480-70); // Задержка для получения ответа if(RC0==0) // проверяем ответ от DS18B20 { err2 = 1; // Если нет единички то возвращаем ошибку. } return err2; // Возвращаем переменную как есть на 0. } unsigned char onewire_write_bit2(char b2 ) { char GIE_tmp2; // Keep global interrupt status GIE_tmp2 = GIE; // Record global interrupt value GIE = 0; // Ensure disable all interrupt onewire_dir_out2(); // Change to output port __delay_us(1); // Delay 1 us if(b2) { onewire_dir_in2(); // If bit is 1 set bus high } __delay_us(15); // Delay 15 us if(RC0 == 0) b2 = 0; // sample at end of read-timeslot __delay_us(60-15); // Delay for write data bit state onewire_dir_in2(); // Change to input port GIE = GIE_tmp2; // Return global interrupt value return b2; } unsigned char onewire_write_byte2(unsigned char b2) { unsigned char i2 = 8, j2; // Keep counter do { j2 = onewire_write_bit2(b2 & 1); // Write data bit b2 >>= 1; // Shift bit 1 time if(j2) // Data bit is "1"? { b2 |= 0x80; } } while(--i2); return b2; } unsigned char onewire_read_byte2(void) { return onewire_write_byte2(0xFF); // read by sending 0xFF (a dontcare?) } #endif
Заголовок сообщения: Re: ds1820 и 16f1824 не работает
Добавлено: Сб янв 17, 2015 17:54:08
Потрогал лапой паяльник
Зарегистрирован: Вс сен 11, 2011 12:35:11 Сообщений: 378
Рейтинг сообщения:0
Да чем они разные?? Интервалы все равно такие же. Биты почти такие же. Ошибки то нет, компилируется. Я уже давно понял что с 16f свяжешься и гемор получишь.
Заголовок сообщения: Re: ds1820 и 16f1824 не работает
Добавлено: Сб янв 17, 2015 18:26:19
Потрогал лапой паяльник
Зарегистрирован: Вс сен 11, 2011 12:35:11 Сообщений: 378
Рейтинг сообщения:0
В данный момент проблемы не в конфиге, камень то работает на 4-х мгц или я не понял совсем чего то. значение переменых отлично передаются на комп. У меня там usart если посмотреть код. Но с температурой какой то бред. Осциллографом если тыкнуть то сигнал есть с датчика.
Заголовок сообщения: Re: ds1820 и 16f1824 не работает
Добавлено: Сб янв 17, 2015 19:32:44
Потрогал лапой паяльник
Зарегистрирован: Вс сен 11, 2011 12:35:11 Сообщений: 378
Рейтинг сообщения:0
ничего не нашел такого от чего бы инклюд температурный ошибался. В общем сколько времени потратил, уже успел бы съездить за 18F, переразвести плату и спаять заново и было бы уже готово. Завтра так и сделаю.
Для начала, "копа́йте" void main() по части инициализации контроллера. Обратите внимание на то что у некоторых контроллеров, при подаче питания, входы могут быть назначены на ADC, компаратор и т.д. От чтения документации компилятор не спасёт.
_________________ С Уважением, Альберт (Albert_V).
Система обеспечения прерываний и аппаратная организация стека весьма разняться. Если задействованы обработчики по прерываниям - ошибок не избежать. Хоша под Си вроде бы и незаметно тех нюансов, но вполне вероятно, что и библиотеки работают по-разному. Про отличия в доступе к ОЗУ и таблицам в ПЗУ вообще разговор особый... Максимум совмещения еще так-сяк в отношении доступа к содержимому акумулятора в энхансед серии среднемладших имеется, и то лишь "чуток" приятнее, чем у стандартных среднемладших, но всё еще далече даже для стандартного режима 18-й серии. Так что если при пересадке исходника с младшей серии на старшую еще можно режим совместимости обеспечить, то обратно (со старшей на младший) аппаратные яйца могут не пустить.
О чём говорить, если INIT в void main() - это пародия на установку начальной конфигурации? Если бы ТС читал документацию, он увидел бы, что кроме: Спойлер
Заголовок сообщения: Re: ds1820 и 16f1824 не работает
Добавлено: Сб янв 17, 2015 21:58:32
Потрогал лапой паяльник
Зарегистрирован: Вс сен 11, 2011 12:35:11 Сообщений: 378
Рейтинг сообщения:0
Ну мало читать надо еще понимать, я в контроллерах еще не очень. Мало практиики. Все регистры те что по умолчанию disabled зачем их еще раз дисаблить??
Увы... Это последствия СИшного "гипноза" наблюдаются... Или первый холодный душ после некоторых успехов легконачинающего. Ничего, теперь пора и за освоение матчасти взяться - очередной этап роста подготовки!
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения