Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Программная инженерия > Микроконтроллеры, робототехника, схемотехника, 3D принтеры
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2018, 14:57   #11
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Еще раз глянул пост #6:
USART1_println ожидает строку с 0 символом. Вы ее даете без него. Остановится, когда повезет...
p51x вне форума Ответить с цитированием
Старый 01.11.2018, 15:00   #12
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Цитата:
Еще раз глянул пост #6:
USART1_println ожидает строку с 0 символом. Вы ее даете без него. Остановится, когда повезет...
с этим символом 0 в конце тоже делал все тоже самое


typedef struct{
unsigned char tel_num[5];
} telephone_ptr;

Тоже самое белиберда, проблема в другом

Пост#6 повнимательнее посмотрите вот он работает нормально
а в пост#5 даже если я подправляю переменную typedef криво работает, я говорю же что я это заметил не только с строками но и с числовыми данными они меняются сами если объявлять переменную через extern из других модулей и именно в объявленных в typedef


Вот с одним символом через какое то время начинаются тоже проблемы, а если переменные прописывать без extern как в посте#6 то все хорошо работает

usart.h
Код:
typedef struct{
	unsigned char tel_num;
} telephone_ptr;
usart.c
Код:
//Переменная на тип из usart.h
telephone_ptr telephone;

//Функция отправки данных
void USART1_write(unsigned char data) 
{
	while (!(UCSR1A & (1<<UDRE1))); //Ожидание опустошения буфера приема
	UDR1 = data; //Начало передачи данных
}
main.c
Код:
//можно сказать ссылка на переменную из usart.c
extern telephone_ptr telephone;

//telephone_ptr telephone;

int main(void)
{
	USART1_init(207); //скорость порта 16-115200 207-9600
	telephone.tel_num= '1';
    sei();
    while (1) 
    {
		
	USART1_write(telephone.tel_num);
		
	_delay_ms(1000);
    }
}
Изображения
Тип файла: jpg Терминал.jpg (64.6 Кб, 133 просмотров)

Последний раз редактировалось Aliens_wolfs; 01.11.2018 в 15:46.
Aliens_wolfs на форуме Ответить с цитированием
Старый 01.11.2018, 15:49   #13
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Вопрос остается открытым, так как же правильно работать с переменными typedef объявленных в других модулях. Такую проблему я заметил в AtmelStudio7, раньше работал в cvavr такого не замечал.

Последний раз редактировалось Aliens_wolfs; 01.11.2018 в 15:54.
Aliens_wolfs на форуме Ответить с цитированием
Старый 01.11.2018, 15:57   #14
jillitil
Форумчанин
 
Аватар для jillitil
 
Регистрация: 17.10.2018
Сообщений: 184
По умолчанию

Цитата:
Сообщение от Aliens_wolfs Посмотреть сообщение
Вопрос остается открытым
Так Вы и не ответили на мой предыдущий вопрос, он был не риторический. 1) Т.о. вывод – не знаете что такое переполнение буфера. Отсюда и понятно почему
Цитата:
Пост#6 повнимательнее посмотрите вот он работает нормально
Он работает, но НЕнормально.

2) Зачем включаете прерывания? Возможно одно из них портит память.
*********
Код:
typedef struct{
  unsigned char tel_num[5];
  char _control[2];   // Контрольные переменные
} telephone_ptr;

main() {
 ._control[0] = 0xAA;
 ._control[1] = 0x55;
...
После каждого вызова/работы с tel_num проверяйте _control[1] и [2]. Если изменились значит где-то накосячили и подпортили память.

П.2. Во первых в терминал Брэя включайте HEX вместо ASCII, может удивитесь сколько мусора приходит в порт. Во вторых он сильно тормознутый, для малых скоростей и нескольких слов подойдёт, выше нет.

Последний раз редактировалось jillitil; 01.11.2018 в 16:05.
jillitil вне форума Ответить с цитированием
Старый 01.11.2018, 16:54   #15
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Цитата:
Так Вы и не ответили на мой предыдущий вопрос, он был не риторический. 1) Т.о. вывод – не знаете что такое переполнение буфера. Отсюда и понятно почему
Я буфер делаю фиксированным, он не должен переполнятся, в посте #12 я дал пример с одним символом, все тоже самое когда я ссылаюсь на тип переменных через extern , какое там может быть переполнение.

