junoSynthesizer
Aug 6 2006, 08:22
люди, я щас буду головой об стенку биться

всю ночь мучаюсь а ничего не работает, как в принципе уже и мозг под утро
ситуация следующая
есть кристалл АТмега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..... ****, то же самое!
сто раз проверяю схемотехнику монтажки - всё правильно (да и негде там ошибиться! )
может я где-то чего-то не дочитал о назначении портов?
что может быть? кто-то знает?
Black Pahan
Aug 6 2006, 08:40
в атмегах с JTAG'ом он по-умолчанию включен. и в атмеге16 он как раз и находится в PORTC cо 2 по 5 бит. перешейте фуз JTAGEN и будет вам "щасьтье".
junoSynthesizer
Aug 6 2006, 09:05
спасибо за совет, сейчас попробую
но это касательно порта С. а что по поводу других портов? почему с ними могут быть проблемы?
А стек после reset: кто инициализировать будет
Код
reset:
ldi r16, high(RAMEND)
out SPH, r16
ldi r16, low(RAMEND)
out SPL, r16
А что б начать зайди хоть сюда (раз десять наверное сылку давал)
http://www.gaw.ru/html.cgi/txt/app/micros/avr/index.htm там как по русски, так и по импортному, апликейшены от Atmel.
Также если будешь использовать биты порта на котором сидит компаратор, не забудь отключить его, т.к. он по умолчанию тоже включён.
junoSynthesizer
Aug 6 2006, 10:22
а назачем, извиняюсь, в такой тестовой программке инитить стек? ессесно что его инит я делаю, но не здесь же =)
junoSynthesizer
Aug 6 2006, 10:57
в данном случае мы не обращаемся же в память, всё только через регистры.
а теперь собственно жалуюсь на новую проблему:
ну по совету товарища
Black Pahan, решил запрограммить фьюзы.
включаю пони прог, читаю - всё пусто. (и флеш проца пуст). ставлю бит, пишу - писать... потом читаю снова фьюзы - ничего не изменилось. зато во флеше!!!!!! мама родная! весь влешь забить мусором! в частности, если я не ошибаюсь, он просто в ячейки памяти записал их номера!
ирэйз, повторно - сейм шит.
читаю доку, ничего такого особенного на эту тему не нахожу...
сорри за два сообщения, но что-то я не могу редактировать предыдущее
defunct
Aug 6 2006, 12:30
Цитата(junoSynthesizer @ Aug 6 2006, 13:57)

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

Ничего не записывалось во флеш. Такой эффект будет если былы установлены lockbit's, запрещающие чтение флеша через ISP. В этом случае вместо данных флеша назад выплевывается байт адреса котороый отправлялся к МК.
Возможно пони-прог путает Fuses и Locks.. Попробуйте другим программатором.
junoSynthesizer
Aug 6 2006, 13:16
нда, до этого за понипрогом не наблюдал ничего такого!
но при этом после того, как я делаю ирэйз (не ресет) он возвращает пустой флеш!
ща попробую другой пони прог чтоли
кто-то вообще программировал же фьюзы на атмеге16? не я же первый! как и чем вы это делали?
кста прочитал в даташите - в MCUCSR есть бит JTD - это типа дисэйбл ДЖТАГА... ставлю... ага, как бы ни так...
SergSit
Aug 6 2006, 13:50
Программирую ATmega16 именно пони прогом. В том числе и фьюзы. Ни каких проблем нет. Единственное ноль фьюза обозначает галочка, единица пусто.
junoSynthesizer
Aug 6 2006, 14:12
взял сейчас 90s4434
всё работает замечательно! и фьюзы программит, и флеш! и работает всё!! чё ж мне так не прёт с атмегой16?
Цитата(junoSynthesizer @ Aug 6 2006, 18:12)

взял сейчас 90s4434
всё работает замечательно! и фьюзы программит, и флеш! и работает всё!! чё ж мне так не прёт с атмегой16?

