Помогите с тинькой разобраться

timsa™
13:06, 30.06.2011
Есть небольшой устройство на tiny13.
Из железа использую только таймер и одну ногу на выход 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
0
Faleex WK
13:41, 30.06.2011
При COM0A0 и COM0A1 = 0 порт работает в штатном режиме, иначе подключается к таймеру как выход, а уж чего будет давать - зависит от конфигурации таймера.
Лучше бы увидеть описание задачи - так понятнее
1 / 0
MRZ
13:49, 30.06.2011
Посмотри под комментарием "Инициализация ножек". Если я правильно понял, тут конфигурируешь порт как "ввод/вывод"? Тогда там должно быть DDRB вместо PORTB. Ну и, конечно, инициализация должна быть до процедур "дрыганья ногами".
0
timsa™
13:51, 30.06.2011
От пользователя MRZ
Посмотри под комментарием "Инициализация ножек". Если я правильно понял, тут конфигурируешь порт как "ввод/вывод"? Тогда там должно быть DDRB вместо PORTB. Ну и, конечно, инициализация должна быть до процедур "дрыганья ногами".


да там и есть DDRB, это я когда сюда писал не то вставил.
конечно же там
Исходник:
SBI  DDRB, 0
SBI  DDRB, 2
0
timsa™
13:54, 30.06.2011
От пользователя Faleex WK


задача простая. таймер выкидывает прерывание с частотой 20 герц. по прерыванию я дрыгаю ногой несколько раз.
проблема в том, что если я дрыгаю ногой PB2 то всё ок, а если PB0 то нет никакого видимого эффекта.
ни в отладчике ни в железе.

вот и вопрос, что может влиять на настройку PB0? (еще раз повторю, ноги PB0 и PB2 настраиваются и дрыгаются идентично)

я грешу на таймер, но хотелось бы знать точно. и почему.
0
14:07, 30.06.2011
фтиньках ни бумбум, но на пиках есть косяк модификации портов, что идёт чтение-модификация-запись и если нога завалена нагрузкой, то она неверно читается и так потом и переписывается. Хотя интел ещё в мцс51 это предусмотрел и пофиксил. А вот микрочип облажался.
0
timsa™
14:13, 30.06.2011
дык это... отладчик то чем завален?
0
14:21, 30.06.2011
да я так, фтему заморок с портами
0
0хCB
15:48, 30.06.2011
потому что взведен бит:COM0A1, что означает сбросить ногу pb0 (или пин OC0A) при наступлении соответсвующего прерывания :-)
1 / 0
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]
2 / 0
timsa™
16:17, 30.06.2011
От пользователя FGV

алилуйя!
спасибо, все заработало как надо
0
Авторизуйтесь, чтобы принять участие в дискуссии.