Помогите с тинькой разобраться
t
timsa™
13:06, 30.06.2011
Есть небольшой устройство на tiny13.
Из железа использую только таймер и одну ногу на выход PB0.
Нога не заработала, стал разбираться, добавил еще одну ногу.
Прогоняю отладчиком и вижу такую картину:
устанавливаю PORTB0 в единицу, он становится единицей, но на следующем такте PINB0 остается молчать.
устанавливаю PORTB2 в единицу, он становится единицей, и на следующем такте PINB2 тоже загорается.
Что не так с ногой PORTB0 ? Почему я не могу ею дрыгать? (и в отладчике и в железе)
Из железа использую только таймер и одну ногу на выход PB0.
Нога не заработала, стал разбираться, добавил еще одну ногу.
Прогоняю отладчиком и вижу такую картину:
устанавливаю PORTB0 в единицу, он становится единицей, но на следующем такте PINB0 остается молчать.
устанавливаю PORTB2 в единицу, он становится единицей, и на следующем такте PINB2 тоже загорается.
Что не так с ногой PORTB0 ? Почему я не могу ею дрыгать? (и в отладчике и в железе)
Исходник:; Отправить ноль Sendzero: CBI PORTB, 0 CBI PORTB, 2 RET ; Отправить единицу Sendone: SBI PORTB, 0 SBI PORTB, 2 RET ; Инициализация ножек SBI PORTB, 0 SBI PORTB, 2 ; Инициализация таймера ~20Гц, прерывание каждые 50.13мс (0.05013с) OUTI TIMSK0,1<<OCIE0A ; срабатывает на совпадение OUTI TCCR0A,1<<COM0A1|1<<WGM01 ; при достижении обнуляем OUTI TCCR0B,1<<CS02|1<<CS00 ; прескалер 1024 OUTI OCR0A, 0xEA ; считает до 234 |
F
Faleex WK
13:41, 30.06.2011
При COM0A0 и COM0A1 = 0 порт работает в штатном режиме, иначе подключается к таймеру как выход, а уж чего будет давать - зависит от конфигурации таймера.
Лучше бы увидеть описание задачи - так понятнее
Лучше бы увидеть описание задачи - так понятнее
M
MRZ
13:49, 30.06.2011
Посмотри под комментарием "Инициализация ножек". Если я правильно понял, тут конфигурируешь порт как "ввод/вывод"? Тогда там должно быть DDRB вместо PORTB. Ну и, конечно, инициализация должна быть до процедур "дрыганья ногами".
t
timsa™
13:51, 30.06.2011
Посмотри под комментарием "Инициализация ножек". Если я правильно понял, тут конфигурируешь порт как "ввод/вывод"? Тогда там должно быть DDRB вместо PORTB. Ну и, конечно, инициализация должна быть до процедур "дрыганья ногами".
да там и есть DDRB, это я когда сюда писал не то вставил.
конечно же там
Исходник:SBI DDRB, 0 SBI DDRB, 2 |
t
timsa™
13:54, 30.06.2011
задача простая. таймер выкидывает прерывание с частотой 20 герц. по прерыванию я дрыгаю ногой несколько раз.
проблема в том, что если я дрыгаю ногой PB2 то всё ок, а если PB0 то нет никакого видимого эффекта.
ни в отладчике ни в железе.
вот и вопрос, что может влиять на настройку PB0? (еще раз повторю, ноги PB0 и PB2 настраиваются и дрыгаются идентично)
я грешу на таймер, но хотелось бы знать точно. и почему.
14:07, 30.06.2011
фтиньках ни бумбум, но на пиках есть косяк модификации портов, что идёт чтение-модификация-запись и если нога завалена нагрузкой, то она неверно читается и так потом и переписывается. Хотя интел ещё в мцс51 это предусмотрел и пофиксил. А вот микрочип облажался.
t
timsa™
14:13, 30.06.2011
дык это... отладчик то чем завален?
х
0хCB
15:48, 30.06.2011
потому что взведен бит:COM0A1, что означает сбросить ногу pb0 (или пин OC0A) при наступлении соответсвующего прерывания :-)
х
0хCB
15:53, 30.06.2011
вобщем в ините tccr0a/b оставить тока инициализацию wgm* и cs**, все остальные биты принудительно сбрасывающие/устанавливающие выходные пины задать 0.
ps небольшое уточнение: при задании в tccr0a(b) битов com0a0/1(foc0a) пин pb0 переключается с portb.0 на oc0a - выход компаратора а таймера 0, потому там 0 и висит все время.
[Сообщение изменено пользователем 30.06.2011 16:04]
ps небольшое уточнение: при задании в tccr0a(b) битов com0a0/1(foc0a) пин pb0 переключается с portb.0 на oc0a - выход компаратора а таймера 0, потому там 0 и висит все время.
[Сообщение изменено пользователем 30.06.2011 16:04]
t
timsa™
16:17, 30.06.2011
алилуйя!
спасибо, все заработало как надо
Авторизуйтесь, чтобы принять участие в дискуссии.