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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

Ckfdf писал(а):Теперь другой вопрос - подскажите, есть ли команда для смены состояния порта при совпадении 2-х переменных, без опроса состояния порта?

просили команду изменения значения порта при совпадении двух чисел без чтения состояния порта. Думаю автор вопроса имел в виду иинверсию одного бита порта по условию, без изменения других битов (что в свою очередь требует операции: чтение - модификация - запись). Вот причем тут запись в регистр PINx.
Ставим плюсы: )
Аватара пользователя
Goodefine
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

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

Сообщение Goodefine »

ibiza11 писал(а): Вот причем тут запись в регистр PINx.

Дык а чтение то зачем? Тупо пишем единицу и вот она - инверсия..
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

инверсия при записи лог."1" в PINx работает во всех AVR микроконтроллерах?
Ставим плюсы: )
Аватара пользователя
Goodefine
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

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

Сообщение Goodefine »

Нет, но думаю, что не инверсия нужна автору вопроса.
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

Сначала согласились с инверсией
Goodefine писал(а):Дык а чтение то зачем? Тупо пишем единицу и вот она - инверсия..
потом отказываетесь
Goodefine писал(а):думаю, что не инверсия нужна автору вопроса.


давайте расставим точки над i и закончим спор, прекращая флуд.
1)если надо изменить часть данных порта в/в и это не просто инверсия бита, то без операции чтения не обойтись.
2)если надо инвертировать один или несколько бит в порту в/в, то можно обойтись без операции чтения (запись в соответствующие биты регистра PINx лог."1")

(to Goodefine: Все верно? или опять не согласны?)
Ставим плюсы: )
Аватара пользователя
Goodefine
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

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

Сообщение Goodefine »

ibiza11 писал(а):Сначала согласились с инверсией

Я согласился с доводом про PINx (причем тут он), после вашего объяснения, что вы имели ввиду, но не с тем, что ввиду автором имелась инверсия.
ibiza11 писал(а):1)если надо изменить часть данных порта в/в и это не просто инверсия бита, то без операции чтения не обойтись.

Опять 25 ))) Зачем, при такой постановке вопроса чтение?
ibiza11 писал(а):2)если надо инвертировать один или несколько бит в порту в/в, то можно обойтись без операции чтения (запись в соответствующие биты регистра PINx лог."1")

Тут согласен
ibiza11 писал(а):давайте расставим точки над i и закончим спор, прекращая флуд.

Согласен. С вас предлагаю и начать - действительно много лишних постов из-за одного вашего предположения.
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

:shock: А как это сделать без предварительного чтения?
Ставим плюсы: )
Аватара пользователя
Goodefine
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

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

Сообщение Goodefine »

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

PORTX=0x18;

Я изменил часть данных порта?
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

нет, Вы изменили данные всего порта.
Ставим плюсы: )
Аватара пользователя
Goodefine
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

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

Сообщение Goodefine »

Откуда Вы знаете что было в порту до этого? Другой пример, где последовательно изменяются ЧАСТИ порта:

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

while(x--) PORTX=x;

Возражения?
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

Что за бред Вы несете?
сама операция присваивания в общем случае изменяет ВСЕ данные порта! Если даже был лог."0" и записывается лог."0", то он перезаписывается, а не копируется!
я сейчас пишу очевидные вещи, что здесь непонятного?
Ставим плюсы: )
Аватара пользователя
Goodefine
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

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

Сообщение Goodefine »

Вы хоть читайте что пишете, изменить это значит изменить, а записать это значит записать. А то у вас слишком развитое воображение - пишете одно а подразумеваете другое.
А такой пример

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

PORTX|=(1<<PD3);

Тоже все? Или асмовских команд для управления отдельными битами тоже не существует?
Компилятор сделает из этого

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

sbi PORTX, 3

Или у вас программа ведет себя абсолютно не детерминировано и вы не знаете что в порту в любом месте программы? Так в большинстве случаев это известно, и для того чтобы изменить состояние части порта совершенно не нужно его читать, разве что только при выводе в порт случайных чисел до этого. Я уже не говорю о том, что если под изменением вы понимаете тупую запись в регистр, неважно чего (следует из поста выше), то тогда тем более знать что в порту не обязательно.
Так кто пишет бред?
я сейчас пишу очевидные вещи, что здесь непонятного?

