CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение pyzhman »

Код: Выделить всё

nnn*= 100;
nnn= ceil(nnn);
nnn/= 100;

Хотя куда девается сотая - не въехал. И что это вы там из чего ожидаете? Ну-ку, ну-ка? Сказал А, говори и Б.
Docendo discimus
Аватара пользователя
wellcom
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Чт фев 24, 2011 13:00:49

Re: CodeVision AVR в вопросах и ответах

Сообщение wellcom »

В общем правильный вариант будет таков:
Data_Tmp *=100.0;
Data_Tmp = ceil(Data_Tmp);
Data_Tmp /=100.0;
как видно, вместо floor стоит ceil. в результате чего получаються нужные числа, так как при использовании floor, от числа еще кудато девается 0,01. (вероятней всего из за того, что у меня в проге умножается целое число на 0,010986328125, а уж потом от етого числа....)

на примере floor число 240,000000000, будет возвращено как 239,99
на примере ceil число 240,000000000, будет возвращено как 240,00
:) спасибо отозвавшимся котам! :beer:
:solder: 32-х ядерный процессор из П213В
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение pyzhman »

floor возвращает меньшее, ceil большее целое. Так и остался в непонятках.
Docendo discimus
Аватара пользователя
wellcom
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Чт фев 24, 2011 13:00:49

Re: CodeVision AVR в вопросах и ответах

Сообщение wellcom »

pyzh_man писал(а):floor возвращает меньшее, ceil большее целое. Так и остался в непонятках.


я и сам не понял почему, но факт! - работает! :))
:solder: 32-х ядерный процессор из П213В
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение pyzhman »

Тама не отрицательные числа фигурируют случаем?
Docendo discimus
Аватара пользователя
wellcom
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Чт фев 24, 2011 13:00:49

Re: CodeVision AVR в вопросах и ответах

Сообщение wellcom »

pyzh_man писал(а):Тама не отрицательные числа фигурируют случаем?


нет, я считываю данные с датчика в виде кода грея, преобраз в двоичн еквивалент, умножаю на 0,010986328125, добавляю еще один float и если выходит > 360 то отнимаю 360 и вывожу на усарт после того как оставляю 2 числа после запятой...в результате вот такое и получается...
:solder: 32-х ядерный процессор из П213В
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

Re: CodeVision AVR в вопросах и ответах

Сообщение levaclaus »

Мастер Ломастер писал(а):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; // очищаем незначащие позиции
         }

Далее настройка регистров
Далее void main c инициализацией датчиков

temp=Блаблабла
if(temp < 0){ // если температура отрицательная,
out(-temp); // то выводим ее по модулю и
massiv[0] = MINUS; // в первом индикаторе зажигаем минус
} else { // а если положительная,
out(temp); // то выводим ее, как есть
massiv[0] = 0; // и гасим первый индикатор
}
massiv[2] |= COMMA;

end

Что я упустил?
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Мастер Ломастер »

levaclaus писал(а):Что я упустил?
вы упустили внимательное чтение рекомендованной мной статьи, в которой рассказано, ЧТО и КАК лучше делать. в частности, четко даны рекомендации что именно делать в прерывании, а что - вне него.
битва с дураками проиграна, победители торжествуют. слава победителям!
loshvitalik
Нашел транзистор. Понюхал.
Сообщения: 176
Зарегистрирован: Чт май 05, 2011 12:58:32
Откуда: Екатеринбург
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение loshvitalik »

При использовании программатора ByteBlaster, какой тип программатора надо выбирать в CVAVR? Или не поддерживается?
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

Re: CodeVision AVR в вопросах и ответах

Сообщение levaclaus »

Мастер Ломастер писал(а):
levaclaus писал(а):Что я упустил?
вы упустили внимательное чтение рекомендованной мной статьи, в которой рассказано, ЧТО и КАК лучше делать. в частности, четко даны рекомендации что именно делать в прерывании, а что - вне него.

