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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Сообщение Aheir »

Вероятнее всего нет, поскольку тогда "съедут" частоты интерфейса общения с компом.
Оптимизм х (Опыт + Знания) = const
Аватара пользователя
VenomXP
Грызет канифоль
Сообщения: 293
Зарегистрирован: Пн дек 24, 2007 07:09:09
Контактная информация:

Сообщение VenomXP »

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

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

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

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


Как их переделать под tiny2313?
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Сообщение Igor_67 »

Как их переделать под tiny2313?


В 2313 нету таймера2. Там есть таймер0 и таймер1. Если таймер 1 больше нигде в программе не используется, то можно юзать его, поменяв в приведённом кусочке TCCR2, OCR2, OCF2 на те же с индексом 1
Аватара пользователя
VenomXP
Грызет канифоль
Сообщения: 293
Зарегистрирован: Пн дек 24, 2007 07:09:09
Контактная информация:

Сообщение 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


Может кто нибудь в чем дело?
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Сообщение Igor_67 »

undeclared - это значит переменная не объявлена заранее. Весь код можно посмотреть, тогда и разговор будет более предметный, а то по кусочкам ничего не понятно.
Аватара пользователя
VenomXP
Грызет канифоль
Сообщения: 293
Зарегистрирован: Пн дек 24, 2007 07:09:09
Контактная информация:

Сообщение VenomXP »

Вот собственно код... Эти регистры обьявляються в файле in_psx.c

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

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

Я так понял у tiny эти регитры по другому обьявляються
Вроде так : OCF1A, TCCR1B, OCR1AH или я ошибаюсь?
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Сообщение Igor_67 »

кажется так. сейчас проверить не могу, т.к. выходные, а у меня всё на работе. пишу с мобилы, поэтому немногословно. сорри!
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16: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 в приведенном исходнике.
Дальше будете действовать по аналогии и пробовать, если не будет получаться - спрашивать
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение 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
}
Аватара пользователя
VenomXP
Грызет канифоль
Сообщения: 293
Зарегистрирован: Пн дек 24, 2007 07:09:09
Контактная информация:

Сообщение VenomXP »

:) пасипа ваще ОГРОМНОЕ... Хоть кто-то откликнулся... ОЧень помогло... Буду проверять :) Еще раз СПАСИБО
Даташит - библия моя...
Изображение
Аватара пользователя
Dock
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Сб дек 22, 2007 17:13:24
Контактная информация:

Сообщение Dock »

добрый вечер, у меня вопрос по массивам. взял код с обучалки немного изменил массив. код прикрепил.. проблема заключается в том что массив Array0: очень велик и не обрабатывается до конца.. говорит ли это о том, что большой код забивает ПЗУ и не обрабатывая до конца начинает с начала?
Вложения
code.asm
код прошивки
(5.49 КБ) 518 скачиваний
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

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

По беглому взгляду - до конца обработки массива наступает условие прерывания Timer1_comp1, и массив естественно не обрабатывается до конца. :shock: Собственно я ни разу не видел обработки массивов в п/п обработки прерывания, может стоит вынести его за пределы обработчика и запретить прерывания на время обработки массива, или на крайний случай увеличить коэф. деления прескалера. Размер массива ограничен только объемом доступной памяти.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

Igor_67 писал(а):
Как их переделать под tiny2313?


В 2313 нету таймера2. Там есть таймер0 и таймер1. Если таймер 1 больше нигде в программе не используется, то можно юзать его, поменяв в приведённом кусочке TCCR2, OCR2, OCF2 на те же с индексом 1

в меге Т2 8-бит, а Т1 в тини2313 16-бит, логичнее использовать ТО, но нужно уточнить в каком режиме он работает
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение 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 и т. д. - если прочтете внимательно - узнаете много интересного.
Аватара пользователя
Dock
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Сб дек 22, 2007 17:13:24
Контактная информация:

Сообщение Dock »

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

Сообщение smac »

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

Тоже мне, четвертый бином Ньютона (с) М. Булгаков
причина здесь

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

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

         mov Temp,R0           ;копирование в РОН
         cpi Temp,0            ;пороверка на нулевой элемент
         breq Init

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

Сообщение smac »

Так вот, команда lpm загружает байт из программной памяти, "лежащий" по адресу, находящемуся в указателе Z, в регистр R0. Т. е. в вашем коде происходит следующее: из массива загружается байт, далее этот байт сравнивается с 0, если равен, то переходим на метку Init, собственно при переходе на Init счетчик массива обнуляется и чтение продолжается с нулевого элемента массиа.
Петрович2
Родился
Сообщения: 6
Зарегистрирован: Чт дек 18, 2008 13:13:27

Сообщение Петрович2 »

а -
Последний раз редактировалось Петрович2 Сб дек 27, 2008 07:47:34, всего редактировалось 3 раза.
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Сообщение 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 - седьмой, т.е. последний.
Аватара пользователя
sachok
Опытный кот
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк
Контактная информация:

Сообщение sachok »

Проблема с настройкой ШИМ. Делаю это так: (вложение). В протеусе работает только 1 канал, почему не пойму.:)
Вложения
untitled.c
(1.57 КБ) 537 скачиваний
Я не Сашок!!!
Ответить

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