Страница 17 из 132

Добавлено: Пн дек 15, 2008 22:45:24
Aheir
Вероятнее всего нет, поскольку тогда "съедут" частоты интерфейса общения с компом.

Добавлено: Пт дек 19, 2008 11:26:55
VenomXP
Доброго времени суток... Нид хелп... Переделываю программу от ATmega8 в программу для ATtiny2313 (есть такая необходимость)... Возникла сложность с регистрами...

В mega8 стоят такие:

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

  TCCR2 = (1<<WGM21)|(1<<CS22)|(1<<CS21)|(1<<CS20); 	//Таймер-2, режим CTC, предделитель 1024
  OCR2 = 0x6A; 											//Регистр сравнения, время счета 9 мс при частоте 12 МГц
  TIFR = (1<<OCF2); 									//Установка флага начала отсчета времени	
Как их переделать под tiny2313?

Добавлено: Пт дек 19, 2008 12:10:53
Igor_67
Как их переделать под tiny2313?
В 2313 нету таймера2. Там есть таймер0 и таймер1. Если таймер 1 больше нигде в программе не используется, то можно юзать его, поменяв в приведённом кусочке TCCR2, OCR2, OCF2 на те же с индексом 1

Добавлено: Пт дек 19, 2008 12:46:27
VenomXP
Исправил - не помогло... Пишет что

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

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


Может кто нибудь в чем дело?

Добавлено: Пт дек 19, 2008 13:35:59
Igor_67
undeclared - это значит переменная не объявлена заранее. Весь код можно посмотреть, тогда и разговор будет более предметный, а то по кусочкам ничего не понятно.

Добавлено: Пт дек 19, 2008 13:47:07
VenomXP
Вот собственно код... Эти регистры обьявляються в файле in_psx.c

Код пока что для ATmega8

http://radiokot.ru/forum/viewtopic.php?p=157934#157934

Я так понял у tiny эти регитры по другому обьявляються
Вроде так : OCF1A, TCCR1B, OCR1AH или я ошибаюсь?

Добавлено: Сб дек 20, 2008 20:31:22
Igor_67
кажется так. сейчас проверить не могу, т.к. выходные, а у меня всё на работе. пишу с мобилы, поэтому немногословно. сорри!

Добавлено: Вс дек 21, 2008 00:38:38
smac
VenomXP писал(а):Вот собственно код... Эти регистры обьявляються в файле in_psx.c

Код пока что для ATmega8

http://radiokot.ru/forum/viewtopic.php?p=157934#157934

Я так понял у tiny эти регитры по другому обьявляються
Вроде так : OCF1A, TCCR1B, OCR1AH или я ошибаюсь?
В вашем случае более адекватной заменой в таймеру2 в меге будет не таймер1 в тини а таймер0, поскольку он 8-ми битный, что касается имен регистров то сначала попробуйте заменить OCR2 на OCR0A, при этом нужно учесть, что если используются прерывания, то нужно выбрать соотвествующий вектор TIFR = (1<<OCF2); заменить на TIFR = (1<<OCF0), а вообще лучше в даташиты глянуть и таймеры сравнить.
З. Ы посмотрел исходник, разбираться желания нет, поскольку там не достаточно в начале заменить имена, их надо по всему исходнику менять. В качестве помощи могу выложить код настройки, чтобы таймер0 в тини был настроен как Таймер2 в приведенном исходнике.
Дальше будете действовать по аналогии и пробовать, если не будет получаться - спрашивать

Добавлено: Вс дек 21, 2008 01:00:03
smac
Как и обещал выкладываю код инициализации. Не проверено т. к. нет симулятора под рукой, но должно работать

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

//Инициализация джойстика

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 
}

Добавлено: Вс дек 21, 2008 08:43:49
VenomXP
:) пасипа ваще ОГРОМНОЕ... Хоть кто-то откликнулся... ОЧень помогло... Буду проверять :) Еще раз СПАСИБО