теперь я с уверенность могу заявить что вы сами не читали статью, что дали мне. Там ни слова про прерывания по таймеру. И информации там крайне ограниченно. Общие понятия и ниодного конкретного примера. А ведь всё на примерах изучается.
Мой случай поправим - я найду другого учителя - более адекватного.
Ваш - нет! :shock:
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Мастер Ломастер »

levaclaus писал(а):теперь я с уверенность могу заявить что вы сами не читали статью, что дали мне. Там ни слова про прерывания по таймеру. И информации там крайне ограниченно. Общие понятия и ниодного конкретного примера. А ведь всё на примерах изучается.
Мой случай поправим - я найду другого учителя - более адекватного.
Ваш - нет! :shock:
ай, ай, какие мы горячие :) ну дал человек не ту ссылку - сразу пениться надо? а сами на том сайте не пробовали пошарить? вот, например, там же есть почти РЯДОМ с той ссылкой: http://arv.radioliga.com/content/view/172/49/
первая ссылка была про перевод чисел, а эта - про индикацию, прерывания и т.п. судя по всему, вы не пытались даже поглядеть, куда вас направили... ну, тогда ищите более адекватного - я не подойду, слишком рассеянный, порой ошибаюсь или опечатываюсь, а вам же надо разжевать и по пищеводу в самый желудок пропихнуть... :)
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Garin
Потрогал лапой паяльник
Сообщения: 351
Зарегистрирован: Пн сен 12, 2011 12:13:46

Re: CodeVision AVR в вопросах и ответах

Сообщение Garin »

Зраствуйте, скажите как корректно сделать функцию отображения температуры без sprintf
вот например проект

Код: Выделить всё

/*****************************************************
                       
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");

Естественно мой второй вариант показывает только половину показаний.
Patrick
Родился
Сообщения: 3
Зарегистрирован: Вс дек 11, 2011 19:55:57

Re: CodeVision AVR в вопросах и ответах

Сообщение Patrick »

Добрый вечер. Помогите решить такую проблему:
Мне нужно заставить работать эту программу на модели микропроцессора в протеусе. Как это сделать, используя шаблон
codevisionavr cvavr и PROTEUS ATmega16.rar
(17.85 КБ) 184 скачивания

Код: Выделить всё

АЦП для 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
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение pyzhman »

Каую эту программу? В приложении одно, здесь в виде кода другое.
Docendo discimus
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: CodeVision AVR в вопросах и ответах

Сообщение BerZerK-ku »

Вроде человек не загадками говорит.
Есть готовый проект для протеуса (вложение), а есть программа для которой надо переделать этот проект (листинг).
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение pyzhman »

Код: Выделить всё

PORTB=(unsigned char) ~ (ADCW>>2);  // задержка 20мс

ADCSR|=0*40;

PORTB=0*FF;      // все выходы
DDRB=0*FF;       //все светодиоды первоначально выключены

ADCSR=0*8E;

ADCSR|=0*40; 

???
Docendo discimus
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: CodeVision AVR в вопросах и ответах

Сообщение BerZerK-ku »

За помощью обратился человек, который видимо вообще не знаком с Си/контроллерами.
А единственный заинтересовавшийся, судя по вопросам, похоже тоже ничего не смыслит в этих областях :))
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение pyzhman »

В таком разе вопрос вам: расшифруйте код в моем верхнем посте. :)
Docendo discimus
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: CodeVision AVR в вопросах и ответах

Сообщение BerZerK-ku »

Код: Выделить всё

PORTB=(unsigned char) ~ (ADC>>2);  
delay_ms(20);// задержка 20мс

ADCSR|=0x40;

PORTB=0xFF;      // все выходы
DDRB=0xFF;       //все светодиоды первоначально выключены

ADCSR=0x8E;

ADCSR|=0x40;
Что-то еще не понятно?
Аватара пользователя
C@at
Вымогатель припоя
Сообщения: 652
Зарегистрирован: Вс ноя 13, 2011 16:42:05
Откуда: Украина

Re: CodeVision AVR в вопросах и ответах

Сообщение C@at »

Да это мы так посты набиваем...
Ответить

Вернуться в «AVR»