leokri 0 28 октября, 2007 Опубликовано 28 октября, 2007 · Жалоба Вопросы к спецам. 1.) В WinAVR есть хорошая функция sizeof (#include pgmspace). Нет ли чего похожено в CVavr, ели есть то как называется, если нет то нельзя-ли ее как-то пристегнуть к CVavr. 2.) Можно ли в ATmega32 выделить область из FLash размером до 8 Кбайт чтобы использовать под данные которые изредка нужно редактировать (оснвная задача чтение и выдача этих данных в порт скажем PORTA ). Если можно то пожалуста пример на Си 3.) Если вариант по второму вопросу отсутствует то кто может подсказать кусок кода на Си для работы протоколом i2c с микросхемой 24с64. Заранее благодарен. Леонид е-mail [email protected] Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 29 октября, 2007 Опубликовано 29 октября, 2007 · Жалоба Вопросы к спецам. 1.) В WinAVR есть хорошая функция sizeof (#include pgmspace). Нет ли чего похожено в CVavr, ели есть то как называется, если нет то нельзя-ли ее как-то пристегнуть к CVavr. sizeof это не функция. Это оператор, который возращает количество байт какого-либо типа. Например sizeof(char) будет равно еденице. Этот оператор не зависит от компилятора, является стандартным, поэтому в CV он должен быть. 2.) Можно ли в ATmega32 выделить область из FLash размером до 8 Кбайт чтобы использовать под данные которые изредка нужно редактировать (оснвная задача чтение и выдача этих данных в порт скажем PORTA ). Если можно то пожалуста пример на Си Можно. Но для этого нужно чуть больше исходных данных: как и когда Вы собираетесь модифицировать данные (обновлением прошивки, используя самопрограммирование микроконтроллера и тп) 3.) Если вариант по второму вопросу отсутствует то кто может подсказать кусок кода на Си для работы протоколом i2c с микросхемой 24с64. Видимо речь идет о работе микроконтроллера AVR. Тогда поиск по соответствующей ветке на форуме даст Вам положительный результат. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
leokri 0 29 октября, 2007 Опубликовано 29 октября, 2007 (изменено) · Жалоба Спасибо за ответ. При постаговке вопроса насчет выделения области в Flash Atmega32 имелось в виду что программа последовательно побайтно выводит данные из этой области скажем в порт А, по командам старт и стоп внешнего устройства - это основной режим. Иногда возникает необходимость подредактировать данные . Т.Е. включить режим редактирования и с прицепленой клавиатуры выборочно изменить данные в области (естественно наличие LCD) . По предварительным прикидкам 32к должно хватить и для программ и для данных.Я пытался открыть массив сразмером 8К но СVavr ругается (видимо хочет открывать массив в SRAM) . По последнему вопросу что лучше использовать i2c или twi микросхема 24с64 ? Изменено 29 октября, 2007 пользователем Леон Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 30 октября, 2007 Опубликовано 30 октября, 2007 · Жалоба Спасибо за ответ. При постаговке вопроса насчет выделения области в Flash Atmega32 имелось в виду что программа последовательно побайтно выводит данные из этой области скажем в порт А, по командам старт и стоп внешнего устройства - это основной режим. Иногда возникает необходимость подредактировать данные . Т.Е. включить режим редактирования и с прицепленой клавиатуры выборочно изменить данные в области (естественно наличие LCD) . По предварительным прикидкам 32к должно хватить и для программ и для данных.Я пытался открыть массив сразмером 8К но СVavr ругается (видимо хочет открывать массив в SRAM) . Можно использовать физические адреса памяти FLASH. Как с ней работать, описано в даташите на микроконтроллер. Можно поискать в инете различные бутлоадеры (bootloader) для AVR. Там Вы найдете примеры работы с памятью программ. По последнему вопросу что лучше использовать i2c или twi микросхема 24с64 ? I2C и TWI это одно и тоже. Первое - название от Phillips, второе - название от Atmel. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
leokri 0 1 ноября, 2007 Опубликовано 1 ноября, 2007 · Жалоба Вопрос к знатокам. Если открыть массив в EEPROM, то его нужно обьявить как глобальный. А если его нужно редактировать тогда как. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 1 ноября, 2007 Опубликовано 1 ноября, 2007 · Жалоба Если открыть массив в EEPROM, то его нужно обьявить как глобальный. А если его нужно редактировать тогда как. Вопрос непонятен. Что значит "открыть массив"? EEPROM внешняя или внутренняя? Если внутреняя - умеет ли с ней работать компилятор (какой используете компилятор?)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
leokri 0 2 ноября, 2007 Опубликовано 2 ноября, 2007 · Жалоба Вопрос непонятен. Что значит "открыть массив"? EEPROM внешняя или внутренняя? Если внутреняя - умеет ли с ней работать компилятор (какой используете компилятор?)? Я имел в виду внутренняя EEPROM, компилятор CVavr. Можно и внешнюю но думаю что с ней будет сложнее ( придется использовать шину I2c). Если знаете как то подскажите пожалуста. С уважением Леонид. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IVANS 0 2 ноября, 2007 Опубликовано 2 ноября, 2007 · Жалоба CVAVR умеет работать с eeprom. Так и объявляйте, например eeprom char m[10]; И редактируйте как надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
leokri 0 3 ноября, 2007 Опубликовано 3 ноября, 2007 (изменено) · Жалоба Извиняюсь за назойливость и прошу не пинать (только учусь) Если объявить массив во внутренней EEPROM компилятор CVavr принимает его только как глобальный. а как его потом редактировать? Програмно можно или нет? Изменено 3 ноября, 2007 пользователем Леон Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vovanse 0 3 ноября, 2007 Опубликовано 3 ноября, 2007 · Жалоба Можно. Объявил, как написали ранее eeprom char m[10]; ну а в программе работаешь как с обыкновенным массивом m[3]=55, m[2]=32, i=m[1], t=m[k] ну и т.д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toshas 0 3 ноября, 2007 Опубликовано 3 ноября, 2007 · Жалоба в "глобальности" нет ничего страшного, это лишь означает, что массив доступен из любого места программы, а "локальный" доступен только в пределах функции в которой был объявлен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
leokri 0 11 ноября, 2007 Опубликовано 11 ноября, 2007 · Жалоба Знатоки помогите! Написал код // External Interrupt 0 service routine interrupt [EXT_INT0] ext_int0_isr(void) { char i=0,n=0,key_0=0;//Начальные значения счетчиков PORTB.3=1,delay_ms(30);//атидребезговая пауза+beep PORTB.3=0;//Конец beep while(PIND.2)//выполнять пока PIND.2=1 {PORTD=((i)<<4),n=i,key_0=n; if(!PIND.2){break;}//если PIN.2=0 покинуть цикл PORTD.3=1,n=(i+16),key_0=n;//включить дешифратор if(!PIND.2){break;}// если PIN.2=0 покинуть цикл i++; } PORTD.3=0,i=0,n=0;//Сбросить счетчики и дешифратор PORTD=((0x0)<<4);//сбросить выходы PORT.4_7 GIFR|=1<<6;//Выставить 1 в регистре флагов(INT0) //return (key_0);// не работает ругается } обслуживание клавы через дешифраторы(31 кнопка) как правильно написать чтобы возвращалось значение key_0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mdmitry 0 11 ноября, 2007 Опубликовано 11 ноября, 2007 (изменено) · Жалоба Знатоки помогите! Написал код // External Interrupt 0 service routine interrupt [EXT_INT0] ext_int0_isr(void) { char i=0,n=0,key_0=0;//Начальные значения счетчиков PORTB.3=1,delay_ms(30);//атидребезговая пауза+beep PORTB.3=0;//Конец beep while(PIND.2)//выполнять пока PIND.2=1 {PORTD=((i)<<4),n=i,key_0=n; if(!PIND.2){break;}//если PIN.2=0 покинуть цикл PORTD.3=1,n=(i+16),key_0=n;//включить дешифратор if(!PIND.2){break;}// если PIN.2=0 покинуть цикл i++; } PORTD.3=0,i=0,n=0;//Сбросить счетчики и дешифратор PORTD=((0x0)<<4);//сбросить выходы PORT.4_7 GIFR|=1<<6;//Выставить 1 в регистре флагов(INT0) //return (key_0);// не работает ругается } обслуживание клавы через дешифраторы(31 кнопка) как правильно написать чтобы возвращалось значение key_0 Прерывание не возвращает никакого значения, оно void! Если это писалось на языке С, то необходимо доставить в строках разделители операторов ; Правильно ли оформлены у Вас описание и вызов прерывания? Какой компилятор? Изменено 11 ноября, 2007 пользователем mdmitry Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
leokri 0 12 ноября, 2007 Опубликовано 12 ноября, 2007 · Жалоба CVavr. Это и есть обработка прерывания INT0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
leokri 0 12 ноября, 2007 Опубликовано 12 ноября, 2007 · Жалоба Спасибо всем откликнувшимся. Все пошло и заработало!!! :08: Я заклинился на том что функции обработки прерываний пишутся первыми. Оказалось достаточным переменную key_0 объявить до описания функции обработки прерывания и все встало на свои места. Еще раз прошу подсказать, кто знает, как объявить массив типа char в области Flash (размер большой до 8 Кбайт) так чтобы он не писался в SRAM, Atmega32. Компилятор CVavr. И если можно особенности работы с этим массивом ( програмное чтение, запись, редактирование), можно ссылки. где можно прочитать об этом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться