WinAvr в вопросах и ответах
А что есть CS0? Вы его определили? Может имеется в виду CS00/CS01/CS02? Какой камень?
- Реклама
- Сообщения: 38
- Зарегистрирован: Пн авг 01, 2011 21:59:21
ATmega8515.
ну точно же!
CS0 это CS00
и все заработало! прошу прощения за такую глупость
спасибо большое!
ну точно же!
- Сообщения: 581
- Зарегистрирован: Ср янв 05, 2011 10:03:18
slavik.ksu писал(а):ATmega8515.
ну точно же!CS0 это CS00
и все заработало! прошу прощения за такую глупость
спасибо большое!
Код: Выделить всё
TCCR0 = (1<<CS00) | (1<<CS01);С уважением,
Виктор.
Виктор.
- Сообщения: 134
- Зарегистрирован: Вс авг 01, 2010 16:05:25
Здравствуйте. Подскажите как быть,допустим, составил программу с использованием EEPROM,прошиваем МК,а в EEPROM,после прошивки, данные имеют максимальные значения. Вот как с помощью WinAVR в EEPROM заносить определённые данные.
если вы в своей программе описали переменные (ячейки) в eeprom, то при компиляции будет сгенерирован автоматически файл с начальным содержимым - этот файл просто программатором прошиваете и все.
однако, более правильным было бы, если бы ваша программа могла определить, что EEPROM не содержит начальных значений, и самостоятельно прошить их туда. если вы сделаете проверку EEPROM с подсчетом контрольной суммы - это в определенном смысле повысит надежность вашего девайса.
однако, более правильным было бы, если бы ваша программа могла определить, что EEPROM не содержит начальных значений, и самостоятельно прошить их туда. если вы сделаете проверку EEPROM с подсчетом контрольной суммы - это в определенном смысле повысит надежность вашего девайса.
битва с дураками проиграна, победители торжествуют. слава победителям!
- Реклама
- Сообщения: 134
- Зарегистрирован: Вс авг 01, 2010 16:05:25
Так вот про это и говорю, мне надо как то внести,при прошивки, какое то значение EEPROM, т.к. при запуски программы
если в EEPROM все нули или максимум, получатся белеберда, которую можно исправить,но это очень долго, числа большие.
если в EEPROM все нули или максимум, получатся белеберда, которую можно исправить,но это очень долго, числа большие.
так что не понятно-то? прошейте сгенерированный компилятром файл для EEPROM
битва с дураками проиграна, победители торжествуют. слава победителям!
Если проблема заключается в том как выставить данные, которые надо залить в мк, то этот пример может помочь:
Здесь в EEPROM создается и инициализируется структура history_dump. Значения можно выставлять произвольные. При компиляции копилятор сделает помимо hex файлика еще и eep файл. Его нужно залить в мк отдельно. Это и будет прошивка EEPROM'а
Код: Выделить всё
static EEMEM HISTORY_MEASURE history_dump =
{
{
{{0,0,0,0,0,0,0}, 0,0,0,false}, {{0,0,0,0,0,0,0}, 0,0,0,false}, {{0,0,0,0,0,0,0}, 0,0,0,false}
},
0
};
- Сообщения: 134
- Зарегистрирован: Вс авг 01, 2010 16:05:25
Да проблема именно в этом,я пробовал ставить ваш код, компилятор ругается, этот код совместим с WinAVR.juzik писал(а):Если проблема заключается в том как выставить данные, которые надо залить в мк, то этот пример может помочь:
Здесь в EEPROM создается и инициализируется структура history_dump. Значения можно выставлять произвольные. При компиляции копилятор сделает помимо hex файлика еще и eep файл. Его нужно залить в мк отдельно. Это и будет прошивка EEPROM'аКод: Выделить всё
static EEMEM HISTORY_MEASURE history_dump = { { {{0,0,0,0,0,0,0}, 0,0,0,false}, {{0,0,0,0,0,0,0}, 0,0,0,false}, {{0,0,0,0,0,0,0}, 0,0,0,false} }, 0 };
рассказы про ругательства компилятора без приведенных конкретных сообщений об ошибках не принимаются. может, вы забыли avr/eeprom.h проинклюдить?
битва с дураками проиграна, победители торжествуют. слава победителям!
Может и забыли, но этого может быть и недостаточно.Мастер Ломастер писал(а):может, вы забыли avr/eeprom.h проинклюдить?
Неясно что за имя HISTORY_MEASURE его тоже нужно объявить.
В поисках истины человек развивается.
- Сообщения: 1
- Зарегистрирован: Вт мар 06, 2012 14:33:44
Здравствуйте.
Пишу Bootloader для mega1280 на WinAVR-20100110. Не могу найти в описании WinAVR как перенести
таблицу прерываний в секцию bootloader'a. На ассемблере с помощью директивы .org, а здесь неясно.
Пишу Bootloader для mega1280 на WinAVR-20100110. Не могу найти в описании WinAVR как перенести
таблицу прерываний в секцию bootloader'a. На ассемблере с помощью директивы .org, а здесь неясно.
Последний раз редактировалось ULF21 Вт мар 06, 2012 20:52:04, всего редактировалось 1 раз.
- Сообщения: 134
- Зарегистрирован: Вс авг 01, 2010 16:05:25
Всё Спасибо кто пытался помочь, а решение нашёл вот такое, при объявлении адреса EEPROMа, просто пишется
данные:
EEMEM uint16_t adres2=4220;
Не знаю правельно или нет,но работает.
данные:
EEMEM uint16_t adres2=4220;
Не знаю правельно или нет,но работает.
просто удивительно, как это вы смогли найти решение, котрое я вам бог знает когда сказал.
Мастер Ломастер писал(а):если вы в своей программе описали переменные (ячейки) в eeprom, то при компиляции будет сгенерирован автоматически файл с начальным содержимым - этот файл просто программатором прошиваете и все.
битва с дураками проиграна, победители торжествуют. слава победителям!
- Сообщения: 134
- Зарегистрирован: Вс авг 01, 2010 16:05:25
Может Вы и правы в с своих объяснениях, но я ни чего не понял, мне бы примеры, но всё равно Спасибо.Мастер Ломастер писал(а):просто удивительно, как это вы смогли найти решение, котрое я вам бог знает когда сказал.Мастер Ломастер писал(а):если вы в своей программе описали переменные (ячейки) в eeprom, то при компиляции будет сгенерирован автоматически файл с начальным содержимым - этот файл просто программатором прошиваете и все.
на будущее: если вам нужен пример, то так и пишите "приведите пример для вот этого". у нас, экстрасенсов, все как у гугла: какое ключевое слово ввел - то и получил в выдачеTICLIR писал(а):Может Вы и правы в с своих объяснениях, но я ни чего не понял, мне бы примеры, но всё равно Спасибо.
битва с дураками проиграна, победители торжествуют. слава победителям!
Всем добра, во общем столкнулся с такой проблемой, то ли я, то ли что?
если я делаю так
на дисплее получаю значение 21964 хотя по моей логике и всем возможным калькуляторам 87500
но если сделать так
то выдаст нормально как и положено 87500, кто нить может мне разъяснить в чем проблема, если во мне, исправлюсь.
если я делаю так
Код: Выделить всё
char buffer1[6];
ultoa((0x6d6 * 0x32), buffer1, 10);
LCDsendString(buffer1);но если сделать так
Код: Выделить всё
char buffer1[6];
ultoa(87500, buffer1, 10);
LCDsendString(buffer1);Всё дело в неявном приведении типов. Смотри, у тебя два числа: 0x6d6 и 0x32. Здесь, по видимому, если это возможно, компилятор приводит эти числа к типу int, т.е. здесь: 2-х байтовое целое. А теперь попробуем это посчитать. Как ты правильно нашёл, это будет равно 87500, но т.к. у нас число содержится в 2-х байтах, то происходит переполнение: 87500 - 65536 = 21964 (где 65536 = 2^16 - максимально возможное значение числа в 2-х байтах + 1) - это то что и вывелось на экран.
Чтобы оно правильно посчиталось, нужно явно указать компилятору, что число таки имеет тип long int, т.е. вот так:
Оно должно работать.
Чтобы оно правильно посчиталось, нужно явно указать компилятору, что число таки имеет тип long int, т.е. вот так:
Код: Выделить всё
char buffer1[6];
ultoa((0x6d6L * 0x32L), buffer1, 10);
LCDsendString(buffer1); Вот спасибо я даже и не знал что так все просто.IfoR писал(а):Всё дело в неявном приведении типов. Смотри, у тебя два числа: 0x6d6 и 0x32. Здесь, по видимому, если это возможно, компилятор приводит эти числа к типу int, т.е. здесь: 2-х байтовое целое. А теперь попробуем это посчитать. Как ты правильно нашёл, это будет равно 87500, но т.к. у нас число содержится в 2-х байтах, то происходит переполнение: 87500 - 65536 = 21964 (где 65536 = 2^16 - максимально возможное значение числа в 2-х байтах + 1) - это то что и вывелось на экран.
Чтобы оно правильно посчиталось, нужно явно указать компилятору, что число таки имеет тип long int, т.е. вот так:
Оно должно работать.Код: Выделить всё
char buffer1[6]; ultoa((0x6d6L * 0x32L), buffer1, 10); LCDsendString(buffer1);
Ещё вопросик к про спринтф, если добавить в код запись то размер увеличиться на 1,5 кб.
если использовать ultoa
если смысл ее (sprintf) использовать, если я ее буду использовать много кратно, памяти в принципе не жалко (mega168)
Код: Выделить всё
sprintf(buffer1,"%3i",d);
Program: 8264 bytes (50.4% Full)
(.text + .data + .bootloader)Код: Выделить всё
ultoa(d, buffer1, 10);
Program: 6756 bytes (41.2% Full)
(.text + .data + .bootloader)




