CodeVision AVR в вопросах и ответах
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
У 74HC405x при 5 вольтах типовое сопростивление канала 70 Ом. Ближе к земле и питанию меньше, около 60.
Мне кажется, что должно заработать.
Мне кажется, что должно заработать.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
- Сериг
- Это не хвост, это антенна
- Сообщения: 1451
- Зарегистрирован: Пт фев 19, 2010 19:39:28
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
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. я на почту
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
данная строчка присваивает создает указатель с именем _str1 на данную строкуСериг писал(а): спасибо огромное!Только не очень понял что означает вот эта строчкаКод: Выделить всё
char *_str1="2 Tepјoјeїpa 1\x60C";
я же сказал, нужно читать справку по printf()! В данном случае sprintf()Сериг писал(а): этаКод: Выделить всё
lcd_buffer_1," t%u=%i.%u\xdfC ",i+1,temp1,temp1%1
Вкратце, в буфер lcd_buffer_1 помещается строка с правилами, указанными в кавычках.Далее по справке будет понятно.Выводится на экран температура судя по переменным
правильно, только не переменные, а в данном случае похоже это строки дисплея количество буферов может быть любым, это зависит от того, что нужно сделать и от оперативной памяти МкСериг писал(а): и для чего нужен LCD буфер,их аж целых три,я так понимаю хранить каки-то выводимые переменные?
Записать можно несколькими способамиСериг писал(а):тогда каким образом их туда записывать?
1.Неизменную строку
Код: Выделить всё
str="какая то строка"
2.Вывод переменных с помощью функций формирования строк
sprintf() и других.
ОК, жду почтового идентификатораСериг писал(а):P.S. я на почту
PS.Я написал, что символ с номером 60, только в шестнадцатеричной системе.То есть номер 0х60.
В поисках истины человек развивается.
- Сериг
- Это не хвост, это антенна
- Сообщения: 1451
- Зарегистрирован: Пт фев 19, 2010 19:39:28
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
огромнейшее спасибо!
и последний вопрос
что означает символ с номером 60, только в шестнадцатеричной системе.То есть номер 0х60,то есть что означает 0x60?
и последний вопрос
Re: CodeVision AVR в вопросах и ответах
Подскажите как можно сделать преобразование дробных чисел из десятичной системы в двоично десятичную.
для целых чисел сделал делением.
теперь понадобилось выводить на LCD дробные, а как не как придумать не могу.
пробовал умножить дробные число, но CodeVisionalAVR выдаёт зелёную ошибку что типа возможно может быть переполнение. (overflow is possible in 16 bit multiplication, casting to 'long' may be required) а на индикаторе только целая часть показывается (из 3.15 после умножения на 100 выводит только 300)
С умножением я что-то напутал теперь ещё раз по пробовал заработало. Только непонятно как запятую ставить.
для целых чисел сделал делением.
Код: Выделить всё
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)
С умножением я что-то напутал теперь ещё раз по пробовал заработало. Только непонятно как запятую ставить.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Сериг писал(а):то есть что означает 0x60?
помнится мне я вот в этом посте конкретно написал что означает это число смотрим таблицу и под номером 0x60 будет тот символ, что вам нужен.Хотя если выводится на lcd то у него может быть своя таблица, которую нужно смотреть в даташите на дисплей.
Re: CodeVision AVR в вопросах и ответах
Что-то стало меня напрягать инициализация портов таймеров и тд сильно уже большая идёт и замучился гонять экран вверх вниз. Что бы от этого избавится вынес в функции и по сворачивал их. Но чувствую что это не совсем правильно. Как можно по другому это сделать? и ещё не большой вопросик вот когда пишем #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;
}- BCluster
- Собутыльник Кота
- Сообщения: 2512
- Зарегистрирован: Пн апр 06, 2009 19:33:29
- Откуда: Молдова, Кишинев
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Нормально конечно, я бы еще в другой файл их вынес нафиг ) А в мейне только вызывал бы эти иниты)
Последний раз редактировалось BCluster Ср окт 24, 2012 10:13:47, всего редактировалось 1 раз.
Re: CodeVision AVR в вопросах и ответах
Как ? библиотеку создать ?
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Чтобы не напрягал длинный листинг придумана include. Нужное место в программе оформляете как отдельный файл *.с и прописываете в теле программы #include "*.с". А если в виде функций, то один хрен болтаться будет в теле и плюс съедать память на вызов функции и возврат из нее.
Библиотека на то и библиотека, есть все, но берем только то, что надо. Короче возьмется только та функция, которая прописана в теле программы. Остальное не войдет в программу.
Библиотека на то и библиотека, есть все, но берем только то, что надо. Короче возьмется только та функция, которая прописана в теле программы. Остальное не войдет в программу.
Docendo discimus
Re: CodeVision AVR в вопросах и ответах
Отлично то что надо благодарю за помощь.
Re: CodeVision AVR в вопросах и ответах
#include "*.с"
Вообще-то .h:)
Не умеешь - не берись, но не взявшись не научишься...
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Перечитываем мой предыдущий пост еще раз. И внимательно.
Docendo discimus
Re: CodeVision AVR в вопросах и ответах
Почему в роботе не могу поменять значение регистра сравнения OCR2 , тоисть я не могу перестраивать его как мне нужно, что бы менять время прерываний( ?
Код: Выделить всё
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
TCNT2=0x00;
OCR2=0xF;
if(digit==0)
{
digit=8;
OCR2=0xFF;
}
digit--;- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
А прерывания то разрешили?
Еще одно замечание:
Зачем вам сначала устанавливать одно значение OCR2, а потом после определенного условия еще раз его менять?Может это присвоение как то в условие поместить?
Еще одно замечание:
Зачем вам сначала устанавливать одно значение OCR2, а потом после определенного условия еще раз его менять?Может это присвоение как то в условие поместить?
Re: CodeVision AVR в вопросах и ответах
да разрешыл я прерывания, то просто кусок из кода, вот весь код
Это я хочу вот такое сделать http://bsvi.ru/bam-alternativa-shimu/, но вот не работает из за того что не меняется время прерываний ((
Код: Выделить всё
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/, но вот не работает из за того что не меняется время прерываний ((
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
viewtopic.php?f=20&t=68801
делал на переполнении 1 таймера.
делал на переполнении 1 таймера.
Re: CodeVision AVR в вопросах и ответах
А в чем тогда проблемма в моем случае?
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
А почему Вы решили, что OCR2 не меняет значение?
Может, таймер не так настроен?
А вообще я бы не занулял таймер в прерывании. Просто проинициализировать так, чтобы прерывание по сравнению, таймер отпустить с правильным прескалером (чтобы и прерывания успевали, но чтобы основная частота не слишком низкая была) и что-то такое:
Начальное значение 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;
}
} Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Re: CodeVision AVR в вопросах и ответах
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;
Просто даже раньше, не в этом проекте, через кнопку менял значение регистра сравнения, но на осцылограмме осцылографа в протеусе ничего не менялось!