Прошу помочь - не могу разобраться как подать напряжение/сигнал к оптосимистру от МК, такое ощущение, что неправильно написан кусок для чтения данных с АЦП и вывода сигнала на PORTD.0
Спойлер
Код под катом: Спойлер
Код:
#include <mega8.h> //библиотека ввода\вывода #include <delay.h> //библиотека задержки #asm //сообщаем куда подключен датчик .equ __w1_port=0x15; PORTC .equ __w1_bit=3 #endasm #asm //сообщаем куда подключен экран .equ __lcd_port=0x18 #endasm #include <lcd.h> //библиотека для LCD #include <1wire.h> //библиотека работы с 1Wire #include <ds18b20.h> //библиотека для работы с датчиком ds18b20 #include <stdio.h> //стандартная библиотека char lcd_buffer[33]; //массив с данными для экрана int temp; int izm;
void main(void) { unsigned char devices; //переменная в которой количество присоеденённых датчиков lcd_init(16); //инициализация LCD, и говорим что он на 16 символов devices=w1_init(); //ищем датчики while(devices>0) //бесконечный цикл, если датчик подключен { temp=ds18b20_temperature(0); //читаем температуру if (temp>1000) //если датчик выдает больше 1000 { temp=4096-temp; //отнимаем от данных 4096 temp=-temp; //и ставим знак "минус" } sprintf(lcd_buffer,"t=%i.%u\xdfC",temp,temp%5); //записываем массив для экрана lcd_clear(); //чистим дисплей перед выводом lcd_puts(lcd_buffer); //выводим массив на LCD delay_ms(500); //ждём 500мс };
while(1) { unsigned int u; ADCSRA |= (1 << ADSC); //Начинаем преобразование while ((ADCSRA&(1 << ADIF))== 0); //Ждем флага окончания преобразования u = (ADCL|ADCH << 8); // Считываем ADC
if (u > 128) //0.625V {izm = 20; if (izm<temp) {PORTD.0=1;} else {PORTD.0=0;}} if (u > 256) //1.25V {izm = 21; if (izm<temp) {PORTD.0=1;} else {PORTD.0=0;}} if (u > 384) //1.875V {izm = 22; if (izm<temp) {PORTD.0=1;} else {PORTD.0=0;}} if (u > 512) //2.5V {izm = 23; if (izm<temp) {PORTD.0=1;} else {PORTD.0=0;}} if (u > 640) //3.125V {izm = 24; if (izm<temp) {PORTD.0=1;} else {PORTD.0=0;}} if (u > 768) //3.75V {izm = 25; if (izm<temp) {PORTD.0=1;} else {PORTD.0=0;}} if (u > 896) //4.375V {izm = 26; if (izm<temp) {PORTD.0=1;} else {PORTD.0=0;}} if (u > 1020) //5V {izm = 27; if (izm<temp) {PORTD.0=1;} else {PORTD.0=0;}} delay_ms(50); } }
Приложите весь проект в папке, похоже что то с настройкой АЦП, да и чтение тоже оставляет желать лучшего. Похоже до АЦП дело вообще не доходит:
Код:
while(devices>0) //бесконечный цикл, если датчик подключен
Исправил на это Спойлер
Код:
#include <mega8.h> //библиотека ввода\вывода #include <delay.h> //библиотека задержки #asm //сообщаем куда подключен датчик .equ __w1_port=0x15; PORTC .equ __w1_bit=3 #endasm #asm //сообщаем куда подключен экран .equ __lcd_port=0x18 #endasm #include <lcd.h> //библиотека для LCD #include <1wire.h> //библиотека работы с 1Wire #include <ds18b20.h> //библиотека для работы с датчиком ds18b20 #include <stdio.h> //стандартная библиотека char lcd_buffer[33]; //массив с данными для экрана int temp; int izm;
void main(void) { unsigned char devices; //переменная в которой количество присоеденённых датчиков DDRD = 0x01; ADCSRA |= (1 << ADEN) //Включение АЦП |(1 << ADPS1)|(1 << ADPS0); // предделитель преобразователя на 8 ADMUX |= (0 << REFS1)|(0 << REFS0) // внешний ИОН |(0 << MUX0)|(0 << MUX1)|(0 << MUX2)|(0 << MUX3); // вход PC0 lcd_init(16); //инициализация LCD, и говорим что он на 16 символов devices=w1_init(); //ищем датчики while(devices>0) //бесконечный цикл, если датчик подключен { unsigned int u; temp=ds18b20_temperature(0); //читаем температуру if (temp>1000) //если датчик выдает больше 1000 { temp=4096-temp; //отнимаем от данных 4096 temp=-temp; //и ставим знак "минус" } sprintf(lcd_buffer,"t=%i.%u\xdfC",temp,temp%1); //записываем массив для экрана lcd_clear(); //чистим дисплей перед выводом lcd_puts(lcd_buffer); //выводим массив на LCD ADCSRA |= (1 << ADSC); //Начинаем преобразование while ((ADCSRA&(1 << ADIF))== 0); //Ждем флага окончания преобразования u = (ADCL|ADCH << 8); // Считываем ADC if (u > 128) //0.625V {izm = 20; if (izm<temp) {PORTD.0=1;} else {PORTD.0=0;}} if (u > 256) //1.25V {izm = 21; if (izm<temp) {PORTD.0=1;} else {PORTD.0=0;}} if (u > 384) //1.875V {izm = 22; if (izm<temp) {PORTD.0=1;} else {PORTD.0=0;}} if (u > 512) //2.5V {izm = 23; if (izm<temp) {PORTD.0=1;} else {PORTD.0=0;}} if (u > 640) //3.125V {izm = 24; if (izm<temp) {PORTD.0=1;} else {PORTD.0=0;}} if (u > 768) //3.75V {izm = 25; if (izm<temp) {PORTD.0=1;} else {PORTD.0=0;}} if (u > 896) //4.375V {izm = 26; if (izm<temp) {PORTD.0=1;} else {PORTD.0=0;}} if (u > 1020) //5V {izm = 27; if (izm<temp) {PORTD.0=1;} else {PORTD.0=0;}} delay_ms(50); } }
И все равно не хочет подавать на ножку pd0 Выкладываю проект в протеусе, код и CAVR
UPD1 - Задал PORTD.0=1 в начале цикла, напряжение подается на PD0, но при изменении переменного напряжения выше 0.625 В оно сразу падает получается нужно каждый раз после условия if подавать его?
UPD2 - Получилось подать сигнал на транзистор. Неправильно написал код сравнения температур - надо разбираться с даташитом на датчик температуры, значением izm и temp
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения