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

Обсуждаем контроллеры компании Atmel.
c717411
Встал на лапы
Сообщения: 148
Зарегистрирован: Ср дек 29, 2010 21:19:03

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

Сообщение c717411 »

isx писал(а):Д в том то и дело, что я только присваиваю ей значение и все.
Присваиваю countob = 65536; а протеус показывает "0". Вместо 65538 показывает 2 и т.д..

Добавьте переменную в Watch Window по адресу, установите нужный размер - 4 байта в Вашем случае, будет отображать корректно.
Изображение
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

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

Сообщение isx »

Ошибка выходит... (

Изображение
c717411
Встал на лапы
Сообщения: 148
Зарегистрирован: Ср дек 29, 2010 21:19:03

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

Сообщение c717411 »

адрес традиционно задается в 16-ричном виде - 0x1234. Ну и соответственно нам нужна data memory
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

isx писал(а):Д в том то и дело, что я только присваиваю ей значение и все.
Присваиваю countob = 65536; а протеус показывает "0". Вместо 65538 показывает 2 и т.д..
Протеус unsigned long отображает как 2-х байтную - это глюк протеуса. Объявите её как signed long и будет отображаться нормально.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

igumich писал(а):Всплыла другая проблема! vol=0 vol=1... и т.д. до vol=10, далее крутим назад vol=90 vol=80...
а нолик после того как "10" написали, кто стирать будет? ай-яй-яй!))))
Ставим плюсы: )
igumich
Встал на лапы
Сообщения: 100
Зарегистрирован: Сб ноя 06, 2010 19:17:02
Откуда: Россия, Омск

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

Сообщение igumich »

ibiza11 писал(а):
igumich писал(а):Всплыла другая проблема! vol=0 vol=1... и т.д. до vol=10, далее крутим назад vol=90 vol=80...
а нолик после того как "10" написали, кто стирать будет? ай-яй-яй!))))

всё получилось, но вот есть ещё одна загвоздка. понять никак не могу.
вот код
#include <mega8.h> //библиотека ввода\вывода
#include <delay.h> //библиотека задержки
#asm //сообщаем куда подключен датчик
.equ __w1_port=0x15; PORTC
.equ __w1_bit=3
#endasm
#asm //сообщаем куда подключён экран
.equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h> //библиотека для LCD
#include <1wire.h> //библиотека работы с 1Wire
#include <ds18b20.h> //библиотека для работы с датчиком ds18b20
#include <stdio.h> //ненаю что за библиотека, но без неё неполучается
unsigned int sek; // переменная сек.
unsigned int min; // пересенная мин.
unsigned int hour; // переменная часов
// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void) // таймер выставлен на частоту 1 Гц
{
// Place your code here
TCNT1H=0;
TCNT1L=0;
sek++; // инкрементируем секунду

}
unsigned char devices; //переменная в которой количество присоеденённых датчиков

int temp;
char lcd_buffer[33]; //масив с данными для экрана
void main(void)
{
PORTC=0x03;
DDRC=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: Normal top=FFFFh
// 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=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x1E;
OCR1AL=0x85;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

//переменная для хранения температуры
lcd_init(16);
//инициилизация LCD, и говорим что он на 16 символов
devices=w1_init(); //ищим датчики
#asm("sei")


while(1) //бесконечный цикл, если датчик подключон
{
temp=ds18b20_temperature(0); //читаем температуру
if (temp>1000) //если датчик выдаёт больше 1000
{
temp=4096-temp; //отнимаем от данных 4096
temp=-temp; //и ставим знак "минус"
}

if (temp<=25)
{

sprintf(lcd_buffer,"ALARM");
lcd_gotoxy(0,1);
lcd_puts(lcd_buffer);
}





sprintf(lcd_buffer,"t=%i.%u\xdfC",temp,temp%1); //записуемв масив для экрана температуру
lcd_gotoxy(4,0);
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(50);



// роботаем с кнопками
if (PINC.0==0) // если нажата первая кнопка
{
delay_ms(20); // задержка 1/4 сек. (для удобства) выбора
min++; // к значению минуты добавляем еденицу
}
if (PINC.1==0) // если нажата вторая кнопка
{
delay_ms(20); // задержка 1/4 сек. (для удобства) выбора
hour++; // к значению часов добавляем еденицу
}
///// Условия часов.
if(sek==60) // если сек = 60
{
min++; // добавляем 1 к переменной "минута"
sek=0; // зануляем переменную "секунда"
}
if(min==60) // если мин = 60
{
hour++; // добавляем 1 к переменной "час"
min=0; // зануляем переменную "минута"
}
if (hour==24) // так как у нас часы имеют 24 часовый формат
{ // при достыжении 24 часов, онулируем все переменные.
hour=0;
min=0;
sek=0;
}
// выводим переменные
lcd_gotoxy(8,1);
lcd_putchar(hour/10+0x30);
lcd_putchar(hour%10+0x30);
lcd_putchar(':');
lcd_putchar(min/10+0x30);
lcd_putchar(min%10+0x30);
lcd_putchar(':');
lcd_putchar(sek/10+0x30);
lcd_putchar(sek%10+0x30);
};

}

