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

Обсуждаем контроллеры компании Atmel.
Ответить
Опытный кот
Аватара пользователя
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна

Сообщение avreal »

У 74HC405x при 5 вольтах типовое сопростивление канала 70 Ом. Ближе к земле и питанию меньше, около 60.
Мне кажется, что должно заработать.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Контактная информация:
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Сообщение Сериг »

vitalik_1984 писал(а):Это же элементарно с CVAVR:

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

eeprom unsigned char saved_value =56;//Объявляем переменную по умолчанию
 unsigned char value 

//в начале работы
value=saved_value;
////////---------- разное,работаем с переменной value
//конец работы 
saved_value=value;//сохраняем значение
 
только вот вопрос о переносимости кода останется открытым.
что такое 2 Tepјoјeїpa 1\x60C?
Так это же та самая строка разве не понятно?Читайте справку по printf();
\x60 здесь это символ номер 60 втаблице символов ASCII
спасибо огромное!Только не очень понял что означает вот эта строчка

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

char *_str1="2 Tepјoјeїpa 1\x60C";
эта

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

lcd_buffer_1," t%u=%i.%u\xdfC ",i+1,temp1,temp1%1
и для чего нужен LCD буфер,их аж целых три,я так понимаю хранить каки-то выводимые переменные?тогда каким образом их туда записывать?
спасибо!
P.S. я на почту :)))
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Сериг писал(а): спасибо огромное!Только не очень понял что означает вот эта строчка

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

char *_str1="2 Tepјoјeїpa 1\x60C";
данная строчка присваивает создает указатель с именем _str1 на данную строку
Сериг писал(а): эта

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

lcd_buffer_1," t%u=%i.%u\xdfC ",i+1,temp1,temp1%1
я же сказал, нужно читать справку по printf()! В данном случае sprintf()
Вкратце, в буфер lcd_buffer_1 помещается строка с правилами, указанными в кавычках.Далее по справке будет понятно.Выводится на экран температура судя по переменным
Сериг писал(а): и для чего нужен LCD буфер,их аж целых три,я так понимаю хранить каки-то выводимые переменные?
правильно, только не переменные, а в данном случае похоже это строки дисплея количество буферов может быть любым, это зависит от того, что нужно сделать и от оперативной памяти Мк
Сериг писал(а):тогда каким образом их туда записывать?
Записать можно несколькими способами
1.Неизменную строку

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

str="какая то строка"
2.Вывод переменных с помощью функций формирования строк
sprintf() и других.
Сериг писал(а):P.S. я на почту :)))
ОК, жду почтового идентификатора :wink:

PS.Я написал, что символ с номером 60, только в шестнадцатеричной системе.То есть номер 0х60.
В поисках истины человек развивается.
Контактная информация:
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Сообщение Сериг »

огромнейшее спасибо!
и последний вопрос :)) что означает символ с номером 60, только в шестнадцатеричной системе.То есть номер 0х60,то есть что означает 0x60?
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

Подскажите как можно сделать преобразование дробных чисел из десятичной системы в двоично десятичную.
для целых чисел сделал делением.

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

void LCD_BDC(unsigned int data)
{
    mass[0]=data/1000+0x30;
    mass[1]=data%1000/100+0x30; 
    mass[2]=data%1000%100/10+0x30;
    mass[3]=data%1000%100%10+0x30;  
}
теперь понадобилось выводить на LCD дробные, а как не как придумать не могу.
пробовал умножить дробные число, но CodeVisionalAVR выдаёт зелёную ошибку что типа возможно может быть переполнение. (overflow is possible in 16 bit multiplication, casting to 'long' may be required) а на индикаторе только целая часть показывается (из 3.15 после умножения на 100 выводит только 300)

С умножением я что-то напутал теперь ещё раз по пробовал заработало. Только непонятно как запятую ставить.
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Сериг писал(а):то есть что означает 0x60?
:facepalm: помнится мне я вот в этом посте конкретно написал что означает это число смотрим таблицу и под номером 0x60 будет тот символ, что вам нужен.
Хотя если выводится на lcd то у него может быть своя таблица, которую нужно смотреть в даташите на дисплей.
Контактная информация:
Реклама
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

Что-то стало меня напрягать инициализация портов таймеров и тд сильно уже большая идёт и замучился гонять экран вверх вниз. Что бы от этого избавится вынес в функции и по сворачивал их. Но чувствую что это не совсем правильно. Как можно по другому это сделать? и ещё не большой вопросик вот когда пишем #include <math.h> мы подключаем библиотеку из этой библиотеки я к примеру использую только одну функцию при компиляции он её выдернет из библиотеки и вставит как функцию? или же всю библиотеку скомпилирует и загонит в флеш память ?
Спойлер

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

