ничего не понимаю... с компаратором А работает....
а вот с Б, нет,,
Какк только в ТИМСК меняю на Б, то не хочет работать... уходит в непонятное место... и пишет неопределен адрес...
invalid opcode 0xffff at adress 0x00000c
добрый день! а вот подскажите такой момент... пишу такую прогу.... светодиодик мигает снчала с одной частотой,, в регистре r30 копится число, пока не станет =5,,, зтем частота моргания меняется....
так вот вопрос в том, что в АВРстудио все четко работает....
а в реале,, ну никак не 5 число в регистре.... он очень уж долго моргает с первой частотой....
что неправильно? или с чем это связано?
.org 19
RESET:
ldi r16,RAMEND;
out SPL,r16
START:
ldi r17,0b00100000
out TIMSK,r17
ldi r18,0b00000010
out OCR1BH,r18
ldi r19,0b00100111
out OCR1BL,r19
ldi r18,0b00000001
out TCCR1B,r18
ldi r19,0b00000001
out DDRB,r19
ldi r24,0b00000001
out portb,r24
sei
starting:
cpi r30,0b00000101
breq main_2
rjmp starting
main_2:
ldi r18,0
out PortB,r18
ldi r24,0b00000000
out ocr1bh,r24
ldi r24,0b10011111
out ocr1bl,r24
ldi r23,0
out tcnt1l,r23
out tcnt1h,r23
sbi portb,0
main_3:rjmp main_3
А подпрограмма вот:
TIMER1_COMPB:
inc r30
ldi r20,0b00000001
in r21,portb
eor r20,r21
out portb,r20
ldi r22,0
out tcnt1l,r22
out tcnt1h,r22
reti
добрый день! а вот подскажите такой момент... пишу такую прогу.... светодиодик мигает снчала с одной частотой,, в регистре r30 копится число, пока не станет =5,,, зтем частота моргания меняется.... так вот вопрос в том, что в АВРстудио все четко работает.... а в реале,, ну никак не 5 число в регистре.... он очень уж долго моргает с первой частотой.... что неправильно? или с чем это связано?
добрый день! а вот подскажите такой момент... .org 19 .... А подпрограмма вот: TIMER1_COMPB: inc r30 ldi r20,0b00000001 in r21,portb eor r20,r21 out portb,r20 ldi r22,0 out tcnt1l,r22 out tcnt1h,r22 reti
Первое что бросается в глаза - Вы не сохраняете значение регистра состояния процессора - S при входе в прерывания и не восстанавливаете его при выходе, отсюда скорее всего неправильная работа программы. Второе - какова тактовая частота контрорллера и рассчетная частота "мигания"?
Следующее просто советы:
а) при инициализации регистров ввода вывода - настройка таймеров и тп. предпочтительно не применять записи вида
Код:
ldi r17,0b00100000 out TIMSK,r17
а пользоваться таким типом записей :
Код:
ldi r17, (1<<OCIE1A)|(1<<OCIE1B) out TIMSK,r17
б) при оформленни постов приветствуется использование тегов code
про code не совсем понял... можно с примером? а про первую запись.... тоже не совсем... не совсем понятно, что записывается в регистр
Как все запущено. Попробую объяснить кратко, но лучше наверное где-то почитате еще.
1. Про регистр состояния процессора - регистр, в котором отображается значение флагов процессора (прерывание, флаг T, флаг переноса, флаг нуля и др.). Некоторые команды процессора (все арифметические, sei, cli и др - подробнее см. систему команд) могут изменять состояние флагов, т. о. в регистре хранится текущее состоянии флагов. По флагам, а также по значениям регистров участвующих в выполнении(последнее не всегда - пример команда cpi), в принципе, и определяется результат выполнения арифметических команд, например команды cpi, если значение регистра и константы с которой он сравнивается равны, то выставляется флаг нуля (Z) который может анализироваться например командой перехода (как у вас в программе) breq - переход если 0. Когда выполняется обслуживание прерывания, то основной цикл программы прерывается, процессор производит какие-то действия и возвращается к основной программе. Дело в том, что при входе в прерывания, у данного семейства МК регистр состояния автоматически нигде не запоминается, поэтому при выполнении команд, изменяющих флаги состояиния в прерывании значение регистра состояния может измениться по сравнению с тем, каким оно было при входе в подпрограмму обслуживания. При выходе из прерываний Вы получаете искаженное значение регистра.
Теперь как с этим бороться. Все просто при входе в прерывания нужно сохранить регистр флагов либо в каком нибудь "ненужном " (не используемом во всей программе) регистре , либо в стеке - последнее правильней. Соответсвенно при выходе из прерываний нужно восстановить сохраненное ранее значение.
Применительно к Вашей подпрограмме можно сделать так:
Код:
TIMER1_COMPB: push r16 ; сохраняем предыдущее значение r16 в стек - мало ли что в нем хранилось до этого in r16, SREG; читаем значение статус-регистра в r16 - push r16 ; сохраняем r16 в стек inc r30 ldi r20,0b00000001 in r21,portb eor r20,r21 out portb,r20 ldi r22,0 out tcnt1l,r22 out tcnt1h,r22 pop r16; вытаскиваем значение, соответсвующее состоянию статус-регистра до входа в прерывания, из стека out SREG, r16; восстанавливаем значение статус регистра pop r16 ; вытаскиваем значение регистра r16 из стека reti
2. про теги code -все просто при вставке куска программы в пост мы выделяем его и нажимаем кнопку code (находится над окном ввода)
Нуждаюсь в помощи с прошивкой на Си. Должен выйти двухточечный термометр но не получается. Проблема в том что я не умею выводить информацию с 2 датчиков на 1 индикатор. Правда било бы луче выводить температуру с датчиков отдельно на 2 индикатора по 3 цифры но это я тоже не умею. В архиве проект CVAVR и Proteus.
С переключением между индикаторами разобрался. Теперь хочу что бы когда, например, показывает температуру датчика 1 на ножке МК появлялась лог.1, а когда идёт индикация температуры датчика 2 то на той же ножке МК был лог.0.
Вот кусочек кода как я это делал но так не работает. Полный код выше в сообщении от tych. Правильно ли я думаю что при использовании побитового доступа к портам нужно каждый бит настраивать отдельно? Вот как у меня настроины порты
Зарегистрирован: Вс сен 09, 2007 12:59:18 Сообщений: 111
Рейтинг сообщения:0
У меня проблема с программированием tiny2313. Вставляю в программатор АТ904433 - все ОК! Проблема в том, что на выводах внешнего кварца нет колебаний. Внутренний генератор МК tiny2313 не работает. В чем дело ?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения