реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Шпак передача данных по USART
zeonix0
сообщение Aug 22 2011, 05:29
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 18-08-11
Пользователь №: 66 777



программа такая:
Код
#include <avr/io.h>
#include <avr/interrupt.h> //Для доступа к функции sei()
#include <avr/signal.h>    //Для доступа к макросу INTERRUPT
//Определяем одиннадцать выводимых строк (последняя - на тот случай, если был принят не цифровой символ)

char str0[] = "Zero";
char strl[] = "One";
char str2[] = "Two";
char str3[] = "Three";
char str4[] = "Four";
char str5[] = "Five";
char str6[] = "Six";
char str7[] = "Seven";
char str8[] = "Eight";
char str9[] = "Nine";
char strDefault[] = "Not digit";
unsigned char queueC, sendC;  //Индексы текущего и переданного символа
unsigned char queue[50];      //Очередь

ISR(USART0_TX_vect)  //Подпрограмма обработки прерывания при завершении передачи очередного символа.
{    //Если был передан не последний символ, то передаем текущий и увеличиваем счетчик переданных данных на 1
if (queueC != sendC) UDR = queue[sendC++];
}

//Функция формирования очереди символов из строки
void SendStr(char *s)
{
    queueC =0;    //Текущий символ - первый
    sendC = 1;    //Первый символ считаем уже переданным
    queue[queueC++] = 0x0D;       //Добавляем в конец очереди символы
    queue[queueC++] = 0x0A;       // возврата каретки и переноса строки. Просматриваем строку и помещаем в очередь символы.
    while (*s) queue[queueC++] = *s++;
    UDR = queue[0];              //Передаем первый символ, чтобы начать процесс
}

int main (void){
    char с;
    UCR = 0x58;
    UBRR = 0x33;
    sei();                    //Общее разрешение прерываний
    while(1)                //Бесконечный цикл
    {
        if (UCR & 0x80)    //Если UART принял символ от ПК,...
        {
        с = UDR;
            switch    (с)        //Анализируем символ и выводим соответствующую
            {                //строку через UART
                case    '0':    SendStr(str0); break;
                case    '1':    SendStr(strl); break;
                case    '2':    SendStr(str2); break;
                case    '3':    SendStr(str3); break;
                case    '4':    SendStr(str4); break;
                case    '5':    SendStr(str5); break;
                case    '6':    SendStr(str6); break;
                case    '7':    SendStr(str7); break;
                case    '8':    SendStr(str8); break;
                case    '9':    SendStr (str9); break;
                default: SendStr(strDefault);
            }
        }
    }    
}


лог ошибок такой:

Цитата
> "make.exe" all

-------- begin --------
avr-gcc (WinAVR 20100110) 4.3.3
Copyright © 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Compiling C: test3.c
avr-gcc -c -mmcu=atmega16a -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./test3.lst -std=gnu99 -MMD -MP -MF .dep/test3.o.d test3.c -o test3.o
In file included from test3.c:3:
c:/winavr/lib/gcc/../../avr/include/avr/signal.h:36:2: warning: #warning "This header file is obsolete. Use <avr/interrupt.h>."
test3.c:20: warning: 'USART0_TX_vect' appears to be a misspelled signal handler
test3.c: In function 'main':
test3.c:37: error: stray '\361' in program
test3.c:37: warning: useless type name in empty declaration
test3.c:38: error: 'UCR' undeclared (first use in this function)
test3.c:38: error: (Each undeclared identifier is reported only once
test3.c:38: error: for each function it appears in.)
test3.c:39: error: 'UBRR' undeclared (first use in this function)
test3.c:45: error: stray '\361' in program
test3.c:45: error: expected expression before '=' token
test3.c:46: error: stray '\361' in program
test3.c:46: error: expected expression before ')' token
make.exe: *** [test3.o] Error 1

> Process Exit Code: 2
> Time Taken: 00:01


вот например
Цитата
test3.c:37: error: stray '\361' in program


Код
char с;

что тут не так?
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 22 2011, 05:52
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Вместо 'с' напиши 'c' sm.gif)

У тебя переменная названа русской буквой с
Go to the top of the page
 
+Quote Post
zeonix0
сообщение Aug 22 2011, 05:57
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 18-08-11
Пользователь №: 66 777



а
Цитата
38: error: 'UCR' undeclared (first use in this function)

UCR = 0x58;
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 22 2011, 06:03
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



UCR undeclared скорее всего означает, что проект транслируется для проца в котором отсутствует UART

Сообщение отредактировал 777777 - Aug 22 2011, 06:04
Go to the top of the page
 
