Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

AT Mega8 вольтметр прошу помочь

Непрочитано 11.05.2010, 00:26  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: AT Mega8 вольтметр прошу помочь

Сообщение от andries5 Посмотреть сообщение
Чтобы правильно горели цифры, можно делать в два этапа:
Проще в один.
Код:
#define SEG_MASK (~0xFE) // ~0b11111110, для исключения изменения PB0
#define DIGIT_1 0xC0 // 0b11000000

PORTB = (PORTB & SEG_MASK)|DIGIT_1;
Можно это в макрос обернуть или инлайновой функцией сделать:
Код:
static inline OutSym(unsigned char sym)
{
PORTB = (PORTB & SEG_MASK)|sym;
}
// и вызывать в коде:
OutSym(DIGIT_1);
Реклама:
kison вне форума  
Эти 2 пользователя(ей) сказали Спасибо kison за это сообщение:
7Fantomas7 (11.05.2010), andries5 (11.05.2010)
Непрочитано 11.05.2010, 06:05  
7Fantomas7
Почётный гражданин KAZUS.RUN
 
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
7Fantomas7 на пути к лучшему
По умолчанию Re: AT Mega8 вольтметр прошу помочь

Огромное спасибо.
Вроде начинаю понимать.
andries5
Цитата:
1 Погасить все катоды. PORTB |= 0b11111110;
Да я действительно гашу все катоды, такая рекомендация есть в примере на основании которого я и изучаю этот процес.
Но если изначальное значение PORTB=0x01; т.е. 00000001
То операция PORTB= 0b11111111; (гасим все катоды) по сути никак бит0 не меняет в весь порт записали число, а бит 0 как был 1 так и остался 1.
Если зажигаем цифру 0 например так PORTB= 0b10000001 то бит0 опять не меняется 1 был да так и остался. Другими словами в знакогенераторе достаточно во всех цифрах бит0 сделать 1 и все шито крыто.
Подскажите правильно ли я понимаю и как постоянная перезапись 1 отразится на работе PB0 как входа, не будет ли мешать.
И еще подскажите если можно такую вещь. Я гдето помоему читал об возможности записи числа в регистр по маске (помоему так) т.е. например зписать в регистр 3 старших разряда, или биты №х №х №х, но так как литературы по этому делу перелопатил уйму то не помню где. Где про это можно почитать и как правильно это называется.

Последний раз редактировалось 7Fantomas7; 11.05.2010 в 06:13.
7Fantomas7 вне форума  
Непрочитано 11.05.2010, 08:57  
andries5
Почётный гражданин KAZUS.RUN
 
Регистрация: 19.02.2008
Сообщений: 1,840
Сказал спасибо: 128
Сказали Спасибо 613 раз(а) в 430 сообщении(ях)
andries5 на пути к лучшему
По умолчанию Re: AT Mega8 вольтметр прошу помочь

Сообщение от 7Fantomas7 Посмотреть сообщение
То операция PORTB= 0b11111111; (гасим все катоды)
Будьте внимательны! Не PORTB= 0b11111111;, а PORTB |= 0b11111110;, т.е. используется операция ИЛИ. А у Вас приравнивание. А это ошибка.
andries5 вне форума  
Сказали "Спасибо" andries5
7Fantomas7 (11.05.2010)
Непрочитано 11.05.2010, 09:18  
andries5
Почётный гражданин KAZUS.RUN
 
Регистрация: 19.02.2008
Сообщений: 1,840
Сказал спасибо: 128
Сказали Спасибо 613 раз(а) в 430 сообщении(ях)
andries5 на пути к лучшему
По умолчанию Re: AT Mega8 вольтметр прошу помочь

kison, Вы правы, так писать удобнее. Я лишь написал как можно делать, но у Вас опыта больше.
А почему инлайновая функция, а не простая?

Последний раз редактировалось andries5; 11.05.2010 в 09:22.
andries5 вне форума  
Непрочитано 11.05.2010, 09:55  
7Fantomas7
Почётный гражданин KAZUS.RUN
 
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
7Fantomas7 на пути к лучшему
По умолчанию Re: AT Mega8 вольтметр прошу помочь

andries5,
Я согласен, Вы правы безспорно. Я знаю побитовые операции но для меня важно понть принцип. Почему нельзя сделать приравнивание? если значение нужного бита не меняется. Мы ведь DDRB=0xFE; не трогаем и вывод PB0 по идее должен оставаться входом.

