ВСЁ по прошивке и программированию AT90S2313/ATTiny2313
Вероятнее всего нет, поскольку тогда "съедут" частоты интерфейса общения с компом.
Оптимизм х (Опыт + Знания) = const
- Реклама
- Сообщения: 293
- Зарегистрирован: Пн дек 24, 2007 07:09:09
Доброго времени суток... Нид хелп... Переделываю программу от ATmega8 в программу для ATtiny2313 (есть такая необходимость)... Возникла сложность с регистрами...
В mega8 стоят такие:
Как их переделать под tiny2313?
В mega8 стоят такие:
Код: Выделить всё
TCCR2 = (1<<WGM21)|(1<<CS22)|(1<<CS21)|(1<<CS20); //Таймер-2, режим CTC, предделитель 1024
OCR2 = 0x6A; //Регистр сравнения, время счета 9 мс при частоте 12 МГц
TIFR = (1<<OCF2); //Установка флага начала отсчета времени - Сообщения: 293
- Зарегистрирован: Пн дек 24, 2007 07:09:09
Исправил - не помогло... Пишет что
Может кто нибудь в чем дело?
Код: Выделить всё
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Может кто нибудь в чем дело?
- Реклама
- Сообщения: 293
- Зарегистрирован: Пн дек 24, 2007 07:09:09
Вот собственно код... Эти регистры обьявляються в файле in_psx.c
Код пока что для ATmega8
http://radiokot.ru/forum/viewtopic.php?p=157934#157934
Я так понял у tiny эти регитры по другому обьявляються
Вроде так : OCF1A, TCCR1B, OCR1AH или я ошибаюсь?
Код пока что для ATmega8
http://radiokot.ru/forum/viewtopic.php?p=157934#157934
Я так понял у tiny эти регитры по другому обьявляються
Вроде так : OCF1A, TCCR1B, OCR1AH или я ошибаюсь?
- Сообщения: 459
- Зарегистрирован: Вс июн 01, 2008 12:16:38
В вашем случае более адекватной заменой в таймеру2 в меге будет не таймер1 в тини а таймер0, поскольку он 8-ми битный, что касается имен регистров то сначала попробуйте заменить OCR2 на OCR0A, при этом нужно учесть, что если используются прерывания, то нужно выбрать соотвествующий вектор TIFR = (1<<OCF2); заменить на TIFR = (1<<OCF0), а вообще лучше в даташиты глянуть и таймеры сравнить.VenomXP писал(а):Вот собственно код... Эти регистры обьявляються в файле in_psx.c
Код пока что для ATmega8
http://radiokot.ru/forum/viewtopic.php?p=157934#157934
Я так понял у tiny эти регитры по другому обьявляються
Вроде так : OCF1A, TCCR1B, OCR1AH или я ошибаюсь?
З. Ы посмотрел исходник, разбираться желания нет, поскольку там не достаточно в начале заменить имена, их надо по всему исходнику менять. В качестве помощи могу выложить код настройки, чтобы таймер0 в тини был настроен как Таймер2 в приведенном исходнике.
Дальше будете действовать по аналогии и пробовать, если не будет получаться - спрашивать
- Сообщения: 459
- Зарегистрирован: Вс июн 01, 2008 12:16:38
Как и обещал выкладываю код инициализации. Не проверено т. к. нет симулятора под рукой, но должно работать
Код: Выделить всё
//Инициализация джойстика
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
}- Сообщения: 293
- Зарегистрирован: Пн дек 24, 2007 07:09:09
Даташит - библия моя...


