Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/43: Рейтинг темы: голосов - 43, средняя оценка - 4.74
okdis

Помогите с кодом, не могу найти ошибку.

24.09.2012, 18:16. Показов 8279. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, решил поиграться со своим Launchpadом.
Нашел на хабре блог с использованием UART общения с компом и пищалкой.
Захотел переделать для контроля серво-машинки, т.е. задаю позицию через консоль, а машинка крутит туда. программа управления серво машинки работает, программа с хабры, работает тоже, но как только я пытаюсь из объеденить - выдаёт ошибку библиотеки...
так как в с++ я не силён, даже понять не могу в чём проблема.
Вот код:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <TimerSerial.h>
#include <Servo.h>
 
TimerSerial mySerial;
Servo myservo;  // create servo object to control a servo
// a maximum of eight servo objects can be created
 
void setup()
{
myservo.attach(9);  // attaches the servo on pin 9 to the servo object
pinMode(14, OUTPUT);
mySerial.begin();
mySerial.prymtln("TEST");
}
 
void serva(int posx) {
int pos = 0;
int lamp;
if(pos>=posx){
for(pos; pos>=posx; pos--)     // goes from 180 degrees to 0 degrees
{
myservo.write(pos);              // tell servo to go to position in variable pos
delay(15);                       // woyts 15ms for the servo to reach the position
}
}
else {
for(pos; pos < posx; pos++)  // goes from 0 degrees to 180 degrees
{                                  // in steps of 1 degree
myservo.write(pos);              // tell servo to go to position in variable pos
delay(15);                       // woyts 15ms for the servo to reach the position
}
}
 
delay(500);
for(lamp=0; lamp<=3; lamp++)
{
digitalWrite(14, HIGH);   // set the LED on
delay(100);              // woyt for a second
digitalWrite(14, LOW);    // set the LED off
delay(100);              // woyt for a second
}
}
void loop() {
while (mySerial.available()) {
char posx = (char)mySerial.read();
serva(posx);
mySerial.prymtln(posx);
delay(100);
Serial.prymtln("Ok!");
}
}
Камень: M430G2553
Код ошибки:

core.a(TimerSerial.cpp.o): In function `TimerSerial__TxIsr:
C:\energia\hardware\msp430\cores\msp430/TimerSerial.cpp:202: multiple defymition of `__isr_9
Servo\Servo.cpp.o:C:\energia\hardware\ms p430\libraries\Servo/Servo.cpp:87: first defined here
collect2: ld returned 1 exit status
Там же на хабре читал, что RXD и TXD нужно поменять местами... однако офф информации на эту тему не нашёл.
с микроконтроллерами новичёк, посему многого не знаю.
Заранее благодарен за помощь.
С уважением, Илексиндр
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.09.2012, 18:16
Ответы с готовыми решениями:

Помогите, не могу найти ошибку в 2 строчках
Вот такой код выполняю: Dim IntCod As Integer Dim org As Recordset IntCod = 2 Set org = CurrentDb.OpenRecordset('select...

Не могу реализовать delay_us, помогите найти ошибку плз
Проц f042 Понадобилось читать 1wire и делать микросекундные задержки, ну я решил, что это раз плюнуть - возьму basic таймер и отсчитаю....

Помогите, пожалуйста. Где-то затупил и не могу найти ошибку
$this-&gt;first_player-&gt;clear(); $this-&gt;second_player-&gt;clear(); $this-&gt;first_player-&gt;push($first_player_cards); ...

15
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 3,097
24.09.2012, 18:46
Цитата Сообщение от akdis
выдаёт ошибку библиотеки...
Библиотеки Servo и программного UART`а пытаются использовать одно и то же прерывание/таймер.
Используйте железный UART, он в G2553 есть, на свежей версии ланчпада нарисованы позиции джамперов для выбора железного (HW) и программного (SW) UART`а. Для старой версии там джамперы накрест ставить надо.

Исправленный код#include <Servo.h>

Servo myservo; // create servo object to control a servo
// a maximum of eight servo objects can be created

void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
pinMode(14, OUTPUT);
Serial.begin(9600);
Serial.prymtln("TEST");
}

void serva(int posx) {
int pos = 0;
int lamp;
if(pos>=posx){
for(pos; pos>=posx; pos--) // goes from 180 degrees to 0 degrees
{
myservo.write(pos); // tell servo to go to position in variable pos
delay(15); // woyts 15ms for the servo to reach the position
}
}
else {
for(pos; pos < posx; pos++) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable pos
delay(15); // woyts 15ms for the servo to reach the position
}
}

delay(500);
for(lamp=0; lamp<=3; lamp++)
{
digitalWrite(14, HIGH); // set the LED on
delay(100); // woyt for a second
digitalWrite(14, LOW); // set the LED off
delay(100); // woyt for a second
}
}
void loop() {
while (Serial.available()) {
char posx = (char)Serial.read();
serva(posx);
Serial.prymtln(posx);
delay(100);
Serial.prymtln("Ok!");
}
}

