Добавьте переменную в Watch Window по адресу, установите нужный размер - 4 байта в Вашем случае, будет отображать корректно.isx писал(а):Д в том то и дело, что я только присваиваю ей значение и все.
Присваиваю countob = 65536; а протеус показывает "0". Вместо 65538 показывает 2 и т.д..
CodeVision AVR в вопросах и ответах
- Реклама
Re: CodeVision AVR в вопросах и ответах
адрес традиционно задается в 16-ричном виде - 0x1234. Ну и соответственно нам нужна data memory
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Протеус unsigned long отображает как 2-х байтную - это глюк протеуса. Объявите её как signed long и будет отображаться нормально.isx писал(а):Д в том то и дело, что я только присваиваю ей значение и все.
Присваиваю countob = 65536; а протеус показывает "0". Вместо 65538 показывает 2 и т.д..
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
а нолик после того как "10" написали, кто стирать будет? ай-яй-яй!))))igumich писал(а):Всплыла другая проблема! vol=0 vol=1... и т.д. до vol=10, далее крутим назад vol=90 vol=80...
Ставим плюсы: )
- Реклама
Re: CodeVision AVR в вопросах и ответах
всё получилось, но вот есть ещё одна загвоздка. понять никак не могу.ibiza11 писал(а):а нолик после того как "10" написали, кто стирать будет? ай-яй-яй!))))igumich писал(а):Всплыла другая проблема! vol=0 vol=1... и т.д. до vol=10, далее крутим назад vol=90 vol=80...
вот код
#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 в вопросах и ответах
Добрый день. Подскажите пожалуйста в чём может быть подвох? Подключаю модуль часов 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
Пробовал заваливать ардуиновский скетч, так с ним часы работают как часы.
В протеусе работает как надо а в железе данные возвращаются с ошибкой вот лог терминала
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 в вопросах и ответах
Пардон.
- Вложения
-
- Новая папка (6).rar
- (109.76 КБ) 189 скачиваний
Re: CodeVision AVR в вопросах и ответах
а что влияет на моргание отображения часов, и прибавляет переменные часов и минут(от кнопок) раз в секунду, когда в задержке 20мс. я этот момент понять не могу!Сериг писал(а):Так все правильно. Вывод информации на экран у вас происходит примерно раз в секунду( зависит от того, сколько настроено время конвертирования температуры датчика). А вот изменение переменной происходит практически мнгновенно. Хотите что бы цифры менялись почти сразу? - Запихните вывод на экран в таймер... Правда чувство у меня, что время со временем будет отставатьесли конечно не запустить другой таймер... Но это уже совсем другая история
если я делаю вот так
while(1)
{
всё что к датчику и отображение температуры
while(1)
{
всё что к часам...
}
}
то у меня часы идут нормально и настройка часов и минут "летит", а вот температуру показывает ту, которая была зафиксирована в момент подачи питания на контроллер, и более не реагирует на изменения
- Сериг
- Это не хвост, это антенна
- Сообщения: 1451
- Зарегистрирован: Пт фев 19, 2010 19:39:28
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
Объясняю первый пункт вашего сообщения:
Вы опрашиваете датчик температуры в основном цикле. Он требует по максимуму 800 миллисекунд. После чего вы считываете температуру и выводите на дисплей. Дальше выводите состояние переменных времени. И так по кругу. Как вы можете видеть, каждый такой <<цикл>> имеет задержку в 800 миллисекунд (0,8 секунды), следовательно вывод на дисплей у вас будет происходить каждые примерно 800 мС. Если вы хотите мнгновенного отображения на дисплее состояния - сделайте вывод в прерывание, там же и опрашивайте кнопки! А вот опрос датчика пусть весит в основном цикле. Тем самым вы добьетесь:
Постоянное обновление отображения информации на экране, плюс опрос датчика температуры чуть меньше чем раз в секунду. " если я делаю вот так..." Вот так - это как? Код в студию!
Вы опрашиваете датчик температуры в основном цикле. Он требует по максимуму 800 миллисекунд. После чего вы считываете температуру и выводите на дисплей. Дальше выводите состояние переменных времени. И так по кругу. Как вы можете видеть, каждый такой <<цикл>> имеет задержку в 800 миллисекунд (0,8 секунды), следовательно вывод на дисплей у вас будет происходить каждые примерно 800 мС. Если вы хотите мнгновенного отображения на дисплее состояния - сделайте вывод в прерывание, там же и опрашивайте кнопки! А вот опрос датчика пусть весит в основном цикле. Тем самым вы добьетесь:
Постоянное обновление отображения информации на экране, плюс опрос датчика температуры чуть меньше чем раз в секунду. " если я делаю вот так..." Вот так - это как? Код в студию!
Re: CodeVision AVR в вопросах и ответах
Сериг писал(а):" если я делаю вот так..." Вот так - это как? Код в студию!
#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);
};
}
}
Re: CodeVision AVR в вопросах и ответах
Время нормально, а вот изменения температуры нет. если сначала нагреть датчик, потом подать питание на контроллер, то покажет ту температуру, которую зафиксировал в момент включения, дальнейшие изменения температуры не отображаются
- Сериг
- Это не хвост, это антенна
- Сообщения: 1451
- Зарегистрирован: Пт фев 19, 2010 19:39:28
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
Я вижу у вас два подряд бесконечных цикла, причем из которых вы не выходите. В этом и ошибка, судя по всему вы попадаете в цикл обработки кнопок, хотя я не понимаю как. Бесконечный цикл в данном случае у вас должен быть один. Исправляйте!
Re: CodeVision AVR в вопросах и ответах
я уже всю голову сломал!
ничего сообразить не могу. помоги куском кода, просто мне как-то трудно на словах воспринять...
а если сделать 2 бесконечных цикла. отдельно на температуру и отдельно на время?
а если сделать 2 бесконечных цикла. отдельно на температуру и отдельно на время?
- Сериг
- Это не хвост, это антенна
- Сообщения: 1451
- Зарегистрирован: Пт фев 19, 2010 19:39:28
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
То микроконтроллер зависнет в первом. Если конечно нет из нее выхода методом return/brake...
Извинтиляюсь, какой тебе кусок кода надо? Как бы я сделал? Я бы сделал через таймер и тд... Тогда ты уже точно ничего не поймешь!
Извинтиляюсь, какой тебе кусок кода надо? Как бы я сделал? Я бы сделал через таймер и тд... Тогда ты уже точно ничего не поймешь!
-
Demon
- Нашел транзистор. Понюхал.
- Сообщения: 164
- Зарегистрирован: Сб янв 20, 2007 20:44:33
- Откуда: Из закаулков вашей души
Re: CodeVision AVR в вопросах и ответах
Подскажите как в CVAVR директивами предпроцессора описать следующию структуру:
если микроконтроллер ATMEGA8 то TXSize=32
если микроконтроллер ATMEGA16 то TXSize=64
в остальных случаях TXSize=64
Нужно для того чтобы каждый раз не переписывать свою библиотеку под каждый МК
если микроконтроллер ATMEGA8 то TXSize=32
если микроконтроллер ATMEGA16 то TXSize=64
в остальных случаях TXSize=64
Нужно для того чтобы каждый раз не переписывать свою библиотеку под каждый МК
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
Код: Выделить всё
#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 в вопросах и ответах
Не совсем подходит т.к. одну и туже библиотеку пользуют несколько МК одновременно, может есть вариант с управлением из main.c?