+Quote Post
zeonix0
сообщение Aug 22 2011, 06:08
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 18-08-11
Пользователь №: 66 777



makefile выложить? atmega16a там все есть.
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 22 2011, 06:24
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(zeonix0 @ Aug 22 2011, 10:08) *
makefile выложить? atmega16a там все есть.

Во-первых нужно обратить внимание на warning "This header file is obsolete. Use <avr/interrupt.h>." и выкинуть #include <avr/signal.h>
Во-вторых заглянуть в файл iom16a.h и увидеть, что обработчик прерывания передатчика называется USARTTXC_vect
В-третьих заглянуть в даташит и увидеть, что регистров UCR и UBRR в 16а нет.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 22 2011, 06:40
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



В атмеге 16 UCSRA, например.
И
ISR(USART_TXC_vect)

Но у Вас ATMEGA168, как я понял из тем других Ваших тем?

Сообщение отредактировал Genadi Zawidowski - Aug 22 2011, 06:57
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 22 2011, 06:55
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



А что такое "шпак"?
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 22 2011, 06:59
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата(777777 @ Aug 22 2011, 10:55) *
А что такое "шпак"?

Судя по всему, какая-то библия... о которой все должны и так знать, без разъяснений.
Go to the top of the page
 
+Quote Post
zeonix0
сообщение Aug 22 2011, 07:03
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 18-08-11
Пользователь №: 66 777



шпак это мужик который написал проги для МК, которые я пытаюсь запустить.
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 22 2011, 07:05
Сообщение #11


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(zeonix0 @ Aug 22 2011, 11:03) *
шпак это мужик который написал проги для МК, которые я пытаюсь запустить.

А, тогда понятно откуда столько вопросов. Лучше читай даташит вместо этого мужика.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Aug 22 2011, 07:40
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Де жавю biggrin.gif
Цитата
'Aug 18 2011, 15:15' post='963437']
Здесь все прекрасно знают , где найти DS на ATMEL. Это Вам надо изучить.

Цитата
Aug 19 2011, 11:30' post='963731']
Выкиньте Шпака на свалку. Читайте оригинальный datasheet, документацию на компилятор и его библиотеку, а также букварь по си. Прощайте...

Цитата
'Aug 22 2011, 11:05' post='964537']
А, тогда понятно откуда столько вопросов. Лучше читай даташит вместо этого мужика.

lol.gif


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
zeonix0
сообщение Aug 22 2011, 07:47
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 18-08-11
Пользователь №: 66 777



меня прикалывает шпак просто...
Может кто посоветовать аналог его проги рабочей для Atmega16a?
электронику собрал всю а прогу пока написать не могу.

Кстати я даташит не читал ,но читал\читаю евстифеева микроконтроллеры авр семейста тини и мега.

Кстати в даташитах прог нету же. чисто описание архитектуры, ну да там список регистров можно узнать.
Go to the top of the page
 
+Quote Post
zeonix0
сообщение Aug 22 2011, 09:19
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 18-08-11
Пользователь №: 66 777



Цитата(Genadi Zawidowski @ Aug 22 2011, 10:40) *
В атмеге 16 UCSRA, например.
И
ISR(USART_TXC_vect)

Но у Вас ATMEGA168, как я понял из тем других Ваших тем?

нет у меня атмега 16а... везде уже пишу об этом)))
сделал как вы посоветовали
Цитата
Compiling C: test3.c
avr-gcc -c -mmcu=atmega16a -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./test3.lst -std=gnu99 -MMD -MP -MF .dep/test3.o.d test3.c -o test3.o
In file included from test3.c:3:
c:/winavr/lib/gcc/../../avr/include/avr/signal.h:36:2: warning: #warning "This header file is obsolete. Use <avr/interrupt.h>."
test3.c:20: warning: 'USART_TXC_vect' appears to be a misspelled signal handler
test3.c: In function 'main':
test3.c:39: error: 'UBRR' undeclared (first use in this function)
test3.c:39: error: (Each undeclared identifier is reported only once
test3.c:39: error: for each function it appears in.)
make.exe: *** [test3.o] Error 1

> Process Exit Code: 2
> Time Taken: 00:011

UBRR на UBRRL поменять что ли?

Код
#include <avr/io.h>
#include <avr/interrupt.h> //Для доступа к функции sei()

//Определяем одиннадцать выводимых строк (последняя - на тот случай, если был принят не цифровой символ)

