Свежие обсуждения
Микроконтроллеры

Помогите с AtMega48

1 2

Собираю одно устройство на atmega48, и для проверки пытаюсь запрограммировать в контроллер примерно такую программу, чтобы она вывела лог. 1 во все разряды порта B (программу для самого устр-ва еще не написал):

.include "m48def.inc"
.cseg
.org 0
ldi r16,0xff
out ddrb,r16
out portb,r16
inf:
rjmp inf

Но программа не работает, логические 1 не появляются (генератор контроллера работает, программирование идет нормально, пробовал подавать сигнал сброса - не помогает).
Использую ассемблер avra (linux)
В чем может быть причина неработоспособности программы?

 

Ни в чем. Должна работать. Попробуйте запрограммировать Fuse Bits на внутренний генератор, проверьте программу в этой ситуации. Альтернативные функции по порту B не задействованы?
PS. Кстати, как установили, что генератор работает?

 

Фьюзы запрограммированы так:

OSCCAL = B4
CKDIV = 0
CKOUT = 1
SUT = 2
CKSEL = 2
RSTDISBL = 1
DWEN = 1
WDTON = 1
EESAVE = 1
BODLEVEL = 7
SELFPRGEN = 1

CKSEL = 2, то есть, уже используется внутренний генератор

Факт работы генератора установлен по программируемости контроллера (без генератора не должен программироваться, насколько я знаю)

P.S. Что за дополнительные функции, и как они могут повлиять?

 

Попробуйте вот так:


ldi r16,0xff
out ddrb,r16
out portb,r16
inf: out pinb,r16
rjmp inf
На всех выходах должен быть меандр с частотой Fclk/6.

 

Да, без какого-нибудь (не обязательно внутреннего) генератора программирование невозможно. Насчет дополнительных функций - выходные линии микроконтроллеров могут использоваться не только портами, но и другими компонентами (USART, ШИМ и прочее). В таких случаях совместное использование этой линии и портом, и дополнительным устройством может оказаться либо невозможным, либо должно выполняться с определенными ограничениями. За редким исключением, линию, на которой задействована альтернативная функция, нельзя использовать в качестве выводной (соответствующий бит DDRx не должен взводиться), иначе последствия могут быть непредсказуемыми. Судя по даташиту и фьюзам, в этом плане все у Вас нормально. Попробуйте взводить не все биты линии, а один (сначала ldi r16,0x01, при следующем прогоне - 0x02 и т.д.), если при каких-то комбинациях заработает - можно будет разбираться дальше. Повторю еще раз - программа правильная, должна работать

 

Во-первых, не понятно, что творится на Ресете? Он подтянут к 1?

А, вообще, неужто так сложно прогнать программу в AVRstudio? Сразу всё увидишь.

 

6 и 7 порта В заняты кварцем. Я бы попробовал другой порт.

 

В AVRStudio прогнал, там работает нормально.

Между ножкой "Reset" и +5в подключен резистор на 4,7 к. Такое должно быть сопротивление?

 

Спасибо за помощь, все заработало.
Дело было в программировании МК, в его памяти программы оказывались не те коды. Предварительное стирание МК все исправило.

 

Petrovich: Дело было в программировании МК, в его памяти программы оказывались не те коды. Предварительное стирание МК все исправило
Это что же у Вас за программатор такой? Что программирует , говорит все ок , а там даже не стерто?
Буду им детей пугать!