реклама на сайте
подробности

 
 
> проблема с ATmega16, помогите новичку
junoSynthesizer
сообщение Aug 6 2006, 08:22
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 83
Регистрация: 25-11-05
Из: odessa
Пользователь №: 11 397



люди, я щас буду головой об стенку биться sad.gif всю ночь мучаюсь а ничего не работает, как в принципе уже и мозг под утро cranky.gif

ситуация следующая help.gif

есть кристалл АТмега16-16PI, распаяный на монтажке с питанием 5В.
есть программатор СТК200, собраный один в один со схемой с сайта ПОНИпрога
собственно понипрог версии 2,06f который даёт Тест ОК при проверке программатора

теперь даже не знаю как описать собственно проблему...

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

код в АВРстудии версии 4.12 билд 460:
.include "m16def.inc"

.def tmp = r16

.cseg
.org 0

jmp reset


reset:

ldi tmp, 0b11111111
out DDRC, tmp

main:

ldi tmp, 0b00000001

nop_cicle:
rol tmp
out PORTC, tmp
nop
jmp nop_cicle

;----------------------------

вот такой вот код. просто как сиськи первого размера.


ну думаю, щаз увижу имульс какой-то частоты. беру осциллограф, встаю на 0 пин порта С и о чудо! импульс! 1 пин - импульс.... а дальше - 2 пин - единица, 3 - единица, 4 и 5 - нули, 6 и 7 - показывают правильный импульс.
получается, что в порту работают только два старших и два младших бита, а средние - показывают детскую неожиданность.
думаю, может что с осциллографом? иду и смотрю на цифровом (кажись Тектроник за 7 косарей) - всё идентично с показаниями старого советского осциллографа. blink.gif

затем пишу другую программу:

.include "m16def.inc"

.def tmp = r16
.def tmp1 = r17

.cseg
.org 0

jmp reset

reset:

main:

ldi tmp, 0b11111111
out DDRB, tmp ; так же ставил ДДРЦ, ДДРА, ДДРД

ldi tmp, 0b00000000
ldi tmp1, 0b00000001


nop_cicle:
add tmp, tmp1
nop
out PORTB, tmp
nop
jmp nop_cicle
;------------------------------------------------

ну и по идее что я должен увидеть? делитель частоты. осциллограф.... порт C - те же пины работают, те же не работают. другие порты - ВООБЩЕ нули. wacko.gif blink.gif

беру другую атмегу16..... ****, то же самое!

сто раз проверяю схемотехнику монтажки - всё правильно (да и негде там ошибиться! )

может я где-то чего-то не дочитал о назначении портов? smile3046.gif

что может быть? кто-то знает?


--------------------
Вся жизнь - ништяк, все бабы - леди, а солнце - шар дающий свет
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
junoSynthesizer
сообщение Sep 6 2006, 18:28
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 83
Регистрация: 25-11-05
Из: odessa
Пользователь №: 11 397



снова обращаюсь за помощью к знающим форума сего =)))


не очень уверен куда мне писать - в подраздел ИАР или в общий форум по АВР... поэтому напишу в эту тему =)


итак, суть задачи, которую реализовываю:

необходимо сделать генератор импульсов с разной (регулируемой независимо) длительностью единицы и нуля + по переключению испольнять пару строк кода.

что используется: вся та же атмега16, в качестве среды программирования - ИАР, среда отладки - АВР студия.

идея реализации: после неудавщихся экспериментов с режимом СТС таймера_1 решил делать через прерывание по переполнению того же таймера_1, поскольку длительность удержания 1 и 0 довольно большая и измеряется в десятках секунд.

итак, в режиме СТС идея не работала. думал, что что-то неправильно работает именно из-за режима. стал экспериментировать с прерыванием по переполнению (куда уж проще?). код обработчика кнопки вкл/выкл:

