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

Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн апр 07, 2014 22:20:35
ibiza11
Так кто мешает определять контроллер в main.c, а проверку оставить в библиотеке?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт апр 08, 2014 06:13:32
Demon
ARV писал(а):Demon писал(а):Не совсем подходит т.к. одну и туже библиотеку пользуют несколько МК одновременно
как такое возможно?!

Не совсем удачно выразился, имелось в виду что одну и ту же библиотеку использую в нескольких параллельных проектах.
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

Коты, подскажите почему когда я пишу
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;
МК принимает все отлично а в терминале получаю 0
9.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) Вы как главный эксперт подскажите по главной проблеме с
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 плз

Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт апр 10, 2014 14:09:04
ARV
Wasily писал(а):Еще подскажите по флагам TXC плз

я не понял вашей проблемы.
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 писал(а):
Коты, подскажите почему когда я пишу
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.
А в чем я ошибаюсь так уж сильно
Флаг TXC должен устанавливаться толко после того как последний байт вышел из UDR и нет новых на входе.