Страница 49 из 111
Re: WinAvr в вопросах и ответах
Добавлено: Пт дек 30, 2011 22:51:37
Мастер Ломастер
на счет таймеров и не слыхал, а в первую очередь брезенхам для рисования прямых линий без умножения/деления был применен, если не ошибаюсь

это четвертое?
P.S. гугль знает все, ну так он пусть и напишет на форуме

Re: WinAvr в вопросах и ответах
Добавлено: Пт дек 30, 2011 23:03:30
urry
Re: WinAvr в вопросах и ответах
Добавлено: Сб дек 31, 2011 00:36:55
BCluster
Как же я люблю срач, но даже меня он начинает уставать ))))
Re: WinAvr в вопросах и ответах
Добавлено: Сб дек 31, 2011 03:53:43
BerZerK-ku
Мастер Ломастер писал(а): что ж, выход один - снова подкорректировать константу, которая соответствует "чистой" задержке в1 микросекунду, т.е. взять не 0.8, а меньше. т.е. в моих опытах вместо 100-101-102 и т.п. задержек получалось примерно (десятые доли откидываю) 112-113-114 и т.д.

т.е. получается вы опять не угадали? который раз приходится править "банальный пример", чтобы он заработал?
Подскажите, и что же надо запихнуть в _delay_us() в вашей функции, чтобы получить желаемый результат для 100, 200 и т.д. мкс? Вряд ли ошибусь, если скажу что ничего не получится.
Чтобы не быть голословным:
Частота 10Мгц, измеряю на "задержке 100мкс": значение 0.8 дает 120мкс, 0.5 - 90мкс.
Частота 16Мгц, измеряю на "задержке 100мкс": значение 0.8 дает 113мкс, 0.7 - 94мкс.
Re: WinAvr в вопросах и ответах
Добавлено: Сб дек 31, 2011 11:28:02
danger3466
Не могу получить символ из юарт, отправляю без проблем
Инициализация:
Код: Выделить всё
void UART_Init(void)
{
UBRRH = UBRRH_VALUE;
UBRRL = UBRRL_VALUE;
UCSRB = (1 << TXEN) | (1 << RXEN);
UCSRC = (1 << USBS) | (3 << UCSZ0);
stdin = &UART_console;
stdout = &UART_console;
}
Код: Выделить всё
void getstring(char *a, char size){
char ch, i = 0;
do{
//ch = fgetc(stdin);
//ch = getchar(stdin);
while ( !(UCSRA & (1<<RXC)) )
ch = UDR;
if(ch == '\n' || ch == '\r') ch = '\0';
if(i == size) ch = '\0';
a[(int)i] = ch;
i++;
} while(ch != '\0' && i <= size);
}
в main:
Код: Выделить всё
puts("Hello\r");
char a[bufersize];
getstring(a, bufersize);
//puts(a);
bufersize в дефайне
даже puts("Hello\r"); не работает, если не закомментировать getstring(a, bufersize);
а в этот момент ВЫВОДИТ в юарт артефакт "g", независимо каким способом получать символ, видимо тут все ломается
Код: Выделить всё
//ch = fgetc(stdin);
//ch = getchar(stdin);
while ( !(UCSRA & (1<<RXC)) )
ch = UDR;
Re: WinAvr в вопросах и ответах
Добавлено: Сб дек 31, 2011 16:07:02
Мастер Ломастер
BerZerK-ku писал(а):который раз приходится править "банальный пример", чтобы он заработал?
Подскажите, и что же надо запихнуть в _delay_us() в вашей функции, чтобы получить желаемый результат для 100, 200 и т.д. мкс? Вряд ли ошибусь, если скажу что ничего не получится.
если не ошибетесь - это будет первое очко в вашу пользу

а мне надоело перед вами бисер метать. захотите явного соревнования - перчатка где-то у вас под ногами валяется.
там писали не совсем об этой теме. здесь, очевидно, нерешаемая задача в рамках WinAVR - возможно, на чистом ассемблере и можно добиться почти нормального решения, но на Си - маловероятно. кратко: здесь идет речь о функциях ПРОГРАММНОЙ задержки, задаваемой значением переменной. причем кое-кому хочется иметь возможность получать задержки с шагом в 1 микросекунду в диапазоне от 1 микросекунды до часов и более
в микросекундном диапазоне и тем более с ПРОГРАММНЫМИ задержками (т.е. без аппаратных таймеров) Брезенхам неуместен.
Re: WinAvr в вопросах и ответах
Добавлено: Сб дек 31, 2011 21:32:33
BCluster
С новым годом господа! Не деритесь

Re: WinAvr в вопросах и ответах
Добавлено: Вт янв 03, 2012 16:02:20
PeLeg
Привет всем! Господа не могу найти ошибку: после компиляции выскакивает вот такая ошибка main.c:undefined reference to 'имя функции'.
Ситуация такая: есть главный файл main.c и заголовочный uart.h,который я подключаю как #include "uart.h",функция,имя которой высвечивается в ошибке определена в этом заголовочном файле. В чем может быть проблема?

Re: WinAvr в вопросах и ответах
Добавлено: Вт янв 03, 2012 16:30:06
urry
включить в makefile uart.c, возможно.
Re: WinAvr в вопросах и ответах
Добавлено: Вт янв 03, 2012 16:39:12
PeLeg
urry писал(а):включить в makefile uart.c, возможно.
А куда его включать-то

