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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

Импульс, будь внимательней, ты уже сам все написал......, они нужны для задания режима, в котором будет работать таймер
советую почитывать, особенно на ночь :)) , эту книгу http://easyelectronics.ru/evstifeev-av- ... y-avr.html , http://radioaktiv.ru/loads/books/microc ... d_543.html - это библия для МК
вот когда ты пару раз ВДУМЧИВО прочитаешь главу о таймерах то и большинство вопросов отпадет само собой....., дерзай !
Tell Me The Truth
PabloVed
Родился
Сообщения: 7
Зарегистрирован: Пн апр 01, 2013 15:40:59

Сообщение PabloVed »

Доброго времени суток.

Пишу в связке CodeVisionAVR + Proteus 7 программу для вентильного двигателя (он же BLDC). С датчиками Холла, с прерываниями, с даташитом avr492.
В качестве контроллера выбрал Atmega8. И тут такая проблема - не уверен, что правильно написал прерывание. В целях проверки, изменил код так, что у меня что приходит с датчиков Холла (PINC), то и должно выдаваться на обмотки (PORTD). И получается какая-то ерунда, при симуляции в протеусе показывает что на выход идет только сигнал с PORTD.0

Ткните носом, где я так напортачил, прошу.

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

#include <mega8.h>

//unsigned char tmp=0;
//  char flag=1; 
 
void port_init()
{DDRD=1;
 PORTD=1;
 DDRC=0;
 PORTC=0xFF;
 DDRB=0;
 PORTB=0xFF;
}

void timer_init()
{
TCCR2=0x01;
TIMSK=0x40;
TCNT2=0x30;
}

void pwm_init()
{   OCR2=0x00;
 // TCCR2=(1<<COM21)|(1<<WGM20)|(1<<WGM21)|(1<<CS20);
};

interrupt [TIM2_OVF] void overflow_timer2 (void)
{
char tmp;
tmp = PINC;
PORTD = tmp;
#asm("sei")
/*switch (tmp)
{
case 0b00000101: {PORTD=0b00000101;}break;   
case 0b00000001: {PORTD=0b00001001;}break;
case 0b00000011: {PORTD=0b00011000;}break;
case 0b00000010: {PORTD=0b00010010;}break;
case 0b00000110: {PORTD=0b00100010;}break;
case 0b00000100: {PORTD=0b00100001;}break;
}*/
}   


void main()
{

port_init();
timer_init();
pwm_init();
#asm("sei")
while (1)
{};
}
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

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

Сообщение Vov123 »

У тебя же в настройках написано

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

DDRD=1;
 PORTD=1;
PabloVed
Родился
Сообщения: 7
Зарегистрирован: Пн апр 01, 2013 15:40:59

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

Сообщение PabloVed »

Vov123 писал(а):У тебя же в настройках написано

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

DDRD=1;
 PORTD=1;

Блин, и правда.
Спасибо, я проглядел.
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

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

Сообщение kotriks »

как сделать фильтр вывода данных в юарт?
делаю запись данных в еепром

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

eeprom unsigned char GPRS [10];

записываем введённые символы

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

GPRS[0]=getchar(); putchar(GPRS[0]);
GPRS[1]=getchar(); putchar(GPRS[1]);
GPRS[2]=getchar(); putchar(GPRS[2]);
GPRS[3]=getchar(); putchar(GPRS[3]);
GPRS[4]=getchar(); putchar(GPRS[4]);
GPRS[5]=getchar(); putchar(GPRS[5]);
GPRS[6]=getchar(); putchar(GPRS[6]);
GPRS[7]=getchar(); putchar(GPRS[7]);
GPRS[8]=getchar(); putchar(GPRS[8]);
GPRS[9]=getchar(); putchar(GPRS[9]);


выводим данные

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

putchar(GPRS[0]);
putchar(GPRS[1]);
putchar(GPRS[2]);
putchar(GPRS[3]);
putchar(GPRS[4]);
putchar(GPRS[5]);
putchar(GPRS[6]);
putchar(GPRS[7]);
putchar(GPRS[8]);
putchar(GPRS[9]);

собственно как сделать чтобы при записи в память пробелов они не выводились в юарт и пропускались ?
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

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

for(i= 0; i< 10; i++)
    {
     if(GPRS[i]!= 0x20) putchar(GPRS[i]);
    }
Последний раз редактировалось pyzhman Ср май 01, 2013 06:55:15, всего редактировалось 1 раз.
Docendo discimus
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

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

Сообщение kotriks »

pyzhman писал(а):

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

for(i= 0; i< 10; i++)
    {
     if(GPRS[i]!= 0x20) putchar(GPRS[9]);
    }

спасибо не работает

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


