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

|
но факт остаётся фактом - после установки фьюза ДЖТАГА - чтение флеша даёт нумерацию ячеек памяти, после ирейза - чистый флеш. вы лучше скажите, когда жмёшь read фьюзов в свежекупленной атмеге какие должны быть отмечены галочкой в понипроге?
--------------------
Вся жизнь - ништяк, все бабы - леди, а солнце - шар дающий свет
|
|
|
|
|
Aug 6 2006, 19:10
|

Знающий
   
Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768

|
галочкой(0) должны быть: JTAGEN,SPIEN,BOOTSZ1,BOOTSZ0,SUT0,CKSEL1,CKSEL2,CKSEL3. А че,даташита нету?
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
Aug 6 2006, 19:16
|
Частый гость
 
Группа: Свой
Сообщений: 83
Регистрация: 25-11-05
Из: odessa
Пользователь №: 11 397

|
даташита есть! спросил потому, что у меня ни один фьюз не помечен (может чего не знаю как должно быть) ! => понипрог не читает фьюзы, но не читает только на эту атмегу! завтра ещё 2313 попробую прочесть...
--------------------
Вся жизнь - ништяк, все бабы - леди, а солнце - шар дающий свет
|
|
|
|
|
Aug 6 2006, 19:56
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Вообще мега16 пользуюсь более 2 лет,и проблема была только из за JTAG.Про остальные порты подобное первый раз слышу. Вот настройки меги16 - отключение JTAG и частота 8Мгц.
Эскизы прикрепленных изображений
|
|
|
|
|
Aug 6 2006, 20:26
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(SergSit @ Aug 6 2006, 20:58)  Ничего пони прог не путает для меги16. Программирую им мегу три месяца(в том числе и фьэы). Все нормально. Хотя я и не пользуюсь ponyprog'ом вообще. Но ситуация описанная автором поста напрямую свидетельствует о том, что были прошиты LOCK's в режиме LB MODE3. Цитата И еще , насколько знаю, если установить защиту от прогрммирования по ISP то снять ее можно только паралельным программатором. Неправильно знаете.. LOCKS снимаются командой стирания (ChipErase). Ваш ответ из разряда, "слышал звон да непонял откуда он" ;> Здесь речь не идет о запрете ISP соответвующим fuse'ом SPIEN, т.к. запретить этот fuse по ISP вообще-то не представляется возможным. LOCK's по ISP программировать можно, и нужно если речь идет о коммерческом изделии. Но очевидно у ponyprog'a, который можно отнести только к разряду любительских программаторов, имеются проблемы с программированием или отображение FUSES/LOCKs. Это факт. Я бы, конечно, посоветовал автору вместо того чтобы лочить JTAG интерфейс - наоборот приобрести JTAGICE и ощутить все прелести внутрисхемной отладки. Из программаторов посоветовал бы приобрести AVRISP по критериям - скорость программирования и качество поддержи. Однако если он не собирается вплотную работать с AVR, тогда вероятно бесплатный AVReal через STK200/byteblaster будет самым лучшим выбором, т.к. достаточно надежен и судя по постам автора AVReal - на порядок более быстр по сравнению с другими LPT программаторами.
Сообщение отредактировал defunct - Aug 6 2006, 20:28
|
|
|
|
|
Aug 8 2006, 17:59
|
Частый гость
 
Группа: Свой
Сообщений: 83
Регистрация: 25-11-05
Из: odessa
Пользователь №: 11 397

|
спасибо всем за советы и отзывы, но, кажется проблема решилась "потусторонними силами"... пришёл я на работу, отобрал у людей рабочий прогграмматор, которым они кодили разные "классики". принёс домой, попробовал - аналогичная ситуация. (нумерация во флеше и нет фьюзов). принёс оба программатора на работу, подключил свой - тестится пони прогом, но не видит !никаких! кристаллов. включил рабчий программатор - теститься, видит кристалл, и атмегу 16 и её фьюзы! чудо! программлю JTAGEN, прекрасно! думаю, ну, дело в моём программаторе. приношу всё домой, подключаю свой программатор к своему компу.. и тихо афигеваю. видится атмега 16, её флеш, её фьюзы, всё пишется и читается, в т.ч. и если повторно зашить и отшить JTAGEN. потом правда долго догонял, почему у меня не работает порт А... но догнал =) что могло послужить причиной аномальной работы на моём компе двух программаторов, а после того как я их повозил по городу - к работе обоих? (кста у меня комп не перезагружался между подключениями!) но что больше меня волнует, почему мой программатор работает у меня дома, но не работает на рабочем компе?
--------------------
Вся жизнь - ништяк, все бабы - леди, а солнце - шар дающий свет
|
|
|
|
|
Aug 8 2006, 19:47
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
У меня была подобная загадка природы из за блока питания. Еще была проблема ,прикупил два программатора под ПОНИ и КОМ- один простенький JDM, другой навороченый от КиевСат (карточки под спутник,карточки SIM,мобилы,Pfoenix,PIC,AVR ,ну и разнокалиберная память само собой),так вот на стационарном компе оба работали, на буке только КиевСат.Проблема оказалась в напряжении уровней КОМ порта,в буке было +\- 5в заместь +\-12в.
|
|
|
|
|
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).
|
|
|
|
|
Sep 8 2006, 14:31
|
Частый гость
 
Группа: Свой
Сообщений: 83
Регистрация: 25-11-05
Из: odessa
Пользователь №: 11 397

|
позволю доложить, что эти советы к положительным результатам не привели
по поводу выставления CSx одной командой, позволю высказать 2 возражения. если уж одной командой - то TCCR1B |= (1 << CS11) | (1 << CS10); а не TCCR1B = (1 << CS11) | (1 << CS10); чтобы оставить целыми все остальные разряды. поправьте меня если я ошибаюсь.
имхо, эти биты можно выставлять и последовательно. ведь по сути, счётчик запускается, и успевая (или не успевая) сделать пару тиков переходит к более длительному интервалу инкремента, что при моей точности "+/- километр" не принципиально.
что же качсается обнуления таймера, то имхо нет особой важности в последовательности. а вот при инициализации - есть, и я инитил регистры так, как было описано в предыдущем посте... результат прежний.
ещё версии? кто-то сталкивался с таким?
Сообщение отредактировал junoSynthesizer - Sep 8 2006, 14:32
--------------------
Вся жизнь - ништяк, все бабы - леди, а солнце - шар дающий свет
|
|
|
|
|
Sep 8 2006, 16:54
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(junoSynthesizer @ Sep 6 2006, 21: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; }
примечание: 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!
неделю бъюсь головой о стенку и понимаю что ошибся где-то в мелочи, помогите увидеть, где! Что означает Выражение Код if (on = ~on) ........ Вы переменную on каким значением инициализируете, если инициализируете вообще? И потом, такая конструкция не очень надежна. Если хотя бы один бит будет ненулевым, то данное условие будет выполняться всегда. Для подобных целей лучше использовать один бит. Это повысит надежность Вашей программы.
|
|
|
|
|
Sep 8 2006, 18:27
|
Частый гость
 
Группа: Свой
Сообщений: 83
Регистрация: 25-11-05
Из: odessa
Пользователь №: 11 397

|
2 _Bill
не там копаете. это тупо переменная она или 0xFF или 0x00 (инитится нулём), соответственно её инвертируем и получаем переключение состояний. это работает стопудов, не здесь глюк
2 singlskv
тоже не то. порт С - выходной. соответсвенно... пин С я в конце функции использую чисто для читабельности и компактности кода.
--------------------
Вся жизнь - ништяк, все бабы - леди, а солнце - шар дающий свет
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|