Проблема такая. Температуру отображает нормально, но вот время... все цифры моргают раз в секунду и при настройке часов и минут прибавляет с задержкой раз в секунду,если зажать соответствующую кнопку. хотя задержка на кнопках такая что по идее цифры должны "летать". никак не могу разобраться, кажется я что-то напутал с while(1)
Аватара пользователя
Сериг
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

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

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

Так все правильно. Вывод информации на экран у вас происходит примерно раз в секунду( зависит от того, сколько настроено время конвертирования температуры датчика). А вот изменение переменной происходит практически мнгновенно. Хотите что бы цифры менялись почти сразу? - Запихните вывод на экран в таймер... Правда чувство у меня, что время со временем будет отставать :) если конечно не запустить другой таймер... Но это уже совсем другая история :))
Александр 2677
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн фев 22, 2010 11:16:00

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

Сообщение Александр 2677 »

Добрый день. Подскажите пожалуйста в чём может быть подвох? Подключаю модуль часов DS1302 стандартной библиотекой CodeWision .
Изображение
В протеусе работает как надо а в железе данные возвращаются с ошибкой вот лог терминала
Second = 12
Second = 92
Second = 124
Second = 144
Second = 14
Second = 94
Second = 18
Second = 98
Second = 92
Second = 132
Second = 20
Second = 100
Second = 126
Second = 146
Second = 22
Second = 102
Пробовал заваливать ардуиновский скетч, так с ним часы работают как часы.
Аватара пользователя
Сериг
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

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

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

Экстрасенсы есть? А настрадамусы? А...
Может коТ выложите?
Александр 2677
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн фев 22, 2010 11:16:00

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

Сообщение Александр 2677 »

Пардон.
Вложения
Новая папка (6).rar
(109.76 КБ) 189 скачиваний
igumich
Встал на лапы
Сообщения: 100
Зарегистрирован: Сб ноя 06, 2010 19:17:02
Откуда: Россия, Омск

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

Сообщение igumich »

Сериг писал(а):Так все правильно. Вывод информации на экран у вас происходит примерно раз в секунду( зависит от того, сколько настроено время конвертирования температуры датчика). А вот изменение переменной происходит практически мнгновенно. Хотите что бы цифры менялись почти сразу? - Запихните вывод на экран в таймер... Правда чувство у меня, что время со временем будет отставать :) если конечно не запустить другой таймер... Но это уже совсем другая история :))


а что влияет на моргание отображения часов, и прибавляет переменные часов и минут(от кнопок) раз в секунду, когда в задержке 20мс. я этот момент понять не могу!

если я делаю вот так

while(1)
{
всё что к датчику и отображение температуры
while(1)
{
всё что к часам...
}
}

то у меня часы идут нормально и настройка часов и минут "летит", а вот температуру показывает ту, которая была зафиксирована в момент подачи питания на контроллер, и более не реагирует на изменения
Аватара пользователя
Сериг
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

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

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

Объясняю первый пункт вашего сообщения:
Вы опрашиваете датчик температуры в основном цикле. Он требует по максимуму 800 миллисекунд. После чего вы считываете температуру и выводите на дисплей. Дальше выводите состояние переменных времени. И так по кругу. Как вы можете видеть, каждый такой <<цикл>> имеет задержку в 800 миллисекунд (0,8 секунды), следовательно вывод на дисплей у вас будет происходить каждые примерно 800 мС. Если вы хотите мнгновенного отображения на дисплее состояния - сделайте вывод в прерывание, там же и опрашивайте кнопки! А вот опрос датчика пусть весит в основном цикле. Тем самым вы добьетесь:
Постоянное обновление отображения информации на экране, плюс опрос датчика температуры чуть меньше чем раз в секунду. " если я делаю вот так..." Вот так - это как? Код в студию!
igumich
Встал на лапы
Сообщения: 100
Зарегистрирован: Сб ноя 06, 2010 19:17:02
Откуда: Россия, Омск

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

Сообщение igumich »

Сериг писал(а):" если я делаю вот так..." Вот так - это как? Код в студию!



#include <mega8.h> //библиотека ввода\вывода
#include <delay.h> //библиотека задержки
#asm //сообщаем куда подключен датчик
.equ __w1_port=0x15; PORTC
.equ __w1_bit=3
#endasm
#asm //сообщаем куда подключён экран
.equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h> //библиотека для LCD
#include <1wire.h> //библиотека работы с 1Wire
#include <ds18b20.h> //библиотека для работы с датчиком ds18b20
#include <stdio.h> //ненаю что за библиотека, но без неё неполучается
unsigned int sek; // переменная сек.
unsigned int min; // пересенная мин.
unsigned int hour; // переменная часов
// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void) // таймер выставлен на частоту 1 Гц
{
// Place your code here
TCNT1H=0;
TCNT1L=0;
sek++; // инкрементируем секунду

}
unsigned char devices; //переменная в которой количество присоеденённых датчиков

