Код: Выделить всё
nnn*= 100;
nnn= ceil(nnn);
nnn/= 100;Хотя куда девается сотая - не въехал. И что это вы там из чего ожидаете? Ну-ку, ну-ка? Сказал А, говори и Б.
Код: Выделить всё
nnn*= 100;
nnn= ceil(nnn);
nnn/= 100;
pyzh_man писал(а):floor возвращает меньшее, ceil большее целое. Так и остался в непонятках.
pyzh_man писал(а):Тама не отрицательные числа фигурируют случаем?
Мастер Ломастер писал(а):out() - это функция, которая тупо выводит 3 разряда числа в этот массив "с конца", вроде как было описано в вышеупомянутой статье
temp - ваша температура, которая может быть с минусом
MINUS - макрос, задающий отображение знака минус
COMMA - макрос, задающий свечение точки на индикаторе
if(temp < 0){ // если температура отрицательная,
out(-temp); // то выводим ее по модулю и
massiv[0] = MINUS; // в первом индикаторе зажигаем минус
} else { // а если положительная,
out(temp); // то выводим ее, как есть
massiv[0] = 0; // и гасим первый индикатор
}
massiv[2] |= COMMA; // а потом тупо добавляем точку к нужному разряду[/code]
Код: Выделить всё
void s_trim_convert(int NUM){
int i, m, sign = 0;
if(NUM <0){
// если число отрицательное
sign = 1; // установим признак наличия знака
NUM *= -1; // а само число возьмем по модулю
}
// выводим уже положительное число
i=MAX_SIZE-1;
do{
// цикл заполнения выходного массива СПРАВА НАЛЕВО
m = NUM % DIG_BASE; // находим остаток от деления числа на основание
if((NUM==0)&&(i!=(MAX_SIZE-1)))
break; // закончим цикл вывода числа
else
out[i] = SYMBOLS[m]; // иначе выводим символ нужной ЦИФРЫ
NUM /= DIG_BASE; // уменьшаем число в DIG_BASE раз
} while (--i >= 0);
// число выведено, проверяем свободное место и выводим при необходимости знак
if (i < 0) return; // места не хватает - выход
if (sign) out[i--] = NEG_CHAR; // выводим знак, если нужно
for(; i>=0;i--) out[i] = SPACE_CHAR; // очищаем незначащие позиции
}вы упустили внимательное чтение рекомендованной мной статьи, в которой рассказано, ЧТО и КАК лучше делать. в частности, четко даны рекомендации что именно делать в прерывании, а что - вне него.levaclaus писал(а):Что я упустил?
Мастер Ломастер писал(а):вы упустили внимательное чтение рекомендованной мной статьи, в которой рассказано, ЧТО и КАК лучше делать. в частности, четко даны рекомендации что именно делать в прерывании, а что - вне него.levaclaus писал(а):Что я упустил?
ай, ай, какие мы горячиеlevaclaus писал(а):теперь я с уверенность могу заявить что вы сами не читали статью, что дали мне. Там ни слова про прерывания по таймеру. И информации там крайне ограниченно. Общие понятия и ниодного конкретного примера. А ведь всё на примерах изучается.
Мой случай поправим - я найду другого учителя - более адекватного.
Ваш - нет!
Код: Выделить всё
/*****************************************************
Chip type : ATmega8
Program type : Application
Clock frequency : 4,000000 MHz
*****************************************************/
#include <mega8.h> // библиотека ввода\вывода микроконтроллера
#asm
.equ __w1_port=0x18 ;PORTB // сообщаем куда подключен датчик
.equ __w1_bit=0
#endasm
#include <1wire.h> // библиотека работы с 1Wire
#include <ds18b20.h> // библиотека для работы с датчиком ds18b20
#asm
.equ __lcd_port=0x12 ;PORTD // сообщаем куда подключён экран
#endasm
#include <lcd.h> // библиотека для LCD
#include <delay.h> // библиотека задержки
#include <stdio.h> // стандартная библиотека вывода символов на экран
unsigned char devices; // переменная в которой количество присоеденённых датчиков
int temp; // переменная для хранения температуры
unsigned char lcd_buffer[16];
void main(void) // Declare your global variables here
{
ACSR=0x80; // Analog Comparator: Off
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%1);// записуем в масив показания на экран
lcd_clear(); // чистим дисплей перед выводом
lcd_puts(lcd_buffer); // выводим масив на LCD
delay_ms(500); // ждём 500мс
};
} Код: Выделить всё
lcd_gotoxy(0,0);
lcd_putsf("t=");
lcd_putchar(temp/10+0x30);
lcd_putchar(temp%10+0x30);
lcd_putchar('.');
lcd_putchar('0');
lcd_putsf("\xdfC"); Код: Выделить всё
АЦП для AT90S8535 на плате Atmel STK500
Установите следующие перемычки на плате STK500: VTARGET, AFER,RESET, XTALI, OSCSEL: 1-2
Соедините разъёмы PORTB и LEDS с помощью 10-жильного плоского кабеля
Соедините разъёмы ISP6?IN и SPROG3 с помощью 6- жильного плоского кабеля
AT90S8535 должен быть расположен в панельке SCKT3100A3
A AVR Studio в окне Tools |STK500| Board установить:
- VTarget=5V
-ARef=5V
-Oscillator=3.63IAo
Подайте положительное DC напряжение в диапазоне 0...5V между выводами PA0 и GND разъёма PORTA
Определения регистров ввода/вывода для AT90S8535
#include<90s8535.h> // функции задержки
#include<delay.h>
#define ADC_VREF_TYPE 0*00 // программа обслуживания прерывания АЦП
interrupt [ADC_INT] void adc-isr(void) // светодиоды отображают 8 наиболее значимых битов АЦП
{
PORTB=(unsigned char) ~ (ADCW>>2); // задержка 20мс
delay_ms(20);
// Начало нового АЦ преобразования
ADCSR|=0*40;
}
void main (void)
{
// инициализация порта В
PORTB=0*FF; // все выходы
DDRB=0*FF; //все светодиоды первоначально выключены
//инициализация АЦП
//тактовая частота АЦП: 57.656 кГц
//Прерывания АЦП: Вкл
ADCSR=0*8E;
// глобальное разрешение прерываний
#asm("sei")
// выберем вход 0 АЦП
ADMUX=0;
//Запустим первое АЦ преобразование
ADCSR|=0*40;
// Вся работа делается посредством АЦП прерываний
while(1);
}
//#define ADC_VREF_TYPE 0*00
Код: Выделить всё
PORTB=(unsigned char) ~ (ADCW>>2); // задержка 20мс
ADCSR|=0*40;
PORTB=0*FF; // все выходы
DDRB=0*FF; //все светодиоды первоначально выключены
ADCSR=0*8E;
ADCSR|=0*40;
Код: Выделить всё
PORTB=(unsigned char) ~ (ADC>>2);
delay_ms(20);// задержка 20мс
ADCSR|=0x40;
PORTB=0xFF; // все выходы
DDRB=0xFF; //все светодиоды первоначально выключены
ADCSR=0x8E;
ADCSR|=0x40;