Добавлено: Пн дек 22, 2008 19:34:57
Dock
добрый вечер, у меня вопрос по массивам. взял код с обучалки немного изменил массив. код прикрепил.. проблема заключается в том что массив Array0: очень велик и не обрабатывается до конца.. говорит ли это о том, что большой код забивает ПЗУ и не обрабатывая до конца начинает с начала?

Добавлено: Пн дек 22, 2008 23:17:15
GP1
Dock писал(а):добрый вечер, у меня вопрос по массивам. взял код с обучалки немного изменил массив. код прикрепил.. проблема заключается в том что массив Array0: очень велик и не обрабатывается до конца.. говорит ли это о том, что большой код забивает ПЗУ и не обрабатывая до конца начинает с начала?
По беглому взгляду - до конца обработки массива наступает условие прерывания Timer1_comp1, и массив естественно не обрабатывается до конца. :shock: Собственно я ни разу не видел обработки массивов в п/п обработки прерывания, может стоит вынести его за пределы обработчика и запретить прерывания на время обработки массива, или на крайний случай увеличить коэф. деления прескалера. Размер массива ограничен только объемом доступной памяти.

Добавлено: Пн дек 22, 2008 23:42:44
GP1
Igor_67 писал(а):
Как их переделать под tiny2313?
В 2313 нету таймера2. Там есть таймер0 и таймер1. Если таймер 1 больше нигде в программе не используется, то можно юзать его, поменяв в приведённом кусочке TCCR2, OCR2, OCF2 на те же с индексом 1
в меге Т2 8-бит, а Т1 в тини2313 16-бит, логичнее использовать ТО, но нужно уточнить в каком режиме он работает

Добавлено: Вт дек 23, 2008 01:09:20
smac
Dock писал(а):добрый вечер, у меня вопрос по массивам. взял код с обучалки немного изменил массив. код прикрепил.. проблема заключается в том что массив 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 и т. д. - если прочтете внимательно - узнаете много интересного.

Добавлено: Вт дек 23, 2008 01:23:09
Dock
причина оказалась банальна при встрече адреса в массиве
0 (десятеричное) или 0b00000000 массив уходил в ресет.. кто может объяснить почему? и как это исправить?
благодарю. прашивка выше.

Добавлено: Вт дек 23, 2008 01:37:40
smac
Dock писал(а):причина оказалась банальна при встрече адреса в массиве
0 (десятеричное) или 0b00000000 массив уходил в ресет.. кто может объяснить почему? и как это исправить?
благодарю. прашивка выше.
Тоже мне, четвертый бином Ньютона (с) М. Булгаков
причина здесь

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

       lpm                   ;загрузка из ПЗУ

         mov Temp,R0           ;копирование в РОН
         cpi Temp,0            ;пороверка на нулевой элемент
         breq Init
Дело в том, что многие ленятся смотреть в даташит, а там можно узнать много интересного. Даю наводку прочитайте описание команды lpm и сами найдите причину. Ну если все-таки не найдете, то я вам так и быть подскажу чуть позже.

Добавлено: Вт дек 23, 2008 02:37:24
smac
Так вот, команда lpm загружает байт из программной памяти, "лежащий" по адресу, находящемуся в указателе Z, в регистр R0. Т. е. в вашем коде происходит следующее: из массива загружается байт, далее этот байт сравнивается с 0, если равен, то переходим на метку Init, собственно при переходе на Init счетчик массива обнуляется и чтение продолжается с нулевого элемента массиа.

Добавлено: Вт дек 23, 2008 09:27:45
Петрович2
а -

Добавлено: Вт дек 23, 2008 09:46:34
Igor_67
Вот выдержка из даташита на ATtiny2313:
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, то можно получить желаемое. Но это, кажись, только для внутреннего генератора. Вот, собственно сами биты:
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)
Здесь CKSEL0 - нулевой; CKDIV8 - седьмой, т.е. последний.

Добавлено: Вт дек 30, 2008 22:38:56
sachok
Проблема с настройкой ШИМ. Делаю это так: (вложение). В протеусе работает только 1 канал, почему не пойму.:)