AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
17.10.2015, 13:19
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
MAX6675 + ATmega32A
Добрый день. Может кто использовал эту микруху для термопары типа К? Нашел в инете готовые коды но почемуто не работают. Можете глянуть рабочие или нет?
PHP код:
|
void max6675_select() { CLEAR_BIT(PORTB, 4); //PORTA=0b11111110; //led diode indication instead of debugger :(( }
void max6675_deselect() { SET_BIT(PORTB, 4); //PORTA=0b01111111; //led diode indication instead of debugger :(( }
uint8_t send_spi(uint8_t spi_data) { SPDR = spi_data; while (!(SPSR & (1‹‹SPIF))); return SPDR; }
void max6675_read_temp() { /* Enable SPI, Master, set clock rate fck/16 */ SPCR = (1‹‹SPE)|(1‹‹MSTR)|(1‹‹SPR0); short value = 0; //float temp = 0; uint8_t highByte=0; uint8_t lowByte=0; max6675_select(); _delay_ms(1000); highByte = send_spi(0); lowByte = send_spi(0); max6675_deselect(); if (lowByte & (1‹‹2)) { //LCDGotoXY(0,0); //sprintf(text,"TC NOT C"); //LCDstring(text,8); //LCDGotoXY(0,1); //sprintf(text,"ONNECTED"); //LCDstring(text,8); } else { value = (highByte ‹‹ 5 | lowByte››3); temp = (value*0.25); t0=temp; // Multiply the value by 0.25 to get temp in ˚C //LCDGotoXY(0,0); //sprintf(text,"TC TEMP:"); //LCDstring(text,8); //LCDGotoXY(0,1); //sprintf(text,"%0.8d", temp); //LCDstring(text,8); } } в майне пишу
// Port B initialization // Func7=In Func6=Out Func5=Out Func4=Out Func3=Out Func2=In Func1=In Func0=In // State7=T State6=0 State5=0 State4=0 State3=0 State2=P State1=P State0=P PORTB=0x07; DDRB=0x78;
while (1) { max6675_read_temp();
и вывожу на LCD как флоат переменную, но показывает 0.00 }
|
где ошибка?....
|
|
|
|
17.10.2015, 14:17
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: MAX6675 + ATmega32A
Ошибка в ДНК. Есть лишняя хромосома.
Тупее АЦП даже придумать трудно. Ничего конфигурировать не надо - просто читай 16 бит и вытаскивай результат. Но увы, и здесь никак без чужой помощи.
Код:
|
#define ADCBitMask 0x7FF8
unsigned int GetTempDig (void)
{
unsigned int res;
PIN_OFF(ADC_CS);
res = SPI_ReadByte(0)‹‹8;
res|= SPI_ReadByte(0);
PIN_ON(ADC_CS);
return ((res&ADCBitMask)››5);
} |
Особого внимания заслуживает вот этот шедевр:
Код:
|
temp = (value*0.25); |
При том, что value имеет тип short
Последний раз редактировалось Easyrider83; 17.10.2015 в 14:20.
|
|
|
Сказали "Спасибо" Easyrider83
|
|
|
17.10.2015, 18:27
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: MAX6675 + ATmega32A
взял тупо чужой код от сюда и начал юзать )) http://pastebin.com/aKk58z36
Сейчас Ваш код вставлю себе. Спасибо!
|
|
|
|
17.10.2015, 18:59
|
|
Вид на жительство
Регистрация: 24.08.2015
Сообщений: 252
Сказал спасибо: 7
Сказали Спасибо 50 раз(а) в 36 сообщении(ях)
|
Re: MAX6675 + ATmega32A
Надо не тупо копипастить чужой код, а просто прочитать даташит на контроллер и этот ацп. А потом уже можно разобрать что чужой код делает.
А то получается в худших традициях индийской копипасты.
|
|
|
|
17.10.2015, 19:52
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: MAX6675 + ATmega32A
Сообщение от Easyrider83
|
Особого внимания заслуживает вот этот шедевр:
Код:
|
temp = (value*0.25); |
При том, что value имеет тип short
|
Дура Студия и не такие какашки заглатывает. Можешь поверить, она честно умножит на 0,25 и результат будет верным.
|
|
|
|
17.10.2015, 22:23
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: MAX6675 + ATmega32A
в понедельник проверю на осциле.... чтото всеравно не пашет..... Проверенная библиотека SPI взята....
|
|
|
|
18.10.2015, 00:37
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: MAX6675 + ATmega32A
сделал новый чистый проект - и всё заработало. А вопрос - как сделать чтобы отображало флоат? По даташиту 0.25 точность.
|
|
|
|
18.10.2015, 01:30
|
|
Почётный гражданин KAZUS.RU
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
|
Re: MAX6675 + ATmega32A
Сообщение от Easyrider83
|
Особого внимания заслуживает вот этот шедевр:
Код:
|
temp = (value*0.25); |
При том, что value имеет тип short
|
а что не так с этим кодом?
|
|
|
|
18.10.2015, 13:09
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,947
Сказал спасибо: 2,993
Сказали Спасибо 3,170 раз(а) в 2,151 сообщении(ях)
|
Re: MAX6675 + ATmega32A
Сообщение от Ara41
|
а что не так с этим кодом?
|
Если 0.25 это действительно константа, то надо записать
Код:
|
temp = value ›› 4; // Multiply the value by 0.25 to get temp in ˚C |
Тем самым мы освободим компилятор от вычисления произведения (или даже от ещё более "тяжёлого" вычисления частного при записи temp = value/4).
|
|
|
|
18.10.2015, 13:31
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: MAX6675 + ATmega32A
Сообщение от ForcePoint
|
Если 0.25 это действительно константа, то надо записать
Код:
|
temp = value ›› 4; // Multiply the value by 0.25 to get temp in ˚C |
Тем самым мы освободим компилятор от вычисления произведения (или даже от ещё более "тяжёлого" вычисления частного при записи temp = value/4).
|
Жесть! Никаких противоречий? Может ошибка где?
temp = value ›› 4;
Это на сколько там деление получится?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:04.
|
|