Страница 305 из 421

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пн апр 07, 2014 15:40:00
ARV
Demon писал(а):Не совсем подходит т.к. одну и туже библиотеку пользуют несколько МК одновременно
как такое возможно?! :shock:

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пн апр 07, 2014 22:20:35
ibiza11
Так кто мешает определять контроллер в main.c, а проверку оставить в библиотеке?

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт апр 08, 2014 06:13:32
Demon
ARV писал(а):
Demon писал(а):Не совсем подходит т.к. одну и туже библиотеку пользуют несколько МК одновременно
как такое возможно?! :shock:
Не совсем удачно выразился, имелось в виду что одну и ту же библиотеку использую в нескольких параллельных проектах.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт апр 08, 2014 06:18:37
Demon
ibiza11 писал(а):Так кто мешает определять контроллер в main.c, а проверку оставить в библиотеке?
Вчера вечером так и пытался сделать, но ничего не получалось - выходила ошибка "неизвестный" TxSize. С утра сообразил, что сначала надо объявить #define c типом МК, а затем только include подключать требуемую библиотеку.
Спасибо за консультацию все заработало.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср апр 09, 2014 12:56:15
Wasily
:shock: Коты, подскажите почему когда я пишу
UCSRA |= (1<<TXC);
printf("%с",UCSRA);


я принимаю в терминале 0x60 (0b01100000), т.е. флаг установлен хотя я в него записал 1?


Мне это надо выяснить поскольку надо по завершению передачи выключать передатчик RS485.
Вот такой код например:
case CmnWritePrefTmr:
if(CmndSymb[0]==Adres1){ //zashita ot sluchainoi zapisi wsex esli komanda pridet с 100m adresom
EETimeTmr1=((unsigned long int)CmndSymb[2])*845;
TimeTmr1=EETimeTmr1;
UCSRA |= (1<<TXC);//sbros flaga txc
Rs485SendEN=1;
printf("NewTimeTmr1=%lu /845",TimeTmr1);
while(!(UCSRA & (1<<TXC)));
Rs485SendEN=0;

};
break;


МК принимает все отлично а в терминале получаю 09.04.2014 16:55:14.00 [RX] - NewTimeTmr2=845 /8ÿ.
И так везде. Только

UCSRA |= (1<<TXC);//sbros flaga txc
Rs485SendEN=1;
putsf("1");
while(!(UCSRA & (1<<TXC)));
Rs485SendEN=0;

