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

 
 
> Шпак передача данных по 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
 
Start new topic
Ответов
Genadi Zawidowsk...
сообщение Aug 22 2011, 06:40
Сообщение #2


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

Группа: Участник
Сообщений: 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
zeonix0
сообщение Aug 22 2011, 09:19
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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
Сообщение #4


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

Группа: Участник
Сообщений: 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

Сообщений в этой теме
- zeonix0   Шпак передача данных по USART   Aug 22 2011, 05:29
- - 777777   Вместо 'с' напиши 'c' ) У тебя пе...   Aug 22 2011, 05:52
- - zeonix0   аЦитата38: error: 'UCR' undeclared (first ...   Aug 22 2011, 05:57
|- - 777777   UCR undeclared скорее всего означает, что проект т...   Aug 22 2011, 06:03
- - zeonix0   makefile выложить? atmega16a там все есть.   Aug 22 2011, 06:08
|- - 777777   Цитата(zeonix0 @ Aug 22 2011, 10:08) make...   Aug 22 2011, 06:24
- - 777777   А что такое "шпак"?   Aug 22 2011, 06:55
|- - Genadi Zawidowski   Цитата(777777 @ Aug 22 2011, 10:55) А что...   Aug 22 2011, 06:59
- - zeonix0   шпак это мужик который написал проги для МК, котор...   Aug 22 2011, 07:03
|- - 777777   Цитата(zeonix0 @ Aug 22 2011, 11:03) шпак...   Aug 22 2011, 07:05
|- - ILYAUL   Де жавю Цитата'Aug 18 2011, 15:15' post...   Aug 22 2011, 07:40
- - zeonix0   меня прикалывает шпак просто... Может кто посовет...   Aug 22 2011, 07:47
- - zeonix0   ген , спасибо. Попробую   Aug 22 2011, 12:12
|- - Genadi Zawidowski   Цитата(zeonix0 @ Aug 22 2011, 16:12) ген ...   Aug 29 2011, 15:28
- - zeonix0   RE: Шпак передача данных по USART   Aug 29 2011, 07:07
|- - 777777   Цитата(zeonix0 @ Aug 29 2011, 11:07) Кодc...   Aug 29 2011, 07:44
- - zeonix0   какая разница этого в контексте данного топика? ну...   Aug 29 2011, 08:56
- - Vasily_   Осциллом надо измерять а не вольтметром, хотя не и...   Aug 29 2011, 09:06
|- - zeonix0   Цитата(Vasily_ @ Aug 29 2011, 13:06) Осци...   Aug 29 2011, 09:11
- - GDI   Если вместо -8.5В меяется +6.48В, то однозначно до...   Aug 29 2011, 12:31
- - zeonix0   похоже что макс действительно сдох, заменил его на...   Aug 30 2011, 12:20
- - aba   Похоже что то напутано со скоростями. Вы уверены, ...   Aug 30 2011, 12:28
- - zeonix0   CODE##############################################...   Aug 30 2011, 12:33
- - aba   У вас есть срока ЦитатаCFLAGS += -Wall -gdwarf-2 -...   Aug 30 2011, 12:43
- - zeonix0   на кварце написано 16 ... бррр из-за этого что ли ...   Aug 30 2011, 12:44
- - aba   1 - в мэйк файле измените значение F_CPU=8000000UL...   Aug 30 2011, 13:11
- - IgorKossak   Господа, научитесь оформлять длинные коды в тэги c...   Aug 30 2011, 17:59
- - zeonix0   IgorKossak, это какая кнопочка? aba, ничего не из...   Aug 31 2011, 06:23
- - IgorKossak   Цитата(zeonix0 @ Aug 31 2011, 09:23) Igor...   Aug 31 2011, 07:29


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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 00:52
Рейтинг@Mail.ru


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