if (on = ~on)
{
PORTC = 0xff;

setbit(TIMSK, TOIE1);
setbit(TCCR1B, CS11);
setbit(TCCR1B, CS10);

TCNT1L = imp_L;
TCNT1H = imp_H;
}
else
{
clrbit(TIMSK, TOIE1);

TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 0;
OCR1B = 0;
ICR1 = 0;

PORTC = 0x00;
}


примечание: clrbit и ей подобные функции работают корректно - это 200%.


код обработчика прерывания переполнения таймера:
#pragma vector = TIMER1_OVF_vect
__interrupt void impulse_change(void)
{
if (PORTC == 0x00)
{
TCNT1L = imp_L;
TCNT1H = imp_H;
}
else
{
TCNT1L = pause_L;
TCNT1H = pause_H;
}

PORTC = ~PINC;
}


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

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

что уже предпринималось (и не привело к изменениям):
не ресетя контроллер, выключаю генерирование, включаю его снова - та же картина.
менял порт вывода
менял места первой инициализации регистра TCNT1
делаю тотальное обнуление регистров таймера при запуске процессора
менял структуру проги
менял делители частоты

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

и самое странное, что меня настораживает и заставляет задуматься: сразу после инициализации таймера и установки значений выставляю вручную флаг прерывания по переполнению - !и всё равно! проц ведёт себя абсолютно точно так же - первый импульс ооооочень длинный! он не входит в прерывание пока не досчитает до FFFF от 0000!


неделю бъюсь головой о стенку и понимаю что ошибся где-то в мелочи, помогите увидеть, где!


--------------------
Вся жизнь - ништяк, все бабы - леди, а солнце - шар дающий свет
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 6 2006, 19:41
Сообщение #3


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(junoSynthesizer @ Sep 6 2006, 22:28) *
setbit(TCCR1B, CS11);
setbit(TCCR1B, CS10);

Вот так нельзя blink.gif
CSx нужно устанавливать одной командой.

Цитата(junoSynthesizer @ Sep 6 2006, 22:28) *
if (on = ~on)
{
PORTC = 0xff;

setbit(TIMSK, TOIE1);
setbit(TCCR1B, CS11);
setbit(TCCR1B, CS10);

TCNT1L = imp_L;
TCNT1H = imp_H;
}
else
{
clrbit(TIMSK, TOIE1);

TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 0;
OCR1B = 0;
ICR1 = 0;

PORTC = 0x00;
}