void appn() {
int i;
GPRS[0]=getchar(); putchar(GPRS[0]);
GPRS[1]=getchar(); putchar(GPRS[1]);
GPRS[2]=getchar(); putchar(GPRS[2]);
GPRS[3]=getchar(); putchar(GPRS[3]);
GPRS[4]=getchar(); putchar(GPRS[4]);
GPRS[5]=getchar(); putchar(GPRS[5]);
GPRS[6]=getchar(); putchar(GPRS[6]);
GPRS[7]=getchar(); putchar(GPRS[7]);
GPRS[8]=getchar(); putchar(GPRS[8]);
GPRS[9]=getchar(); putchar(GPRS[9]);

for(i= 0; i< 10; i++)
    {
if(GPRS[i]!= 0x20) putchar(GPRS[0]);
if(GPRS[i]!= 0x20) putchar(GPRS[1]);
if(GPRS[i]!= 0x20) putchar(GPRS[2]);
if(GPRS[i]!= 0x20) putchar(GPRS[3]);
if(GPRS[i]!= 0x20) putchar(GPRS[4]);
if(GPRS[i]!= 0x20) putchar(GPRS[5]);
if(GPRS[i]!= 0x20) putchar(GPRS[6]);
if(GPRS[i]!= 0x20) putchar(GPRS[7]);
if(GPRS[i]!= 0x20) putchar(GPRS[8]);
if(GPRS[i]!= 0x20) putchar(GPRS[9]);
putchar(13);
putchar(10);
  }
}
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Извиняйте, поторопился. Исправил индекс 9 на i. :))
Docendo discimus
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

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

Сообщение kotriks »

пишу на запись

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

appn!{пробелы}5

выводит
в терминал

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

aaaaaaaaaa
pppppppppp
pppppppppp
nnnnnnnnnn
!!!!!!!!!!



5555555555

а должно вывести как и писал в 1 сроку по одному символу, чёто опять не то
:)
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Откомпилировал сам. Код:

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

                 _0x7:
000066 e0ea         LDI  R30,LOW(10)
000067 165e         CP   R5,R30
000068 f008         BRLO PC+2
000069 c009         RJMP _0x8
                 ; 0000 0073    {
                 ; 0000 0074    if(GPRS[i]!= 0x20) putchar(GPRS[i]);
00006a d010         RCALL SUBOPT_0x0
00006b 32e0         CPI  R30,LOW(0x20)
00006c f409         BRNE PC+2
00006d c003         RJMP _0x9
00006e d00c         RCALL SUBOPT_0x0
00006f 93ea         ST   -Y,R30
000070 d004         RCALL _putchar
                 ; 0000 0075    }
                 _0x9:
                 _0x6:
000071 9453         INC  R5
000072 cff3         RJMP _0x7
                 _0x8:


Не может он посылать пробелы.
Docendo discimus
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

:))

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

for(i= 0; i< 10; i++)
    {
if(GPRS[i]!= 0x20) putchar(GPRS[0]);
if(GPRS[i]!= 0x20) putchar(GPRS[1]);
if(GPRS[i]!= 0x20) putchar(GPRS[2]);
if(GPRS[i]!= 0x20) putchar(GPRS[3]);
if(GPRS[i]!= 0x20) putchar(GPRS[4]);
if(GPRS[i]!= 0x20) putchar(GPRS[5]);
if(GPRS[i]!= 0x20) putchar(GPRS[6]);
if(GPRS[i]!= 0x20) putchar(GPRS[7]);
if(GPRS[i]!= 0x20) putchar(GPRS[8]);
if(GPRS[i]!= 0x20) putchar(GPRS[9]);
putchar(13);
putchar(10);
  }

Что за хрень???? Так и будет выводить пробелы. :))
К примеру:

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

if(GPRS[i]!= 0x20) putchar(GPRS[4]);

если в i-том элементе сидит не_пробел, а в 4-ом пробел, то преспокойно выведет.


viewtopic.php?p=1665174#p1665174 !!!!!!!!!!!!!!!!!!!!!!!
Docendo discimus
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

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

Сообщение kotriks »

да проббелы не выводит но выводит почемуто по 10 символов пишу например 12345 он пишет десять 1 десять 2 и тд в ряд.
так вот и сделал я с i

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

for(i= 0; i<19; i++)
    {
if(GPRS[i]!= 0x20) putchar(GPRS[i]);
if(GPRS[i]!= 0x20) putchar(GPRS[i]);
if(GPRS[i]!= 0x20) putchar(GPRS[i]);
if(GPRS[i]!= 0x20) putchar(GPRS[i]);
if(GPRS[i]!= 0x20) putchar(GPRS[i]);
if(GPRS[i]!= 0x20) putchar(GPRS[i]);
if(GPRS[i]!= 0x20) putchar(GPRS[i]);
if(GPRS[i]!= 0x20) putchar(GPRS[i]);
if(GPRS[i]!= 0x20) putchar(GPRS[i]);
if(GPRS[i]!= 0x20) putchar(GPRS[i]);
if(GPRS[i]!= 0x20) putchar(GPRS[i]);
if(GPRS[i]!= 0x20) putchar(GPRS[i]);
if(GPRS[i]!= 0x20) putchar(GPRS[i]);
if(GPRS[i]!= 0x20) putchar(GPRS[i]);
if(GPRS[i]!= 0x20) putchar(GPRS[i]);
if(GPRS[i]!= 0x20) putchar(GPRS[i]);
if(GPRS[i]!= 0x20) putchar(GPRS[i]);
if(GPRS[i]!= 0x20) putchar(GPRS[i]);
if(GPRS[i]!= 0x20) putchar(GPRS[i]);
if(GPRS[i]!= 0x20) putchar(GPRS[i]);
}


