Страница 303 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср мар 26, 2014 09:57:23
pyzhman
pokk писал(а):EEPROM по нужному мне адресу ?
Так пробовали:
?
pokk писал(а):как стереть всю EEPROM ?
Создать, записать - не получается?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср мар 26, 2014 11:14:09
pokk
Так пробовали:
То что надо благодарю!!!
Создать, записать - не получается?
ага в принципе так и сделал. Как и испоганил всю EEPROM так же и записал туда FF =)
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср мар 26, 2014 21:05:08
С_а_н_ы_ч
Доброго времени суток, подскажите в CVAVR_2.05.3 стандартной библиотеке glcd.h можно как-нибудь графику, ну линию например одну стереть, не очищая весь экран glcd_clear()'ом?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср мар 26, 2014 22:47:29
pyzhman
Не юзал, но логичное решение - нарисовать пустыми битами.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср мар 26, 2014 23:43:21
С_а_н_ы_ч
pyzhman писал(а):Не юзал, но логичное решение - нарисовать пустыми битами.
Пробовал инверсным цветом (дисплей монохром 3310) не работает

Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт мар 27, 2014 13:45:14
radio-kot
Помогите! человек от CVAVR страдает
http://goo.gl/3keQWJ не компилит не работает

Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн мар 31, 2014 19:35:51
jazz393
кто-нибудь прикручивал текстовые редакторы типа Notepad++ или sublime text 2/3 к компилятору cvavr, чтобы компилить прямо из редактора?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт апр 01, 2014 18:22:20
isx
Здравствуйте!
Помогите пожалуйста с таймерами на атмеге8.
Есть код, который посредством 16-ти битного таймера считает длительность импульса. Эту величину нужно выводить на дисплей 1602. Как правильно организовать задержку в выборке значений и выводе их на экран, ато дисплей не сможет обновляться с частотой в несколько килогерц