int temp;
char lcd_buffer[33]; //масив с данными для экрана
void main(void)
{
PORTC=0x03;
DDRC=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: Normal top=FFFFh
// 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=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x1E;
OCR1AL=0x85;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

//переменная для хранения температуры
lcd_init(16);
//инициилизация LCD, и говорим что он на 16 символов
devices=w1_init(); //ищим датчики
#asm("sei")


while(1) //бесконечный цикл, если датчик подключон
{
temp=ds18b20_temperature(0); //читаем температуру
if (temp>1000) //если датчик выдаёт больше 1000
{
temp=4096-temp; //отнимаем от данных 4096
temp=-temp; //и ставим знак "минус"
}

if (temp<=25)
{

sprintf(lcd_buffer,"ALARM");
lcd_gotoxy(0,1);
lcd_puts(lcd_buffer);
}





sprintf(lcd_buffer,"t=%i.%u\xdfC",temp,temp%1); //записуемв масив для экрана температуру
lcd_gotoxy(4,0);
lcd_clear();
lcd_puts(lcd_buffer);
delay_ms(50);

while(1)
{

// роботаем с кнопками
if (PINC.0==0) // если нажата первая кнопка
{
delay_ms(20); // задержка 1/4 сек. (для удобства) выбора
min++; // к значению минуты добавляем еденицу
}
if (PINC.1==0) // если нажата вторая кнопка
{
delay_ms(20); // задержка 1/4 сек. (для удобства) выбора
hour++; // к значению часов добавляем еденицу
}
///// Условия часов.
if(sek==60) // если сек = 60
{
min++; // добавляем 1 к переменной "минута"
sek=0; // зануляем переменную "секунда"
}
if(min==60) // если мин = 60
{
hour++; // добавляем 1 к переменной "час"
min=0; // зануляем переменную "минута"
}
if (hour==24) // так как у нас часы имеют 24 часовый формат
{ // при достыжении 24 часов, онулируем все переменные.
hour=0;
min=0;
sek=0;
}
// выводим переменные
lcd_gotoxy(8,1);
lcd_putchar(hour/10+0x30);
lcd_putchar(hour%10+0x30);
lcd_putchar(':');
lcd_putchar(min/10+0x30);
lcd_putchar(min%10+0x30);
lcd_putchar(':');
lcd_putchar(sek/10+0x30);
lcd_putchar(sek%10+0x30);
};


}

}
igumich
Встал на лапы
Сообщения: 100
Зарегистрирован: Сб ноя 06, 2010 19:17:02
Откуда: Россия, Омск

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

Сообщение igumich »

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

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

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

Я вижу у вас два подряд бесконечных цикла, причем из которых вы не выходите. В этом и ошибка, судя по всему вы попадаете в цикл обработки кнопок, хотя я не понимаю как. Бесконечный цикл в данном случае у вас должен быть один. Исправляйте!
igumich
Встал на лапы
Сообщения: 100
Зарегистрирован: Сб ноя 06, 2010 19:17:02
Откуда: Россия, Омск

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

Сообщение igumich »

я уже всю голову сломал! :( ничего сообразить не могу. помоги куском кода, просто мне как-то трудно на словах воспринять...
а если сделать 2 бесконечных цикла. отдельно на температуру и отдельно на время?
Аватара пользователя
Сериг
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

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

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

То микроконтроллер зависнет в первом. Если конечно нет из нее выхода методом return/brake...
Извинтиляюсь, какой тебе кусок кода надо? Как бы я сделал? Я бы сделал через таймер и тд... Тогда ты уже точно ничего не поймешь!
Demon
Нашел транзистор. Понюхал.
Сообщения: 164
Зарегистрирован: Сб янв 20, 2007 20:44:33
Откуда: Из закаулков вашей души

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

Сообщение Demon »

Подскажите как в CVAVR директивами предпроцессора описать следующию структуру:

если микроконтроллер ATMEGA8 то TXSize=32
если микроконтроллер ATMEGA16 то TXSize=64
в остальных случаях TXSize=64

Нужно для того чтобы каждый раз не переписывать свою библиотеку под каждый МК
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

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

#define ATMEGA8
// #define ATMEGA16

//...
#undef TXSize

#ifdef ATMEGA8
#define TXSize 32
#endif

#ifdef ATMEGA16
#define TXSize 64
#endif 
Ставим плюсы: )
Demon
Нашел транзистор. Понюхал.
Сообщения: 164
Зарегистрирован: Сб янв 20, 2007 20:44:33
Откуда: Из закаулков вашей души

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

Сообщение Demon »

Не совсем подходит т.к. одну и туже библиотеку пользуют несколько МК одновременно, может есть вариант с управлением из main.c?
Ответить

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