Никак не связанные с нитью рассуждений...
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

Я читаю, что я пишу. Прошу указать мне, в каких сообщениях у меня разыгралось воображение по Вашему мнению.

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

PORTX|=(1<<PD3);
- частный случай. По Вашему код:

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

PORTX|=0xFE;
будет преобразован в 7 последовательных команд sbi? Компилятор явно умнее и он сначала прочитает порт, а потом, изменив, запишет обратно.

Или у вас программа ведет себя абсолютно не детерминировано и вы не знаете что в порту в любом месте программы?
Конечно я не знаю что в каждом порту в любом месте программы! Мало ли что в прерывании могло поменяться.
разве что только при выводе в порт случайных чисел до этого
Приведу пример. По окончанию приема пакета по UART, по таймеру запускается мигание светодиодом (PORTx бит №0), а в это время идет программная передача данных (пусть будет параллельный интерфейс 4 бита) на микросхему внешней памяти висящей на PORTx биты [1:6]. Подрограмма передающая данные на внешнюю память ни сном, ни духом о том в каком состоянии светодиод сейчас находится. По-вашему, она будет изменять это значение, как ей заблагорассудится? А если там не светодиод, а вывод управления двигателем? И такие моменты в программе встречаются очень часто, в разрез Вашему утверждению
Так в большинстве случаев это известно

А откуда этот вывод я вообще не понимаю:
Я уже не говорю о том, что если под изменением вы понимаете тупую запись в регистр, неважно чего (следует из поста выше), то тогда тем более знать что в порту не обязательно.
В моем предыдущем посте нет ни одного слова "изменение".
Дабы Вас определить с выводами, под изменением я подразумеваю любое изменение в данных в порту. Под изменением части данных - изменение части данных порта без изменения другой части данных порта.
В любом случае, поняли Вы меня или нет, я хочу дождаться ответа автора вопроса. Что он имел в виду под сменой состояния порта без опроса состояния порта? Я предположил, что он имел в виду изменение части данных порта без изменения другой части данных порта. Пусть он нас и рассудит.
Ставим плюсы: )
Аватара пользователя
Ckfdf
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Ср ноя 28, 2012 07:09:50
Откуда: Казахстан, Алматы
Контактная информация:

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

Сообщение Ckfdf »

Господа! Всем спасибо за внимание! Думаю, я не совсем корректно вопрос задал! Я имел в виду иззменение состояния порта при выполнении определенного условия без применения группы команд типа

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

if(PINB.1==0){PINB.1=1;}
else{PINB.1=0;}

Вопрос решил командой

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

if(time1<time2){time2=0;
      PORTB.6=~PORTB.6;}
Последний раз редактировалось Ckfdf Пт ноя 30, 2012 11:45:13, всего редактировалось 1 раз.
Аватара пользователя
Goodefine
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

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

Сообщение Goodefine »

ibiza11 писал(а):Я читаю, что я пишу. Прошу указать мне, в каких сообщениях у меня разыгралось воображение по Вашему мнению.

Разыгралось там, где речь шла об изменении части данных порта (я ниже напишу, что я под этим понимаю), а именно
сама операция присваивания в общем случае изменяет ВСЕ данные порта! Если даже был лог."0" и записывается лог."0", то он перезаписывается, а не копируется!

Следовательно, по Вашему, сам факт перезаписывания (даже тем же значением) битов в регистре является изменением. Что явно не так. Т.е. воображение отождествило перезапись и изменение.
ibiza11 писал(а):

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

PORTX|=(1<<PD3);
- частный случай. По Вашему код:

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

PORTX|=0xFE;
будет преобразован в 7 последовательных команд sbi? Компилятор явно умнее и он сначала прочитает порт, а потом, изменив, запишет обратно.

Начнем с того, что даже частный случай опровергает придуманное Вами правило:
1)если надо изменить часть данных порта в/в и это не просто инверсия бита, то без операции чтения не обойтись.

