Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Как заставить работать ATmega48 на частоте 4Мгц без внешнего кварца?


Как заставить работать ATmega48 на частоте 4Мгц без внешнего кварца?

Сообщений 1 страница 11 из 11

1

Прошу помощи.
На Мега8 сделан датчик.МК спит,просыпается по таймеру(TIMER2),который работает в асинхронном режиме от часового кварца.Просыпается,шлёт через UART что там намерял и засыпает . Скорость UART-4800,частота МК-4 Мгц. Всё работает нормально,но код для 8-й меги маловат и хотел использовать 48 мегу,да и там ещё останется.Если у 8-й меги фьюзами можно поставить нужную частоту и вполне хватает точности,чтобы UART не мусорил,то у 48-й только 8Мгц,делитель на 8,да 128 кГц. Регистр делителя CLKPR не помогает. При изменение конфигурации битов этого регистра видно,что частота меняется,но данные приемник(радиоканал) не видит.Есть ли возможность настроить 48 мегу на точную работу с частотой 4МГц  от внутреннего генератора?

0

2

Вам надо 4МГц, то судя из инет описания, у 48 есть только 8МГц, следовательно, чтобы получить 4МГц, вам надо использовать внешний кварц на 4 и проверить бит делителя на 8.
Если такой возможности нет, то придется всю программу перестраивать на другие внутренние частоты.

0

3

В том то и дело,что ноги для внешнего кварца уже заняты часовым кварцем,который тактирует TIMER2.Но я вычитал в дш,что есть регистр,который может менять тактовую частоту на ходу.Выглядит это так:
http://se.uploads.ru/t/JezLq.jpg
http://s0.uploads.ru/t/OrQzT.jpg
Думал,что фьюзами ставим 8 МГц,отключаем делитель на 8,а потом,уже внутри кода включаем делитель на 2.
Но,либо я что-то не так делаю,либо точности установки частоты  не хватает.

0

4

В код нужно добавить

Код:
Config Clockdiv = 2

0

5

Пётр написал(а):

В код нужно добавить


И не забудьте установить скорость трансляции USART

$map       ' Получаем карту распределения памяти компилятором Bascom
  $regfile = "m48pdef.dat"       ' Используемый контроллер
  $crystal = 8000000       ' 8 МГц
  $framesize = 64       'размер области используемой и необходимой для преобразований
  $hwstack = 64       ' Размер аппаратного стека
  $swstack = 64       ' Размер программного стека

  $baud = 4800       'Так проще задействовать весь аппаратный модуль USART МК

'===============================================================================
'Устанавливаем делитель частоты МК
'===============================================================================

   Config Clockdiv = 2       '1; 2; 4; 8; 16; 32; 64' 128' 256

'===============================================================================
'Устанавливаем скорость трансляции USART
'===============================================================================
'4800 бод
  Ucsr0a.u2x0 = 0
  Ubrr0 = 51

'9600 бод
'  Ucsr0a.U2x0 = 0
'  Ubrr0 = 25

'19200 бод
'  Ucsr0a.U2x0 = 0
'  Ubrr0 = 12

'250000 бод
'  Ucsr0a.U2x0 = 0
'  Ubrr0 = 0

'--------------  Разрешаем работу необходимых прерываний  ----------------------
'  Enable Adc
'  Enable Int0
'  Enable Compare0a
'  Enable Timer0
'  Start Timer0
'  Enable Urxc
'------------  Разрешаем работу всех включенных прерываний  --------------------
'  Enable Interrupts
'===============================================================================

'                   Г Л А В Н Ы Й         Ц И К Л
  Главный_цикл:
'===============================================================================

      Print "Тест скорости USART"

      Wait 1

'===============================================================================
  Goto Главный_цикл
End
'                        П О Д П Р О Г Р А М М Ы
'===============================================================================

0

6

Sergik07 написал(а):

Всё работает нормально,но код для 8-й меги маловат и хотел использовать 48 мегу,да и там ещё останется.

Что-то изменилось в мире и я пропустил ? ;)
Отчего в ATMega48 стало памяти больше, чем в ATMega8 ? ;)
У перового 4 кБ, у второго - 8 кБ...

Может, речь идет о замене на ATMega328 ?

0

7

Nord написал(а):

Отчего в ATMega48 стало памяти больше, чем в ATMega8 ?
У перового 4 кБ, у второго - 8 кБ...


Описа̀лся человек, с кем не бывает.

0

8

Nord
Не,в мире ничего не изменилось :). Просто я имел в виду,что код настолько мал,что мега8 для него слишком большая.Не мега8 мала для кода,а код маленький,чтобы использовать МК с большим флешем.Так понятней? :)

0

9

Sergik07 написал(а):

NordНе,в мире ничего не изменилось . Просто я имел в виду,что код настолько мал,что мега8 для него слишком большая.Не мега8 мала для кода,а код маленький,чтобы использовать МК с большим флешем.Так понятней?

Уф...  :rolleyes:
А то я уже переживать начал... ;)

Отредактировано Nord (2017-02-10 09:07:43)

0

10

sasha_1973 написал(а):

$crystal = 8000000       ' 8 МГц

В данном случае, МК тактируется от 4 МГц (8/2) поэтому должно быть

Код:
$crystal = 4000000       ' 4 МГц

0

11

В общем заработало вот так:

Код:
$regfile = "m48pdef.dat"
$hwstack = 56
$swstack = 56
$framesize = 64

'делитель на 2 при тактировании от внутр.ген.8МГц
Clkpr = &B1000_0000
Clkpr = &B0000_0001

'или так:
'Config Clockdiv = 2

'скорость UART,приблизительно $baud = 4500
Ubrr0 = 55
'обычный режим работы UART
Ucsr0a.1 = 0

Оказалось,что нужно было немного подправить скорость работы UART в сторону уменьшения.Вполне возможно,что этот экземпляр 48-й меги имеет своих тараканов,так что нужно будет подбирать под каждый МК свою скорость UART.Может придется учитывать напряжение питания,температуру,помехи и проч. В дипе у меня нет 48-х,так что когда руки дойдут перепаять с переходника этот на другой экземпляр проверю и отпишу по результатам.

Большое спасибо всем,оказавшим помощь.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Как заставить работать ATmega48 на частоте 4Мгц без внешнего кварца?