Последний раз редактировалось 7Fantomas7; 11.05.2010 в 09:58.
7Fantomas7 вне форума  
Непрочитано 11.05.2010, 09:59  
andries5
Почётный гражданин KAZUS.RUN
 
Регистрация: 19.02.2008
Сообщений: 1,840
Сказал спасибо: 128
Сказали Спасибо 613 раз(а) в 430 сообщении(ях)
andries5 на пути к лучшему
По умолчанию Re: AT Mega8 вольтметр прошу помочь

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

Последний раз редактировалось andries5; 11.05.2010 в 11:17.
andries5 вне форума  
Сказали "Спасибо" andries5
7Fantomas7 (11.05.2010)
Непрочитано 11.05.2010, 11:12  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: AT Mega8 вольтметр прошу помочь

Сообщение от 7Fantomas7 Посмотреть сообщение
И еще подскажите если можно такую вещь. Я гдето помоему читал об возможности записи числа в регистр по маске (помоему так) т.е. например зписать в регистр 3 старших разряда, или биты №х №х №х,
Я выше как раз и дал пример с маской. Там замаскирован PB0, но ничто не мешает замаскировать любые разряды в любом порядке. Надо всего лишь изменить дефайн SEG_MASK.
Сообщение от andries5 Посмотреть сообщение
А почему инлайновая функция, а не простая?
Функция маленькая, ее выгоднее встраивать в код. Так быстрее работает.
При обычной:
1 - переместить данные в Call Used регистр
2 - вызвать функцию
3 - отработав выполнить ret
А при инлайне этого оверхеда нет. Теряем 4 байта, но почти в два раза быстрее работает.
kison вне форума  
Сказали "Спасибо" kison
7Fantomas7 (11.05.2010)
Непрочитано 11.05.2010, 15:09  
7Fantomas7
Почётный гражданин KAZUS.RUN
 
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
7Fantomas7 на пути к лучшему
По умолчанию Re: AT Mega8 вольтметр прошу помочь

andries5,
Цитата:
он и будет входом
другими словами постоянная перезапись 1 никак не влияет на состояние
Цитата:
но вход может быть подключен к подтягивающему резистору или нет
в моем случае подключен к подтягивающему резистору и меня очень интерисует что произойдет если мы опять будем писать туда 1 прямо вот так в момент перезаписи что будет происходить?, не будет ли "дребезга" на входе.
7Fantomas7 вне форума  
Непрочитано 11.05.2010, 16:00  
andries5
Почётный гражданин KAZUS.RUN
 
Регистрация: 19.02.2008
Сообщений: 1,840
Сказал спасибо: 128
Сказали Спасибо 613 раз(а) в 430 сообщении(ях)
andries5 на пути к лучшему
По умолчанию Re: AT Mega8 вольтметр прошу помочь

Сообщение от 7Fantomas7 Посмотреть сообщение
не будет ли "дребезга" на входе.
Не знаю, но думаю что не будет. А с другой стороны зачем? Выше kison обьяснил:
вначале обьявите define
#define SEG_MASK (~0xFE) // ~0b11111110, для исключения изменения PB0
#define DIGIT_0 0b10000001
#define DIGIT_1 0b11110011
#define DIGIT_2 0b01001001
и т.д.
ниже обьявите
static inline OutSym(unsigned char sym)
{
PORTB = (PORTB & SEG_MASK)|sym;
}
а в ходе программы высвечивайте нужную цифру
OutSym(DIGIT_1);
и не будете думать о дребезге или других последствиях.
andries5 вне форума  
Сказали "Спасибо" andries5
7Fantomas7 (11.05.2010)
Непрочитано 11.05.2010, 16:23  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: AT Mega8 вольтметр прошу помочь

Сообщение от 7Fantomas7 Посмотреть сообщение
если мы опять будем писать туда 1 прямо вот так в момент перезаписи что будет происходить?, не будет ли "дребезга" на входе.
Не будет - это триггер по сути. Перезапись того же состояния никаких "иголок" не вызывает.
kison вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
АЦП в mega8 FlashAck Микроконтроллеры, АЦП, память и т.д 29 29.01.2010 17:50


Часовой пояс GMT +4, время: 13:09.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.