TechMike писал(а):Использую WinAVR 20050214 всем доволен, но понадобилось работать с tiny45, а ее в 2005 версии еще нет. Что посоветуете из стабильных версий WinAVR с как минимум поддержкой tiny45/25. Шью МК с помощью avrdude, отлаживаю в AVR Studio 4.15.
dt_andrew писал(а):а можно ли передать в функцию в качестве параметра имя порта а потом внутри функции использовать это имя Спасибо
имя - бесполезно, а вот адрес - запросто. то есть указатель. WinAVR обращается к портам, как к ячейкам памяти (надеюсь, эту особенность архитектуры AVR все знают) - поэтому можно объявить указатель на байт, присвоить ему адрес нужного порта - и вперед!
собрал себе схему частотомера на SAB6456 и Mega8.Написал програму на С в AvrStudio под WinAVR.Запустил вроде бы работает, циферки скачут... .При попытке отлаживать дебаггером, внизу вилазит ошибка, мол неправильно установлен указатель стека, так немного промучавсь обнаружив, что я ошибочно указал тип прибора не Мега8, а Тини 2313.исправил и при прошивки на экране просто высвечиваются начальный экран(первое, что в голову пришло - не обрабатываются прерывания).Вновь помучавсь обнаружил интересную вещицу.
у меня основная программа в цикле выводит на ЛЕД-дисплей четире числа - частоту, которые обчистиваются в подпрограмме обработки переполнения таймера=1с.Так вот суть вся в том, что подпрограмма запускается(если в ней вписать команду вывода в порт, то видно как светодиод мигает), частота вычисляется, но в основной программе эти данные будто не выдимы.Все переменные обявлены глобальными.
После этого провел эксперимент, просто в цикле основной программы вывожу цифру, в подпрограмме прописываю заменить эту переменную на другое число, но после прошивки, все по старому, на экране первое число...
Уже не знаю что можно предположить.Может это какой то глюк?я впервые пишу программу на С для Мега8 с использованием прерываний, на Тини все было нормально.
Да!Действительно получилось.А я все думал, что это какая то ошибка.
Удивительно то, что когда я ошибочно скомпилировал свой код, написан для Мега8, под Тини 2313 все работало!
Большое спасибо за подказку!
Всем привет. Возникла необходимость сваять программку под atmega8, в качестве IDE выбрал WinAvr + AVR Studio. Программу написал (вернее портировал с CVAVR + кое-чего своего добавил). Ошибки компиляции исправил (отладку логики пока не делал) и запустил в симуляторе. Результат - ошибка обращения к памяти. Долго копал в чём дело и пришёл к выводу что компилятор иногда некорректно проставляет адрес переходя для rjump rcall если размер кода превышает 4096 байт. Кусок неправильного кода (не единственный в проге):
Заметил ещё одну странность, в настройках памяти в Avr Studio (MemorySettings) Flash Size для atmega8 указан как 0x1000 !!! Возможно Flash Size указан в словах, но тогда почему размер eeprom и ram соответствует размеру в байтах ? И почему тогда компилятор показывал что .text + ... занимает менее 70% флеша.
У меня зародилась мысль что я немного не понимаю организацию памяти мк. Прошу помощи у гуру, в чём кроется бага !!!
Заметил ещё одну странность, в настройках памяти в Avr Studio (MemorySettings) Flash Size для atmega8 указан как 0x1000 !!! Возможно Flash Size указан в словах, но тогда почему размер eeprom и ram соответствует размеру в байтах ? И почему тогда компилятор показывал что .text + ... занимает менее 70% флеша.
Во-первых, могли бы и код показать, а то в асм листинге изготовленном компилятором разбираться тяжело.
Во-вторых, как я думаю сам компилятор так косячить не должен, видимо его "кто-то хорошенько попросил".
В-третьих версия достаточно старая, да еще и релиз-кандидат.
В общем, делайте выводы.
По поводу памяти. Флешь организована пословно, поэтому и размер в словах, еепром и рам - побайтно, размер соответсвенно в байтах.
Спасибо, насчёт памяти понял. Покапал ещё немного и выяснил что проблема в rcall и rjmp, по даташиту они могут делать переходы до +- 2К слов (+-4096) байт. В этом и проблема, нужен переход дальше, либо другая копмоновка функций в сегменте. С 2008 г. atmel убрал jmp и call из даташита для atmega8 (и из студии) и теперь мега их не поддерживает (не знаю аппаратно поменяли или нет). Собственно проблема остаётся или в компоновщике (версия 2007 года) или в голове (придётся делать upgrade знаний по gcc). Сначала попробую взять новую версию WinAvr.
Итак поизучав инет и запустив код в отладчике (почему сразу этого не сделал ), возникли сомнения в диагнозе, тот страшный адрес fffffxxx на самом деле врапится (счётчик 12 битный и отсчёт ведётся в обратную сторону) и преобразовывается в xxx, по крайней мере в студии ошибки не возникает и код работает. Т.е. надо смотреть на Proteus , а не на компилятор.
void main (void)
{
DDRD=0b11111111;
PORTD=0b01010000;
while (1) {}
}
и компилячим ее в CodeVision и AvrStudio(WinAvr-compiler).
Программа кодвижина работают правильно - светодиоды загораются и горят постоянно. Программа скомпилированная винавр - сведодиоды МИГАЮТ с частотой ~10Гц. При этом, длинна программ еще различается на 10байт.
Подскажите, в чем дело, что я не так делаю может? Или где-то что-то в настройка компилера не так?
Скачал последнюю версию WinAVR 20090313 и попробовал протестировать в ней отработанную прогу С.Рюмика с журнала РА 04/2005 по миганию светодиодов на atmega8 и в результате имею следующую ошибку по мнению компилятора:
//Маячок-мигалка =AVR, ñòóïåíü 4=. æóðíàë ÐÀ, ¹4-2005 =1
//Make: Name=avr2, MCU=atmega8, Level=2, Debug=VMLab =2
//Ôüþçû: SUT0=CKSEL3=CKSEL2=CKSEL1="ãàëî÷êè" (1 ÌÃö) =3
#include <avr> //Библиотека ввода-вывода =4
//=============Основная программа=====5
int main(void) //Начало основной программы =6
{ unsigned int pause=0; //Переменная для паузы =7
// =8
PORTB = PORTC = PORTD = 0xFF //Входы с резисторами =9
DDRC !=_BV(PC3) ; //PC3 выход с лог.1 =10
DDRD !=_BV(PD7) ; //PD7 выход с лог.1 =11
while (1) //Бесконечный цикл между строками 13-19 =12
{ PORTC !=_BV(PC3) ; //PC3 выход с лог.1 =13
PORTD &=~_BV(PD7) ; //PD7 выход с лог.0 =14
while (++pause <15000> 0) ; //Пауза 15000 итераций=18
} //Окончание функции "while" в строке 12 =19
}
> "make.exe" all
make.exe: *** No rule to make target `all'. Stop.
> Process Exit Code: 2
> Time Taken: 00:00
Подскажите в чем прикол? может компилятор чего-то не понимает и необходимо его подстроить? (если да, то как?).
MakeFile создаю MFile без проблем
No rule to make target - У меня было такое, если в пути к проэкту или в названии проэкта есть русские буквы. И первый файл в твоем прицепе должен иметь конкретное название "Makefile". Проверь.
то есть создаем MFile по стандартному шаблону (описан в журнале РА):
1.выбираем имя файла
2. тип чипа
3.уровень оптимизации - 2
4. Debug Format
AVR Studio 4.07, + VMLab 3.10+
и все или еще какой-то пункт пропустил я ?