WinAvr в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Bird55
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Вт сен 02, 2008 18:17:29

Сообщение Bird55 »

TechMike писал(а):Использую WinAVR 20050214 всем доволен, но понадобилось работать с tiny45, а ее в 2005 версии еще нет. Что посоветуете из стабильных версий WinAVR с как минимум поддержкой tiny45/25.
Шью МК с помощью avrdude, отлаживаю в AVR Studio 4.15.


WinAVR 20080610 Released, там есть поддержка attiny45/25
Аватара пользователя
dt_andrew
Мявтор!
Сообщения: 2057
Зарегистрирован: Чт ноя 30, 2006 12:27:46
Откуда: Челябинск

Сообщение dt_andrew »

а можно ли передать в функцию в качестве параметра имя порта
а потом внутри функции использовать это имя
Спасибо
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

dt_andrew писал(а):а можно ли передать в функцию в качестве параметра имя порта
а потом внутри функции использовать это имя
Спасибо
имя - бесполезно, а вот адрес - запросто. то есть указатель. WinAVR обращается к портам, как к ячейкам памяти (надеюсь, эту особенность архитектуры AVR все знают) - поэтому можно объявить указатель на байт, присвоить ему адрес нужного порта - и вперед!

Код: Выделить всё

void my_func(uint8_t *port){
   // что-то делаем с портом, например:
   *port ^=1;
}

// вызываем функцию
my_func(&PORTB);
my_func(&PORTC);
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
dt_andrew
Мявтор!
Сообщения: 2057
Зарегистрирован: Чт ноя 30, 2006 12:27:46
Откуда: Челябинск

Сообщение dt_andrew »

хм :) интересно
я когда посмотрел в winavr определение для порта

там было #define PORTD _SEF_IO8(0x12);

тоже подумал что можно адрес передавать
но никогда почему то не думал что надо как указатель передавать

век живи век учись :oops:

Спасибо ARV!!!
Аватара пользователя
UkrRadist
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Вс янв 13, 2008 00:40:29
Откуда: україна,Київ,Дубровиця
Контактная информация:

Сообщение UkrRadist »

собрал себе схему частотомера на SAB6456 и Mega8.Написал програму на С в AvrStudio под WinAVR.Запустил вроде бы работает, циферки скачут... .При попытке отлаживать дебаггером, внизу вилазит ошибка, мол неправильно установлен указатель стека, так немного промучавсь обнаружив, что я ошибочно указал тип прибора не Мега8, а Тини 2313.исправил и при прошивки на экране просто высвечиваются начальный экран(первое, что в голову пришло - не обрабатываются прерывания).Вновь помучавсь обнаружил интересную вещицу.
у меня основная программа в цикле выводит на ЛЕД-дисплей четире числа - частоту, которые обчистиваются в подпрограмме обработки переполнения таймера=1с.Так вот суть вся в том, что подпрограмма запускается(если в ней вписать команду вывода в порт, то видно как светодиод мигает), частота вычисляется, но в основной программе эти данные будто не выдимы.Все переменные обявлены глобальными.
После этого провел эксперимент, просто в цикле основной программы вывожу цифру, в подпрограмме прописываю заменить эту переменную на другое число, но после прошивки, все по старому, на экране первое число...
Уже не знаю что можно предположить.Может это какой то глюк?я впервые пишу программу на С для Мега8 с использованием прерываний, на Тини все было нормально.
Надо жить с надеждой!
Аватара пользователя
bsyomov
Нашел транзистор. Понюхал.
Сообщения: 179
Зарегистрирован: Вт ноя 04, 2008 11:15:49
Откуда: Санкт-Петербург
Контактная информация:

Сообщение bsyomov »

А если добавить

Код: Выделить всё

 volatile 
перед описанием глобальных переменных, используемых в прерываниях? =)
Аватара пользователя
UkrRadist
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Вс янв 13, 2008 00:40:29
Откуда: україна,Київ,Дубровиця
Контактная информация:

Сообщение UkrRadist »

Да!Действительно получилось.А я все думал, что это какая то ошибка.
Удивительно то, что когда я ошибочно скомпилировал свой код, написан для Мега8, под Тини 2313 все работало!
Большое спасибо за подказку! :)))
Надо жить с надеждой!
ket_nnz
Родился
Сообщения: 6
Зарегистрирован: Ср мар 11, 2009 19:50:21

Сообщение ket_nnz »

Всем привет. Возникла необходимость сваять программку под 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% флеша.

У меня зародилась мысль что я немного не понимаю организацию памяти мк. Прошу помощи у гуру, в чём кроется бага !!!
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

ket_nnz писал(а):Всем привет. ...

Заметил ещё одну странность, в настройках памяти в Avr Studio (MemorySettings) Flash Size для atmega8 указан как 0x1000 !!! Возможно Flash Size указан в словах, но тогда почему размер eeprom и ram соответствует размеру в байтах ? И почему тогда компилятор показывал что .text + ... занимает менее 70% флеша.

Во-первых, могли бы и код показать, а то в асм листинге изготовленном компилятором разбираться тяжело.
Во-вторых, как я думаю сам компилятор так косячить не должен, видимо его "кто-то хорошенько попросил".
В-третьих версия достаточно старая, да еще и релиз-кандидат.
В общем, делайте выводы.