Поскольку является исключением из него. Я не зря сказал, что при такой постановке вопроса чтение не нужно, на что Вы сделали круглые глаза, спросив как же без чтения... Выражайтесь точнее, другими словами.
ibiza11 писал(а): Конечно я не знаю что в каждом порту в любом месте программы! Мало ли что в прерывании могло поменяться.
разве что только при выводе в порт случайных чисел до этого
Приведу пример. По окончанию приема пакета по UART, по таймеру запускается мигание светодиодом (PORTx бит №0), а в это время идет программная передача данных (пусть будет параллельный интерфейс 4 бита) на микросхему внешней памяти висящей на PORTx биты [1:6]. Подрограмма передающая данные на внешнюю память ни сном, ни духом о том в каком состоянии светодиод сейчас находится. По-вашему, она будет изменять это значение, как ей заблагорассудится? А если там не светодиод, а вывод управления двигателем? И такие моменты ...

Мало что понял из этого потока сознания, но скажу, что я могу и сам представить когда может понадобится знать состояние регистра перед записью. Но, повторяю, в большинстве случаев этого не надо. В моих программах я даже не вспомню такие места, где нужно читать перед записью. И не надо внутреннюю кухню, а именно особенности ассемблера (в частности команду ori, не способную работать с регистрами портов) выдавать за логическую необходимость чтения. Не думаю, что человека только начавшего работать с МК на Си, волнует что компилятор там себе считывает регистр иногда.
Про изменение - если стояли на порту где-то нули, где-то единицы, в регистр записали что-либо (командой присваивания), перезаписались все биты, согласен. Но изменились не все (!). Поскольку где писались одинаковые данные изменения нетуууу! Детский сад, чесслово, объяснять такие вещи. Пытаетесь формулировать, так делайте это точно.
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Аватара пользователя
Goodefine
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

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

Сообщение Goodefine »

Ckfdf писал(а): Я имел в виду иззменение ...

to Ibiza11:
Т.е. имелась ввиду хоть инверсия, но явно не про PINX. Человека удовлетворило чтение даже в этом варианте:

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

SBIS 0x18,6 ; вот оно, чтение )))))
RJMP _0x3
CBI  0x18,6
RJMP _0x4
_0x3:
SBI  0x18,6

И внутренняя кухня компилятора ему до лампочки, просто не знает сишные битовые операции и не точно задает вопросы...
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Аватара пользователя
Ckfdf
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Ср ноя 28, 2012 07:09:50
Откуда: Казахстан, Алматы
Контактная информация:

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

Сообщение Ckfdf »

Goodefine писал(а):И внутренняя кухня компилятора ему до лампочки, просто не знает сишные битовые операции и не точно задает вопросы...

Прошу не судить строго, я самоучка, особо литературы нет. Программирование настигал по Корабельникову на ассемблере. Поэтому могу не совсем корректные вопросы задавать. В преть постараюсь быть более точным! :)
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

to Goodefine: Полностью с Вами соглашаюсь. В начале спора не подумал о командах sbi/cbi, поэтому и глаза округлил))))) Признаю! В том случае можно их использовать без предварительного чтения) :beer:
Ставим плюсы: )
Аватара пользователя
Goodefine
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

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

Сообщение Goodefine »

:beer:
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Аватара пользователя
Ckfdf
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Ср ноя 28, 2012 07:09:50
Откуда: Казахстан, Алматы
Контактная информация:

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

Сообщение Ckfdf »

Добрый день!
Возник вопрос: нужно значение переменной i записать в епром, а затем (когда возникнет необходимость) считать это значение в i. Пробовал код

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

//чтение
EEAR=0;  //нулевой адрес
EECR=0b'00000101';  //разрешить чтение
i=EEDR;
//запись
EECR=0b'00000110';  //разрешить стирание/запись
EEAR=0;  //адрес 0
EEDR=i;  //запись

Чтение, вроде проходит, а вот с записью проблемы. Знаю, что-то не то в коде, а разобраться не могу.
Ответить

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