Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AVR первые шаги - первые ошибки
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
D H
Вот и написана в CodeVision Первая программа. В VMLab симулируется нормально. Зашил в ATMega16. В ответ тишина.
В проекте выбран ATmega16, 4MHz. Прошиваю PonyProg.
Фьюзы такие (отмечены галочками в PonyProg):
SUT1=1
CKSEL1=1
CKSEL0=1

На 40-й ноге телодвижений нет.

Reset через 0,1 мф на землю. +5 на VCC и AVCC

---------------------------------
#include
#define PA_OUT DDRA = 0b00000001

void initialization(void)
{
PORTA=0b11111110;
PA_OUT; //сделать PORTA выходом
TCCR0 = 0x4;/* таймер включить */
}


void main(void)
{
unsigned int Flag;
initialization();

while (1)
{
Flag=0;
if((TIFR&0x01)) // Проверка флага переполнения timer0
{
TIFR = 0x01; // очистить флаг переполнения timer0
PORTA.0=~PORTA.0; //Инвертировать значение в порту А
}
};
}
---------------------------------

Объясните пожалуйста, что неправильно сделал?
vet
Фьюзы - отмечены галочками или установлены в 1 ? это разные вещи.
D H
Фьюзы отмечены галочками в PonyProg:
SUT1=1
CKSEL1=1
CKSEL0=1

Отмечены галочками. Я знаю, что это разные вещи. Прошу помочь разобраться что сделано не правильно.
vet
Приведите скриншот окна установки фьюзов.
D H
Цитата(vet @ Nov 1 2006, 10:13) *
Приведите скриншот окна установки фьюзов.

Нажмите для просмотра прикрепленного файла
otrog
Попробуйте так:Нажмите для просмотра прикрепленного файла
$ilent
Помоему почти всё не правильно.
Код
#include <mega16.h>
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here
PORTA=~PORTA.0;
}

void main(void)
{
// Input/Output Ports initialization
// Port A initialization
PORTA=0b11111110;
DDRA = 0b00000001;


// Port B initialization
PORTB=0x00;
DDRB=0x00;

// Port C initialization
PORTC=0x00;
DDRC=0x00;

// Port D initialization
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 3,906 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x05;
TCNT0=0x00;
OCR0=0x00;

// External Interrupt(s) initialization
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm("sei")

while (1)
      {
      // Place your code here
      };
}


БЕЗ КВАРЦА
CSEL3...0 = 0011 = слева на права - ( галка, галка, пусто, пусто) - (галка - это ноль - это сброшен)
SUT0 = галка, SUT1 = пусто или просто не трогаешь (оставляешь как есть)
Petka
Цитата(D H @ Nov 1 2006, 09:38) *
Reset через 0,1 мф на землю.
Объясните пожалуйста, что неправильно сделал?

уж лучше reset "через" 10к на +5V
IgorKossak
Чтобы определиться с умолчаниями по отношению к фьюзам в том или ином программаторе, их иногда полезно прочитать.
Таким образом, по крайней мере, ничего не испортите.
D H
Цитата($ilent @ Nov 1 2006, 10:58) *
Помоему почти всё не правильно.
Код
#include <mega16.h>
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here
PORTA=~PORTA.0;
}

void main(void)
{
// Input/Output Ports initialization
// Port A initialization
PORTA=0b11111110;
DDRA = 0b00000001;



// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm("sei")

while (1)
      {
      // Place your code here
      };
}


БЕЗ КВАРЦА
CSEL3...0 = 0011 = слева на права - ( галка, галка, пусто, пусто) - (галка - это ноль - это сброшен)
SUT0 = галка, SUT1 = пусто или просто не трогаешь (оставляешь как есть)


Ситуация такая же. В VMLab все эмулируется. Прошиваю, тишина.
Petka
Цитата(D H @ Nov 1 2006, 12:20) *
Ситуация такая же. В VMLab все эмулируется. Прошиваю, тишина.

Вы ресет к пяти вольтам хоть чем-нибудь тяните?
D H
Цитата(Petka @ Nov 1 2006, 12:43) *
Цитата(D H @ Nov 1 2006, 12:20) *

Ситуация такая же. В VMLab все эмулируется. Прошиваю, тишина.

Вы ресет к пяти вольтам хоть чем-нибудь тяните?


Нет. Резистор отсутствовал. Поставил и все запустилось. Огромное спасибо. Начало положено.
Надо отдать должное дружелюбию и стремлению помочь новичку. Ваш форум был третий, где я задал вопрос и, что самое главное, получил внятный ответ. На остальных форумах ответы были такого характера : "Пиши на асме и все будет понятно".
Еще раз огромное спасибо.
junoSynthesizer
давно уже хотел спросит форумчан, да всё новую тему не хочется открывать =)


раз уж здесь оказалось дело в ресете... скажите мне:
я экспериментально установил, что ресет, висящий в воздухе, прекрасно позволяет работать атмеге. сделал уже не одно любительское устройство (на профессионализм пока и не претендую), которые работают и под капотом машины, и в комнатных условиях... и ещё не разу не сталкивался с проблемами.

если мне надо хардварный ресет, то просто кидаю кнопку с ресета на землю. и прекрасно работает!

так вот вопрос: чем мне это грозит в будущем? =)
Alex11
Если провод от ноги Reset никуда не идет, то ничем не грозит, а если идет - пониженной помехоустройчивостью. Там внутренняя подтяжка 30-60 КОм, это многовато для длинной линии в условиях сильных помех.
junoSynthesizer
от рисета идёт, на разъём программирования... буду его обрубать на пп после прошивки =)
Petka
Цитата(junoSynthesizer @ Nov 1 2006, 23:56) *
от рисета идёт, на разъём программирования... буду его обрубать на пп после прошивки =)

