ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
-
Денис203
- Открыл глаза
- Сообщения: 51
- Зарегистрирован: Вт авг 28, 2007 10:53:49
- Контактная информация:
добрый день! а вот подскажите такой момент... пишу такую прогу.... светодиодик мигает снчала с одной частотой,, в регистре 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
так вот вопрос в том, что в АВРстудио все четко работает....
а в реале,, ну никак не 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
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Денис203 писал(а):добрый день! а вот подскажите такой момент... пишу такую прогу.... светодиодик мигает снчала с одной частотой,, в регистре r30 копится число, пока не станет =5,,, зтем частота моргания меняется....
так вот вопрос в том, что в АВРстудио все четко работает....
а в реале,, ну никак не 5 число в регистре.... он очень уж долго моргает с первой частотой....
что неправильно? или с чем это связано?
Может с тактовой частотой?
Денис203 писал(а):добрый день! а вот подскажите такой момент...
.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
Денис203 писал(а):про 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 (находится над окном ввода)
- sachok
- Опытный кот
- Сообщения: 849
- Зарегистрирован: Сб янв 05, 2008 11:05:15
- Откуда: Україна м.Луцьк
- Контактная информация:
Нуждаюсь в помощи с прошивкой на Си. Должен выйти двухточечный термометр но не получается. Проблема в том что я не умею выводить информацию с 2 датчиков на 1 индикатор. Правда било бы луче выводить температуру с датчиков отдельно на 2 индикатора по 3 цифры но это я тоже не умею. В архиве проект CVAVR и Proteus.
- Вложения
-
- Копия termometr.rar
- (71 КБ) 443 скачивания
Я не Сашок!!!
- tych
- Э...
- Сообщения: 2792
- Зарегистрирован: Ср апр 04, 2007 08:39:14
- Откуда: Москва
- Контактная информация:
sachok писал(а):Нуждаюсь в помощи с прошивкой на Си. Должен выйти двухточечный термометр но не получается.
ПОЛУЧИЛСЯ !!! Вы не поверите !
Добавил счетчик переключающий термометры каждые 9 сек примерно. Моделировал в PROTEUS 7.2 работает на модели старого AVR2313
Но в PROTEUS 7.4 есть моделька Тини2313 !
В реале нужно резисторы (примерно по 560 Ом) поставить на сегменты !
Архив содержит еще и шаблон для быстрого старта в CVAVR VMLAB WinAVR PROTEUS.
- Вложения
-
- 2x DS18b20 7segLED CVAVR PROTEUS.rar
- (97.88 КБ) 631 скачивание
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
- sachok
- Опытный кот
- Сообщения: 849
- Зарегистрирован: Сб янв 05, 2008 11:05:15
- Откуда: Україна м.Луцьк
- Контактная информация:
С переключением между индикаторами разобрался. Теперь хочу что бы когда, например, показывает температуру датчика 1 на ножке МК появлялась лог.1, а когда идёт индикация температуры датчика 2 то на той же ножке МК был лог.0.
Вот кусочек кода как я это делал но так не работает. Полный код выше в сообщении от tych. Правильно ли я думаю что при использовании побитового доступа к портам нужно каждый бит настраивать отдельно? Вот как у меня настроины порты
Код: Выделить всё
if (big_ctr < 1)
{
j=0;
PORTD.5=0;
}
else
{
j=1;
PORTD.5=1;
}Вот кусочек кода как я это делал но так не работает. Полный код выше в сообщении от tych. Правильно ли я думаю что при использовании побитового доступа к портам нужно каждый бит настраивать отдельно? Вот как у меня настроины порты
Код: Выделить всё
PORTD=0xFF;
DDRD=0x3F;Я не Сашок!!!
- tych
- Э...
- Сообщения: 2792
- Зарегистрирован: Ср апр 04, 2007 08:39:14
- Откуда: Москва
- Контактная информация:
sachok писал(а):Правильно ли я думаю что при использовании побитового доступа к портам нужно каждый бит настраивать отдельно?
Можно и так сказать, но запись в регистр может быть и одна.
Напиши:
Код: Выделить всё
DDRD.5 = 1; Не ошибешСИ !
Возможно порт-Д не достижим так в CVAVR, тогда используй операции над битами как в задаче 1 у меня в курсе.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
- sachok
- Опытный кот
- Сообщения: 849
- Зарегистрирован: Сб янв 05, 2008 11:05:15
- Откуда: Україна м.Луцьк
- Контактная информация:
Ничего не пойму... даже так делал и работать не хочет...
Код: Выделить всё
#define SET_D(x) |= (1<<x)
#define CLR_D(x) &=~(1<<x)
sfrb PORTD=0x12;
sfrb DDRD=0x11;
sfrb PIND=0x10;Я не Сашок!!!
- tych
- Э...
- Сообщения: 2792
- Зарегистрирован: Ср апр 04, 2007 08:39:14
- Откуда: Москва
- Контактная информация:
Сделай копию проекта выкинь все из него и оставь только дрыганье ножкой - может это из-за не той модели в PROTEUS - там же не тини применили.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru