| Форум РадиоКот https://radiokot.ru/forum/ |
|
| Прошу помочь с МК https://radiokot.ru/forum/viewtopic.php?f=57&t=80619 |
Страница 1 из 1 |
| Автор: | Bagum_Bagum [ Ср ноя 14, 2012 00:41:38 ] | ||
| Заголовок сообщения: | Прошу помочь с МК | ||
Прошу помочь - не могу разобраться как подать напряжение/сигнал к оптосимистру от МК, такое ощущение, что неправильно написан кусок для чтения данных с АЦП и вывода сигнала на 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мс }; DDRD = 0x00; ADCSRA |= (1 << ADEN) //Включение АЦП |(1 << ADPS1)|(1 << ADPS0); // предделитель преобразователя на 8 ADMUX |= (0 << REFS1)|(0 << REFS0) // внешний ИОН |(0 << MUX0)|(0 << MUX1)|(0 << MUX2)|(0 << MUX3); // вход PC0 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); } }
|
|||
| Автор: | Goodefine [ Ср ноя 14, 2012 00:52:33 ] |
| Заголовок сообщения: | Re: Прошу помочь с МК |
Код: DDRD = 0x01;
|
|
| Автор: | Bagum_Bagum [ Ср ноя 14, 2012 00:57:26 ] |
| Заголовок сообщения: | Re: Прошу помочь с МК |
Goodefine писал(а): Код: DDRD = 0x01; К сожалению, напряжение все равно остается нулевым на этом участке |
|
| Автор: | pyzhman [ Ср ноя 14, 2012 06:10:34 ] |
| Заголовок сообщения: | Re: Прошу помочь с МК |
Протеус или реал? |
|
| Автор: | Bagum_Bagum [ Ср ноя 14, 2012 10:15:02 ] |
| Заголовок сообщения: | Re: Прошу помочь с МК |
pyzhman писал(а): Протеус или реал? Протеус |
|
| Автор: | Goodefine [ Ср ноя 14, 2012 10:18:27 ] |
| Заголовок сообщения: | Re: Прошу помочь с МК |
Приложите весь проект в папке, похоже что то с настройкой АЦП, да и чтение тоже оставляет желать лучшего. Похоже до АЦП дело вообще не доходит: Код: while(devices>0) //бесконечный цикл, если датчик подключен
|
|
| Автор: | Bagum_Bagum [ Ср ноя 14, 2012 13:58:57 ] |
| Заголовок сообщения: | Re: Прошу помочь с МК |
Goodefine писал(а): Приложите весь проект в папке, похоже что то с настройкой АЦП, да и чтение тоже оставляет желать лучшего. Похоже до АЦП дело вообще не доходит: Код: 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 |
|
| Автор: | Goodefine [ Ср ноя 14, 2012 14:53:25 ] |
| Заголовок сообщения: | Re: Прошу помочь с МК |
Будет гораздо легче, если научитесь пользоваться отладкой: Вложение:
|
|
| Автор: | Bagum_Bagum [ Ср ноя 14, 2012 19:00:26 ] |
| Заголовок сообщения: | Re: Прошу помочь с МК |
Goodefine писал(а): Будет гораздо легче, если научитесь пользоваться отладкой: Вложение: ex.jpg Спасибо! Буду учиться! |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|