void INIT_TIMER(void)
{
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 8000,000 kHz
// Mode: CTC top=OCR1A
// OC1A output: Disconnected
// OC1B output: Disconnected
// OC1C output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer Period: 0,25 ms
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<COM1C1) | (0<<COM1C0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
OCR1AH=0x07;
OCR1AL=0xCF;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (1<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);
}

void INIT_PORT(void)
{
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (1<<DDD3) | (1<<DDD2) | (1<<DDD1) | (1<<DDD0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=1 Bit2=1 Bit1=1 Bit0=1 
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (1<<PORTD3) | (1<<PORTD2) | (1<<PORTD1) | (1<<PORTD0);

PORTB=0;
DDRB=0xFF;

PORTC=0;
DDRC=0xFF;       

PORTA=0;
DDRA=0xFF;
}
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

Нормально конечно, я бы еще в другой файл их вынес нафиг ) А в мейне только вызывал бы эти иниты)
Последний раз редактировалось BCluster Ср окт 24, 2012 10:13:47, всего редактировалось 1 раз.
Контактная информация:
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

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

Сообщение pyzhman »

Чтобы не напрягал длинный листинг придумана include. Нужное место в программе оформляете как отдельный файл *.с и прописываете в теле программы #include "*.с". А если в виде функций, то один хрен болтаться будет в теле и плюс съедать память на вызов функции и возврат из нее.
Библиотека на то и библиотека, есть все, но берем только то, что надо. Короче возьмется только та функция, которая прописана в теле программы. Остальное не войдет в программу.
Docendo discimus
Контактная информация:
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

Отлично то что надо благодарю за помощь.
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

Сообщение Arlleex »

#include "*.с"
Вообще-то .h:)
Не умеешь - не берись, но не взявшись не научишься...
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Перечитываем мой предыдущий пост еще раз. И внимательно.
Docendo discimus
Контактная информация:
Встал на лапы
Сообщения: 95
Зарегистрирован: Ср ноя 02, 2011 15:11:49

Сообщение mich91 »

Почему в роботе не могу поменять значение регистра сравнения OCR2 , тоисть я не могу перестраивать его как мне нужно, что бы менять время прерываний( ?

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

interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
 TCNT2=0x00; 
 OCR2=0xF;
 
 if(digit==0)
   {
    digit=8;
    OCR2=0xFF;
   }
 digit--;
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

А прерывания то разрешили?

Еще одно замечание:
Зачем вам сначала устанавливать одно значение OCR2, а потом после определенного условия еще раз его менять?Может это присвоение как то в условие поместить?
Контактная информация:
Встал на лапы
Сообщения: 95
Зарегистрирован: Ср ноя 02, 2011 15:11:49

Сообщение mich91 »

да разрешыл я прерывания, то просто кусок из кода, вот весь код

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

interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
 TCNT2=0x00;
 
 if(digit==0)
   {
    digit=8;
   }
 digit--;
 OCR2=1<<digit; // не меняет значение  (((
 if(VALUE & (1<<digit))
  {
    PORTD.0=1;
  }
  else
  { 
    PORTD.0=0;
  }    
}
Это я хочу вот такое сделать http://bsvi.ru/bam-alternativa-shimu/, но вот не работает из за того что не меняется время прерываний ((
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

http://radiokot.ru/forum/viewtopic.php?f=20&t=68801
делал на переполнении 1 таймера.
Контактная информация:
Встал на лапы
Сообщения: 95
Зарегистрирован: Ср ноя 02, 2011 15:11:49

Сообщение mich91 »

А в чем тогда проблемма в моем случае?
Опытный кот
Аватара пользователя
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна

Сообщение avreal »

А почему Вы решили, что OCR2 не меняет значение?
Может, таймер не так настроен?

А вообще я бы не занулял таймер в прерывании. Просто проинициализировать так, чтобы прерывание по сравнению, таймер отпустить с правильным прескалером (чтобы и прерывания успевали, но чтобы основная частота не слишком низкая была) и что-то такое:

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

uint8_t mask = 0x01;
uint8_t value;

interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
    mask <<= 1;
    if (mask == 0) mask = 0x01;
    OCR2 += mask;
    if (value & mask) {
        PORTD.0=1;
    } else {
        PORTD.0=0;
    }   
} 
Начальное значение OCR2 не имеет значения.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Контактная информация:
Встал на лапы
Сообщения: 95
Зарегистрирован: Ср ноя 02, 2011 15:11:49

Сообщение mich91 »

avreal писал(а):А почему Вы решили, что OCR2 не меняет значение?
Может, таймер не так настроен?
А как нужно настроить таймер, у меня вот так
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x02;
TCNT2=0x00;
OCR2=0x80;
Просто даже раньше, не в этом проекте, через кнопку менял значение регистра сравнения, но на осцылограмме осцылографа в протеусе ничего не менялось!
Ответить

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