лучше всего ресет напрямую заправить на +5В. при внутрисхемном программировании это не годится, поэтому не напрямую а кОм через 1-10.
Persona
Конечно антенну из RESET лучше не делать. Но если помехи "достают", то надо с RESET-ом считаться и фильтр. емкость поближе к корпусу повесить, чтобы не все так близко принимал с "эфира".
При "грязном" питании 10к резистор (с RESET на пит.) - прямой мост для помех и гарантия случайного сброса.
Когда мониторинг события СБРОС не проводить, то может возникать мнение, что ложных сбросов никогда и не было...
Petka
Цитата(Persona @ Nov 2 2006, 21:42) *
Конечно антенну из RESET лучше не делать. Но если помехи "достают", то надо с RESET-ом считаться и фильтр. емкость поближе к корпусу повесить, чтобы не все так близко принимал с "эфира".
При "грязном" питании 10к резистор (с RESET на пит.) - прямой мост для помех и гарантия случайного сброса.

Вот для случая "грязного" или плохого питания как раз ресет и НАДО ОБЯЗАТЕЛЬНО вешать на питание. А то представьте себе, скокануло питание, часть периферии сбойнуло, память слетела, а контроллер не перазапустился! вот здорово! это называете надёжной работой?
Persona
Ну ничего себе! Что же так питание скачет, что все сбоит и слетает? Тогда надо UPS ставить. Если МК будет перезапускаться, то и сбой некому заметить будет и маячок зажечь.. smile.gif
Harbinger
Так "маячок" же можно в процедуру инициализации вписать wink.gif
smk
Ну если зашла речь о питании, то расскажите кто как делает. Если на одной платке с контроллером стоит, управляемая им, нагрузка с током до 0,3А то как быть? А если бузер 25 Ом при частоте 2400 Гц управляется меандром и длинна проводника от него до контроллера не более 3 см? Какие мнения? Питание от раздельных стабилизаторов не обсуждаем, понятно, что это лекарство...
Harbinger
Для буззера - RC-фильтр. 10 Ом/100 мкФ. И, имхо, неприлично такие вещи прямо на порт контроллера вешать wink.gif Даже китайцы на транзисторах не экономят.
Сейчас вот на одном стабилизаторе висит контроллер и нагрузка с пиковым током потребления 2 А (GSM-модуль). Ничего, работают. DC/DC 3,6 В, на выходе 470 мкФ, модуль отвязан супрессором+220 мкФ тантал+0,1 мкФ керамический.
smk
Конечно не на порту такая нагрузка. Конечно есть транзистор. Интересуют оригинальные решения. Стандартные мне известны. Ну вот скажем, не будет ли проще отфильтровать питание самого контроллера, а не таких нагрузок? Ток контроллера ведь намного меньше. И конечно развязаться по току транзисторами. я прав?

И еще. Кто-нибудь сталкивался с изменением частоты встроенного генератора контроллера при изменении напряжения питания (кварца нет)? А питание и температура одновременно? Даташит смотрел, но толком пока ничего не ясно. Как на практике?
Dog Pawlowa
Цитата(smk @ Nov 6 2006, 13:48) *
Интересуют оригинальные решения.

Философское...
Вообще-то придумать оригинальное решение в технике практически невозможно.
Все уже давно кем-то придумано, и даже по несколько раз.
Нучиться использовать придуманное - уже не зря жизнь сложилась.
biggrin.gif
smk
Согласен. Хотя, совершенству нет предела. Оригинальность заключается, в данном случае, в способе обеспечить надежную работоспособность устройства.
Terapefft
сори за офтоп, подскажите пожалуста почему при компилировании в АВР студио 4.12 проги для меги8, он ругается на строку:
st y+,yh ;
пишет типа:
C:\avr\avtomat\AVT.asm(2121): error: Operands may cause undefined behaviour
klop
Цитата(Terapefft @ Nov 7 2006, 16:49) *
сори за офтоп, подскажите пожалуста почему при компилировании в АВР студио 4.12 проги для меги8, он ругается на строку:
st y+,yh ;
пишет типа:
C:\avr\avtomat\AVT.asm(2121): error: Operands may cause undefined behaviour


Очевидно он считает что результат отерации может быть различным Иными словами что будет и по какому адресу сохранится Например
1 high(y) по адресу y
2 high(y+1) по адресу y
и так далее
А вот почему ето error а не warning не знаю
=GM=
Цитата(Terapefft @ Nov 7 2006, 13:49) *
сори за офтоп, подскажите пожалуста почему при компилировании в АВР студио 4.12 проги для меги8, он ругается на строку:
st y+,yh ;
пишет типа:
C:\avr\avtomat\AVT.asm(2121): error: Operands may cause undefined behaviour

Видимо потому, что во время выполнения атомарной (неделимой) операции yh может измениться из-за наличия переноса из yl.

В документе doc085е (с. 139) указывается, что результат следующих инструкций не определен.
Код
       1.      st  y+,r28
       2.      st  y+,r29
       3.      st  -y,r28
       4.      st  -y,r29
Terapefft
как мне лучше поступить в этой ситуации? подскажите пожалуста
Nanobyte
Цитата(Terapefft @ Nov 8 2006, 09:58) *
как мне лучше поступить в этой ситуации? подскажите пожалуста

Использовать отдельные команды:
ST Y,YH
ADIW YL,1
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.