Доброго времени суток... Нид хелп... Переделываю программу от ATmega8 в программу для ATtiny2313 (есть такая необходимость)... Возникла сложность с регистрами...
В mega8 стоят такие:
Код:
TCCR2 = (1<<WGM21)|(1<<CS22)|(1<<CS21)|(1<<CS20); //Таймер-2, режим CTC, предделитель 1024 OCR2 = 0x6A; //Регистр сравнения, время счета 9 мс при частоте 12 МГц TIFR = (1<<OCF2); //Установка флага начала отсчета времени
В 2313 нету таймера2. Там есть таймер0 и таймер1. Если таймер 1 больше нигде в программе не используется, то можно юзать его, поменяв в приведённом кусочке TCCR2, OCR2, OCF2 на те же с индексом 1
Compiling C: in_psx.c avr-gcc -c -mmcu=attiny2313 -I. -gdwarf-2 -DF_CPU=12000000UL -O2 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef -Wa,-adhlns=obj/in_psx.lst -std=gnu99 -Wundef -MD -MP -MF .dep/in_psx.o.d in_psx.c -o obj/in_psx.o in_psx.c: In function 'inDecoderInit': in_psx.c:11: error: 'TCCR1' undeclared (first use in this function) in_psx.c:11: error: (Each undeclared identifier is reported only once in_psx.c:11: error: for each function it appears in.) in_psx.c:13: error: 'OCF1' undeclared (first use in this function) in_psx.c: In function 'inDecoderPoll': in_psx.c:38: error: 'OCF1' undeclared (first use in this function) make.exe: *** [obj/in_psx.o] Error 1
undeclared - это значит переменная не объявлена заранее. Весь код можно посмотреть, тогда и разговор будет более предметный, а то по кусочкам ничего не понятно.
Я так понял у tiny эти регитры по другому обьявляються Вроде так : OCF1A, TCCR1B, OCR1AH или я ошибаюсь?
В вашем случае более адекватной заменой в таймеру2 в меге будет не таймер1 в тини а таймер0, поскольку он 8-ми битный, что касается имен регистров то сначала попробуйте заменить OCR2 на OCR0A, при этом нужно учесть, что если используются прерывания, то нужно выбрать соотвествующий вектор TIFR = (1<<OCF2); заменить на TIFR = (1<<OCF0), а вообще лучше в даташиты глянуть и таймеры сравнить.
З. Ы посмотрел исходник, разбираться желания нет, поскольку там не достаточно в начале заменить имена, их надо по всему исходнику менять. В качестве помощи могу выложить код настройки, чтобы таймер0 в тини был настроен как Таймер2 в приведенном исходнике.
Дальше будете действовать по аналогии и пробовать, если не будет получаться - спрашивать
Как и обещал выкладываю код инициализации. Не проверено т. к. нет симулятора под рукой, но должно работать
Код:
//Инициализация джойстика
void inDecoderInit(void) { PORTB=0xFF; DDRB=0x14; //PB2,PB4 выходы, остальные входы с резисторами PORTC=0xFF; DDRC=0x3B; //PC0,PC1,PC3-PC5 выходы, остальные входы с резисторами TCCR0A=(1<<WGM01)// Включаем режим CTC у таймера0 TCCR0B=(0b101<<CS00)// Включаем делитель на 1024 !! учтите, что временной интервал будет совпадать //с указанны только при частоте тактирования тиньки 12 МГц OCR0A = 0x6A; //Регистр сравнения, время счета 9 мс при частоте 12 МГц TIFR |= _BV(OCF0A); //Установка флага начала отсчета времени // для приведенной настройки везде в программе нужно заменить OCF2 на OCF0A }
добрый вечер, у меня вопрос по массивам. взял код с обучалки немного изменил массив. код прикрепил.. проблема заключается в том что массив Array0: очень велик и не обрабатывается до конца.. говорит ли это о том, что большой код забивает ПЗУ и не обрабатывая до конца начинает с начала?
Вложения:
Комментарий к файлу: код прошивки code.asm [5.49 KiB]
Скачиваний: 515
Карма: 2
Рейтинг сообщений: 11
Зарегистрирован: Пт май 23, 2008 19:32:22 Сообщений: 2401 Откуда: Россия, Волгоград
Рейтинг сообщения:0 Медали: 1
Dock писал(а):
добрый вечер, у меня вопрос по массивам. взял код с обучалки немного изменил массив. код прикрепил.. проблема заключается в том что массив Array0: очень велик и не обрабатывается до конца.. говорит ли это о том, что большой код забивает ПЗУ и не обрабатывая до конца начинает с начала?
По беглому взгляду - до конца обработки массива наступает условие прерывания Timer1_comp1, и массив естественно не обрабатывается до конца. Собственно я ни разу не видел обработки массивов в п/п обработки прерывания, может стоит вынести его за пределы обработчика и запретить прерывания на время обработки массива, или на крайний случай увеличить коэф. деления прескалера. Размер массива ограничен только объемом доступной памяти.
Карма: 2
Рейтинг сообщений: 11
Зарегистрирован: Пт май 23, 2008 19:32:22 Сообщений: 2401 Откуда: Россия, Волгоград
Рейтинг сообщения:0 Медали: 1
Igor_67 писал(а):
Цитата:
Как их переделать под tiny2313?
В 2313 нету таймера2. Там есть таймер0 и таймер1. Если таймер 1 больше нигде в программе не используется, то можно юзать его, поменяв в приведённом кусочке TCCR2, OCR2, OCF2 на те же с индексом 1
в меге Т2 8-бит, а Т1 в тини2313 16-бит, логичнее использовать ТО, но нужно уточнить в каком режиме он работает
добрый вечер, у меня вопрос по массивам. взял код с обучалки немного изменил массив. код прикрепил.. проблема заключается в том что массив Array0: очень велик и не обрабатывается до конца.. говорит ли это о том, что большой код забивает ПЗУ и не обрабатывая до конца начинает с начала?
Код конечно безобразный, но при беглом просмотре думаю работать должен, одно меня смущает: счетчик сбросов организован в регистре общего назначения (R21), не знаю точно - беглый просмотр ДШ не дал ответа на вопрос, но подозреваю, что r21 обнуляестя при сбросе.
Как вариант - попробуйте организовать счетчик сброса в ОЗУ, естественно смотрите в сторону команд lds, sts.
Ниже некий пример работы с памятью
Код:
.dseg rst_cntr: .byte 1 ; резервируем 1 байт ОЗУ под счетчик (до 255 ресетов) .cseg .org 0 ... ; работа с переменной в озу может происходить так: lds r16, rst_cntr; загружаем данные из памяти в регистр inc r16; ну или dec r16 или еще какие действия sts rst_cntr, r16 ; сохраняем данные из регистра в память
З. Ы. В коде возможны опечатки т. к. писал прямо в окне ответа, соответсвенно не проверял.
З. З. Ы. По поводу массивов - поглядите на описание команд ld rd, X+, ld rd, Y+, ldd и т. д. - если прочтете внимательно - узнаете много интересного.
причина оказалась банальна при встрече адреса в массиве
0 (десятеричное) или 0b00000000 массив уходил в ресет.. кто может объяснить почему? и как это исправить?
благодарю. прашивка выше.
причина оказалась банальна при встрече адреса в массиве 0 (десятеричное) или 0b00000000 массив уходил в ресет.. кто может объяснить почему? и как это исправить? благодарю. прашивка выше.
Тоже мне, четвертый бином Ньютона (с) М. Булгаков
причина здесь
Код:
lpm ;загрузка из ПЗУ
mov Temp,R0 ;копирование в РОН cpi Temp,0 ;пороверка на нулевой элемент breq Init
Дело в том, что многие ленятся смотреть в даташит, а там можно узнать много интересного. Даю наводку прочитайте описание команды lpm и сами найдите причину. Ну если все-таки не найдете, то я вам так и быть подскажу чуть позже.
Так вот, команда lpm загружает байт из программной памяти, "лежащий" по адресу, находящемуся в указателе Z, в регистр R0. Т. е. в вашем коде происходит следующее: из массива загружается байт, далее этот байт сравнивается с 0, если равен, то переходим на метку Init, собственно при переходе на Init счетчик массива обнуляется и чтение продолжается с нулевого элемента массиа.
Calibration Byte The ATtiny2313 has a byte calibration value for the internal RC Oscillator. This byte resides in the high byte of address 0x000 in the signature address space. During reset, this byte is automatically written into the OSCCAL Register to ensure correct frequency of the calibrated RC Oscillator.
То есть, если записать нужные биты в слово OSCCAL, то можно получить желаемое. Но это, кажись, только для внутреннего генератора. Вот, собственно сами биты:
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения