Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
11.05.2010, 00:26
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
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); |
|
|
|
Эти 2 пользователя(ей) сказали Спасибо kison за это сообщение:
|
|
|
11.05.2010, 06:05
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
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.
|
|
|
|
11.05.2010, 08:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.02.2008
Сообщений: 1,799
Сказал спасибо: 124
Сказали Спасибо 602 раз(а) в 419 сообщении(ях)
|
Re: AT Mega8 вольтметр прошу помочь
Сообщение от 7Fantomas7
|
То операция PORTB= 0b11111111; (гасим все катоды)
|
Будьте внимательны! Не PORTB= 0b11111111;, а PORTB |= 0b11111110;, т.е. используется операция ИЛИ. А у Вас приравнивание. А это ошибка.
|
|
|
Сказали "Спасибо" andries5
|
|
|
11.05.2010, 09:18
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.02.2008
Сообщений: 1,799
Сказал спасибо: 124
Сказали Спасибо 602 раз(а) в 419 сообщении(ях)
|
Re: AT Mega8 вольтметр прошу помочь
kison, Вы правы, так писать удобнее. Я лишь написал как можно делать, но у Вас опыта больше.
А почему инлайновая функция, а не простая?
Последний раз редактировалось andries5; 11.05.2010 в 09:22.
|
|
|
|
11.05.2010, 09:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
Re: AT Mega8 вольтметр прошу помочь
andries5,
Я согласен, Вы правы безспорно. Я знаю побитовые операции но для меня важно понть принцип. Почему нельзя сделать приравнивание? если значение нужного бита не меняется. Мы ведь DDRB=0xFE; не трогаем и вывод PB0 по идее должен оставаться входом.
Последний раз редактировалось 7Fantomas7; 11.05.2010 в 09:58.
|
|
|
|
11.05.2010, 09:59
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.02.2008
Сообщений: 1,799
Сказал спасибо: 124
Сказали Спасибо 602 раз(а) в 419 сообщении(ях)
|
Re: AT Mega8 вольтметр прошу помочь
7Fantomas7, он и будет входом, но вход может быть подключен к подтягивающему резистору или нет, в зависимости от состояния бита.
Последний раз редактировалось andries5; 11.05.2010 в 11:17.
|
|
|
Сказали "Спасибо" andries5
|
|
|
11.05.2010, 11:12
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: AT Mega8 вольтметр прошу помочь
Сообщение от 7Fantomas7
|
И еще подскажите если можно такую вещь. Я гдето помоему читал об возможности записи числа в регистр по маске (помоему так) т.е. например зписать в регистр 3 старших разряда, или биты №х №х №х,
|
Я выше как раз и дал пример с маской. Там замаскирован PB0, но ничто не мешает замаскировать любые разряды в любом порядке. Надо всего лишь изменить дефайн SEG_MASK.
Сообщение от andries5
|
А почему инлайновая функция, а не простая?
|
Функция маленькая, ее выгоднее встраивать в код. Так быстрее работает.
При обычной:
1 - переместить данные в Call Used регистр
2 - вызвать функцию
3 - отработав выполнить ret
А при инлайне этого оверхеда нет. Теряем 4 байта, но почти в два раза быстрее работает.
|
|
|
|
11.05.2010, 15:09
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Сообщений: 1,437
Сказал спасибо: 287
Сказали Спасибо 339 раз(а) в 202 сообщении(ях)
|
Re: AT Mega8 вольтметр прошу помочь
andries5,
Цитата:
|
он и будет входом
|
другими словами постоянная перезапись 1 никак не влияет на состояние
Цитата:
|
но вход может быть подключен к подтягивающему резистору или нет
|
в моем случае подключен к подтягивающему резистору и меня очень интерисует что произойдет если мы опять будем писать туда 1 прямо вот так в момент перезаписи что будет происходить?, не будет ли "дребезга" на входе.
|
|
|
|
11.05.2010, 16:00
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.02.2008
Сообщений: 1,799
Сказал спасибо: 124
Сказали Спасибо 602 раз(а) в 419 сообщении(ях)
|
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
|
|
|
11.05.2010, 16:23
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: AT Mega8 вольтметр прошу помочь
Сообщение от 7Fantomas7
|
если мы опять будем писать туда 1 прямо вот так в момент перезаписи что будет происходить?, не будет ли "дребезга" на входе.
|
Не будет - это триггер по сути. Перезапись того же состояния никаких "иголок" не вызывает.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
АЦП в mega8
|
FlashAck |
Микроконтроллеры, АЦП, память и т.д |
29 |
29.01.2010 17:50 |
Часовой пояс GMT +4, время: 03:07.
|
|