работает отлично.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср апр 09, 2014 17:42:06
c717411
Wasily писал(а): я принимаю в терминале 0x60 (0b01100000), т.е. флаг установлен хотя я в него записал 1?
....
UCSRA |= (1<<TXC);//sbros flaga txc
...
UCSRA |= (1<<TXC);//sbros flaga txc
....
1 - флаг установлен
0 - флаг сброшен

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт апр 10, 2014 04:26:18
Wasily
Не совсем понял, что вы хотели этим сказать.
Для сброса флага нужно в него записать 1 согласно даташиту.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт апр 10, 2014 08:37:38
Wasily
и как вынести функцию в другой файл?

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт апр 10, 2014 08:47:54
Аlex
как вынести функцию в другой файл?
Скопировать функцию в буфер обмена, вставить текст в другой файл, удалить копируемый текст из первого файла :)

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт апр 10, 2014 09:35:30
Wasily
Да, а как его обозвать и правильно include?
Пробовал и .h и .c и все ругается. :(

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт апр 10, 2014 10:06:10
ARV
Wasily писал(а):Да, а как его обозвать и правильно include?
Пробовал и .h и .c и все ругается. :(
уж сколько раз твердили миру... а воз и ныне там.

в .h файлы выносятся макроопределения и прототипы функций, определения типов и описания вешних (или глобальных) переменных. в этих файлах по-хорошему не должно быть никаких реализаций функций!!!

в .c файлы вставяются #include со всеми .h файлами, необходимыми для всех функций, которые реализуются или используются в этом модуле. здесь же определяются все переменные.

.c файлы должны компилироваться, т.е. дожны быть включены в проект.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт апр 10, 2014 10:39:08
Wasily
Т.е. если я правильно понял то отдельно функцию которая будет вызываться из main неполучится?

я в main пишу
#include <stdio.h>
#include <mega8.h>
#include <delay.h>

и #include "readRx.c"

readRx.c добавляю в проект, там функция обработчик которая получает и передает в main. Но не выходит.

2) Вы как главный эксперт подскажите по главной проблеме с :shock:
UCSRA |= (1<<TXC);
printf("%с",UCSRA);

и ниже

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт апр 10, 2014 10:55:34
ARV
я даже разволновался: может, я пишу не по-русски? перечитал - вроде нет...

итак, разжевываю:

1. ваш проект состоит из 2 модулей main.c и readrx.c
2. оба этих файла вы добавили в проект
3. чтобы функции readrx.c были доступны в main.c вы обязаны создать readrx.h, в котором описать прототип вашей функции - не знаю, какая там она у вас.
4. в main.c вы пишите #include "readrx.h"
5. компилируете

повторяю: никакого инклюдирования сишных файлов быть не должно!!!!!!!!

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт апр 10, 2014 11:19:28
Wasily
Вот теперь понятно! огромное спасибо.

Еще подскажите по флагам TXC плз :beer:

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт апр 10, 2014 14:09:04
ARV
Wasily писал(а):Еще подскажите по флагам TXC плз :beer:
я не понял вашей проблемы.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт апр 10, 2014 14:11:40
Gudd-Head
ARV писал(а):я не понял вашей проблемы.
Не сбрасывается флаг у него http://radiokot.ru/forum/viewtopic.php? ... 7#p1980627

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт апр 10, 2014 14:15:07
ARV
"не сбрасывается флаг" - это фигня непонятная. я вижу, что он выводит (неужели в USART?!) содержимое регистра и при этом он ждет, что в этом регистре не будет флага?!

Re: CodeVision AVR в вопросах и ответах

Добавлено: Чт апр 10, 2014 14:23:41
ibiza11
Wasily писал(а)::shock: Коты, подскажите почему когда я пишу
UCSRA |= (1<<TXC);
printf("%с",UCSRA);

я принимаю в терминале 0x60 (0b01100000), т.е. флаг установлен хотя я в него записал 1?
попробуйте так:

Код: Выделить всё

uint8_t tmp;
...
UCSRA |= (1<<TXC);
tmp = UCSRA;
printf("%с",tmp); 

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пт апр 11, 2014 04:37:37
Wasily
ARV писал(а):uint8_t tmp;
...
UCSRA |= (1<<TXC);
tmp = UCSRA;
printf("%с",tmp); 
И так я делал, только переменная была temp. :))
После чип erase c флагами стало все ок!

Сейчас провел эксперимент очередной:

Если запустить такой код после reset (запускается после нажатии кнопки однократно):

Rs485SendEN=1;
printf("%c",UCSRA);
delay_us(550);
Rs485SendEN=0;

Получаем в первый раз 11.04.2014 09:58:25.68 [RX] - 0х20 что и должно быть!
После второго раза получаем 0х60 что тоже отлично, т.к. флаг не сбрасывался!

Но, как только убираю delay и ставлю while(!(UCSRA & (1<<TXC)));
приходит FF, т.е. передатчик раньше отключается до завершения передачи.
Если посылать длинную посылку то не приходят 2 последних символа.
В чем ошибка?

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пт апр 11, 2014 04:38:12
Wasily
ARV писал(а):"не сбрасывается флаг" - это фигня непонятная. я вижу, что он выводит (неужели в USART?!) содержимое регистра и при этом он ждет, что в этом регистре не будет флага?!
Да в USART через ADM485.


А в чем я ошибаюсь так уж сильно :dont_know:
Флаг TXC должен устанавливаться толко после того как последний байт вышел из UDR и нет новых на входе.