Работает отлично вот так уже в течении часа
usart.h
Код:

Код:
typedef struct{
	unsigned char tel_num;
} telephone_ptr;
usart.c
Код:
Код:
//telephone_ptr telephone;

//Функция отправки данных
void USART1_write(unsigned char data) 
{
	while (!(UCSR1A & (1<<UDRE1))); //Ожидание опустошения буфера приема
	UDR1 = data; //Начало передачи данных
}
main.c
Код:
Код:
//extern telephone_ptr telephone;

telephone_ptr telephone;

int main(void)
{
	USART1_init(207); //скорость порта 16-115200 207-9600
	telephone.tel_num= '1';
    sei();
    while (1) 
    {
		
	USART1_write(telephone.tel_num);
		
	_delay_ms(1000);
    }
}
Изображения
Тип файла: jpg Терминал.jpg (117.9 Кб, 133 просмотров)

Последний раз редактировалось Aliens_wolfs; 02.11.2018 в 09:26.
Aliens_wolfs на форуме Ответить с цитированием
Старый 02.11.2018, 09:08   #16
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Цитата:
После каждого вызова/работы с tel_num проверяйте _control[1] и [2]. Если изменились значит где-то накосячили и подпортили память.
Тип переменной у меня фиксированного размера, так что с памятью не может быть проблем.
Я еще раз говорю проблема в другом в обращении к типу переменных из других модулей через extern
Проверьте у себя, контроллер мой на atmega64a, пока нет возможности проверить на других.
Но для примера я выкинул все модули от туда и работаю с двумя, думал ошибка из за других модулей, но нет.

Последний раз редактировалось Aliens_wolfs; 02.11.2018 в 11:36.
Aliens_wolfs на форуме Ответить с цитированием
Старый 03.11.2018, 02:37   #17
jillitil
Форумчанин
 
Аватар для jillitil
 
Регистрация: 17.10.2018
Сообщений: 184
По умолчанию

Выкладывайте сюда полностью нерабочий код. В целом проблема ясна, будет время на выходных глянем.
jillitil вне форума Ответить с цитированием
Старый 06.11.2018, 09:04   #18
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Не было времени на выходных дальше с кодом заниматься вот проект, лишние модули убрал, что бы не мешали
Вложения
Тип файла: rar GSMAlarm.rar (28.2 Кб, 13 просмотров)

Последний раз редактировалось Aliens_wolfs; 06.11.2018 в 09:48.
Aliens_wolfs на форуме Ответить с цитированием
Старый 06.11.2018, 10:57   #19
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Всем спасибо кто откликнулся, нашел у себя проблему, оказывается GSM модуль влиял на USART буфер, мне нужно было отключить его при работе с терминалом для отладки на этом же USART.
На голом контроллере все нормально работает.

Последний раз редактировалось Aliens_wolfs; 06.11.2018 в 11:02.
Aliens_wolfs на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Может ли условное форматирование взаимодействовать с глобальными переменными объявленными на самом листе RISagitov Microsoft Office Excel 8 09.11.2015 17:02
Массив:проблемы с глобальными переменными(С\С++) vitaliz Помощь студентам 2 12.01.2014 19:44
Локальные переменные сделать глобальными AnryFlame JavaScript, Ajax 1 15.04.2013 03:52
Проблема с typedef.... не виден новый тип данных! Fantom.as Общие вопросы C/C++ 3 29.11.2011 17:04
Проблема с глобальными переменными yulia PHP 4 04.11.2008 02:47