просили команду изменения значения порта при совпадении двух чисел без чтения состояния порта. Думаю автор вопроса имел в виду иинверсию одного бита порта по условию, без изменения других битов (что в свою очередь требует операции: чтение - модификация - запись). Вот причем тут запись в регистр PINx.Ckfdf писал(а):Теперь другой вопрос - подскажите, есть ли команда для смены состояния порта при совпадении 2-х переменных, без опроса состояния порта?
CodeVision AVR в вопросах и ответах
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
Ставим плюсы: )
- Реклама
- Goodefine
- Держит паяльник хвостом
- Сообщения: 906
- Зарегистрирован: Ср апр 16, 2008 13:22:54
- Откуда: Приднестровье, Тирасполь
Re: CodeVision AVR в вопросах и ответах
Дык а чтение то зачем? Тупо пишем единицу и вот она - инверсия..ibiza11 писал(а): Вот причем тут запись в регистр PINx.
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
инверсия при записи лог."1" в PINx работает во всех AVR микроконтроллерах?
Ставим плюсы: )
- Goodefine
- Держит паяльник хвостом
- Сообщения: 906
- Зарегистрирован: Ср апр 16, 2008 13:22:54
- Откуда: Приднестровье, Тирасполь
Re: CodeVision AVR в вопросах и ответах
Нет, но думаю, что не инверсия нужна автору вопроса.
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
Сначала согласились с инверсией
1)если надо изменить часть данных порта в/в и это не просто инверсия бита, то без операции чтения не обойтись.
2)если надо инвертировать один или несколько бит в порту в/в, то можно обойтись без операции чтения (запись в соответствующие биты регистра PINx лог."1")
(to Goodefine: Все верно? или опять не согласны?)
потом отказываетесьGoodefine писал(а):Дык а чтение то зачем? Тупо пишем единицу и вот она - инверсия..
давайте расставим точки над i и закончим спор, прекращая флуд.Goodefine писал(а):думаю, что не инверсия нужна автору вопроса.
1)если надо изменить часть данных порта в/в и это не просто инверсия бита, то без операции чтения не обойтись.
2)если надо инвертировать один или несколько бит в порту в/в, то можно обойтись без операции чтения (запись в соответствующие биты регистра PINx лог."1")
(to Goodefine: Все верно? или опять не согласны?)
Ставим плюсы: )
- Реклама
- Goodefine
- Держит паяльник хвостом
- Сообщения: 906
- Зарегистрирован: Ср апр 16, 2008 13:22:54
- Откуда: Приднестровье, Тирасполь
Re: CodeVision AVR в вопросах и ответах
Я согласился с доводом про PINx (причем тут он), после вашего объяснения, что вы имели ввиду, но не с тем, что ввиду автором имелась инверсия.ibiza11 писал(а):Сначала согласились с инверсией
Опять 25 ))) Зачем, при такой постановке вопроса чтение?ibiza11 писал(а): 1)если надо изменить часть данных порта в/в и это не просто инверсия бита, то без операции чтения не обойтись.
Тут согласенibiza11 писал(а): 2)если надо инвертировать один или несколько бит в порту в/в, то можно обойтись без операции чтения (запись в соответствующие биты регистра PINx лог."1")
Согласен. С вас предлагаю и начать - действительно много лишних постов из-за одного вашего предположения.ibiza11 писал(а): давайте расставим точки над i и закончим спор, прекращая флуд.
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
Ставим плюсы: )
- Goodefine
- Держит паяльник хвостом
- Сообщения: 906
- Зарегистрирован: Ср апр 16, 2008 13:22:54
- Откуда: Приднестровье, Тирасполь
Re: CodeVision AVR в вопросах и ответах
Код: Выделить всё
PORTX=0x18;
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
- Goodefine
- Держит паяльник хвостом
- Сообщения: 906
- Зарегистрирован: Ср апр 16, 2008 13:22:54
- Откуда: Приднестровье, Тирасполь
Re: CodeVision AVR в вопросах и ответах
Откуда Вы знаете что было в порту до этого? Другой пример, где последовательно изменяются ЧАСТИ порта:
Возражения?
Код: Выделить всё
while(x--) PORTX=x;
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
Что за бред Вы несете?
сама операция присваивания в общем случае изменяет ВСЕ данные порта! Если даже был лог."0" и записывается лог."0", то он перезаписывается, а не копируется!
я сейчас пишу очевидные вещи, что здесь непонятного?
сама операция присваивания в общем случае изменяет ВСЕ данные порта! Если даже был лог."0" и записывается лог."0", то он перезаписывается, а не копируется!
я сейчас пишу очевидные вещи, что здесь непонятного?
Ставим плюсы: )
- Goodefine
- Держит паяльник хвостом
- Сообщения: 906
- Зарегистрирован: Ср апр 16, 2008 13:22:54
- Откуда: Приднестровье, Тирасполь
Re: CodeVision AVR в вопросах и ответах
Вы хоть читайте что пишете, изменить это значит изменить, а записать это значит записать. А то у вас слишком развитое воображение - пишете одно а подразумеваете другое.
А такой пример
Тоже все? Или асмовских команд для управления отдельными битами тоже не существует?
Компилятор сделает из этого
Или у вас программа ведет себя абсолютно не детерминировано и вы не знаете что в порту в любом месте программы? Так в большинстве случаев это известно, и для того чтобы изменить состояние части порта совершенно не нужно его читать, разве что только при выводе в порт случайных чисел до этого. Я уже не говорю о том, что если под изменением вы понимаете тупую запись в регистр, неважно чего (следует из поста выше), то тогда тем более знать что в порту не обязательно.
Так кто пишет бред?
А такой пример
Код: Выделить всё
PORTX|=(1<<PD3);
Компилятор сделает из этого
Код: Выделить всё
sbi PORTX, 3Так кто пишет бред?
Никак не связанные с нитью рассуждений...я сейчас пишу очевидные вещи, что здесь непонятного?
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
Я читаю, что я пишу. Прошу указать мне, в каких сообщениях у меня разыгралось воображение по Вашему мнению.
- частный случай. По Вашему код: будет преобразован в 7 последовательных команд sbi? Компилятор явно умнее и он сначала прочитает порт, а потом, изменив, запишет обратно.
Дабы Вас определить с выводами, под изменением я подразумеваю любое изменение в данных в порту. Под изменением части данных - изменение части данных порта без изменения другой части данных порта.
В любом случае, поняли Вы меня или нет, я хочу дождаться ответа автора вопроса. Что он имел в виду под сменой состояния порта без опроса состояния порта? Я предположил, что он имел в виду изменение части данных порта без изменения другой части данных порта. Пусть он нас и рассудит.
Код: Выделить всё
PORTX|=(1<<PD3);Код: Выделить всё
PORTX|=0xFE;Конечно я не знаю что в каждом порту в любом месте программы! Мало ли что в прерывании могло поменяться.Или у вас программа ведет себя абсолютно не детерминировано и вы не знаете что в порту в любом месте программы?
Приведу пример. По окончанию приема пакета по UART, по таймеру запускается мигание светодиодом (PORTx бит №0), а в это время идет программная передача данных (пусть будет параллельный интерфейс 4 бита) на микросхему внешней памяти висящей на PORTx биты [1:6]. Подрограмма передающая данные на внешнюю память ни сном, ни духом о том в каком состоянии светодиод сейчас находится. По-вашему, она будет изменять это значение, как ей заблагорассудится? А если там не светодиод, а вывод управления двигателем? И такие моменты в программе встречаются очень часто, в разрез Вашему утверждениюразве что только при выводе в порт случайных чисел до этого
А откуда этот вывод я вообще не понимаю:Так в большинстве случаев это известно
В моем предыдущем посте нет ни одного слова "изменение".Я уже не говорю о том, что если под изменением вы понимаете тупую запись в регистр, неважно чего (следует из поста выше), то тогда тем более знать что в порту не обязательно.
Дабы Вас определить с выводами, под изменением я подразумеваю любое изменение в данных в порту. Под изменением части данных - изменение части данных порта без изменения другой части данных порта.
В любом случае, поняли Вы меня или нет, я хочу дождаться ответа автора вопроса. Что он имел в виду под сменой состояния порта без опроса состояния порта? Я предположил, что он имел в виду изменение части данных порта без изменения другой части данных порта. Пусть он нас и рассудит.
Ставим плюсы: )
- Ckfdf
- Первый раз сказал Мяу!
- Сообщения: 26
- Зарегистрирован: Ср ноя 28, 2012 07:09:50
- Откуда: Казахстан, Алматы
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Господа! Всем спасибо за внимание! Думаю, я не совсем корректно вопрос задал! Я имел в виду иззменение состояния порта при выполнении определенного условия без применения группы команд типа
Вопрос решил командой
Код: Выделить всё
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 в вопросах и ответах
Разыгралось там, где речь шла об изменении части данных порта (я ниже напишу, что я под этим понимаю), а именноibiza11 писал(а):Я читаю, что я пишу. Прошу указать мне, в каких сообщениях у меня разыгралось воображение по Вашему мнению.
Следовательно, по Вашему, сам факт перезаписывания (даже тем же значением) битов в регистре является изменением. Что явно не так. Т.е. воображение отождествило перезапись и изменение.сама операция присваивания в общем случае изменяет ВСЕ данные порта! Если даже был лог."0" и записывается лог."0", то он перезаписывается, а не копируется!
Начнем с того, что даже частный случай опровергает придуманное Вами правило:ibiza11 писал(а):- частный случай. По Вашему код:Код: Выделить всё
PORTX|=(1<<PD3);будет преобразован в 7 последовательных команд sbi? Компилятор явно умнее и он сначала прочитает порт, а потом, изменив, запишет обратно.Код: Выделить всё
PORTX|=0xFE;
Поскольку является исключением из него. Я не зря сказал, что при такой постановке вопроса чтение не нужно, на что Вы сделали круглые глаза, спросив как же без чтения... Выражайтесь точнее, другими словами.1)если надо изменить часть данных порта в/в и это не просто инверсия бита, то без операции чтения не обойтись.
Мало что понял из этого потока сознания, но скажу, что я могу и сам представить когда может понадобится знать состояние регистра перед записью. Но, повторяю, в большинстве случаев этого не надо. В моих программах я даже не вспомню такие места, где нужно читать перед записью. И не надо внутреннюю кухню, а именно особенности ассемблера (в частности команду ori, не способную работать с регистрами портов) выдавать за логическую необходимость чтения. Не думаю, что человека только начавшего работать с МК на Си, волнует что компилятор там себе считывает регистр иногда.ibiza11 писал(а): Конечно я не знаю что в каждом порту в любом месте программы! Мало ли что в прерывании могло поменяться.Приведу пример. По окончанию приема пакета по UART, по таймеру запускается мигание светодиодом (PORTx бит №0), а в это время идет программная передача данных (пусть будет параллельный интерфейс 4 бита) на микросхему внешней памяти висящей на PORTx биты [1:6]. Подрограмма передающая данные на внешнюю память ни сном, ни духом о том в каком состоянии светодиод сейчас находится. По-вашему, она будет изменять это значение, как ей заблагорассудится? А если там не светодиод, а вывод управления двигателем? И такие моменты ...разве что только при выводе в порт случайных чисел до этого
Про изменение - если стояли на порту где-то нули, где-то единицы, в регистр записали что-либо (командой присваивания), перезаписались все биты, согласен. Но изменились не все (!). Поскольку где писались одинаковые данные изменения нетуууу! Детский сад, чесслово, объяснять такие вещи. Пытаетесь формулировать, так делайте это точно.
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
- Goodefine
- Держит паяльник хвостом
- Сообщения: 906
- Зарегистрирован: Ср апр 16, 2008 13:22:54
- Откуда: Приднестровье, Тирасполь
Re: CodeVision AVR в вопросах и ответах
to Ibiza11:Ckfdf писал(а): Я имел в виду иззменение ...
Т.е. имелась ввиду хоть инверсия, но явно не про 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 в вопросах и ответах
Прошу не судить строго, я самоучка, особо литературы нет. Программирование настигал по Корабельникову на ассемблере. Поэтому могу не совсем корректные вопросы задавать. В преть постараюсь быть более точным!Goodefine писал(а): И внутренняя кухня компилятора ему до лампочки, просто не знает сишные битовые операции и не точно задает вопросы...
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
to Goodefine: Полностью с Вами соглашаюсь. В начале спора не подумал о командах sbi/cbi, поэтому и глаза округлил))))) Признаю! В том случае можно их использовать без предварительного чтения) 
Ставим плюсы: )
- Goodefine
- Держит паяльник хвостом
- Сообщения: 906
- Зарегистрирован: Ср апр 16, 2008 13:22:54
- Откуда: Приднестровье, Тирасполь
Re: CodeVision AVR в вопросах и ответах
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
- Ckfdf
- Первый раз сказал Мяу!
- Сообщения: 26
- Зарегистрирован: Ср ноя 28, 2012 07:09:50
- Откуда: Казахстан, Алматы
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Добрый день!
Возник вопрос: нужно значение переменной i записать в епром, а затем (когда возникнет необходимость) считать это значение в i. Пробовал код
Чтение, вроде проходит, а вот с записью проблемы. Знаю, что-то не то в коде, а разобраться не могу.
Возник вопрос: нужно значение переменной i записать в епром, а затем (когда возникнет необходимость) считать это значение в i. Пробовал код
Код: Выделить всё
//чтение
EEAR=0; //нулевой адрес
EECR=0b'00000101'; //разрешить чтение
i=EEDR;
//запись
EECR=0b'00000110'; //разрешить стирание/запись
EEAR=0; //адрес 0
EEDR=i; //запись