...
Код: Выделить всё
#include <mega8.h>
long a=0,b=0,c=0;
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
if(a==0) //считываем таймер в "a"
{
a=ICR1;
}
else //находим разницу
{
b=ICR1;
c=b-a;
TCNT1=0x00;
a = 0;
#asm("cli")
}
}
void main(void)
{
PORTB=0x01;
DDRB=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Normal top=0xFFFF
// Input Capture on Rising Edge
// Input Capture Interrupt: On
TCCR1A=0x00;
TCCR1B=0xC3;
TCNT1=0x00;
ICR1=0x00;
TIMSK=0x20;
#asm("sei")
while (1)
{
}
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт апр 01, 2014 18:31:42
Аlex
Эту величину нужно выводить на дисплей 1602. Как правильно организовать задержку в выборке значений и выводе их на экран, ато дисплей не сможет обновляться с частотой в несколько килогерц
В основном цикле. Не ?
Как правильно организовать задержку
Что значит "правильно" ?
Delay_Ms не подойдёт ?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт апр 01, 2014 18:43:37
isx
Хотелось бы без delay, мало ли что потом в код дописать нужно будет...

А можно ли сделать так:
1) Включаем 16-ти битный таймер. Делаем замер. Отключаем таймер.
2) Включаем 8-ми битный таймер. Делаем 15 циклов (около 0.5сек).Отключаем таймер.
3) Выводим данные на дисплей.
Не будет ли проблем из-за постоянного включения и отключения таймеров?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт апр 01, 2014 21:11:26
Panda_Y2K
А если считать 10-50 длительностей, находить среднее и тогда не нужно будет слишком часто выводить на экран данные и цифры так сильно скакать не будут.
А так классическая задержка
i=10000;
while (i)
i--;
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт апр 01, 2014 22:05:42
ARV
1. для чего вы в прерывании делаете запрет прерываний? при выходе из обработчика они все равно разрешатся автоматически...
2. чем не устраивает такой алгоритм опроса и вывода:
Код: Выделить всё
int get_dlit(void); // эта функция возвращает длительность импульса
void main(void){
int result;
while(1){
result = get_dlit(); // получаем
out_to_lcd(result); // выводим
delay_ms(1000); // задержка
}
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт апр 01, 2014 22:58:36
isx
Panda_Y2K писал(а):данные и цифры так сильно скакать не будут
Хорошая мысль. Спасибо
Panda_Y2K писал(а):while (i)
Можно в принципе... Просто хотел таймер присобачить, ато что он без дела висит...
ARV писал(а):для чего вы в прерывании делаете запрет прерываний?
Это где?
ARV писал(а):чем не устраивает такой алгоритм опроса и вывода
Delay злая вещь. Пока просто тахометр у меня, но возможно в будущем придётся дополнить код какими-либо наворотами, а там от такой задержки может плохо стать
Тоесть с включением/отключением таймеров лучше не баловаться?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт апр 01, 2014 23:32:58
ARV
isx писал(а):ARV писал(а):для чего вы в прерывании делаете запрет прерываний?
Это где?
это там:
isx писал(а):Код: Выделить всё
#include <mega8.h>
long a=0,b=0,c=0;
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
if(a==0) //считываем таймер в "a"
{
a=ICR1;
}
else //находим разницу
{
b=ICR1;
c=b-a;
TCNT1=0x00;
a = 0;
#asm("cli") // ВОТ ИМЕННО ТУТ
}
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт апр 01, 2014 23:35:54
ARV
isx писал(а): Delay злая вещь. Пока просто тахометр у меня, но возможно в будущем придётся дополнить код какими-либо наворотами, а там от такой задержки может плохо стать
Тоесть с включением/отключением таймеров лучше не баловаться?
сами по себе всякие вещи не злые и не добрые, злыми или добрыми их делают люди.
во всяком случае задержка по таймеру мало чем лучше задержки функцией.
никто не запретит вам все ваши навороты делать как раз по прерываниям, а результаты этих наворотов выводить неспеша по задержкам...
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср апр 02, 2014 04:26:33
pokk
isx писал(а):Хотелось бы без delay, мало ли что потом в код дописать нужно будет...

А можно ли сделать так:
1) Включаем 16-ти битный таймер. Делаем замер. Отключаем таймер.
2) Включаем 8-ми битный таймер. Делаем 15 циклов (около 0.5сек).Отключаем таймер.
...
2) Зачем выключать таймер ? сделайте его на какой-то элементарный шаг к примеру 10 миллисекунд и внутри его увеличивайте счётчик
а в главном цикле смотрите на этот счётчик.(Или вообще этот счётчик в ваше прерывание(где замер делаете) запихать если такое возможно)
Код: Выделить всё
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
counter++;
}
void main(void){
int result;
while(1){
result = get_dlit(); // получаем
if(counter>100){
out_to_lcd(result); // выводим 1 раз в секуну
counter=0;
}
}
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср апр 02, 2014 16:37:28
isx
Здравствуйте. Почему переменная объявленная таким образом,
, не принимает значений более 65535?
Вроде так ведь должно быть:
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср апр 02, 2014 17:07:14
ARV
судя по всему у вас проблема не с переменной, а с выражением, результат вычисления которого вы заносите в переменную. код в студию - экстрасенсы в отпуске...
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср апр 02, 2014 18:09:39
isx
Д в том то и дело, что я только присваиваю ей значение и все.
Присваиваю countob = 65536; а протеус показывает "0". Вместо 65538 показывает 2 и т.д..
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср апр 02, 2014 18:47:10
igumich
А как всё таки убрать мирцание LCD? убирал lcd_clear(), моргать перестал. Всплыла другая проблема!
vol=0 vol=1... и т.д. до vol=10, далее крутим назад vol=90 vol=80...
#include <mega8.h>
int NewState,OldState,upState,downState;
#asm
.equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h>
#include <stdio.h>
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
NewState=PINB & 0b00000011;
if(NewState!=OldState)
{
switch(OldState)
{
case 2:
{
if(NewState == 3) upState++;
if(NewState == 0) downState++;
break;
}
case 0:
{
if(NewState == 2) upState++;
if(NewState == 1) downState++;
break;
}
case 1:
{
if(NewState == 0) upState++;
if(NewState == 3) downState++;
break;
}
case 3:
{
if(NewState == 1) upState++;
if(NewState == 2) downState++;
break;
}
}
OldState=NewState;
}
TCNT1H=0x00;
TCNT1L=0x00;
}
void main(void)
{
char lcd_buf[17];
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=P State0=P
PORTB=0x03;
DDRB=0x08;
ASSR=0x00;
TCCR2=0x6C;
TCNT2=0x00;
OCR2=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x0A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x03;
OCR1AL=0xE8;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;
// Global enable interrupts
#asm("sei")
lcd_init(16);
while (1)
{
if (upState >= 4)
{
OCR2=OCR2+0x02;
upState = 0;
}
if (downState >= 4)
{
OCR2=OCR2-0x02;
downState = 0;
}
sprintf(lcd_buf,"\xB1p\xBAoc\xBF\xC4=%d",OCR2);
lcd_gotoxy(0,0);
lcd_puts(lcd_buf);
};
}