CodeVision AVR в вопросах и ответах
Re: CodeVision AVR в вопросах и ответах
Также, проблема может быть в слишком высокой частоте на линии SCL. Для этой микросхемы - не более 100 кГц. Попробуйте сделать 20 кГц, ну или 50.
Этот пост оказался полезен? Не поленись, нажми
слева!

Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
слева!Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
- Реклама
Re: CodeVision AVR в вопросах и ответах
WiseLord, большое спасибо за подсказку!
Проблема действительна была в адресе. Я как-то и упустил, что с префиксом чипы имеют другой. Поставил 0х70 и всё заработало!
Спасибо!
PS. за неполноценный "плюс" я знал, заранее подкинул всё через транзистор.
Проблема действительна была в адресе. Я как-то и упустил, что с префиксом чипы имеют другой. Поставил 0х70 и всё заработало!
Спасибо!
PS. за неполноценный "плюс" я знал, заранее подкинул всё через транзистор.
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
Re: CodeVision AVR в вопросах и ответах
Сеньоры, столкнулся со странностью...
CV 3.12
Объявляю переменную:
В eep файле вижу:
Ну ок. Читаю переменную:
ИЧСХ, читается она тоже как 0x8F03 или 36611 вместо 911! Перевод K_div в uint не помогает.
Почему так? Для еепрома задан другой "индеец"? Где это поправить?
CV 3.12
Объявляю переменную:
Код: Выделить всё
#define COEFFICIENT (0.89)
#define EEPROM_VAL ((unsigned int)((COEFFICIENT * 1024.0) + 0.5)) // получается 911
eeprom unsigned int division_factor = EEPROM_VAL;
unsigned long K_div;
Код: Выделить всё
:020000008F036CКод: Выделить всё
K_div = division_factor; Почему так? Для еепрома задан другой "индеец"? Где это поправить?
Re: CodeVision AVR в вопросах и ответах
Неверно используете приведение к типу при вычислении eeprom_val .DataLife писал(а):ИЧСХ, читается она тоже как 0x8F03 или 36611 вместо 911! Перевод K_div в uint не помогает.
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Вообще-то, последовательность двух байтов 8F03 в eeprom - это как раз 911
- Реклама
Re: CodeVision AVR в вопросах и ответах
[uquote="rusl32",url="/forum/viewtopic.php?p=3196328#p3196328"]
А как надо?
Добавлено after 57 minutes 46 seconds:
Тут фишка в том, что если я просто делаю
в обход eeprom, то всё прекрасно работает.
Но стоит пропустить число через eeprom и всему капец.
Причём и в протеусе, и в железе. То есть состояние чипа роли не играет.
Неверно используете приведение к типу при вычислении eeprom_val .[/uquote]DataLife писал(а):ИЧСХ, читается она тоже как 0x8F03 или 36611 вместо 911! Перевод K_div в uint не помогает.
А как надо?
В протеусе считывается 36611. В реальном железе, судя по поведению программы - тоже.WiseLord писал(а):Вообще-то, последовательность двух байтов 8F03 в eeprom - это как раз 911
Добавлено after 57 minutes 46 seconds:
Тут фишка в том, что если я просто делаю
Код: Выделить всё
K_div = EEPROM_VAL;Но стоит пропустить число через eeprom и всему капец.
Причём и в протеусе, и в железе. То есть состояние чипа роли не играет.
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
AVR - LittleEndian. Поэтому последовательность байтов, например, 134679AB в EEPROM - это число 0xAB794613.
В avr-gcc eeprom_write_word() и eeprom_read_word() работают нормально. Число пишется "с LE-перевёртыванием" в eeprom, но оно же и читается оттуда с перевёртыванием, в итоге всё ОК.
Возможно, у CV какой-то глюк при работе с EEPROM на предмет записи-чтения мультибайтовых переменных. Потому что
Должно читаться как из eeprom (:020000008F036C) как число 0x038F
Возможно, глюк связан ещё и с тем, что двухбайтовая переменная читается в четырёхбайтовую.
В avr-gcc eeprom_write_word() и eeprom_read_word() работают нормально. Число пишется "с LE-перевёртыванием" в eeprom, но оно же и читается оттуда с перевёртыванием, в итоге всё ОК.
Возможно, у CV какой-то глюк при работе с EEPROM на предмет записи-чтения мультибайтовых переменных. Потому что
Код: Выделить всё
K_div = division_factor; Возможно, глюк связан ещё и с тем, что двухбайтовая переменная читается в четырёхбайтовую.
Re: CodeVision AVR в вопросах и ответах
[uquote="WiseLord",url="/forum/viewtopic.php?p=3196695#p3196695"]AVR - LittleEndian.
---
Возможно, глюк связан ещё и с тем, что двухбайтовая переменная читается в четырёхбайтовую.[/uquote]
Дык если он литл эндиан, то он и читать и писать должен одинаково. А получается, читает наоборот. Может, глюк версии CV?
Я пробовал делать K_div двухбайтной - та же фигня.
Добавлено after 1 hour 51 minute:
так, кажется разобрался.
Гадский протеус 1 раз подсасывает eeprom в проект и более не обновляет его из файла, даже если останавливать симуляцию полностью или перезагружать протеус.
Сброс делается командой Debug => Reset Persistent Model Data
Вроде помогло - стало работать правильно в симуляции.
Почему не работало в железе - отдельный вопрос... Буду проверять дальше.
---
Возможно, глюк связан ещё и с тем, что двухбайтовая переменная читается в четырёхбайтовую.[/uquote]
Дык если он литл эндиан, то он и читать и писать должен одинаково. А получается, читает наоборот. Может, глюк версии CV?
Я пробовал делать K_div двухбайтной - та же фигня.
Добавлено after 1 hour 51 minute:
так, кажется разобрался.
Гадский протеус 1 раз подсасывает eeprom в проект и более не обновляет его из файла, даже если останавливать симуляцию полностью или перезагружать протеус.
Сброс делается командой Debug => Reset Persistent Model Data
Вроде помогло - стало работать правильно в симуляции.
Почему не работало в железе - отдельный вопрос... Буду проверять дальше.
Re: CodeVision AVR в вопросах и ответах
в железе работает
протеус на мыло
протеус на мыло
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Proteus ведёт себя вполне адекватно, эмулируя реальный МК. В который точно так же eeprom лишь при прошивке (= из файла) записывается.
Re: CodeVision AVR в вопросах и ответах
Доброго времени суток, друзья.
Собрал двухдатчиковый термометр на DS18B20 и дисплее 1602.
Положительный диапазон измеряет отлично, но вот с "минусом" проблема. Целые выводятся правильно, а десятые как-бы нет ...