а печатает в терм по 10 символов с каждой занесённой яйчейки памяти.
Последний раз редактировалось kotriks Ср май 01, 2013 07:58:58, всего редактировалось 1 раз.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Весь код ваш дайте.
Docendo discimus
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

:facepalm:
:))
Такое ощущение, что либо я вас не понимаю, либо вы не понимаете, что делаете. Сделайте именно так viewtopic.php?p=1665174#p1665174
Docendo discimus
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

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

Сообщение kotriks »

pyzhman писал(а)::facepalm:
:))
Такое ощущение, что либо я вас не понимаю, либо вы не понимаете, что делаете. Сделайте именно так viewtopic.php?p=1665174#p1665174

спасибо большое дошло до идиота :))
не подскажите можно ли мой код както видоизменить чтобы не дописывать пробелы в память мк скока ввёл стока и записалось символов или дополнить в конце значком # чтобы он определялся как ввод и вбивало в память вписанные значения.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Не представляю, что за цель вы преследуете, но как основа:

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

temp= getchar();
if(temp!= 0x20) GPRS[i]= temp;
Docendo discimus
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Пропустил основную дискуссию, сразу подумал, что нужно было в цикл еще и getchar() добавить, тогда бы лишней страницы обсуждения не было. :)))
kotriks , опишите ситуацию полностью, а не с той точки, до которой вы дошли самостоятельно, мы не знаем всех фактов, поэтому нам непонятен ход вашей мысли.
Зачем вы удаляете пробелы что значит чтобы не дописывать пробелы в память Мк? Как вариант можно сделать так:

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


i
=0;
do{
    
tempgetchar();
    if(
temp!= 0x20GPRS[i++]= temp;}
while (
temp!="#")//тут можно любой символ конца строки.  

как раз в конце и будет ваш символ #
либо при приеме определенного количества символов при выходе из цикла просто добавлять этот символ.
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

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

Сообщение kotriks »

ситуация по сути у меня такая, делаю на гсм модуле отправлялку логов на почту, данные для хоста берутся из памяти еепром которые я туда же записываю

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

putchar('E'); putchar('n'); putchar('t'); putchar('e');  putchar('r'); putchar(' '); 
putchar('n'); putchar('e'); putchar('w'); putchar(' ');
putchar('a'); putchar('p'); putchar('n');
putchar(13);
putchar(10);
GPRS[0]=getchar(); putchar(GPRS[0]);
GPRS[1]=getchar(); putchar(GPRS[1]);
GPRS[2]=getchar(); putchar(GPRS[2]);
GPRS[3]=getchar(); putchar(GPRS[3]);
GPRS[4]=getchar(); putchar(GPRS[4]);
GPRS[5]=getchar(); putchar(GPRS[5]);
GPRS[6]=getchar(); putchar(GPRS[6]);
GPRS[7]=getchar(); putchar(GPRS[7]);
GPRS[8]=getchar(); putchar(GPRS[8]);
GPRS[9]=getchar(); putchar(GPRS[9]);
GPRS[10]=getchar(); putchar(GPRS[10]);
GPRS[11]=getchar(); putchar(GPRS[11]);
GPRS[12]=getchar(); putchar(GPRS[12]);
GPRS[13]=getchar(); putchar(GPRS[13]);
GPRS[14]=getchar(); putchar(GPRS[14]);
GPRS[15]=getchar(); putchar(GPRS[15]);
GPRS[16]=getchar(); putchar(GPRS[16]);
GPRS[17]=getchar(); putchar(GPRS[17]);
GPRS[18]=getchar(); putchar(GPRS[18]);
GPRS[19]=getchar(); putchar(GPRS[19]);

и тд.
вывожу их при подключении к сети теперь так :))

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

printf("AT+SAPBR=3,1,\"APN\"");
putchar(',');
putchar('"');
for(i= 0; i< 19; i++)
    {
     if(GPRS[i]!= 0x20) putchar(GPRS[i]);
    }
putchar('"');
printf("\r");

как видите 20 знаков надо ввести чтобы в память произошла запись, но у всех провайдеров разная длинна имени хоста вот я и ломал голову как добить строку чтобы записалась и при этом не выводить её в юарт.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

никак вы этого не добьетесь, если пробел работает как разделитель строк. Убрав разделитель вы ничего не добьетесь.
Будет как в сказке: казнить нельзя помиловать.
Можно только его добавлять после каждой строки, но при хранении самих строк пробел используется как разделитель.
Можно сделать функцию вывода строк из массива, тогда неважно какой длины- каждое сообщение (имя хоста ) оно будет читаться до пробела.
kotriks
Грызет канифоль
Сообщения: 274
Зарегистрирован: Чт апр 28, 2011 15:08:58

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

Сообщение kotriks »

Вы меня извините но я уже привёл пример готового решения, благодаря pyzhman, больше мне нечего не надо. всем спасибо!
Ответить

Вернуться в «AVR»