|
проблема с ATmega16, помогите новичку |
|
|
|
Aug 6 2006, 08:22
|
Частый гость
 
Группа: Свой
Сообщений: 83
Регистрация: 25-11-05
Из: odessa
Пользователь №: 11 397

|
люди, я щас буду головой об стенку биться  всю ночь мучаюсь а ничего не работает, как в принципе уже и мозг под утро ситуация следующая есть кристалл АТмега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 косарей) - всё идентично с показаниями старого советского осциллографа. затем пишу другую программу: .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 - те же пины работают, те же не работают. другие порты - ВООБЩЕ нули. беру другую атмегу16..... ****, то же самое! сто раз проверяю схемотехнику монтажки - всё правильно (да и негде там ошибиться! ) может я где-то чего-то не дочитал о назначении портов? что может быть? кто-то знает?
--------------------
Вся жизнь - ништяк, все бабы - леди, а солнце - шар дающий свет
|
|
|
|
|
 |
Ответов
|
Sep 6 2006, 18:28
|
Частый гость
 
Группа: Свой
Сообщений: 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!
неделю бъюсь головой о стенку и понимаю что ошибся где-то в мелочи, помогите увидеть, где!
--------------------
Вся жизнь - ништяк, все бабы - леди, а солнце - шар дающий свет
|
|
|
|
|
Sep 6 2006, 19:41
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(junoSynthesizer @ Sep 6 2006, 22:28)  setbit(TCCR1B, CS11); setbit(TCCR1B, CS10); Вот так нельзя 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).
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|