? вот допустим майкфайл:
Код: Выделить всё
...
# Target file name (without extension).
TARGET = main
# Object files directory
# To put object files in current directory, use a dot (.), do NOT make
# this an empty or blank macro!
OBJDIR = .
# List C source files here. (C dependencies are automatically generated.)
SRC = $(TARGET).c
# List C++ source files here. (C dependencies are automatically generated.)
CPPSRC =
...
а куда включать заголовочный файл,вернее куда вписать его имя?

Re: WinAvr в вопросах и ответах
Добавлено: Вт янв 03, 2012 16:49:23
urry
приложите мейкфайл
Re: WinAvr в вопросах и ответах
Добавлено: Вт янв 03, 2012 17:00:17
PeLeg
urry писал(а):приложите мейкфайл

Все,спасибо, японял,надо было дописать в мейкфайле имя сишного файла uart.c для заголовка uart.h,если я правильно понял вот так:
Код: Выделить всё
# List C source files here. (C dependencies are automatically generated.)
SRC = $(TARGET).c uart.c
Подправьте меня,если что не так.вроде бы скомпилился

Re: WinAvr в вопросах и ответах
Добавлено: Вт янв 03, 2012 17:05:24
urry
это как бы немного неправильно, при очистке может не задеть объектный файл, все как-то проще.
мой мейкфайл от чего-то там
Код: Выделить всё
TARGET = rom_winavr_mob
F_CPU = 20000000
CSRC = main.c lmx2322.c
ASRC =
MCU_TARGET = atmega48
OPTIMIZE = -Os -mcall-prologues
DEFS =
LIBS =
DEBUG = dwarf-2
CC = avr-gcc
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs $(DEFS)
ALL_ASFLAGS = -mmcu=$(MCU_TARGET) -I. -x assembler-with-cpp $(ASFLAGS)
CFLAGS = -g$(DEBUG) -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) $(DEFS)
LDFLAGS = -Wl,-Map,$(TARGET).map
OBJ = $(CSRC:.c=.o) $(ASRC:.S=.o)
OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
SIZE = avr-size
all: clean $(TARGET).elf lst text size
$(TARGET).elf: $(OBJ)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)
clean:
rm -rf *.o $(TARGET).elf *.eps *.bak *.a
rm -rf *.lst *.map $(EXTRA_CLEAN_FILES)
rm -rf $(TARGET).hex
size: $(TARGET).elf
$(SIZE) -C --mcu=$(MCU_TARGET) $(TARGET).elf
lst: $(TARGET).lst
%.lst: %.elf
$(OBJDUMP) -h -S $< > $@
%.o : %.S
$(CC) -c $(ALL_ASFLAGS) $< -o $@
text: hex
hex: $(TARGET).hex
%.hex: %.elf
$(OBJCOPY) -j .text -j .data -O ihex $< $@
Re: WinAvr в вопросах и ответах
Добавлено: Вт янв 03, 2012 17:13:23
PeLeg
urry писал(а):это как бы немного неправильно, при очистке может не задеть объектный файл, все как-то проще.
кусок мой мейкфайл от чего-то там

Немножко непонятно,а что вы туда новенького добавили кроме имени заголовочного файла?
Re: WinAvr в вопросах и ответах
Добавлено: Вт янв 03, 2012 17:25:42
urry
не понял вопрос - куда именно ???
в мейк файле выставляется частота, тип контроллера, оптимизация, сишные файлы и при необходимости - ассемблерные вставки (*.S) и еепром.
Re: WinAvr в вопросах и ответах
Добавлено: Пт янв 06, 2012 08:48:17
shurikss123
Привет всем, есть вопрос по поводу работы внутренней eepprom.
в интернетах надыбал что если задать переменную так volatile int EEMEM butt1=0; то он сформирует файл с данными eeprom, и его можно записать, так вот а как задать адрес этой переменной (чтоб он эти данные засунул не в первую ячейку, а к примеру в 20-ю).
Re: WinAvr в вопросах и ответах
Добавлено: Пт янв 06, 2012 11:33:50
BCluster
Ну в винавр я не знаю если возможно, в IAR возможно точно. Вопрос - а зачем вам это нужно? Может есть другой способ решить проблему?
Re: WinAvr в вопросах и ответах
Добавлено: Пт янв 06, 2012 13:41:51
shurikss123
BCluster писал(а):Ну в винавр я не знаю если возможно, в IAR возможно точно. Вопрос - а зачем вам это нужно? Может есть другой способ решить проблему?
может и можно, просто вдруг я страшный извращенец, я спросил, и жду ответа. да или нет, если да то как?
Re: WinAvr в вопросах и ответах
Добавлено: Пт янв 06, 2012 14:14:01
BCluster
Можно сделать массив на весь объем еепрома и тогда можно адресовать как угодно

Re: WinAvr в вопросах и ответах
Добавлено: Пт янв 06, 2012 16:11:36
Мастер Ломастер
shurikss123 писал(а):Привет всем, есть вопрос по поводу работы внутренней eepprom.
в интернетах надыбал что если задать переменную так volatile int EEMEM butt1=0; то он сформирует файл с данными eeprom, и его можно записать, так вот а как задать адрес этой переменной (чтоб он эти данные засунул не в первую ячейку, а к примеру в 20-ю).
если вам в жизни не хватает геморроя, то можно его получить. WinAVR для задуманного вами предоставляет 2 способа:
1. определить для вашей переменной отдельную секцию, а затем в командной строке указать линкеру адрес, по которому эту секцию размещать. способ непростой, имхо.
2. определить в программе указатель, присвоить ему нужный адрес, и работать с ним, как с указателем (т.е. адресом) вашей переменной - в этом случае все значительно проще, имхо.