Попробуйте прошить мегу16 с помощью
http://avr.nikolaew.org/data/uniprof20jan6.zip
junoSynthesizer
Aug 6 2006, 15:24
дело в том, что у меня стк200 программатор, там предумотрен шинный преобразователь, а если я правильно помню, то в этом программаторе (унипрог) нужен коннект на пины тупо через резисторы
Цитата(junoSynthesizer @ Aug 6 2006, 19:24)

дело в том, что у меня стк200 программатор, там предумотрен шинный преобразователь, а если я правильно помню, то в этом программаторе (унипрог) нужен коннект на пины тупо через резисторы
Можно просто пять проводочков к LPT порту без резисторов (в справке описано как это можно сделать).
defunct
Aug 6 2006, 16:10
Цитата(junoSynthesizer @ Aug 6 2006, 17:12)

взял сейчас 90s4434
всё работает замечательно! и фьюзы программит, и флеш! и работает всё!! чё ж мне так не прёт с атмегой16?

Очень похоже на то, что программатор просто путает местами команды Write Lock и Write Fuse для Mega16.
Используйте AVReal. Судя по отзывам в этом форуме, AVReal самый лучший LPT программатор.
SergSit
Aug 6 2006, 17:58
Ничего пони прог не путает для меги16. Программирую им мегу три месяца(в том числе и фьэы). Все нормально. И еще , насколько знаю, если установить защиту от прогрммирования по ISP то снять ее можно только паралельным программатором.
junoSynthesizer
Aug 6 2006, 18:10
но факт остаётся фактом - после установки фьюза ДЖТАГА - чтение флеша даёт нумерацию ячеек памяти, после ирейза - чистый флеш.
вы лучше скажите, когда жмёшь read фьюзов в свежекупленной атмеге какие должны быть отмечены галочкой в понипроге?
галочкой(0) должны быть:
JTAGEN,SPIEN,BOOTSZ1,BOOTSZ0,SUT0,CKSEL1,CKSEL2,CKSEL3.
А че,даташита нету?
junoSynthesizer
Aug 6 2006, 19:16
даташита есть!
спросил потому, что у меня ни один фьюз не помечен (может чего не знаю как должно быть) ! => понипрог не читает фьюзы, но не читает только на эту атмегу! завтра ещё 2313 попробую прочесть...
bodja74
Aug 6 2006, 19:56
Вообще мега16 пользуюсь более 2 лет,и проблема была только из за JTAG.Про остальные порты подобное первый раз слышу.
Вот настройки меги16 - отключение JTAG и частота 8Мгц.
bodja74
Aug 6 2006, 20:14
Еще,похоже у Вас кристалл дейсвительно сидит в защите.
Подайте команду "стереть кристалл" - она должна снятся.
Как только вы прочитаете эфки,вы сможете прочитать и фузы , и перебить если нужно.
При прошивке лучше подавать команду "записать кристал полностью" ,чем
"прошить флеш",в противном случае прошивка будет накладыватся поверх предыдущей,что приводит
к ошибке верификации.
defunct
Aug 6 2006, 20:26
Цитата(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 программаторами.
SergSit
Aug 7 2006, 20:56
За ошибку извените, признаю. Но проблем с программированием (по крайней мере с ATmega16)у пони нет. Это тоже факт. И если вы им не занимались ,помойму , не надо говорить о проблемах. Еще раз повторяю програмирую мегу16 пони_прогом месяца 3 , проблем нет. В том числе и фьюзами. Надо только помнить, что "1" фьза(незапрограмирован) есть пустая клетка. И "0" фьюза (запрограмирован) стоит галочка.
The ATmega16 provides six Lock bits which can be left unprogrammed (“1”) or can be
programmed (“0”)
junoSynthesizer
Aug 8 2006, 17:59
спасибо всем за советы и отзывы, но, кажется проблема решилась "потусторонними силами"...
пришёл я на работу, отобрал у людей рабочий прогграмматор, которым они кодили разные "классики". принёс домой, попробовал - аналогичная ситуация. (нумерация во флеше и нет фьюзов). принёс оба программатора на работу, подключил свой - тестится пони прогом, но не видит !никаких! кристаллов. включил рабчий программатор - теститься, видит кристалл, и атмегу 16 и её фьюзы! чудо! программлю JTAGEN, прекрасно! думаю, ну, дело в моём программаторе.
приношу всё домой, подключаю свой программатор к своему компу.. и тихо афигеваю. видится атмега 16, её флеш, её фьюзы, всё пишется и читается, в т.ч. и если повторно зашить и отшить JTAGEN.
потом правда долго догонял, почему у меня не работает порт А... но догнал =)
что могло послужить причиной аномальной работы на моём компе двух программаторов, а после того как я их повозил по городу - к работе обоих? (кста у меня комп не перезагружался между подключениями!) но что больше меня волнует, почему мой программатор работает у меня дома, но не работает на рабочем компе?
bodja74
Aug 8 2006, 19:47
У меня была подобная загадка природы из за блока питания.
Еще была проблема ,прикупил два программатора под ПОНИ и КОМ- один простенький JDM,
другой навороченый от КиевСат (карточки под спутник,карточки SIM,мобилы,Pfoenix,PIC,AVR ,ну и разнокалиберная память само собой),так вот на стационарном компе оба работали, на буке только КиевСат.Проблема оказалась в напряжении уровней КОМ порта,в буке было +\- 5в заместь +\-12в.
junoSynthesizer
Sep 6 2006, 18:28
снова обращаюсь за помощью к знающим форума сего =)))
не очень уверен куда мне писать - в подраздел ИАР или в общий форум по АВР... поэтому напишу в эту тему =)
итак, суть задачи, которую реализовываю:
необходимо сделать генератор импульсов с разной (регулируемой независимо) длительностью единицы и нуля + по переключению испольнять пару строк кода.
что используется: вся та же атмега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!
неделю бъюсь головой о стенку и понимаю что ошибся где-то в мелочи, помогите увидеть, где!
singlskv
Sep 6 2006, 19:41
Цитата(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
Sep 8 2006, 14:31
позволю доложить, что эти советы к положительным результатам не привели
по поводу выставления CSx одной командой, позволю высказать 2 возражения. если уж одной командой - то
TCCR1B |= (1 << CS11) | (1 << CS10);
а не
TCCR1B = (1 << CS11) | (1 << CS10);
чтобы оставить целыми все остальные разряды. поправьте меня если я ошибаюсь.
имхо, эти биты можно выставлять и последовательно. ведь по сути, счётчик запускается, и успевая (или не успевая) сделать пару тиков переходит к более длительному интервалу инкремента, что при моей точности "+/- километр" не принципиально.
что же качсается обнуления таймера, то имхо нет особой важности в последовательности. а вот при инициализации - есть, и я инитил регистры так, как было описано в предыдущем посте... результат прежний.
ещё версии? кто-то сталкивался с таким?
singlskv
Sep 8 2006, 16:34
Цитата(junoSynthesizer @ Sep 6 2006, 22:28)

код обработчика прерывания переполнения таймера:
#pragma vector = TIMER1_OVF_vect
__interrupt void impulse_change(void)
{
if (PORTC == 0x00) <-------- наверное все-таки дожно быть PINC ?
{
TCNT1L = imp_L;
TCNT1H = imp_H;
}
else
{
TCNT1L = pause_L;
TCNT1H = pause_H;
}
PORTC = ~PINC;
}
Цитата(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 каким значением инициализируете, если инициализируете вообще? И потом, такая конструкция не очень надежна. Если хотя бы один бит будет ненулевым, то данное условие будет выполняться всегда. Для подобных целей лучше использовать один бит. Это повысит надежность Вашей программы.
junoSynthesizer
Sep 8 2006, 18:27
2 _Bill
не там копаете. это тупо переменная она или 0xFF или 0x00 (инитится нулём), соответственно её инвертируем и получаем переключение состояний. это работает стопудов, не здесь глюк
2 singlskv
тоже не то. порт С - выходной. соответсвенно...
пин С я в конце функции использую чисто для читабельности и компактности кода.
singlskv
Sep 8 2006, 19:08
Цитата(junoSynthesizer @ Sep 8 2006, 22:27)

2 singlskv
тоже не то. порт С - выходной. соответсвенно...
пин С я в конце функции использую чисто для читабельности и компактности кода.
А Вы попробуйте таки поменять PORTC на PINC.
Если следовать datasheets:
Код
Reading the Pin Value Independent of the setting of Data Direction bit DDxn, the port pin can be read through
the PINxn Register bit. As shown in Figure 22, the PINxn Register bit and the preceding
latch constitute a synchronizer. This is needed to avoid metastability if the physical pin
changes value near the edge of the internal clock, but it also introduces a delay. Figure
23 shows a timing diagram of the synchronization when reading an externally applied
pin value. The maximum and minimum propagation delays are denoted tpd,max and tpd,min
respectively.
Figure 23. Synchronization when Reading an Externally Applied Pin value
...............................
Figure 24. Synchronization when Reading a Software Assigned Pin Value
...............................
при этом в симуляторе может все работать
Gennadiy_
Sep 8 2006, 20:50
Если не ошибаюсь, то когда выполняется чтение portD то чтение происходит из управляющего выходом регистра, при чтении pinD читается состояние физической линии, прошедшее синхронизацию, следовательно при исправной цепи и достаточном времени, работать должно идентично с обоими командами.
Я бы всетаки использовал одинаковые обращения.
Предпринял бы следующее:
*Проверил бы ассемблерный код, во "что" он там скомпилировал.
*Проверил бы последовательность инициализации таймера.
*Попробовал бы код на другом кристалле (лучше менее навороченном)
Получается, что таймер стартует с параметрами
Кажись нашел ваш трабл
сначала надо грузить старшую часть потом младшую , а не на обарот
об этом в даташит сказано !!!, думал вы знаете
singlskv
Sep 8 2006, 21:04
Цитата(Gennadiy_ @ Sep 9 2006, 00:50)

Если не ошибаюсь, то когда выполняется чтение portD то чтение происходит из управляющего выходом регистра, при чтении pinD читается состояние физической линии, прошедшее синхронизацию, следовательно при исправной цепи и достаточном времени, работать должно идентично с обоими командами.
Я бы всетаки использовал одинаковые обращения.
в даташите для чтения пинов даже при програмной установке ВСЕГДА используется
PINx (почему-то).
Результат чтения из PORTx вообще не описан...
Если мне не изменяет память, на эти грабли я уже наступал
При этом в симуляторе все ОК.
Как работает чтение из PORTx для меня так и осталось загадкой (может быть задать этот
вопрос atmel

).
Gennadiy_
Sep 8 2006, 21:10
Мне почемуто помнится, что гдето я видел описание этой разницы, или ктото мне рассказывал это.
singlskv
Sep 8 2006, 21:22
Цитата(Gennadiy_ @ Sep 9 2006, 01:10)

Мне почемуто помнится, что гдето я видел описание этой разницы, или ктото мне рассказывал это.
Вероятно вот здесь:
В.В.Сташин А.В.Урусов О.Ф.Мологонцева
"Проектирование цифровых устройств на однокристальных микроконтроллерах"
Только на AVR все чуть-чуть подругому.
Gennadiy_
Sep 8 2006, 22:12
Если в этой книге есть примеры про АВР то возможно, просто у меня книг таких нет, както обхожусь первоисточниками, но один раз, что то чужое на глаза попадалось, книга была с простейшими примерами для АВР.
Shurmas
Sep 8 2006, 23:31
Для AVR я вам советую 2 инструмена объемом 6 Мб всего! достаточных для полного цикла разработки - программирования, отладки и прошивания - вот посмотрите: vm-lab.narod.ru
Мастер начального кода позволяет настраивать МК так как вам нужно интерактивно и симулятор великолепный.
Еще скачайте PROTEUS - уверен вам понравится.
Цитата(singlskv @ Sep 9 2006, 01:04)

для чтения пинов даже при програмной установке ВСЕГДА используется
PINx (почему-то). Результат чтения из PORTx вообще не описан...
так устроен AVR - вот подробно: [banned]/02.htm
Gennadiy_
Sep 9 2006, 09:30
Не смог загрузить картинки.
В D.Sheet старой серии МС было так
The Port B Input Pins address (PINB) is not a register, and this address enables access
to the physical value on each Port B pin. When reading PORTB, the Port B Data Latch
is read, and when reading PINB, the logical values present on the pins are read.
Если посмотреть на схему организации выхода, то можно заметить _однонаправленные_ ключи, в новых схемах добавились цепи синхронизации и доп. цепи управления выходом для новых режимов.
Согласно схемам при чтении portD выдается сигнал RRx и данные считываются с выхода тригерра управления, физическая линия может при этом иметь другое состояние.
Где здесь и что " подругому" ?
junoSynthesizer
Sep 9 2006, 10:05
2 Gennadiy_
спасибо вам огромное! я действительно как то не обратил внимание на то что сначала надо инициализировать верхнюю часть 16 разрядного регистра счёта!
всё заработало!
singlskv
Sep 9 2006, 10:42
Цитата(Gennadiy_ @ Sep 9 2006, 13:30)

Не смог загрузить картинки.
В D.Sheet старой серии МС было так
The Port B Input Pins address (PINB) is not a register, and this address enables access
to the physical value on each Port B pin. When reading PORTB, the Port B Data Latch
is read, and when reading PINB, the logical values present on the pins are read.
Если посмотреть на схему организации выхода, то можно заметить _однонаправленные_ ключи, в новых схемах добавились цепи синхронизации и доп. цепи управления выходом для новых режимов.
Согласно схемам при чтении portD выдается сигнал RRx и данные считываются с выхода тригерра управления, физическая линия может при этом иметь другое состояние.
Где здесь и что " подругому" ?
Да Вы правы, просто в новых DSheet этой фразы нет "When reading PORTB, the
Port B Data Latch is read", а на схему я и не смотрел.
А глюк у меня был кажеться связан с этим:
", физическая линия может при этом иметь другое состояние"
Gennadiy_
Sep 9 2006, 16:33
Код
char user[10];
user="Shurmas";
if (user == a.vr123.nm.ru) then
{
ban(user);
}
правильная конструкция?
singlskv
Sep 9 2006, 20:28
Цитата(ps1x @ Sep 9 2006, 23:36)

Код
char user[10];
user="Shurmas";
if (user == a.vr123.nm.ru) then
{
ban(user);
}
правильная конструкция?
C Shurmas то все и так ясно,
интересно вот это:
smk"AVR-технология. Серьезные вопросы., Очень грамотный и думающий человек осваивает AVR."
и первой фразой:
"Читал форум и "курс", понятно какой... курс скорее мешает думать, чем помогает...."
smk != Shurmas ???
P.S это был первый пост
smk на electronix ?!
P.S.2.
Цитата(ps1x @ Sep 9 2006, 23:36)

Код
char user[10]; <--------- Я бы зарезервировал побольше места :)
user="Shurmas"; --------- иначе со временем придется менять ...
if (user == a.vr123.nm.ru) then
{
ban(user);
}
junoSynthesizer
Sep 10 2006, 09:27
Народ, харе флудить =)
я вот тоже читаю форум уже довольно давно, и этот "курс" у меня в печёнках сидит, человек его рекламирует похлеще чем владелец порно-сайта =) ну что поделать =)
проблема, ввиду которой был снова поднят пост - решена, поэтому говорю всем кто посмотрел - спасибо =)
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.