По поводу памяти. Флешь организована пословно, поэтому и размер в словах, еепром и рам - побайтно, размер соответсвенно в байтах.
ket_nnz
Родился
Сообщения: 6
Зарегистрирован: Ср мар 11, 2009 19:50:21

Сообщение ket_nnz »

2smac

Спасибо, насчёт памяти понял. Покапал ещё немного и выяснил что проблема в rcall и rjmp, по даташиту они могут делать переходы до +- 2К слов (+-4096) байт. В этом и проблема, нужен переход дальше, либо другая копмоновка функций в сегменте. С 2008 г. atmel убрал jmp и call из даташита для atmega8 (и из студии) и теперь мега их не поддерживает (не знаю аппаратно поменяли или нет). Собственно проблема остаётся или в компоновщике (версия 2007 года) или в голове (придётся делать upgrade знаний по gcc). Сначала попробую взять новую версию WinAvr.

Итак поизучав инет и запустив код в отладчике (почему сразу этого не сделал :( ), возникли сомнения в диагнозе, тот страшный адрес fffffxxx на самом деле врапится (счётчик 12 битный и отсчёт ведётся в обратную сторону) и преобразовывается в xxx, по крайней мере в студии ошибки не возникает и код работает. Т.е. надо смотреть на Proteus , а не на компилятор.
iMSD
Родился
Сообщения: 1
Зарегистрирован: Пт мар 13, 2009 10:38:43

Сообщение iMSD »

Добрый день. Нашел непонятную багу. Использую AT90USBKey плату. Пишем примитивную программу:


#include "io.h"

void main (void)
{
DDRD=0b11111111;
PORTD=0b01010000;
while (1) {}
}

и компилячим ее в CodeVision и AvrStudio(WinAvr-compiler).
Программа кодвижина работают правильно - светодиоды загораются и горят постоянно. Программа скомпилированная винавр - сведодиоды МИГАЮТ с частотой ~10Гц. При этом, длинна программ еще различается на 10байт.
Подскажите, в чем дело, что я не так делаю может? Или где-то что-то в настройка компилера не так?
ket_nnz
Родился
Сообщения: 6
Зарегистрирован: Ср мар 11, 2009 19:50:21

Сообщение ket_nnz »

Попробуй:

#include <avr/io.h>
#include <avr/iousb82.h> // для at90usb82, если устройство другое. то соответствующий заголовок + настройки проекта (makefile)

int main (void)
{
DDRD=0b11111111;
PORTD=0b01010000;
while (1) {}
}
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

ket_nnz писал(а):Попробуй:

#include <avr>
#include <avr> // для at90usb82, если устройство другое. то соответствующий заголовок + настройки проекта (makefile)

int main (void)
{
DDRD=0b11111111;
PORTD=0b01010000;
while (1) {}
}
выделенное жирным - лишнее, этот файл автоматически подключается, если в make-file указана целевая платформа MCU
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
ket_nnz
Родился
Сообщения: 6
Зарегистрирован: Ср мар 11, 2009 19:50:21

Сообщение ket_nnz »

2ARV

Ага, логично, не подумал об этом, пасиб :).
saint981
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Вс мар 08, 2009 22:52:27
Откуда: Ukraine

Сообщение saint981 »

Скачал последнюю версию 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 без проблем

высылаю архив с проектом
Вложения
1.RAR
(5.5 КБ) 258 скачиваний
Аватара пользователя
otvertkin
Открыл глаза
Сообщения: 42
Зарегистрирован: Сб фев 03, 2007 19:43:03
Откуда: E:\Russia\Stavropol

Сообщение otvertkin »

No rule to make target - У меня было такое, если в пути к проэкту или в названии проэкта есть русские буквы. И первый файл в твоем прицепе должен иметь конкретное название "Makefile". Проверь.
Аватара пользователя
ikarab
Опытный кот
Сообщения: 828
Зарегистрирован: Пн мар 16, 2009 21:40:57
Контактная информация:

Сообщение ikarab »

saint981 писал(а):Скачал последнюю версию WinAVR 20090313
имею следующую ошибку по мнению компилятора:


Я просто создал новый Makefile по инструкции как создать новый проект в WinAVR 2009

и исправил ошибку - у вас lse было написано.

вот ваш проект работает в WinAVR 2009
Последний раз редактировалось ikarab Пт мар 20, 2009 20:14:59, всего редактировалось 1 раз.
saint981
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Вс мар 08, 2009 22:52:27
Откуда: Ukraine

Сообщение saint981 »

Попробовал - работает! Единственная порсьба - подробней написаьт, где была ошибка в самой проге или в makefile?
Аватара пользователя
ikarab
Опытный кот
Сообщения: 828
Зарегистрирован: Пн мар 16, 2009 21:40:57
Контактная информация:

Сообщение ikarab »

Мэйкфайл просто новый создал мастером "Мфайл"

А в проге у вас написано lse вместо else
saint981
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Вс мар 08, 2009 22:52:27
Откуда: Ukraine

Сообщение saint981 »

то есть создаем MFile по стандартному шаблону (описан в журнале РА):
1.выбираем имя файла
2. тип чипа
3.уровень оптимизации - 2
4. Debug Format
AVR Studio 4.07, + VMLab 3.10+
и все или еще какой-то пункт пропустил я ?
Ответить

Вернуться в «AVR»