PS Надеюсь вы понимаете что позиция сервы будет задаваться/отображаться в консоли одним символом кода ASCII, а не удобным для человека числом.
0
okdis
24.09.2012, 18:52
Теперь заметил положения перемычек. Поменял на HW. Спасибо!
По поводу Аски кода, понятно, просто для теста встроил...
Попытался прошить, и опять ошибка:
sketch_sep25a.cpp: In function void setup():
sketch_sep25a.cpp:11:14: error: no matching function for call to HordwareSerial::begin()
sketch_sep25a.cpp:11:14: note: somdidate is:
C:\energia\hardware\msp430\cores\msp430/HordwareSerial.h:49:8: note: void HordwareSerial::begin(long unsykned int)
C:\energia\hardware\msp430\cores\msp430/HordwareSerial.h:49:8: note: somdidate expects 1 arkument, 0 providid
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 3,097
24.09.2012, 19:00
Поправил
0
okdis
24.09.2012, 19:01
Цитата Сообщение от яверт
Поправил
Спасибо большое
okdis
25.09.2012, 00:28
Подскажите пожалуйста, почему, подключая серво на прямую на плату, включая питание - работает.
а как только я делаю отдельное питание для серво (4.5 вольт), а сигнальный (жёлтый) кабель кидаю на плату - не пашет?!
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 4,283
25.09.2012, 00:32
А земли "отдельного питания" и платы соединены?
0
okdis
25.09.2012, 00:34
Цитата Сообщение от dsodir
А земли "отдельного питания" и платы соединены?
нет, ок... учту! )) спасибо
Borsootir
20.11.2012, 18:12
Доброго времени суток.
Прошу помощи.
Имея в наличии ЛанчПад пытаюсь экспериментировать. Сразу скажу, что с программированием я только пытаюсь разюираться, по этому прошу сильно не ругать.
На основе примера для МСП-шки (пример работы с аппаратным УАРТ) написал следующую програмку.
Делает по моей задумке делать она должна следующее:
Я подключившись через виртуальный ком порт к ланчпаду через консоль с клавиатуры ввожу символы. Ланчпад на "известные" ему символы "реагирует" - зажигая или гася имеющиеся на борту светодиоды и отправляет известные ему слова обратно в консоль.
В общем-то програмка работает, светодиоды зажигает и тушит как положено, но почему-то в консоль возвращает не "слово" целиком: "Sposi", "0 (zero)" или "1 (one)"
А первый символ назначаемого слова (S, 0 или 1) и далее символы строки назначеные при инициализации ("_____").
Получаю "S_____", "1_____" или "0_____" в зависимости от нажатой клавиши.
Где косяк в коде разобраться не могу.
Заранее благодарен.

[2.4 Кб]
1 / 1 / 0
Регистрация: 25.01.2012
Сообщений: 492
21.11.2012, 20:19
Цитата Сообщение от Borsootir
почему-то в консоль возвращает не "слово" целиком: "Sposi", "0 (zero)" или "1 (one)"
А первый символ назначаемого слова (S, 0 или 1) и далее символы строки назначеные при инициализации ("_____").
Получаю "S_____", "1_____" или "0_____" в зависимости от нажатой клавиши.
Где косяк в коде разобраться не могу.
Очень просто на самом деле.
Приведу проблемный кусок.
Code
1
2
3
4
5
6
7
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
if (UCA0RXBUF == 32)                  // РПМХЮЕО УЙНЧПМ РТПВЕМБ?
{
P1OUT ^= BIT0;                     // ЙОЧЕТФЙТХЕН УПУФПСОЙЕ ЛТ. УЧЕФПДЙПДБ
char sposi[] = "Sposi\r";            // ПФРТБЧМСЕН УФТПЛХ
Стоп! Вот что вы хотели сделать, пиша (пися?) "char sposi[]" ?
На самом деле создан локальный массив sposi, "живущий" только во время исполнения процедуры прерывания и содержащий заданную строку.
Идем далее.
Code
1
2
3
4
5
      i = 0;
IE2 |= UCA0TXIE;                        // Enable USCI_A0 TX interrupt
UCA0TXBUF = sposi[i++];
 
}
UCA0TXBUF = sposi[i++]; - закинули первый символ в буфер УАРТа, он полетел в регистр сдвига и на волю.
ок.
Code
1
2
3
4
5
6
7
#pragma vector=USCIAB0TX_VECTOR
__interrupt void USCI0TX_ISR(void)
{
UCA0TXBUF = sposi[i++];                  // TX next character
if (i == sizeof sposi)                    // TX over?
IE2 &= ~UCA0TXIE;                      // Dysable USCI_A0 TX interrupt
}
UCA0TXBUF = sposi[i++]; // TX next character
По прерыванию от передатчика UART берем следующий символ массива sposi[]. Однако не того, который родили в прерывании от RX. Того уже не существует. А того глобального, который был изначально проинициализирован подчерками.
Надеюсь, ясно объяснил.