- Сообщения: 37
- Зарегистрирован: Сб дек 22, 2007 17:13:24
добрый вечер, у меня вопрос по массивам. взял код с обучалки немного изменил массив. код прикрепил.. проблема заключается в том что массив Array0: очень велик и не обрабатывается до конца.. говорит ли это о том, что большой код забивает ПЗУ и не обрабатывая до конца начинает с начала?
- Вложения
-
- code.asm
- код прошивки
- (5.49 КБ) 519 скачиваний
По беглому взгляду - до конца обработки массива наступает условие прерывания Timer1_comp1, и массив естественно не обрабатывается до конца.Dock писал(а):добрый вечер, у меня вопрос по массивам. взял код с обучалки немного изменил массив. код прикрепил.. проблема заключается в том что массив Array0: очень велик и не обрабатывается до конца.. говорит ли это о том, что большой код забивает ПЗУ и не обрабатывая до конца начинает с начала?
в меге Т2 8-бит, а Т1 в тини2313 16-бит, логичнее использовать ТО, но нужно уточнить в каком режиме он работаетIgor_67 писал(а):В 2313 нету таймера2. Там есть таймер0 и таймер1. Если таймер 1 больше нигде в программе не используется, то можно юзать его, поменяв в приведённом кусочке TCCR2, OCR2, OCF2 на те же с индексом 1Как их переделать под tiny2313?
- Сообщения: 459
- Зарегистрирован: Вс июн 01, 2008 12:16:38
Код конечно безобразный, но при беглом просмотре думаю работать должен, одно меня смущает: счетчик сбросов организован в регистре общего назначения (R21), не знаю точно - беглый просмотр ДШ не дал ответа на вопрос, но подозреваю, что r21 обнуляестя при сбросе.Dock писал(а):добрый вечер, у меня вопрос по массивам. взял код с обучалки немного изменил массив. код прикрепил.. проблема заключается в том что массив Array0: очень велик и не обрабатывается до конца.. говорит ли это о том, что большой код забивает ПЗУ и не обрабатывая до конца начинает с начала?
Как вариант - попробуйте организовать счетчик сброса в ОЗУ, естественно смотрите в сторону команд 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 и т. д. - если прочтете внимательно - узнаете много интересного.
- Сообщения: 37
- Зарегистрирован: Сб дек 22, 2007 17:13:24
причина оказалась банальна при встрече адреса в массиве
0 (десятеричное) или 0b00000000 массив уходил в ресет.. кто может объяснить почему? и как это исправить?
благодарю. прашивка выше.
0 (десятеричное) или 0b00000000 массив уходил в ресет.. кто может объяснить почему? и как это исправить?
благодарю. прашивка выше.
- Сообщения: 459
- Зарегистрирован: Вс июн 01, 2008 12:16:38
Тоже мне, четвертый бином Ньютона (с) М. БулгаковDock писал(а):причина оказалась банальна при встрече адреса в массиве
0 (десятеричное) или 0b00000000 массив уходил в ресет.. кто может объяснить почему? и как это исправить?
благодарю. прашивка выше.
причина здесь
Код: Выделить всё
lpm ;загрузка из ПЗУ
mov Temp,R0 ;копирование в РОН
cpi Temp,0 ;пороверка на нулевой элемент
breq Init- Сообщения: 459
- Зарегистрирован: Вс июн 01, 2008 12:16:38
Так вот, команда lpm загружает байт из программной памяти, "лежащий" по адресу, находящемуся в указателе Z, в регистр R0. Т. е. в вашем коде происходит следующее: из массива загружается байт, далее этот байт сравнивается с 0, если равен, то переходим на метку Init, собственно при переходе на Init счетчик массива обнуляется и чтение продолжается с нулевого элемента массиа.
- Сообщения: 6
- Зарегистрирован: Чт дек 18, 2008 13:13:27
Вот выдержка из даташита на ATtiny2313:
То есть, если записать нужные биты в слово OSCCAL, то можно получить желаемое. Но это, кажись, только для внутреннего генератора. Вот, собственно сами биты: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.
Здесь CKSEL0 - нулевой; CKDIV8 - седьмой, т.е. последний.CKDIV8 7 Divide clock by 8 0 (programmed)
CKOUT 6 Output Clock on CKOUT pin 1 (unprogrammed)
SUT1 5 Select start-up time 1 (unprogrammed)(1)
SUT0 4 Select start-up time 0 (programmed)(1)
CKSEL3 3 Select Clock source 0 (programmed)(2)
CKSEL2 2 Select Clock source 0 (programmed)(2)
CKSEL1 1 Select Clock source 1 (unprogrammed)(2)
CKSEL0 0 Select Clock source 0 (programmed)(2)
Проблема с настройкой ШИМ. Делаю это так: (вложение). В протеусе работает только 1 канал, почему не пойму.
- Вложения
-
- untitled.c
- (1.57 КБ) 543 скачивания
Я не Сашок!!!


