WinAVR 20080610 Released, там есть поддержка attiny45/25TechMike писал(а):Использую WinAVR 20050214 всем доволен, но понадобилось работать с tiny45, а ее в 2005 версии еще нет. Что посоветуете из стабильных версий WinAVR с как минимум поддержкой tiny45/25.
Шью МК с помощью avrdude, отлаживаю в AVR Studio 4.15.
WinAvr в вопросах и ответах
- Реклама
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18647
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
имя - бесполезно, а вот адрес - запросто. то есть указатель. WinAVR обращается к портам, как к ячейкам памяти (надеюсь, эту особенность архитектуры AVR все знают) - поэтому можно объявить указатель на байт, присвоить ему адрес нужного порта - и вперед!dt_andrew писал(а):а можно ли передать в функцию в качестве параметра имя порта
а потом внутри функции использовать это имя
Спасибо
Код: Выделить всё
void my_func(uint8_t *port){
// что-то делаем с портом, например:
*port ^=1;
}
// вызываем функцию
my_func(&PORTB);
my_func(&PORTC);
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- UkrRadist
- Первый раз сказал Мяу!
- Сообщения: 34
- Зарегистрирован: Вс янв 13, 2008 00:40:29
- Откуда: україна,Київ,Дубровиця
- Контактная информация:
собрал себе схему частотомера на SAB6456 и Mega8.Написал програму на С в AvrStudio под WinAVR.Запустил вроде бы работает, циферки скачут... .При попытке отлаживать дебаггером, внизу вилазит ошибка, мол неправильно установлен указатель стека, так немного промучавсь обнаружив, что я ошибочно указал тип прибора не Мега8, а Тини 2313.исправил и при прошивки на экране просто высвечиваются начальный экран(первое, что в голову пришло - не обрабатываются прерывания).Вновь помучавсь обнаружил интересную вещицу.
у меня основная программа в цикле выводит на ЛЕД-дисплей четире числа - частоту, которые обчистиваются в подпрограмме обработки переполнения таймера=1с.Так вот суть вся в том, что подпрограмма запускается(если в ней вписать команду вывода в порт, то видно как светодиод мигает), частота вычисляется, но в основной программе эти данные будто не выдимы.Все переменные обявлены глобальными.
После этого провел эксперимент, просто в цикле основной программы вывожу цифру, в подпрограмме прописываю заменить эту переменную на другое число, но после прошивки, все по старому, на экране первое число...
Уже не знаю что можно предположить.Может это какой то глюк?я впервые пишу программу на С для Мега8 с использованием прерываний, на Тини все было нормально.
у меня основная программа в цикле выводит на ЛЕД-дисплей четире числа - частоту, которые обчистиваются в подпрограмме обработки переполнения таймера=1с.Так вот суть вся в том, что подпрограмма запускается(если в ней вписать команду вывода в порт, то видно как светодиод мигает), частота вычисляется, но в основной программе эти данные будто не выдимы.Все переменные обявлены глобальными.
После этого провел эксперимент, просто в цикле основной программы вывожу цифру, в подпрограмме прописываю заменить эту переменную на другое число, но после прошивки, все по старому, на экране первое число...
Уже не знаю что можно предположить.Может это какой то глюк?я впервые пишу программу на С для Мега8 с использованием прерываний, на Тини все было нормально.
Надо жить с надеждой!
- Реклама
- bsyomov
- Нашел транзистор. Понюхал.
- Сообщения: 179
- Зарегистрирован: Вт ноя 04, 2008 11:15:49
- Откуда: Санкт-Петербург
- Контактная информация:
А если добавить перед описанием глобальных переменных, используемых в прерываниях? =)
Код: Выделить всё
volatile Всем привет. Возникла необходимость сваять программку под atmega8, в качестве IDE выбрал WinAvr + AVR Studio. Программу написал (вернее портировал с CVAVR + кое-чего своего добавил). Ошибки компиляции исправил (отладку логики пока не делал) и запустил в симуляторе. Результат - ошибка обращения к памяти. Долго копал в чём дело и пришёл к выводу что компилятор иногда некорректно проставляет адрес переходя для rjump rcall если размер кода превышает 4096 байт. Кусок неправильного кода (не единственный в проге):
00000052 <do_clear_bss_start>:
52: a9 3e cpi r26, 0xE9 ; 233
54: b1 07 cpc r27, r17
56: e1 f7 brne .-8 ; 0x50 <do_clear_bss_loop>
58: c2 d1 rcall .+900 ; 0x3de <main>
5a: af cd rjmp .-1186 ; 0xfffffbba <__eeprom_end>
0000005c <__bad_interrupt>:
5c: d1 cf rjmp .-94 ; 0x0 <__vectors>
**************************
00001bba <_exit>:
1bba: ff cf rjmp .-2 ; 0x1bba <_exit>
вместо 0xfffffbba <__eeprom_end> должен быть переход на 0x1bba <_exit>, и компилятор так и делает если <exit> располагается до 0x1000.
Кусок правильного кода:
00000052 <do_clear_bss_start>:
52: ad 39 cpi r26, 0x9D ; 157
54: b1 07 cpc r27, r17
56: e1 f7 brne .-8 ; 0x50 <do_clear_bss_loop>
58: c2 d1 rcall .+900 ; 0x3de <main>
5a: 10 c3 rjmp .+1568 ; 0x67c <_exit>
0000005c <__bad_interrupt>:
5c: d1 cf rjmp .-94 ; 0x0 <__vectors>
**************************
0000067c <_exit>:
67c: ff cf rjmp .-2 ; 0x67c <_exit>
WinAvr - 20071221rc1.
Заметил ещё одну странность, в настройках памяти в Avr Studio (MemorySettings) Flash Size для atmega8 указан как 0x1000 !!! Возможно Flash Size указан в словах, но тогда почему размер eeprom и ram соответствует размеру в байтах ? И почему тогда компилятор показывал что .text + ... занимает менее 70% флеша.
У меня зародилась мысль что я немного не понимаю организацию памяти мк. Прошу помощи у гуру, в чём кроется бага !!!
00000052 <do_clear_bss_start>:
52: a9 3e cpi r26, 0xE9 ; 233
54: b1 07 cpc r27, r17
56: e1 f7 brne .-8 ; 0x50 <do_clear_bss_loop>
58: c2 d1 rcall .+900 ; 0x3de <main>
5a: af cd rjmp .-1186 ; 0xfffffbba <__eeprom_end>
0000005c <__bad_interrupt>:
5c: d1 cf rjmp .-94 ; 0x0 <__vectors>
**************************
00001bba <_exit>:
1bba: ff cf rjmp .-2 ; 0x1bba <_exit>
вместо 0xfffffbba <__eeprom_end> должен быть переход на 0x1bba <_exit>, и компилятор так и делает если <exit> располагается до 0x1000.
Кусок правильного кода:
00000052 <do_clear_bss_start>:
52: ad 39 cpi r26, 0x9D ; 157
54: b1 07 cpc r27, r17
56: e1 f7 brne .-8 ; 0x50 <do_clear_bss_loop>
58: c2 d1 rcall .+900 ; 0x3de <main>
5a: 10 c3 rjmp .+1568 ; 0x67c <_exit>
0000005c <__bad_interrupt>:
5c: d1 cf rjmp .-94 ; 0x0 <__vectors>
**************************
0000067c <_exit>:
67c: ff cf rjmp .-2 ; 0x67c <_exit>
WinAvr - 20071221rc1.
Заметил ещё одну странность, в настройках памяти в Avr Studio (MemorySettings) Flash Size для atmega8 указан как 0x1000 !!! Возможно Flash Size указан в словах, но тогда почему размер eeprom и ram соответствует размеру в байтах ? И почему тогда компилятор показывал что .text + ... занимает менее 70% флеша.
У меня зародилась мысль что я немного не понимаю организацию памяти мк. Прошу помощи у гуру, в чём кроется бага !!!
Во-первых, могли бы и код показать, а то в асм листинге изготовленном компилятором разбираться тяжело.ket_nnz писал(а):Всем привет. ...
Заметил ещё одну странность, в настройках памяти в Avr Studio (MemorySettings) Flash Size для atmega8 указан как 0x1000 !!! Возможно Flash Size указан в словах, но тогда почему размер eeprom и ram соответствует размеру в байтах ? И почему тогда компилятор показывал что .text + ... занимает менее 70% флеша.
Во-вторых, как я думаю сам компилятор так косячить не должен, видимо его "кто-то хорошенько попросил".
В-третьих версия достаточно старая, да еще и релиз-кандидат.
В общем, делайте выводы.
По поводу памяти. Флешь организована пословно, поэтому и размер в словах, еепром и рам - побайтно, размер соответсвенно в байтах.
2smac
Спасибо, насчёт памяти понял. Покапал ещё немного и выяснил что проблема в rcall и rjmp, по даташиту они могут делать переходы до +- 2К слов (+-4096) байт. В этом и проблема, нужен переход дальше, либо другая копмоновка функций в сегменте. С 2008 г. atmel убрал jmp и call из даташита для atmega8 (и из студии) и теперь мега их не поддерживает (не знаю аппаратно поменяли или нет). Собственно проблема остаётся или в компоновщике (версия 2007 года) или в голове (придётся делать upgrade знаний по gcc). Сначала попробую взять новую версию WinAvr.
Итак поизучав инет и запустив код в отладчике (почему сразу этого не сделал
), возникли сомнения в диагнозе, тот страшный адрес fffffxxx на самом деле врапится (счётчик 12 битный и отсчёт ведётся в обратную сторону) и преобразовывается в xxx, по крайней мере в студии ошибки не возникает и код работает. Т.е. надо смотреть на Proteus , а не на компилятор.
Спасибо, насчёт памяти понял. Покапал ещё немного и выяснил что проблема в rcall и rjmp, по даташиту они могут делать переходы до +- 2К слов (+-4096) байт. В этом и проблема, нужен переход дальше, либо другая копмоновка функций в сегменте. С 2008 г. atmel убрал jmp и call из даташита для atmega8 (и из студии) и теперь мега их не поддерживает (не знаю аппаратно поменяли или нет). Собственно проблема остаётся или в компоновщике (версия 2007 года) или в голове (придётся делать upgrade знаний по gcc). Сначала попробую взять новую версию WinAvr.
Итак поизучав инет и запустив код в отладчике (почему сразу этого не сделал
Добрый день. Нашел непонятную багу. Использую AT90USBKey плату. Пишем примитивную программу:
#include "io.h"
void main (void)
{
DDRD=0b11111111;
PORTD=0b01010000;
while (1) {}
}
и компилячим ее в CodeVision и AvrStudio(WinAvr-compiler).
Программа кодвижина работают правильно - светодиоды загораются и горят постоянно. Программа скомпилированная винавр - сведодиоды МИГАЮТ с частотой ~10Гц. При этом, длинна программ еще различается на 10байт.
Подскажите, в чем дело, что я не так делаю может? Или где-то что-то в настройка компилера не так?
#include "io.h"
void main (void)
{
DDRD=0b11111111;
PORTD=0b01010000;
while (1) {}
}
и компилячим ее в CodeVision и AvrStudio(WinAvr-compiler).
Программа кодвижина работают правильно - светодиоды загораются и горят постоянно. Программа скомпилированная винавр - сведодиоды МИГАЮТ с частотой ~10Гц. При этом, длинна программ еще различается на 10байт.
Подскажите, в чем дело, что я не так делаю может? Или где-то что-то в настройка компилера не так?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18647
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
выделенное жирным - лишнее, этот файл автоматически подключается, если в make-file указана целевая платформа MCUket_nnz писал(а):Попробуй:
#include <avr>
#include <avr> // для at90usb82, если устройство другое. то соответствующий заголовок + настройки проекта (makefile)
int main (void)
{
DDRD=0b11111111;
PORTD=0b01010000;
while (1) {}
}
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
saint981
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Вс мар 08, 2009 22:52:27
- Откуда: Ukraine
Скачал последнюю версию 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 без проблем
высылаю архив с проектом
//Маячок-мигалка =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 без проблем
высылаю архив с проектом
- Вложения
-
- 1.RAR
- (5.5 КБ) 258 скачиваний
Я просто создал новый Makefile по инструкции как создать новый проект в WinAVR 2009saint981 писал(а):Скачал последнюю версию WinAVR 20090313
имею следующую ошибку по мнению компилятора:
и исправил ошибку - у вас lse было написано.
вот ваш проект работает в WinAVR 2009
Последний раз редактировалось ikarab Пт мар 20, 2009 20:14:59, всего редактировалось 1 раз.