Вот часть кода:
Даже не знаю. Код простой и по всему интернету именно так и делают.
Пробовал не умножать на 10 в температурной функции и писать так в выводе на экран:
sprintf(lcd_buffer_1, "T1 = %i.%u\xdfC", temper[0], temper[0]%1);
Так много источников в интернете пишут, но выводятся так только целые, после точки всегда 0.
Собрал двухдатчиковый термометр на DS18B20 и дисплее 1602.
Положительный диапазон измеряет отлично, но вот с "минусом" проблема. Целые выводятся правильно, а десятые как-бы нет ...
Вот часть кода:
Спойлер
Код: Выделить всё
/*****************************************************
Chip type : ATmega8
Program type : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega8.h>
#include <1wire.h>
#include <ds18b20.h>
#include <stdio.h>
#include <delay.h>
#include <alcd.h>
#define MAX_DS18B20 2
unsigned char ds18b20_devices;
unsigned char ds18b20_rom_codes[MAX_DS18B20][9];
unsigned char lcd_buffer_1[16];
unsigned char lcd_buffer_2[16];
/*температурная функция*/
int temper[2];
int H;
void temperature(void) // функция по работе с термо-датчиком
{
for (H=0;H<ds18b20_devices;H++)
{
temper[H]=ds18b20_temperature(&ds18b20_rom_codes[H][0])*10; // специально умножил на 10 для вывода десятых частей
if (temper[H]>10000) //если датчик выдаёт больше 1000*10
{
temper[H]=40960-temper[H]; //отнимаем от данных 4096*10
temper[H]=-temper[H]; //и ставим знак "минус"
}
delay_ms(10);
}
}
void main(void)
{
w1_init();
ds18b20_init(0,-30,80,DS18B20_12BIT_RES);
// Determine the number of DS1820 devices
// connected to the 1 Wire bus
ds18b20_devices=w1_search(0xf0,ds18b20_rom_codes);
lcd_init(16);
lcd_clear();
if (ds18b20_devices == 0)
{
lcd_gotoxy(0,1);
lcd_putsf("No sensors!");
}
while (1)
{
temperature();
sprintf(lcd_buffer_1, "T1 = %i.%u\xdfC", temper[0]/10, temper[0]%10);
sprintf(lcd_buffer_2, "T2 = %i.%u\xdfC", temper[1]/10, temper[1]%10);
lcd_gotoxy(0,0);
lcd_clear();
lcd_puts(lcd_buffer_1);
lcd_gotoxy(0,1);
lcd_puts(lcd_buffer_2);
}
}
Пробовал не умножать на 10 в температурной функции и писать так в выводе на экран:
sprintf(lcd_buffer_1, "T1 = %i.%u\xdfC", temper[0], temper[0]%1);
Так много источников в интернете пишут, но выводятся так только целые, после точки всегда 0.
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
"%u" - это беззнаковое целое (unsigned int). Отсюда и число такое. -5 - это 65530 в беззнаковом представлении (для двухбайтового int, соответственно).
Re: CodeVision AVR в вопросах и ответах
Аlex, спасибо, это уяснил.
Однако уже час бьюсь в вариантами вывода минусовой температуры.
Максимум могу вывести что-то вроде: -5.-7 градусов. Убрать знак "минус" не получается. Даже ввёл отдельную переменную для хранения не отрицательной десятичной доли температуры - не помогло.
Однако уже час бьюсь в вариантами вывода минусовой температуры.
Максимум могу вывести что-то вроде: -5.-7 градусов. Убрать знак "минус" не получается. Даже ввёл отдельную переменную для хранения не отрицательной десятичной доли температуры - не помогло.
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
То, что Вам нужно - abs
Добавлено after 3 minutes 48 seconds:
Можно без всяких stdlib и им подобным :
Добавлено after 3 minutes 48 seconds:
Можно без всяких stdlib и им подобным :
Код: Выделить всё
#define abs(v) ((v)<0?-(v):(v))
Re: CodeVision AVR в вопросах и ответах
Аlex, спасибо за дополнительную инфу.
Нашёл в сети пример поинтересней и проще, наверное.
В цикле проверка флага sig . если 1, то ставим минус в строке форматирования.
В сумме - работает. Правда в момент перехода от плюса к минусу есть секундный "зависон".
Нашёл в сети пример поинтересней и проще, наверное.
Код: Выделить всё
if (temper[H]>10000) //если датчик выдаёт больше 1000
{
temper[H]=~ temper[H]+1; //инвертируем
sig = 1; // выбрасываем флаг того, что у нас минусовая температура
}В сумме - работает. Правда в момент перехода от плюса к минусу есть секундный "зависон".
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Какая-то абсолютно ненужная магия чисел. Зачем? Датчик в первых двух байтах ROM уже выдаёт нормальное число (с точки зрения знака) для температуры: 16 * T.DataLife писал(а):Код: Выделить всё
temper[H]=ds18b20_temperature(&ds18b20_rom_codes[H][0])*10; // специально умножил на 10 для вывода десятых частей if (temper[H]>10000) //если датчик выдаёт больше 1000*10 { temper[H]=40960-temper[H]; //отнимаем от данных 4096*10 temper[H]=-temper[H]; //и ставим знак "минус" }
Не нужна дробная часть - просто поделить готовое число на 16 и вывести на экран.
Нужна дробная часть - умножить готовое число на 5 (получим 80 * T) и поделить на 8 (получим 10 * T). Ну и выводим на экран, вставив точку перед последним знаком.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
только никак не ROM - то, что выдает датчик, это содержимое так называемой блокнотной памяти - scratchpadWiseLord писал(а):в первых двух байтах ROM
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Виноват...
Там, правда, намешано всего в этом scratchpad - и RAM байты с температурой, и ROM (EEPROM) байты с конфигурациями.
Там, правда, намешано всего в этом scratchpad - и RAM байты с температурой, и ROM (EEPROM) байты с конфигурациями.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
нет, scratchpad - это исключительно ОЗУ, а байты конфигурации - это кэш в озу ячеек EEPROM... так что читается всегда ОЗУ.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: CodeVision AVR в вопросах и ответах
Здравствуйте, не знаю в правильную ли тему я пишу но попрошу Вас помочь, пытался найти решение в уже созданных темах но не нашел. Возникла проблема в работе программы cvavr 3.12, можете посмотреть в приложенной картинке. В краце: 2 месяца работал в этой программе, все хорошо шло, сделал перерыв на неделю, зашел и тут такие дела. Решил снести переустановить, тоже самое. Скачал поставил версию 3.10 ничего не поменялось. Подумал, что какие нибудь настройки остаются или другие программы конфликтуют, потому удалил весь комплекс программ avr, atmel, proteus и тд., почистил временные фалы, почистил реестр клинером, а потом ручками, но все тоже самое. Дополнительно к скрину скажу, что при старте программы подгружаеться весь интерфейс и затем просто сворачивается. Кто знает решение, у кого какие мысли подскажите.
Добавлено after 2 hours 4 minutes 12 seconds:
Все проблема решена запуском десяток совтин по очистке ненужных файлов и реестра, какая точно помогла не известно.
Добавлено after 2 hours 4 minutes 12 seconds:
Все проблема решена запуском десяток совтин по очистке ненужных файлов и реестра, какая точно помогла не известно.
- Вложения
-
- cvavr bug.png
- (51.71 КБ) 424 скачивания