char str0[] = "Zero";
char strl[] = "One";
char str2[] = "Two";
char str3[] = "Three";
char str4[] = "Four";
char str5[] = "Five";
char str6[] = "Six";
char str7[] = "Seven";
char str8[] = "Eight";
char str9[] = "Nine";
char strDefault[] = "Not digit";
unsigned char queueC, sendC;  //Индексы текущего и переданного символа
unsigned char queue[50];      //Очередь

ISR(USART_TXC_vect)  //Подпрограмма обработки прерывания при завершении передачи очередного символа.
{    //Если был передан не последний символ, то передаем текущий и увеличиваем счетчик переданных данных на 1
if (queueC != sendC) UDR = queue[sendC++];
}

//Функция формирования очереди символов из строки
void SendStr(char *s)
{
    queueC =0;    //Текущий символ - первый
    sendC = 1;    //Первый символ считаем уже переданным
    queue[queueC++] = 0x0D;       //Добавляем в конец очереди символы
    queue[queueC++] = 0x0A;       // возврата каретки и переноса строки. Просматриваем строку и помещаем в очередь символы.
    while (*s) queue[queueC++] = *s++;
    UDR = queue[0];              //Передаем первый символ, чтобы начать процесс
}

int main (void){
    char c;
    UCSRA = 0x58;
    UBRRL = 0x33;
    sei();                    //Общее разрешение прерываний
    while(1)                //Бесконечный цикл
    {
        if (UCSRA & 0x80)    //Если UART принял символ от ПК,...
        {
        c = UDR;
            switch    (c)        //Анализируем символ и выводим соответствующую
            {                //строку через UART
                case    '0':    SendStr(str0); break;
                case    '1':    SendStr(strl); break;
                case    '2':    SendStr(str2); break;
                case    '3':    SendStr(str3); break;
                case    '4':    SendStr(str4); break;
                case    '5':    SendStr(str5); break;
                case    '6':    SendStr(str6); break;
                case    '7':    SendStr(str7); break;
                case    '8':    SendStr(str8); break;
                case    '9':    SendStr (str9); break;
                default: SendStr(strDefault);
            }
        }
    }    
}


такой резульатат:

Цитата
> "make.exe" all

-------- begin --------
avr-gcc (WinAVR 20100110) 4.3.3
Copyright © 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Size before:
AVR Memory Usage
----------------
Device: atmega16a

Program: 486 bytes (3.0% Full)
(.text + .data + .bootloader)

Data: 112 bytes (10.9% Full)
(.data + .bss + .noinit)




Compiling C: test3.c
avr-gcc -c -mmcu=atmega16a -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./test3.lst -std=gnu99 -MMD -MP -MF .dep/test3.o.d test3.c -o test3.o
test3.c:20: warning: 'USART_TXC_vect' appears to be a misspelled signal handler

Linking: test3.elf
avr-gcc -mmcu=atmega16a -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=test3.o -std=gnu99 -MMD -MP -MF .dep/test3.elf.d test3.o --output test3.elf -Wl,-Map=test3.map,--cref -lm

Creating load file for Flash: test3.hex
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock test3.elf test3.hex

Creating load file for EEPROM: test3.eep
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 --no-change-warnings -O ihex test3.elf test3.eep || exit 0

Creating Extended Listing: test3.lss
avr-objdump -h -S -z test3.elf > test3.lss

Creating Symbol Table: test3.sym
avr-nm -n test3.elf > test3.sym

Size after:
AVR Memory Usage
----------------
Device: atmega16a

Program: 486 bytes (3.0% Full)
(.text + .data + .bootloader)

Data: 112 bytes (10.9% Full)
(.data + .bss + .noinit)



-------- end --------


> Process Exit Code: 0
> Time Taken: 00:01

вроде скомпилился норм... но правильно ли это?
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 22 2011, 09:58
Сообщение #15


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата
вроде скомпилился норм... но правильно ли это?

В листинге было одно предупреждение, советую проанализировать, что бы это значило.

Цитата
test3.c:20: warning: 'USART_TXC_vect' appears to be a misspelled signal handler

Смените тип процессора с ATMEGA16A на ATMEGA16 или смените название обработчика с USART_TXC_vect на USARTTXC_vect

Ну хоть немного понитересуйтесь содержимым заголовочных файлов компилятора (что происходит после включения файла io.h), ещё раз - ну загляните наконец в чужой работающий проект!

Про скорость:
Регистр широкий, в зависимости от тактовой и скорости надо грузить значение в обе половины:
Код
    UBRRH = (value >> 8) & 0xff;
    UBRRL = value & 0xff;




Сообщение отредактировал Genadi Zawidowski - Aug 22 2011, 10:17
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 09:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01528 секунд с 7
ELECTRONIX ©2004-2016