Ну да это точно проще чем винду переставить, ппцjava писал(а):СпасибоНет, я лучше подберу где-нибудь на свалке старенький комп, специально для программатора.
CodeVision AVR в вопросах и ответах
- Реклама
как не старался пишет что проблема с доступом к файлу IOPORT.sys хоть с правами админа запускал хоть без них, и с установкой тоже самое
а файл-то есть?))) семерка 64 бита?
Привет!
Подскажите в чем может быть дело?
Взял за основу http://chipenable.ru/index.php/programm ... llere.html
Решил добавить туда термометр в проект, добавил также модульно т.е отдельным файлом. Все компилируется/работает. Но!!! температура с датчика опрашивается один раз, сбрасываю контроллер и если температура изменилась то и на дисплеи меняется, т.е не работает цикл. Подскажите как правильно написать цикл? while (1) в оде термометра не работает ибо просто программа доходит до этого места и по кругу, т.е часы перестают идти...
Подскажите в чем может быть дело?
Взял за основу http://chipenable.ru/index.php/programm ... llere.html
Решил добавить туда термометр в проект, добавил также модульно т.е отдельным файлом. Все компилируется/работает. Но!!! температура с датчика опрашивается один раз, сбрасываю контроллер и если температура изменилась то и на дисплеи меняется, т.е не работает цикл. Подскажите как правильно написать цикл? while (1) в оде термометра не работает ибо просто программа доходит до этого места и по кругу, т.е часы перестают идти...
Не вижу смысла.Винду я сам не ставлю, отдаю знакомому, он ставит свою, перебранную гибрид из ХР и висты. Так вот, я проверял программатор на ноутбуке и двух стареньких компах, он работал нормально, а система стоит на всех одинаковая, и на моём компе тоже. Это засада в железе. жаль конечно, придётся для программирования держать ноут.BCluster писал(а):Ну да это точно проще чем винду переставить, ппц
Пишу с ошибками и опечатками.На это у меня есть разрешение и справка
- Реклама
ну тогда вам прийдётся попросить своего человека поставить вам или нормальную винду стандартную или собственно семерку....ибо нет никаких гибридов висты и XP ... просто на хрюшку навешивают всякие сторонние глючные программы украшалки которые потом боком и вылазят....кроме того даже если они (системы) установлены с одного диска на нотик и на ББ - они всёравно разные ибо материнки, звуковухи, системные конекторы, чипсет и прочик вещи - разные а значит и разные драйвера и разные утилиты для этих драйверов подгрузились...результат - внешне одинаковые внутри полная противоположность...
вывод...поставьте ЧИСТУЮ винду, поставьте родные драйвера с сайта производителя материнки, поиграйтесь с настройками в биосе, проверьте питание - мож там кабелек длинный и тонких мож предохранитель самовосстанавливающийся устал мож ещё что...да малоли...
вывод...поставьте ЧИСТУЮ винду, поставьте родные драйвера с сайта производителя материнки, поиграйтесь с настройками в биосе, проверьте питание - мож там кабелек длинный и тонких мож предохранитель самовосстанавливающийся устал мож ещё что...да малоли...
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Не доверяйте русским лужам - это может быть вход в метро.
псц... может стоит начать с обучения установке винды?)java писал(а):Не вижу смысла.Винду я сам не ставлю, отдаю знакомому
- Сообщения: 512
- Зарегистрирован: Вт дек 22, 2009 02:24:50
Можно в обработчик прерывания опрос датчика добавитьa.garkin писал(а):часы перестают идти...
cюда
__interrupt void Timer1CompA(void)
{
ES_PlaceEvent(EVENT_SYS_TIMER);
}
- Сообщения: 67
- Зарегистрирован: Пн мар 03, 2008 22:12:47
подскажите, пожалуйста, как изменить код, чтобы индикатор показывал температуру с 2 знаками после запятой и еще минусовую температуру. Большое спасибо!
int temper; //Переменая для хранения значения температуры
unsigned char lcdBuff[16]; //Массив для хранения фоматированной строки
#pragma rl+
char *str1="найден датчик ds18b20";
char *str2="датчик ds18b20 отсутствует";
#pragma rl-
void main( void )
{
lcd_init( 16 );
lcd_clear( );
if( ds18b20_init( 0, 30, 60, DS18B20_12BIT_RES ) )
//инициализация датчика. Анализ присутствия датчика
//функция возвращает 1 если датчик присутствует на линии
{
lcd_clear( ); lcd_puts( str1 ); delay_ms( 1000 );
while( 1 ){
temper=ds18b20_temperature( 0 );//Чтение температуры, адрес нуль
sprintf( lcdBuff,"t %u\xdfC", temper ); //помещаем форматированую строку в массив
//для вывода значения температуры с точностью до одной сотой, %u заменить на %.3f ( диапазон 0-3 )
//переменную temper нужно записать как float temper;
//выводим на индикатор значение температуры
lcd_clear( ); lcd_gotoxy( 0,0 ); lcd_puts( lcdBuff ); }
}else{ lcd_clear( ); lcd_puts( str2 ); }
}
int temper; //Переменая для хранения значения температуры
unsigned char lcdBuff[16]; //Массив для хранения фоматированной строки
#pragma rl+
char *str1="найден датчик ds18b20";
char *str2="датчик ds18b20 отсутствует";
#pragma rl-
void main( void )
{
lcd_init( 16 );
lcd_clear( );
if( ds18b20_init( 0, 30, 60, DS18B20_12BIT_RES ) )
//инициализация датчика. Анализ присутствия датчика
//функция возвращает 1 если датчик присутствует на линии
{
lcd_clear( ); lcd_puts( str1 ); delay_ms( 1000 );
while( 1 ){
temper=ds18b20_temperature( 0 );//Чтение температуры, адрес нуль
sprintf( lcdBuff,"t %u\xdfC", temper ); //помещаем форматированую строку в массив
//для вывода значения температуры с точностью до одной сотой, %u заменить на %.3f ( диапазон 0-3 )
//переменную temper нужно записать как float temper;
//выводим на индикатор значение температуры
lcd_clear( ); lcd_gotoxy( 0,0 ); lcd_puts( lcdBuff ); }
}else{ lcd_clear( ); lcd_puts( str2 ); }
}
для одной десятой, соответственно, %5.1fvbif87 писал(а): //для вывода значения температуры с точностью до одной сотой, %u заменить на %.3f ( диапазон 0-3 )
//переменную temper нужно записать как float temper;
битва с дураками проиграна, победители торжествуют. слава победителям!
- Сообщения: 67
- Зарегистрирован: Пн мар 03, 2008 22:12:47
вопрос, как в динамике включить отображение точки?
число 25.5 выводится как 255
Есть массив
****
счас десятые отключены, но без дела пропадает один знакосегмент
число 25.5 выводится как 255
Есть массив
Код: Выделить всё
unsigned char digit_ar[14] = {0b11111010, //0-
0b10000010, //1-
0b10111001, //2-
0b10101011, //3-
0b11000011, //4-
0b01101011, //5-
0b01111011, //6-
0b10100010, //7-
0b11111011, //8-
0b11101011, //9-
0b00000100, //. -
0b00000000, // empty
0b00000001, //-
0b11100001 //значок градуса
}; счас десятые отключены, но без дела пропадает один знакосегмент
Код: Выделить всё
void main(void)
{
float znach;
unsigned char str1[3];
ds18b20_init(0,0,0,0);
avr_init();
#asm("sei");
while (1)
{
znach=ds18b20_temperature(0);
itoa((int)znach, str);
str1[0] = '+';
strcat(str, str1);
};
}Смотрю я на Ваш массив для семисегментника и не пойму. Почему при 7ми сегментах в индикаторе Вы используете все восемь битов в байте? По логике: первые 7 бит содержат форму цифры, а оставшийся 8й бит идет под точку. Просто в нужный момент при отображении к выводимому коду присоединяете бит точки (например 0b00000111 - это число 7, поставить точку 0b00000111|(1<<7)).
Не умееш - не берись, но не взявшись не научишся.
у меня точка - 6 бит.
о0
понял, есть к примеру
0b11111011, //8-
надо к нему прибавить
0b00000100
будет 8.
А как это записать?
о0
понял, есть к примеру
0b11111011, //8-
надо к нему прибавить
0b00000100
будет 8.
А как это записать?
Код: Выделить всё
void avr_init(void);
//Timer 0 interrupt
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
unsigned char m;
bit c;
TCNT0 = 0;
if (str[SignPlace] == '.') { //вывести знак "точка"
m = 10;
c = 1;
};
if (str[SignPlace] == '+') { //вывести знак "градус"
m = 13;
c = 1;
};
if (str[SignPlace] == '-') { //вывести знак "минус"
m = 12;
c = 1;
};
if (str[SignPlace] == ' ') { //вывести знак "пробел"
m = 11;
c = 1;
};
if (isprint(str[SignPlace]) == 0) {
m = 11;
c = 1;
};
if (c == 0) {
m = toint(str[SignPlace]);
}
PORTD = 0;
PORTB = 0;
PORTB = digit_ar[m];
PORTD = SPlace_ar[SignPlace];
c = 0;
SignPlace = SignPlace + 1;
if (SignPlace == 4) SignPlace = 0;
}
почитайте о том, как делать динамическую индикацию на 7-сегментниках, и тогда вопрос "как добавить точку" у вас должен отпасть сам собой.
битва с дураками проиграна, победители торжествуют. слава победителям!
замечательноМастер Ломастер писал(а):почитайте о том, как делать динамическую индикацию на 7-сегментниках, и тогда вопрос "как добавить точку" у вас должен отпасть сам собой.
статья гуд, но как быть с отрицательным числом? разряд то смещается.
есть и
25.5*
5.5*_
-5.5*
-25.5
или сдвигать всё вправо, всёравно не поможет, на двузначном отрицательном числе точка стоит в 3 разряде,
во втором при отрицательном однозначном, в первом при однозначном положительном числе.
Как учесть знак минус, при этом смещается знак градус или вообще не выводится?
и потом
Код: Выделить всё
#define COMMA_CHAR '.'
unsigned char SPlace_ar[4] = { 0b01000000,
0b00100000,
0b00010000,
0b00001000};
****
float znach;
****
while (1)
{
znach=ds18b20_temperature(0)*10;
itoa((int)znach, str);
SPlace_ar[4-1] |=COMMA_CHAR;
};вообщем сделаем проще
if znach > 9.9
включаем второй сегмент
if znach > 0<10
включаем первый сегмент
if znach <0 >-9.9
включаем второй сегмент
if znach < -10
включаем третий сегмент
А теперь подскажите как эти условия написать?
if znach > 9.9
включаем второй сегмент
if znach > 0<10
включаем первый сегмент
if znach <0 >-9.9
включаем второй сегмент
if znach < -10
включаем третий сегмент
А теперь подскажите как эти условия написать?
ититьтвоючерезкоромыслопустымведромпоголове!levaclaus писал(а):статья гуд, но как быть с отрицательным числом? разряд то смещается.
как быть? есть 2 варианта:
1. все-таки потратить часть своего драгоценного времени на изучения языка программирования
2. продолжать бомбить форум своими вопросами, делая все на автопилоте.
второй путь, естественно, предпочтительнее, т.к. всегда найдется идиот, который даст ответ. например, я:
Код: Выделить всё
massiv[4] - это 4 ваших индикатора.
out() - это функция, которая тупо выводит 3 разряда числа в этот массив "с конца", вроде как было описано в вышеупомянутой статье
temp - ваша температура, которая может быть с минусом
MINUS - макрос, задающий отображение знака минус
COMMA - макрос, задающий свечение точки на индикаторе
if(temp < 0){ // если температура отрицательная,
out(-temp); // то выводим ее по модулю и
massiv[0] = MINUS; // в первом индикаторе зажигаем минус
} else { // а если положительная,
out(temp); // то выводим ее, как есть
massiv[0] = 0; // и гасим первый индикатор
}
massiv[2] |= COMMA; // а потом тупо добавляем точку к нужному разрядубитва с дураками проиграна, победители торжествуют. слава победителям!
Если есть на русском языке где можно почитать как работать с CodeVision AVR, дайте плиз ссылку.
Пишу с ошибками и опечатками.На это у меня есть разрешение и справка