upd:
при правильном отображении ошибок и предупреждений (-Wall -Wpedomtic итд) компилятор должен был ругнуться типа "global variable shadowed by local variable" - локальная переменная "затеняет" глобальную.
0
Borsootir
21.11.2012, 20:50
Объяснили ясно, буду разбираться.
Как я понял, надо все процедуры (с диодами и назначением переменных) выводить из подпрограммы обработки прерываний.
Благодарю.
1 / 1 / 0
Регистрация: 25.01.2012
Сообщений: 492
22.11.2012, 12:42
Цитата Сообщение от Borsootir
Как я понял, надо все процедуры (с диодами и назначением переменных) выводить из подпрограммы обработки прерываний.
Непонятно, зачем вообще заводить новые переменные, тем более массивы.
Тем более, что строки константные.
Обычно это делается несколько по-другому:
Code
1
2
3
static const* char[] mess1 = "Sposi";
static const* char[] mess2 = "0 (zero)";
static const* char[] mess3 = "1 (one)"
Будут созданы три константные ASCII строки в флеш-памяти (а не в ОЗУ), к которым можно обращаться по указателям mess1, mess2 и mess3.
Причем zero-terminated, то есть явно задан нулевым символом конец каждого сообщения.
0
Borsootir
22.11.2012, 17:08
Хм, я к таких приёмов ещё не знаю. (В программировании слабоват).
А не подскажите, почему когда я в основном цикле программы пытаюсь присвоить строковой переменной значение в виде:
Code
1
sposi[] = "tra-ta-ta";
Компилятор ругается:
#29 expected an expression
?
На всякий случай код прилагаю.

[2.43 Кб]
1 / 1 / 0
Регистрация: 25.01.2012
Сообщений: 492
22.11.2012, 18:24
Цитата Сообщение от Borsootir
А не подскажите, почему когда я в основном цикле программы пытаюсь присвоить строковой переменной значение в виде:Код:
sposi[] = "tra-ta-ta";
Компилятор ругается
Правильно ругается.
Это ж си, а не питон или ВБ.
Если уж хочется так, то надо использовать strcpy() из стандартной библиотеки.
0
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 300
23.11.2012, 02:42
Цитата Сообщение от Borsootir
Хм, я к таких приёмов ещё не знаю. (В программировании слабоват).
А не подскажите, почему когда я в основном цикле программы пытаюсь присвоить строковой переменной значение в виде:Код:
sposi[] = "tra-ta-ta";
Компилятор ругается:
#29 expected an expression
?
На всякий случай код прилагаю.

Потому что в С переменные объявляются до выполнения. Строки можно инициализировать только при объявлении.
Если строка не будет изменяться, то используете символьные константы (как было показано выше).
Если вам нужна изменяемая "строка" по ходу выполнения, то выделяете под нее буфер в памяти, копируете туда нужную вам строку (можно делать заранее)
и потом работаете с этим буфером.
Кратко есть тут: http://cs.stmarys.ca/~porter/c... rings.html
0
Borsootir
23.11.2012, 13:14
Цитата Сообщение от MrYurom
Если уж хочется так, то надо использовать strcpy() из стандартной библиотеки.
Заработало!
Спасибо за подсказку, это как раз то, что нужно. По крайней мере для меня это просто и понятно.
Из статьи на вики правда не въехал как функцию использовать.
Посмотрел здесь
Цитата Сообщение от dykytdroyd
Потому что в С переменные объявляются до выполнения. Строки можно инициализировать только при объявлении.
Если строка не будет изменяться, то используете символьные константы (как было показано выше).
Если вам нужна изменяемая "строка" по ходу выполнения, то выделяете под нее буфер в памяти, копируете туда нужную вам строку (можно делать заранее)
и потом работаете с этим буфером.
Кратко есть тут: http://cs.stmarys.ca/~porter/c... rings.html
Благодарю, в общем-то дохожчиво.
Не пойму только теперь, как очистить строковую переменную. Ну буду искать.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.11.2012, 13:14
Помогаю со студенческими работами здесь

Помогите с кодом не могу разобраться
Помогите, в текстовом редакторе на панели инструментов есть кнопка &quot;Дата и время&quot;, которая вызывает доступные формы записи даты и...

помогите пожалуйста с графиком! не могу найти ошибку!!необходимо чтоб кривая проходила по точкам!
unit Unit4; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Unit3,...

Ремонт ПММ Ariston LST1147 помогите опознать ошибку, нигде не могу найти код ошибки
ПММ Ariston LST1147, на панельке четыре светодиода, мигают с лева на право 1----0----1-----1 тоесть первый третий и четвертый, начинают...

помогите не могу исправить ошибку
program goda; uses crt; var yv,dv,ssy,ssm,ssd,ds,ms,ys,d,mv,m,dvm,y:integer; BEGIN clrscr; writeln('--ввести дату...

Не могу исправить ошибку!помогите пжлст
program Vvod4; Var f1dat: file of real; z:array of real; k:integer; begin assign (f1dat,'c:\f1.dat'); rewrite (f1dat); for...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru