Перейти к содержанию
    

Шпак передача данных по USART

программа такая:

#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 с;

что тут не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вместо 'с' напиши 'c' :))

 

У тебя переменная названа русской буквой с

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем 777777

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

makefile выложить? atmega16a там все есть.

Во-первых нужно обратить внимание на warning "This header file is obsolete. Use <avr/interrupt.h>." и выкинуть #include <avr/signal.h>

Во-вторых заглянуть в файл iom16a.h и увидеть, что обработчик прерывания передатчика называется USARTTXC_vect

В-третьих заглянуть в даташит и увидеть, что регистров UCR и UBRR в 16а нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В атмеге 16 UCSRA, например.

И

ISR(USART_TXC_vect)

 

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

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что такое "шпак"?

Судя по всему, какая-то библия... о которой все должны и так знать, без разъяснений.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

шпак это мужик который написал проги для МК, которые я пытаюсь запустить.

А, тогда понятно откуда столько вопросов. Лучше читай даташит вместо этого мужика.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Де жавю :biggrin:

'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:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

меня прикалывает шпак просто...

Может кто посоветовать аналог его проги рабочей для Atmega16a?

электронику собрал всю а прогу пока написать не могу.

 

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

 

Кстати в даташитах прог нету же. чисто описание архитектуры, ну да там список регистров можно узнать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В атмеге 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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...