ВСЁ по прошивке и программированию AT90S2313/ATTiny2313

Обсуждаем контроллеры компании Atmel.
Денис203
Открыл глаза
Сообщения: 51
Зарегистрирован: Вт авг 28, 2007 10:53:49
Контактная информация:

Сообщение Денис203 »

ничего не понимаю... с компаратором А работает....
а вот с Б, нет,,
Какк только в ТИМСК меняю на Б, то не хочет работать... уходит в непонятное место... и пишет неопределен адрес...
invalid opcode 0xffff at adress 0x00000c
Денис203
Открыл глаза
Сообщения: 51
Зарегистрирован: Вт авг 28, 2007 10:53:49
Контактная информация:

Сообщение Денис203 »

ввобщем Program Counter становиться красынм и там адрес 0x0000C
и Staick Pointer тоже крачные 0xFE
Аватара пользователя
Тихан
Потрогал лапой паяльник
Сообщения: 346
Зарегистрирован: Пн апр 14, 2008 19:57:20
Контактная информация:

Сообщение Тихан »

А у tiny2313 цоколёвка такая же как у AT90s2313 ??
Денис203
Открыл глаза
Сообщения: 51
Зарегистрирован: Вт авг 28, 2007 10:53:49
Контактная информация:

Сообщение Денис203 »

да, абс такая же.....
Аватара пользователя
Тихан
Потрогал лапой паяльник
Сообщения: 346
Зарегистрирован: Пн апр 14, 2008 19:57:20
Контактная информация:

Сообщение Тихан »

Денис203 писал(а):да, абс такая же.....


СПасибо!!!!!
Денис203
Открыл глаза
Сообщения: 51
Зарегистрирован: Вт авг 28, 2007 10:53:49
Контактная информация:

Сообщение Денис203 »

добрый день! а вот подскажите такой момент... пишу такую прогу.... светодиодик мигает снчала с одной частотой,, в регистре 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
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение BerZerK-ku »

Денис203 писал(а):добрый день! а вот подскажите такой момент... пишу такую прогу.... светодиодик мигает снчала с одной частотой,, в регистре r30 копится число, пока не станет =5,,, зтем частота моргания меняется....
так вот вопрос в том, что в АВРстудио все четко работает....
а в реале,, ну никак не 5 число в регистре.... он очень уж долго моргает с первой частотой....
что неправильно? или с чем это связано?

Может с тактовой частотой?
Аватара пользователя
Lakshmi
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Пн сен 01, 2008 21:56:44
Откуда: Балашиха

Сообщение Lakshmi »

Денис203 писал(а):в АВРстудио все четко работает....

Дак и выложи проект Студии архивом.
Денис203
Открыл глаза
Сообщения: 51
Зарегистрирован: Вт авг 28, 2007 10:53:49
Контактная информация:

Сообщение Денис203 »

выкладываю... посмотрите плиз...
Вложения
проект.rar
(4.56 КБ) 454 скачивания
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

Денис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
Открыл глаза
Сообщения: 51
Зарегистрирован: Вт авг 28, 2007 10:53:49
Контактная информация:

Сообщение Денис203 »

про code не совсем понял... можно с примером?
а про первую запись.... тоже не совсем... не совсем понятно, что записывается в регистр
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

Денис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
Откуда: Україна м.Луцьк
Контактная информация:

Сообщение sachok »

Нуждаюсь в помощи с прошивкой на Си. Должен выйти двухточечный термометр но не получается. Проблема в том что я не умею выводить информацию с 2 датчиков на 1 индикатор. Правда било бы луче выводить температуру с датчиков отдельно на 2 индикатора по 3 цифры но это я тоже не умею. В архиве проект CVAVR и Proteus.
Вложения
Копия termometr.rar
(71 КБ) 443 скачивания
Я не Сашок!!!
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

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
Откуда: Україна м.Луцьк
Контактная информация:

Сообщение sachok »

СПАСИБО tych!!! :) Все понял...
Я не Сашок!!!
Аватара пользователя
sachok
Опытный кот
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк
Контактная информация:

Сообщение sachok »

С переключением между индикаторами разобрался. Теперь хочу что бы когда, например, показывает температуру датчика 1 на ножке МК появлялась лог.1, а когда идёт индикация температуры датчика 2 то на той же ножке МК был лог.0.

Код: Выделить всё

      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
Откуда: Москва
Контактная информация:

Сообщение tych »

sachok писал(а):Правильно ли я думаю что при использовании побитового доступа к портам нужно каждый бит настраивать отдельно?

Можно и так сказать, но запись в регистр может быть и одна.

Напиши:

Код: Выделить всё

DDRD.5 = 1; 

Не ошибешСИ !

Возможно порт-Д не достижим так в CVAVR, тогда используй операции над битами как в задаче 1 у меня в курсе.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Аватара пользователя
sachok
Опытный кот
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк
Контактная информация:

Сообщение sachok »

Ничего не пойму... даже так делал и работать не хочет...

Код: Выделить всё

#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
Откуда: Москва
Контактная информация:

Сообщение tych »

Сделай копию проекта выкинь все из него и оставь только дрыганье ножкой - может это из-за не той модели в PROTEUS - там же не тини применили.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Аватара пользователя
Гагарин
Встал на лапы
Сообщения: 111
Зарегистрирован: Вс сен 09, 2007 12:59:18

Сообщение Гагарин »

У меня проблема с программированием tiny2313. Вставляю в программатор АТ904433 - все ОК! Проблема в том, что на выводах внешнего кварца нет колебаний. Внутренний генератор МК tiny2313 не работает. В чем дело ?
Ответить

Вернуться в «AVR»