zeonix0 0 22 августа, 2011 Опубликовано 22 августа, 2011 · Жалоба программа такая: #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 с; что тут не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 22 августа, 2011 Опубликовано 22 августа, 2011 · Жалоба Вместо 'с' напиши 'c' :)) У тебя переменная названа русской буквой с Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zeonix0 0 22 августа, 2011 Опубликовано 22 августа, 2011 · Жалоба а 38: error: 'UCR' undeclared (first use in this function) UCR = 0x58; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 22 августа, 2011 Опубликовано 22 августа, 2011 (изменено) · Жалоба UCR undeclared скорее всего означает, что проект транслируется для проца в котором отсутствует UART Изменено 22 августа, 2011 пользователем 777777 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zeonix0 0 22 августа, 2011 Опубликовано 22 августа, 2011 · Жалоба makefile выложить? atmega16a там все есть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 22 августа, 2011 Опубликовано 22 августа, 2011 · Жалоба makefile выложить? atmega16a там все есть. Во-первых нужно обратить внимание на warning "This header file is obsolete. Use <avr/interrupt.h>." и выкинуть #include <avr/signal.h> Во-вторых заглянуть в файл iom16a.h и увидеть, что обработчик прерывания передатчика называется USARTTXC_vect В-третьих заглянуть в даташит и увидеть, что регистров UCR и UBRR в 16а нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 22 августа, 2011 Опубликовано 22 августа, 2011 (изменено) · Жалоба В атмеге 16 UCSRA, например. И ISR(USART_TXC_vect) Но у Вас ATMEGA168, как я понял из тем других Ваших тем? Изменено 22 августа, 2011 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 22 августа, 2011 Опубликовано 22 августа, 2011 · Жалоба А что такое "шпак"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 22 августа, 2011 Опубликовано 22 августа, 2011 · Жалоба А что такое "шпак"? Судя по всему, какая-то библия... о которой все должны и так знать, без разъяснений. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zeonix0 0 22 августа, 2011 Опубликовано 22 августа, 2011 · Жалоба шпак это мужик который написал проги для МК, которые я пытаюсь запустить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 22 августа, 2011 Опубликовано 22 августа, 2011 · Жалоба шпак это мужик который написал проги для МК, которые я пытаюсь запустить. А, тогда понятно откуда столько вопросов. Лучше читай даташит вместо этого мужика. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 22 августа, 2011 Опубликовано 22 августа, 2011 · Жалоба Де жавю 'Aug 18 2011, 15:15' post='963437'] Здесь все прекрасно знают , где найти DS на ATMEL. Это Вам надо изучить. Aug 19 2011, 11:30' post='963731'] Выкиньте Шпака на свалку. Читайте оригинальный datasheet, документацию на компилятор и его библиотеку, а также букварь по си. Прощайте... 'Aug 22 2011, 11:05' post='964537'] А, тогда понятно откуда столько вопросов. Лучше читай даташит вместо этого мужика. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zeonix0 0 22 августа, 2011 Опубликовано 22 августа, 2011 · Жалоба меня прикалывает шпак просто... Может кто посоветовать аналог его проги рабочей для Atmega16a? электронику собрал всю а прогу пока написать не могу. Кстати я даташит не читал ,но читал\читаю евстифеева микроконтроллеры авр семейста тини и мега. Кстати в даташитах прог нету же. чисто описание архитектуры, ну да там список регистров можно узнать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zeonix0 0 22 августа, 2011 Опубликовано 22 августа, 2011 · Жалоба В атмеге 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 вроде скомпилился норм... но правильно ли это? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 22 августа, 2011 Опубликовано 22 августа, 2011 (изменено) · Жалоба вроде скомпилился норм... но правильно ли это? В листинге было одно предупреждение, советую проанализировать, что бы это значило. 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; Изменено 22 августа, 2011 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться