Ничего подобного. Все регистры (и содержимое ОЗУ) остаются в тех состояниях, в которых были до сна.miharus писал(а):На порту висят светодиоды. Я так понял что при powerdown они должны выключиться.
CodeVision AVR в вопросах и ответах
- AI_Disable
- Сверлит текстолит когтями
- Сообщения: 1116
- Зарегистрирован: Чт окт 15, 2009 14:16:18
- Откуда: Екб
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
- Реклама
Re: CodeVision AVR в вопросах и ответах
Аааааа! ну спасибочки)
Re: CodeVision AVR в вопросах и ответах
есть на коте проект термометра на МК http://radiokot.ru/lab/controller/18/
есть CodeVisionAVR V2.05.0 писать не умею, хотел просто изменить назначение ножек, однако говорит, что непоместится в тиньку! - проект не изменял (для начала)
Chip: ATtiny2313
Clock frequency: 8,000000 MHz
Memory model: Tiny
Optimize for: Size
(s)printf features: long, width
(s)scanf features: int, width
Promote 'char' to 'int': No
'char' is unsigned: Yes
global 'const' stored in FLASH: No
8 bit enums: Yes
Enhanced core instructions: Yes
Automatic register allocation: Yes
Smart register allocation: Yes
Build: 435
7829 line(s) compiled
1 error(s) - ошибку не расшифровывает...
1 warning(s)
Bit variables size: 0 byte(s)
Data Stack area: 0x60 to 0x7F
Data Stack size: 32 byte(s)
Estimated Data Stack usage: 27 byte(s)
RAM Global variables area: 0x80 to 0xDB
RAM Global variables size: 92 byte(s)
Hardware Stack area: 0xDC to 0xDF
Hardware Stack size: 4 byte(s)
Heap size: 0 byte(s)
EEPROM usage: 0 byte(s), 0,0% of EEPROM
есть CodeVisionAVR V2.05.0 писать не умею, хотел просто изменить назначение ножек, однако говорит, что непоместится в тиньку! - проект не изменял (для начала)
Chip: ATtiny2313
Clock frequency: 8,000000 MHz
Memory model: Tiny
Optimize for: Size
(s)printf features: long, width
(s)scanf features: int, width
Promote 'char' to 'int': No
'char' is unsigned: Yes
global 'const' stored in FLASH: No
8 bit enums: Yes
Enhanced core instructions: Yes
Automatic register allocation: Yes
Smart register allocation: Yes
Build: 435
7829 line(s) compiled
1 error(s) - ошибку не расшифровывает...
1 warning(s)
Bit variables size: 0 byte(s)
Data Stack area: 0x60 to 0x7F
Data Stack size: 32 byte(s)
Estimated Data Stack usage: 27 byte(s)
RAM Global variables area: 0x80 to 0xDB
RAM Global variables size: 92 byte(s)
Hardware Stack area: 0xDC to 0xDF
Hardware Stack size: 4 byte(s)
Heap size: 0 byte(s)
EEPROM usage: 0 byte(s), 0,0% of EEPROM
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Странно всегда расшифровывал, а у вас нет...ra6fnq писал(а): 1 error(s) - ошибку не расшифровывает...
1 warning(s)
Всегда показывает в окне просмотра проекта открывается так: View(вид)->Code Navigator(Дерево проекта)
Нужно обязательно устранить ошибки.
А вообще точно такой же проект тутеще и часы:)
В поисках истины человек развивается.
Re: CodeVision AVR в вопросах и ответах
это ошибка линкера - места в 2313 не хватает...
у автора хватало, а у мня не хватает... в 4313 всё отлично... в чём причина? попробовать в какой нибудь старой версии CVavr?
что зацепило - полный код и возможность не копировать а разобраться, что в полтинник уже не так просто...
что зацепило - полный код и возможность не копировать а разобраться, что в полтинник уже не так просто...
- Реклама
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
у автора хватило места.А что там у вас можете знать только вы.Откройте свойства проекта Project->Configurera6fnq писал(а):это ошибка линкера - места в 2313 не хватает...у автора хватало, а у мня не хватает... в 4313 всё отлично... в чём причина? попробовать в какой нибудь старой версии CVavr?
что зацепило - полный код и возможность не копировать а разобраться, что в полтинник уже не так просто...
там на вкладке C Compile в списке Optimizaiton level выберите maximal
А еще в строке ошибка, может поэтому не получается?:)
вот правильный код
Код: Выделить всё
if (devices == 0) {
str[0] = 'E'; //Выводим сообщение об ошибке.
str[1] = 'r';
str[2] = 'r';
str[3] = '';
while (1){
//Ходим по кругу.
};А еще ошибка линкера это потому, что массив для цифр неправильно продекларирован
вот как нужно:
flash unsigned char digit_ar[17]
Круто в статье такие ошибки.
В поисках истины человек развивается.
- Volgol_555
- Потрогал лапой паяльник
- Сообщения: 301
- Зарегистрирован: Пт сен 23, 2011 13:13:51
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Всем привет. Возможно вопрос уже поднимался!...Есть 2 датчика температуры DS18B20. У них у каждого свой ром-код. CodeVision предлагает такой вариант обращения:
ds18b20_devices=w1_search(0xf0,ds18b20_rom_codes);
в итоге чтение каждого датчика происходит так:
temp1=ds18b20_temperature(&ds18b20_rom_codes[0][0]);
temp2=ds18b20_temperature(&ds18b20_rom_codes[1][0]);
Т.е. по сути он каждый ром код записал в массив. Как мне обойти это вариант, зная ром-коды каждого из датчика и обращаться по типу - с учетом того что ром код 10 С5 С3 20 00 00 00:
temp1=ds18b20_temperature(10 С5 С3 20 00 00 00);
Т.е. я хочу, чтобы контроллер не проводил опрос всего и запись кодов каждого, а сразу же по данным кодам находил датчик и делал именно его опрос. Как сделать такую процедуру в CodeVision?
ds18b20_devices=w1_search(0xf0,ds18b20_rom_codes);
в итоге чтение каждого датчика происходит так:
temp1=ds18b20_temperature(&ds18b20_rom_codes[0][0]);
temp2=ds18b20_temperature(&ds18b20_rom_codes[1][0]);
Т.е. по сути он каждый ром код записал в массив. Как мне обойти это вариант, зная ром-коды каждого из датчика и обращаться по типу - с учетом того что ром код 10 С5 С3 20 00 00 00:
temp1=ds18b20_temperature(10 С5 С3 20 00 00 00);
Т.е. я хочу, чтобы контроллер не проводил опрос всего и запись кодов каждого, а сразу же по данным кодам находил датчик и делал именно его опрос. Как сделать такую процедуру в CodeVision?
Самое гениальное - всегда самое простое
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
ну так сразу пропишите в массив свои адреса - и все. поиск не нужен, а все остальное остается без изменений.
битва с дураками проиграна, победители торжествуют. слава победителям!
- Volgol_555
- Потрогал лапой паяльник
- Сообщения: 301
- Зарегистрирован: Пт сен 23, 2011 13:13:51
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Проблема вышла в том, что почему то не получается сделать таким образом. Я даже специально romcode выводил на экран, но я не знаю как правильно он записывается в памяти контроллера!
Ведь на экран я вывожу как захочу...А что есть на самом деле, не совсем знаю(
Ведь на экран я вывожу как захочу...А что есть на самом деле, не совсем знаю(
Самое гениальное - всегда самое простое
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
во-первых, ROM-код это 8 байт, а не 7, как у вас.
во-вторых, как он устроен, можно прочитать в даташите на датчик
в-третьих, как в памяти хранятся массивы, можно прочитать в любом букваре по Си
во-вторых, как он устроен, можно прочитать в даташите на датчик
в-третьих, как в памяти хранятся массивы, можно прочитать в любом букваре по Си
битва с дураками проиграна, победители торжествуют. слава победителям!
-
John-RADIST
- Открыл глаза
- Сообщения: 44
- Зарегистрирован: Чт дек 15, 2011 19:04:24
Re: CodeVision AVR в вопросах и ответах
Доброго времени суток! Извините что вклиниваюсь!!! Нужна немножко помощь.
Фрагмент исходника:
interrupt [ADC_INT] void adc_isr(void){
result=ADCW*5-ADCW/10; //умножаем чтобы получить мВ и немного учитываем погрешности
sprintf(lcd_buffer,"Vlazhnost=%4umV",result);// записываем в буфер вторые 2 параметра
lcd_clear(); // очищаем жки
lcd_puts(lcd_buffer); // теперь выводим в него
delay_us(100);
if (knoka1_pressed==0) ADCSRA=0b11011111;
Здесь все понятно...Дальше другой фрагмент исходника со свичем:
while (1)
{
if(knoka1_pressed)
{
knoka1_pressed= 0;
switch(punkt_menu)
{
case 1:
lcd_gotoxy(1,0);
lcd_putsf("Punkt1");//печатаем
ADCSRA=0b11011111;
break;
case 2:
lcd_gotoxy(1,0);
lcd_putsf("Punkt2");//печатаем
break;
case 3:
lcd_gotoxy(1,0);
lcd_putsf("Punkt3");//печатаем
break;
default:
// punkt_menu= 1;
break;
}
}
Это фрагменты 2-х исходников. Подскажите как подредактировать текст программы, чтобы выбирая один из case-ов, второй строчкой на LCD выводились один из ("Punkt").
Спасибо!!!
Фрагмент исходника:
interrupt [ADC_INT] void adc_isr(void){
result=ADCW*5-ADCW/10; //умножаем чтобы получить мВ и немного учитываем погрешности
sprintf(lcd_buffer,"Vlazhnost=%4umV",result);// записываем в буфер вторые 2 параметра
lcd_clear(); // очищаем жки
lcd_puts(lcd_buffer); // теперь выводим в него
delay_us(100);
if (knoka1_pressed==0) ADCSRA=0b11011111;
Здесь все понятно...Дальше другой фрагмент исходника со свичем:
while (1)
{
if(knoka1_pressed)
{
knoka1_pressed= 0;
switch(punkt_menu)
{
case 1:
lcd_gotoxy(1,0);
lcd_putsf("Punkt1");//печатаем
ADCSRA=0b11011111;
break;
case 2:
lcd_gotoxy(1,0);
lcd_putsf("Punkt2");//печатаем
break;
case 3:
lcd_gotoxy(1,0);
lcd_putsf("Punkt3");//печатаем
break;
default:
// punkt_menu= 1;
break;
}
}
Это фрагменты 2-х исходников. Подскажите как подредактировать текст программы, чтобы выбирая один из case-ов, второй строчкой на LCD выводились один из ("Punkt").
Спасибо!!!
- Volgol_555
- Потрогал лапой паяльник
- Сообщения: 301
- Зарегистрирован: Пт сен 23, 2011 13:13:51
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Скажите пожалуйста - вот инициализация USART в CodeVision:
#ifndef RXB8
#define RXB8 1
#endif
#ifndef TXB8
#define TXB8 0
#endif
#ifndef UPE
#define UPE 2
#endif
#ifndef DOR
#define DOR 3
#endif
#ifndef FE
#define FE 4
#endif
#ifndef UDRE
#define UDRE 5
#endif
#ifndef RXC
#define RXC 7
#endif
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
// USART Receiver buffer
#define RX_BUFFER_SIZE 100
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
для того, чтобы принять символ нужно написать getchar(); Но как мне принять целое слово "Hello"?
#ifndef RXB8
#define RXB8 1
#endif
#ifndef TXB8
#define TXB8 0
#endif
#ifndef UPE
#define UPE 2
#endif
#ifndef DOR
#define DOR 3
#endif
#ifndef FE
#define FE 4
#endif
#ifndef UDRE
#define UDRE 5
#endif
#ifndef RXC
#define RXC 7
#endif
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
// USART Receiver buffer
#define RX_BUFFER_SIZE 100
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
для того, чтобы принять символ нужно написать getchar(); Но как мне принять целое слово "Hello"?
Самое гениальное - всегда самое простое
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Вызвать гетчар пять раз. И желательно в нем самом прописать тайм-аут, который вернет определенный флаг при превышении времени ожидания посылки.
Docendo discimus
- Volgol_555
- Потрогал лапой паяльник
- Сообщения: 301
- Зарегистрирован: Пт сен 23, 2011 13:13:51
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Спасибо. Я думал, есть стандартная функция приема целого текста. Ведь отсылаю я через putsf("много символов")
Самое гениальное - всегда самое простое
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Когда мы отправляем, то знаем что и когда и куда отправляем. Когда принимаем, то пес его знает откуда и что и когда приползет.
Docendo discimus
- Volgol_555
- Потрогал лапой паяльник
- Сообщения: 301
- Зарегистрирован: Пт сен 23, 2011 13:13:51
- Откуда: Минск
- Контактная информация:
- Volgol_555
- Потрогал лапой паяльник
- Сообщения: 301
- Зарегистрирован: Пт сен 23, 2011 13:13:51
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Всем привет. Есть такой вопросик касательно Си. Вот я округляю значение до десятой части.
tx=int(ceil(tx/10));
Есть ли вариант обойти функции ceil -она ведь возрващает значение float((. К примеру мне нужно округлить 133 до 130
tx=int(ceil(tx/10));
Есть ли вариант обойти функции ceil -она ведь возрващает значение float((. К примеру мне нужно округлить 133 до 130
Самое гениальное - всегда самое простое
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
я бы сделал так: округление до десятков
Код: Выделить всё
(tx/10) * 10;битва с дураками проиграна, победители торжествуют. слава победителям!
- Volgol_555
- Потрогал лапой паяльник
- Сообщения: 301
- Зарегистрирован: Пт сен 23, 2011 13:13:51
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
точно. А мне и в голову не пришло) Вот только интересно: 133/10*10=130 при данном варианте
а если 136 - мне с него надо получить 140! Ведь такой вариант просто уберет дробное значение!
а если 136 - мне с него надо получить 140! Ведь такой вариант просто уберет дробное значение!
Самое гениальное - всегда самое простое
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
вы тогда формулируйте почетче, что вам надо. самому слабО додумать, как сделать математическое окрагление до десятков?Volgol_555 писал(а):точно. А мне и в голову не пришло) Вот только интересно: 133/10*10=130 при данном варианте
а если 136 - мне с него надо получить 140! Ведь такой вариант просто уберет дробное значение!
Код: Выделить всё
((tx + 5) / 10) * 10битва с дураками проиграна, победители торжествуют. слава победителям!