У Вас сильно попутана последовательность программирования регистров таймера.
Сначала программируем TCNT1,OCR1A,OCR1B,TCCR1A и т.д.,
затем запускаем таймер TCCR1B=(1<<CS11)|(1<<CS10).
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- junoSynthesizer   проблема с ATmega16   Aug 6 2006, 08:22
- - Black Pahan   в атмегах с JTAG'ом он по-умолчанию включен. и...   Aug 6 2006, 08:40
- - junoSynthesizer   спасибо за совет, сейчас попробую но это касатель...   Aug 6 2006, 09:05
- - Rash   А стек после reset: кто инициализировать будет Код...   Aug 6 2006, 09:49
- - junoSynthesizer   а назачем, извиняюсь, в такой тестовой программке ...   Aug 6 2006, 10:22
- - junoSynthesizer   в данном случае мы не обращаемся же в память, всё ...   Aug 6 2006, 10:57
|- - defunct   Цитата(junoSynthesizer @ Aug 6 2006, 13:5...   Aug 6 2006, 12:30
- - junoSynthesizer   нда, до этого за понипрогом не наблюдал ничего так...   Aug 6 2006, 13:16
- - SergSit   Программирую ATmega16 именно пони прогом. В том чи...   Aug 6 2006, 13:50
- - junoSynthesizer   взял сейчас 90s4434 всё работает замечательно...   Aug 6 2006, 14:12
|- - AVR   Цитата(junoSynthesizer @ Aug 6 2006, 18:1...   Aug 6 2006, 14:56
|- - defunct   Цитата(junoSynthesizer @ Aug 6 2006, 17:1...   Aug 6 2006, 16:10
- - junoSynthesizer   дело в том, что у меня стк200 программатор, там пр...   Aug 6 2006, 15:24
|- - AVR   Цитата(junoSynthesizer @ Aug 6 2006, 19:2...   Aug 6 2006, 15:40
- - SergSit   Ничего пони прог не путает для меги16. Программиру...   Aug 6 2006, 17:58
|- - defunct   Цитата(SergSit @ Aug 6 2006, 20:58) Ничег...   Aug 6 2006, 20:26
- - junoSynthesizer   но факт остаётся фактом - после установки фьюза ДЖ...   Aug 6 2006, 18:10
- - WHALE   галочкой(0) должны быть: JTAGEN,SPIEN,BOOTSZ1,BOOT...   Aug 6 2006, 19:10
- - junoSynthesizer   даташита есть! спросил потому, что у меня ни о...   Aug 6 2006, 19:16
- - bodja74   Вообще мега16 пользуюсь более 2 лет,и проблема был...   Aug 6 2006, 19:56
- - bodja74   Еще,похоже у Вас кристалл дейсвительно сидит в защ...   Aug 6 2006, 20:14
- - SergSit   За ошибку извените, признаю. Но проблем с программ...   Aug 7 2006, 20:56
- - junoSynthesizer   спасибо всем за советы и отзывы, но, кажется пробл...   Aug 8 2006, 17:59
- - bodja74   У меня была подобная загадка природы из за блока п...   Aug 8 2006, 19:47
|- - singlskv   Цитата(junoSynthesizer @ Sep 6 2006, 22:2...   Sep 8 2006, 16:34
|- - _Bill   Цитата(junoSynthesizer @ Sep 6 2006, 21:2...   Sep 8 2006, 16:54
- - junoSynthesizer   позволю доложить, что эти советы к положительным р...   Sep 8 2006, 14:31
- - junoSynthesizer   2 _Bill не там копаете. это тупо переменная она и...   Sep 8 2006, 18:27
|- - singlskv   Цитата(junoSynthesizer @ Sep 8 2006, 22:2...   Sep 8 2006, 19:08
- - Gennadiy_   Если не ошибаюсь, то когда выполняется чтение port...   Sep 8 2006, 20:50
|- - singlskv   Цитата(Gennadiy_ @ Sep 9 2006, 00:50) Есл...   Sep 8 2006, 21:04
- - Gennadiy_   Мне почемуто помнится, что гдето я видел описание ...   Sep 8 2006, 21:10
|- - singlskv   Цитата(Gennadiy_ @ Sep 9 2006, 01:10) Мне...   Sep 8 2006, 21:22
- - Gennadiy_   Если в этой книге есть примеры про АВР то возможно...   Sep 8 2006, 22:12
- - Shurmas   Для AVR я вам советую 2 инструмена объемом 6 Мб вс...   Sep 8 2006, 23:31
- - Gennadiy_   Не смог загрузить картинки. В D.Sheet старой серии...   Sep 9 2006, 09:30
|- - singlskv   Цитата(Gennadiy_ @ Sep 9 2006, 13:30) Не ...   Sep 9 2006, 10:42
- - junoSynthesizer   2 Gennadiy_ спасибо вам огромное! я действите...   Sep 9 2006, 10:05
- - Gennadiy_   RE: проблема с ATmega16   Sep 9 2006, 16:33
|- - ps1x   Код char user[10]; user="Shurmas...   Sep 9 2006, 19:36
|- - singlskv   Цитата(ps1x @ Sep 9 2006, 23:36) Код cha...   Sep 9 2006, 20:28
- - junoSynthesizer   Народ, харе флудить =) я вот тоже читаю форум уже...   Sep 10 2006, 09:27


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 12:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01446 секунд с 7
ELECTRONIX ©2004-2016