|
Пишется лажа в память |
|
|
|
Dec 16 2007, 14:45
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 2-04-07
Пользователь №: 26 711

|
Здравствуйте . Проблема вот какая . Написал давно несколько подпрограмм. Решил их вместе заставить работать как какое ни будь фукцианальное устройство. Проблема возникла в следующем. Не записываются данные в память ($60 $61 $62 $63 $64 $65 ) в этих ячейках памяти должны быть цифры от1 до 9 в реале 00 15 00 0E 00 15 иногда что то другое. В блоке подпрограммы RESET я записываю туда единицы (сделал для того чтобы определить в каком блоке портак ) после команды RJAMP перехожу на вывод сигнала в порт у же в памяти портак (другие блоки отключал проверяю передачей по ком порту). В эмуляторе все считается и работает исправно в реале нет. Есть вторая проблема когда к выводам 23 и 24 подвожу сигнал (для обработки ацп процессора ATmega 8) проц молчит сигнал вывода сигнала есть а по ком порту нет . Если 24 вывод посадить на землю то всё передача идёт. Код программы прилагаю . На писан в мнемонике мне так понятнее писать и разбираться . Описал всё как мог что бы понятнее было . Если не понятно то по ходу обсуждения могу подробно описать и объяснить каждую подпрограмму .
Прикрепленные файлы
_____.txt ( 18.34 килобайт )
Кол-во скачиваний: 264
|
|
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 43)
Guest_=AVR=_*
|
Dec 16 2007, 18:36
|
Guests

|
Так писать нельзя, потому что так нельзя писать. Совсем. Это не просто безграмотно, что встречается в 90% случаев - это ВОПИЮЩЕ БЕЗГРАМОТНО! [CENSORED] отправляйся на атмел.ру и атмел.сом, и учись пользоваться ассемблером и писать для начала простейший код - на конкретных примерах. Дальше можешь постепенно усложнять задачи, но научись понимать суть происходящего [CENSORED]
Сообщение отредактировал IgorKossak - Dec 24 2007, 11:46
|
|
|
|
|
Dec 16 2007, 23:59
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(Sholkin @ Dec 16 2007, 14:45)  Проблема вот какая . Написал давно несколько подпрограмм. Решил их вместе заставить работать как какое ни будь фукцианальное устройство. Проблема возникла в следующем. Не записываются данные в память ($60 $61 $62 $63 $64 $65 ) в этих ячейках памяти должны быть цифры от1 до 9 в реале 00 15 00 0E 00 15 иногда что то другое. В блоке подпрограммы RESET я записываю туда единицы (сделал для того чтобы определить в каком блоке портак ) после команды RJAMP перехожу на вывод сигнала в порт у же в памяти портак (другие блоки отключал проверяю передачей по ком порту). В эмуляторе все считается и работает исправно в реале нет. Есть вторая проблема когда к выводам 23 и 24 подвожу сигнал (для обработки ацп процессора ATmega 8) проц молчит сигнал вывода сигнала есть а по ком порту нет. Если 24 вывод посадить на землю то всё передача идёт. Код программы прилагаю . Написан в мнемонике мне так понятнее писать и разбираться. Описал всё как мог чтобы понятнее было . Если не понятно то по ходу обсуждения могу подробно описать и объяснить каждую подпрограмму 0) .... skipped .... 1) На входе в подпрограммы обработки прерываний надо обязательно сохранять содержимое статус-регистра SREG (если он в подпрограмме портится), а также содержимое используемых регистров (или использовать регистры, назначенные исключительно для данного прерывания) 2) Лучше не использовать зарезервированные слова RXC, UDRE и т.д. в качестве меток.
Сообщение отредактировал zltigo - Dec 17 2007, 00:26
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Dec 17 2007, 06:34
|

Местный
  
Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836

|
Цитата(Sholkin @ Dec 16 2007, 17:45)  какое ни будь фукцианальное устройство. Не записываются данные в память ($60 $61 $62 $63 $64 $65 ) в этих ячейках памяти должны быть цифры от1 до 9 в реале 00 15 00 0E 00 15 иногда что то другое. В блоке подпрограммы RESET я записываю туда единицы (сделал для того чтобы определить в каком блоке портак ) Что то я не нахожу у Вас ГДЕ Вы в "блоке подпрограммы RESET" записываете туда единицы? По коду записываете данные(($60 $61 $62 $63 $64 $65 ) из ЕЕПРОМ. Почему бы Вам не отладить код последовательно по блокам? Сначало передачу данных по USART. Потом работу с ЕЕПРОМ. Добавте в "подпрограмму RESET" загрузку ваших ячеек памяти конкретными значениями.. к примеру так: Код ldi r23,1 sts $60,r23 ldi r23,2 sts $61,r23 ldi r23,3 sts $62,r23 ;и т.д. оставьте только инициализацию передачи по USART и минимально необходимые функции. И добейтесь правильной передачи и ПОНИМАНИЯ своего кода! зы: я бы посоветовал резервировать байты в памяти и работать с метками: Код .def tmp = r23 .dseg mydata: .byte 1;мои данные .cseg . . //гдето в коде.. lds tmp,mydata //загрузить мои данные в РОН r23 (tmp) Есть еще такая замечательная вещь как директива ".include": Код .device ATmega8 .INCLUDE "m8def.inc" ; Пишите сие в начале и не нужно вашего: Код ;описание переменных памяти EEPROM .equ EECR = $1C .equ EEARH = $1F .equ EEARL = $1E .equ EEDR = $1D .equ EEMWE = 2 .equ EEWE = 1 .equ EERE = 0 .def VAR =r20 .def DATA =r21
;описание переменных USART
Сообщение отредактировал adc - Dec 17 2007, 07:22
--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
|
|
|
|
|
Dec 18 2007, 13:47
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 2-04-07
Пользователь №: 26 711

|
Здравствуйте. ADC вы не нашли где я записываю единици в память в блоке ресет я его убрал так как он мне не помог (там действительно с EEPROM данные беруться сначала я думал от туда лажа но потом стал записывать). ldi r16,1 sts $60,r16 sts $61,r16 sts $62,r16 sts $63,r16 sts $64,r16 sts $65,r16 rjmp aa оставил настроики подпрограмму передачи по USART и вывод сигнал
aa:sbic $12,4 ; сравнение Pd(0)=1 rjmp outr0 ; пограмма передачи низкого уровня символа rjmp outr1 outr0:cbi $12,4 ;вывод сигнала анти сброс (0) rjmp aa outr1:sbi $12,4 ;вывод сигнала анти сброс (1) wdr ;сбрасывать WDT(вачдок таймер) rjmp aa
передачи по USART оставил для того чтобы смотреть чего в проце делаеться подпрограмму передачи по USART работает точно (зашивал отдельно в проц и передавал данные) Так эе пробовал отключать полпрограмму где используеться АЦП (она у меня начинает работать когда переполнение таймера 0 идёт) rjmp start ;прерывание по таймеру Timer 0 и его отключил
Оставил вот эти 3 блока . Выходит такая сетуация Питания пошло выполняется программа ресет выполняются настройки потом записались единицы в ячейки памяти выполняеться команда rjmp aa
выполняется подпрограмма вывода сигнала анти сброс я считываю данные там ерунда. Выходит в этот момент и портак. дело в том я потом блок подключал только считывание с 0 и 1 канала ацп подключаю e1:rjmp test по етои метке перехожу для записи данных в память sts $69,r5 по этой ячейки сужу выполняласли программа умножения (данные ячейки меняется) sts $66,r22 по этоя ячейки сужу выполнилас ли программа считывания (данные такжи меняються )
не мяняются только ячейки sts $60,r16 sts $61,r16 sts $62,r16 sts $63,r16 sts $64,r16 sts $65,r16 и там не еденици как я туда писал а 00 15 00 0E 00 15 и ещё sts $67,r24 sts $68,r27
Вот эти ячеки я использую что ацп насчитало так при считывании в них данные 00 15 или 00 0E они как бы отражаются в ячейках 61-65 во какой парадокс не могу понять пока связь как так вообще происходит
|
|
|
|
|
Dec 24 2007, 07:57
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 2-04-07
Пользователь №: 26 711

|
Здравствуйте. Не упорство. Конечно вы все здесь провессионалы спору нет и пишите по другому но я то нет. Вы прогромируете 24 часа в сутки и по этому вам уже почи всё понятно. Я пробовал на си Но так как я его не очень то ещё больше стал путаться и не совсем понимать чего делать по этому написал пока так как мне понятно а не как вы привыкли писать по профессианальному. В таком виде а хотябы знаю что как происходит немного. что бы воловить ошибку. Хочю получить работающий код а потом уже как надо переписать на си чтоб было что работающее. По моему ошибку локолизовал пока на 100 не знаю прогроматор отказал пока его починил. Сегодня попробую. По моему напутано у меня с прерывание по таймеру нулевому кода его задействую то лажа идет попробую без него посмотреть.
|
|
|
|
|
Dec 26 2007, 14:09
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 2-04-07
Пользователь №: 26 711

|
Здравствуйте. Александр моей целью не было каго то аскобить или выразить не уважение своим кодом. А совсем другое. Я писал почему написал такой код. Прошу прощение за такое написательство постораюсь всё исправить. Посмотрел несколько примеров как пишиться на асме . Разобраться пока трудновато без поддержки и без советов. повторюсь свой код программы исправлю. Александр просьба вот какая. Как бы вы написали вот этот кусок моей программы на асме ? Если не трудно с подробными коментариями . По вашему примеру буду переделывать.
ldi r16,0b10000110 ;установка режима АЦП out $06,r16 ldi r17,0b11000000 out $07,r17 ;установка 1 канала sbi $06,6 ;получение значене 1 канала c1:sbis $06,4 rjmp c1 in r27,$04 ;запись значения напряжения 1 фазы in r28,$05 Или какой другой кусок.
По совету участника abc . Оставил передачу и умножение всё зациклил (умножение данных и преобразование в десетичный) проц работает делает несколько преобразовании в ресет уходит.
|
|
|
|
|
Dec 26 2007, 19:42
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Давайте попробуем ещё раз. Придерживайтесь следующих советов. 1) Используйте для всего мнемонические имена. а) Поименуйте регистры б) Поименуйте ячейки памяти в) Поименуйте порты ввода/вывода 2) Используйте коментарии везде где это возможно. ( не надо писать "сложить r14 и r15" это и так видно. Описывайте смысл того, что вы делаете) приведу пример моего написания В начале идёт подробное описание проекта с указанием версии и распиновки сигналов. Код ;**************************************************************** ;* * ;* Приборный щиток для трактора "Беларусь". * ;* Версия 1.16. * ;* * ;* На шаговых двигателях. Шесть приборов. * ;* Без использования внешних регистров. * ;* Цифровая фильтрация входных данных. * ;* * ;* * ;* PC2 - ADC2 - Температура охладителя. * ;* 3 - ADC3 - Давление масла в двигателе. * ;* 4 - ADC4 - Давление воздуха в пневмосистеме. * ;* 5 - ADC5 - Давление масла в КПП. * ;* 6 - ADC6 - Уровень топлива. * ;* 7 - ADC7 - Напряжение. * ;* * ;* * ;* Двигатель MS1. * ;* PB1 - Общий провод обмоток (-). * ;* PB0 - Провод обмотоки 1 (1+). * ;* PB2 - Провод обмотоки 2 (2+). * ...... Далее объявление имён портов и констант Код .equ SCL = pb5; Для I2C (Двигатель 5) .equ SDA = pb4; Для I2C (Двигатель 5)
.equ Fclk = 8000; Частота микрокотроллера 8МГц .equ Tclk = 125; Период микрокотроллера 125нс Далее объявление регистров (обратите внимание на объявление регистра флагов r15 и рабочие регистры wl,wh. Рабочие регистры не имею специального предназначения и используются для промежуточного хранения. Я даю всегда такие наименования из проекта в проект. Поэтому в тексте сразу чётко вижу, что данный регистр - рабочий (work). Я его могу изменить во всём проекте изменив только одну строчку. Код .def Faz0 = r8; Фаза в которой находится двигатель 0 .def Faz1 = r9; Фаза в которой находится двигатель 1 .... .def bitp = r15; .equ bendc = 0 ; Конец расчётам в прерывании .equ bwdr = 1 ; Сброс от WatchDog-а .equ boff = 2 ; Возврат по провалу питания .... .def wl = r24 .def wh = r25 Объявление памяти Код .dseg Nint: .byte 1 ; Счётчик прерываний speed: .byte 1 ; скорость движения стрелки ... Далее у меня идут вектора, подпрограммы и прерывания. ну например подпрограммы Код ;======================================================================== ; Инициализация вторичных буферов произвольной длины. ;------------------------------------------------------------------------ ; Входные регистры: wl - номер буфера, Y - адрес буфера ; Выходные регистры: Y - адрес следующего буфера ; Портятся регистры: wh, wil, wih, Zl, Zh, Xl, Xh, r0, r1 ; Занято стэка : -
bufinit: ldi Xh,0 mov Xl,wl ; номер канала в Xl lsl Xl ; умножить на 512 ldi Zl,low(TabStrel*2); Загрузить адрес таблицы пересчёта ldi Zh,high(TabStrel*2) add Zh,Xl ; найти начало таблицы данных
lpm wh,Z tst wh breq bufinit0 ldi wh,$ff ; В начале обрыв !!! .... Приведу пример инициализации примерно аналогичной вашей Код .if chip == 88 .equ kadcsra = exp2(aden)+exp2(adsc)+exp2(adate)+exp2(adps1)+exp2(adps2) .else .equ kadcsra = exp2(aden)+exp2(adsc)+exp2(adfr)+exp2(adps1)+exp2(adps2) .endif ; Для внутреннего АЦП ;.equ kadmux = exp2(refs1)+exp2(refs0)+exp2(adlar) ; Для внешнего АЦП .equ kadmux = exp2(adlar)
ldi chan,0 ldi wl,kadcsra+exp2(adif) .if chip == 88 sts adcsra,wl; сбросить флаг завершения преобразования .else out adcsr,wl; сбросить флаг завершения преобразования .endif mov wl,chan subi wl,-2 ; начать с канала 2 ori wl,kadmux .if chip == 88 sts admux,wpl; включить новый канал .else out admux,wpl; включить новый канал .endif Вы выработаете свой стиль, но вы должны сразу видеть что именно происходит. Как понятнее скажите? Или так ldi r16,0b10000110 ;установка режима АЦП out $06,r16 Или так, к примеру? ldi wl, (ADEN<<1)+(ADPS1<<1)+(ADPS2<<1) out ADCSR,wl sbis $06,4 или sbis ADCSR,ADIF lds r16,$64 sts $74,r16 или так? .equ lenbuf = $10 ... .dseg InBuf: .byte lenbuf OutBuf: .byte lenbuf .... lds wl,InBuf sts OutBuf,wl
|
|
|
|
|
Dec 29 2007, 08:24
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 2-04-07
Пользователь №: 26 711

|
Здравствуйте. Первое большое спасибо за ответ . Разбираться буду и учиться. Второе Поздравляю всех с новым годом
|
|
|
|
|
Jan 6 2008, 15:08
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 2-04-07
Пользователь №: 26 711

|
Здравствуйте. Александр я и так почти везде использовал мнемонические имена. Регистры я не переменовал так как для каждой подпрограммы использую свои (описаны выше сейчас всё переименовал кроме ячеек памяти). Коментарии и так где можно написал и подробно если чтол то не понятно могу словестно описать как и что каждая подпрограмма делает. Что где в программе происходит я сам понимаю (я же её написал) Свами согласен так
ldi wl, (ADEN<<1)+(ADPS1<<1)+(ADPS2<<1) out ADCSR,wl понятнее но у меня выдаёт ошибку при таком написании (в документации не нашёл где у меня ошибка) пишит E:\AVR\ATmega8V2\sav01_v1.asm(108): error: Undefined symbol: ADEN E:\AVR\ATmega8V2\sav01_v1.asm(658): No EEPROM data, deleting E:\AVR\ATmega8V2\sav01_v1.eep не знаю как индифицировать. Просьба подсказать? Посмотреть не могу не где пока программу стал переделывать 30 декабря комп накрылся Не везуха. щас праздники отремонтировать ни как запчасть нужна. Ну эта моя проблема.
|
|
|
|
|
Jan 6 2008, 16:15
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Компилятор вам сообщает, что он не знает такого имени ADEN. Надо понимать, что компилятор по умолчанию вообще ни чего не знает. Никаких имён. Имена либо объявляются заранее, либо подключаются с помощью директивы #include из заранее подготовленного файла. Такие файлы поставляются вместе с AvrStudio. Например Код .include "8515def.inc" . Как понятно из примера здесь подключен файл определений имён для микросхемы at90s8515. Сам файл можно найти и просмотреть. Там всё совершенно понятно. Если, к примеру, у вас какая то переменная отсутствует, то можно просмотреть такой файл и вычислить в чём загвоздка. Поймите, мы вам не навязываем какие-то надуманные правила. Это вам существенно облегчит жизнь. Особенно при программировании на ассемблере. Приведу пример. Например у вас есть линия управления COM портом "CTS". Вы объявляете в начале файла Код .equ CTS = pd7; Готовность к передаче модема .equ PortCTS = portd .equ DdrCTS = ddrd И далее работаете с ним по всему тексту. Например Код sbi DdrCTS,CTS ; Готовность на вывод ..... sbi PortCTS,CTS ; Установить готовность ..... cbi PortCTS,CTS ; снять готовность ...... Какие преимущества? 1) вы сразу видите, что вы в данном месте делаете 2) вы однозначно избежите такой распространнённой ошибки как "cbi portd,pb7" 3) при изменении схемы и платы либо при переносе программы на другой камень вам не придётся выискивать все места связанные с тем или иным портом по всему тексту программы. Вам просто придётся внести изменения только в объявления переменной По поводу имён. 1) Допускается (и я, к примеру использую) назначение нескольких имён одному и тому же регистру. Наложение. Правда компилятор выдаёт предупреждение об этом. 2) Если данный регистр используется как рабочий (то есть не имеет определённого предназначения), то его лучше так и обозначить, чтобы это было сразу видно. Обычно для этого используют "w" (сокращение от "work"). В некоторых МК такие регистры есть. Либо его модификации. Например wl, wh (work low, work high) или w0,w1,w2,w3. Можно использовать любую вам удобную мнемонику. Не надо писать r16,r17. Регистра 32. Если программа хотябы средняя, то очень скоро вы абсолютно запутаетесь что это за регистры, какие используются в том или ином месте, а какие можно использовать. До всего этого вы и сами дойдёте, только сначала понабиваете шишек.
|
|
|
|
|
Jan 9 2008, 03:37
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 2-04-07
Пользователь №: 26 711

|
Привет всем. Я не говорю что вы навязываете. Просто возмущает в конфе агрессивность к новичкам (в часности ко мне). Я готов вас внимательно слушать . Вечером сегодня посмотрю обязательно этот фаил. Я эту переменую пробовал обьявить как остальные , в начале программы, не вышло. Сегодня попробую исправить. А шишки готов набивать Александр пока я исправляю кракозябы я паралельно всё же пытаюсь заставить проц работать . Вопрос (я уже писал выше какие монипуляции проделал) из за чего в ресет уходит проц какие причины могут быть, так из опыта ? (напоминаю прога в имуляторе работает как надо) Уже всё по отключал. оставил настроики ( прога PESET вывод сигнала сброс считывание с ацп 0и 1 каналов их перемножаю и вывод FORM программа ) . Происходит следуещее забивает ячеики памяти 111111 где то 20 чиклов проходит (снимаю по комп порту 121111) потом опять все единицы. Тоеть ыходит в ресет и опять записывает все 1
|
|
|
|
|
Jan 9 2008, 06:06
|

Местный
  
Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836

|
Цитата(SasaVitebsk @ Jan 6 2008, 19:15)  ... По поводу имён. 1) Допускается (и я, к примеру использую) назначение нескольких имён одному и тому же регистру. Наложение. Правда компилятор выдаёт предупреждение об этом. ... Поделитесь пожалуйста опытом использования присвоения нескольких имён одному и тому же регистру. Где это может использоваться? Наверное это может добавить путаницу в программе? Возможно для удобства переноса на другой микроконтроллер? Заранее спасибо за разъяснения. зы: Код ldi wl, (ADEN<<1)+(ADPS1<<1)+(ADPS2<<1) Я делаю так: Код ldi wl,(1<<ADEN)|(1<<ADPS1)|(1<<ADPS2)
Сообщение отредактировал adc - Jan 9 2008, 06:08
--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
|
|
|
|
|
Jan 9 2008, 11:09
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(adc @ Jan 9 2008, 10:06)  Поделитесь пожалуйста опытом использования присвоения нескольких имён одному и тому же регистру. Где это может использоваться? Наверное это может добавить путаницу в программе? Возможно для удобства переноса на другой микроконтроллер? Заранее спасибо за разъяснения. зы: Код ldi wl, (ADEN<<1)+(ADPS1<<1)+(ADPS2<<1) Я делаю так: Код ldi wl,(1<<ADEN)|(1<<ADPS1)|(1<<ADPS2) Ну естественно (1<<ADEN) или exp2(ADEN) для ASM ATMEL. Просто обписался. Любая вещь "может добавить путаницу в программе", а может и не добавить. Всё зависит от автора и программы. Живой пример - регистры X,Y,Z. Они уже переопределены. И вы можете обращаться к ним как Zh а можете как r31. Это вас путает? Я это делаю не для переноса. Ну например у вас микроконтроллер находится в двух устойчивых состояниях. ONLINE и OFFLINE. И прога построена так, что это два совершенно независимых участка. Тогда можно регистрам дать по два мнемонических имени для удобства работы. Естественно тем, которые полностью переназначаются в своём участке кода. И в каждом участке работать со "своим" регистром. Это очень удобно. Код .def sek1 = r21; декрементируется каждую секунду. .def nbod = r21; скорость обмена по COM порту (наложенный !!!) Очень удобное средство ассемблера - MACRO. Почему то ими не любят пользоваться. А я, например, очень страдал когда на ASM AVR начал писать. Там макроопределения очень слабенькие. Порой их ужасно не хватает. Потом слегка они добавили, но это тоже капля в море. Приведу пример использования: Код ;**************************************************************** ;* Команда LDI для регистровой пары. * ;****************************************************************
.macro ldix ; Два параметра "Имя регистровой пары" и "параметр".
ldi @0l,low(@1) ; загрузить младший регистр ldi @0h,high(@1); загрузить старший регистр .endm
;**************************************************************** ;* Команда MOV для регистровой пары. * ;****************************************************************
.macro movx ; Два параметра "Имя регистровой пары 1" и "Имя регистровой пары 2".
mov @0l,@1l ; переслать младший регистр mov @0h,@1h ; переслать старший регистр .endm
.def Wl = r16; регистр Work младший байт .def Wh = r17; регистр Work старший байт
.dseg Int_Cnt: .byte 2 ; счётчик
.cseg
movx X,W ... ldix W,1235 ... ldix X,Int_Cnt ... Я сейчас на Си пишу, и это ещё более стимулирует к продуманности написания программы. Как это не выглядит нелепо, но лучше потратить "день, а потом за час долететь".  Правильно написанная прога, потом вам сэкономит кучу времени. При отладке, при поиске ошибки, при заимствовании, при переносе. Постепенно у вас сложится свой стиль написания и вы так будете писать автоматически. Даже не задумываясь.
|
|
|
|
|
Jan 10 2008, 07:50
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 2-04-07
Пользователь №: 26 711

|
Здравствуйте. Переписал в такой вид ;описание переменных AD_CONVERTER .equ ADCSRA = $06 .equ ADMUX = $07 .equ ADCH = $05 .equ ADCL = $04
.equ ADIF = 4 .equ ADEN = 7 .equ ADPS2 = 2 .equ ADPS1 = 1
ldi r16,(1<<ADEN)|(1<<ADPS1)|(1<<ADPS2); 0b10000110 ;установка режимов АЦП ut ADCSRA,r16 Перестал ругатся всё пошло нормально. вот этот include "8515def.inc" фаилик нашёл где он посмотрел как описаны значения для 8 меги енто фаил m8def.inc вроде так понял. Все таки про ухода процессора в ресет ? И ещё вопрос как сделать , что бы проц остановился дальше программа не шла не циклилась как бы на одну команду, а дошла до определенного места остановилась и дальше пошла в том случае когда пришло прерывание внешнене например по ком порту ? Не знаю как подробнее ещё обьяснить .
|
|
|
|
|
Jan 10 2008, 12:01
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Вы немножко не поняли. Эти определения, которые вы написали, на самом деле не нужны. Они уже написаны за вас самой фирмой Atmel. К тому же без ошибок. Вам просто необходимо подключить соответствующий файл в свой проект! Ну например вы в проекте используете мегу8. Тогда первой строчкой проекта вы должны написать: .include "m8def.inc" И всё! Все регистры и биты данного микроконнтроллера, а также его распределение памяти, вектора и прочее - всё указано в данном файле и, соответственно, объявлено в вашем. Вам необходимо только объявить свои переменные и работать! Про уход процессора в резет. Причин может быть несколько сотен.  Но, учитывая ваш уровень, смею предположить что вы не проинициализировали стек. Или сделали это неверно. Обычное написание начала программы выглядит так(убрал комментарии, дабы уменьшить текст): Код .include "m8def.inc" ; объявили МК ... ; объявляем переменные и константы ... .cseg ; начинаем сегмент кода .org 0; с начала rjmp init ; Переходим на инициализацию
.org INT0addr ; Описываем вектор прерывания от INT0 (если есть) rjmp j_int0; Переходим к обработке прерывания INT0 ; Описываем все другие вектора прерывания, задействованные в программе .... init: ; метка начали инициализации программы ldi tmpl,low(RAMEND);инициализация стека out SPL,tmpl ldi tmpl,high(RAMEND) out SPH,tmpl ; Прочая инициализация оборудования .... main: ; главный цикл .... ; работа ... rjmp main
INT0addr:; метка обработки прерывания от INT0 ... ; обработка прерывания ... reti ; возврат из прерывания Ну а вообще неплохо бы теорию какую-нибудь почитать. Хотябы книжку какую по данной тематике. А то вы выполняете кучу глупой работы. То есть быстрый старт у вас получается не очень быстрым.
|
|
|
|
|
Jan 14 2008, 03:58
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 2-04-07
Пользователь №: 26 711

|
Здравствуйте. Документация есть (на английском правда) скачал ещё книжку Евстифеева 2007. Понял. что нужно подключить (просто прошлыи раз писали, есть такая волшебная строчка, а что за строчка ........). В программе исправил. Можно по подробнее почему старт не быстрый и какую глупую работу делаю (что бы в дальнейшем не делать).
Про стек вопрос зделал его вот так
ldi r16,$DF ;инициализация стека out SPL,r16 Подсказал один человек (нужно записать ячейку памяти в SPL где будет PointStack ). Посмотрел по документации вроде так . Не могли бы подсказать ?
Программу переписал . Осталось свои переменные описать.
Вопрос вот ещё какой (глупый наверно ) Как правильно свои переменые описать например constEEPROM = 0b00111111. Пробовал как регистры, ругаеться .
|
|
|
|
|
Jan 14 2008, 05:07
|

Местный
  
Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836

|
Цитата(Sholkin @ Jan 14 2008, 06:58)  Про стек вопрос зделал его вот так ldi r16,$DF ;инициализация стека out SPL,r16 Подсказал один человек (нужно записать ячейку памяти в SPL где будет PointStack ). Посмотрел по документации вроде так . Не могли бы подсказать ? Вам же уже все разжевали, осталось проглотить...  См. пост выше. Цитата(Sholkin @ Jan 14 2008, 06:58)  Вопрос вот ещё какой (глупый наверно ) Как правильно свои переменые описать например constEEPROM = 0b00111111. Вот: Код .equ constEEPROM = 0b00111111 зы: Обращайте Ваше драгоценное внимание на посты.. Даже шаблон Вам уже написали.. зы2: И еще полезно почитать хелп авр студии: menu/help/avr tools user guide.. далее AVR Assembler/Directives здесь ответ про волшебную строчку.
--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
|
|
|
|
|
Jan 14 2008, 06:16
|

Местный
  
Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836

|
Цитата(Sholkin @ Jan 14 2008, 06:58)  Как правильно свои переменые описать например constEEPROM = 0b00111111. Уточню: Так описываются константы: Код .equ constEEPROM = 0b00111111 так переменные в озу: Код //Начало сегмента данных озу .dseg constEEPROM: .byte 1 //зарезирвируем один байт в озу //Начало сегмента кода в Flash .cseg ....
--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
|
|
|
|
|
Jan 14 2008, 07:24
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 2-04-07
Пользователь №: 26 711

|
Пробовал так .equ constEEPROM = 0b00111111 Ошибку выдаёт потому и спросил . Вечером попробую ещё раз может накасячил чего. Про стек нашёл
init: ; метка начали инициализации программы ldi tmpl,low(RAMEND);инициализация стека out SPL,tmpl ldi tmpl,high(RAMEND) out SPH,tmpl что такое RAMEND ? Под рукой нет доки сейчас на работе нахожусь не дома. Предпологаю адрес ячейки (самая последняя) Дома ещё по разбираюсь.
adc спасибо за ответ ?
|
|
|
|
|
Jan 14 2008, 08:05
|

Местный
  
Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836

|
Цитата(Sholkin @ Jan 14 2008, 10:24)  Пробовал так .equ constEEPROM = 0b00111111 Ошибку выдаёт потому и спросил . эта строка должна быть вне кода т.е. до директивы .dseg или .сseg. Порробуйте обозвать по другому если не получится. Цитата(Sholkin @ Jan 14 2008, 10:24)  что такое RAMEND ? Это уже определенная константа (значение начала стека .equ RAMEND =$45F). Ее определение как раз и находится в файле .include "m8def.inc" Его можно найти здесь"C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\m8def.inc"
--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
|
|
|
|
|
Jan 17 2008, 04:31
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 2-04-07
Пользователь №: 26 711

|
Здравствуйте . Где эта строчка я нашёл (выше писал). Я понимаю что всё разжевали , но я хочу разобраться, а не тупо списал и всё . Ни когда не списывал и списывать ...... . Лучше выглядеть тупым спросить и разобраться чем списать просто. Просидел 3 вечера переписал программу . Посмотрите так не так , не так, то что не правильно. Периписал не всю , основной код как вы сказали . Просто так нужно или нет ? Сразу оговорюсь там два варианта с подлючением волшебной строчки и без. Когда не знал, что подключить надо так писал ну и чтоб разобраться. Некоторые регистры я не обозвал , так мне при тросировке в окно с регистрами смотреть удобнее (там то нет их названий, да и они просто переменные для определённой подпрограммы). Ещё почему то в первом варианте подключаю волшебную строчку ругаеться во втором естественно всё идёт. что то фаил не прошёл. Подключил наконец.
Прикрепленные файлы
sav01_v1.txt ( 20.21 килобайт )
Кол-во скачиваний: 94
sav.txt ( 18.86 килобайт )
Кол-во скачиваний: 98
|
|
|
|
|
Jan 17 2008, 06:10
|

Местный
  
Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836

|
Цитата(Sholkin @ Jan 17 2008, 07:31)  Сразу оговорюсь там два варианта с подлючением волшебной строчки и без. Когда не знал, что подключить надо так писал ну и чтоб разобраться. Некоторые регистры я не обозвал , так мне при тросировке в окно с регистрами смотреть удобнее (там то нет их названий, да и они просто переменные для определённой подпрограммы).  Есть! просто надо забить... Нажимаете во время отладки кнопу "Toggle Watch Windows" и в первом поле введите название регистра (вами определенного в программе). И все будет показывать! Цитата(Sholkin @ Jan 17 2008, 07:31)  Ещё почему то в первом варианте подключаю волшебную строчку ругаеться во втором естественно всё идёт. что то фаил не прошёл. В первом случае Вы уже определили константы которые находятся в "волшебном" файле, по этому он заругался..
--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
|
|
|
|
|
Jan 21 2008, 03:37
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 2-04-07
Пользователь №: 26 711

|
Здрасте. Что то не кто не ответил . Сейчас то у меня правильно пишиться прога ? или нет ? Запрогромировал проц с новым вариантом, ещё хуже стало . К старой ошибки добавилась ещё. Стало передоваться только 5 цифр . А если ингорировать ацп (не обращаться к нему) вообще одна цифра и то не известно какая . Вообще не знаю, что делать. Два вечера убил толку..........
|
|
|
|
|
Jan 21 2008, 17:53
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(Sholkin @ Jan 21 2008, 07:37)  Здрасте. Что то не кто не ответил . Сейчас то у меня правильно пишиться прога ? или нет ? Привет. Сейчас более-менее прилично. Времени не вагон, поэтому задержки с ответом и замечания будут поступательные. По мере прочтения документа. Сначала некоторые замечания по оформлению Лучше всего все вектора объявлять ч/з org. Иначе ОБЯЗАТЕЛЬНО наступите на грабли. Теперь по существу. Прерывание от таймера для измерения АЦП реализовано неправильно. Точнее так не делают. Вообще все прерывания делают найкрадчайшими. У вас в самом прерывании будет задержка на ответ от измерения АЦП. Это значительная величина. И её элементарно можно избежать. Для того, чтобы её избежать делается след. образом. 1) По входу в прерывание сразу читается значение. 2) Потом переключается канал 3) перестартовывается и выходят. Таким образом к следующему прерыванию таймера АЦП гарантировано завершило преобразование. Если одного прерывания недостаточно, то делают счётчик прерываний. Буду читать дальше Да ещё одно замечание. Выключи свой wdt. ты должен отладить прогу так, чтобы работала как часы без wdt. wdt это сложная и отдельная песня. Правильная и добросовестная его настройка занимает половину времени от написания проекта.  Плюс надо понимание что и зачем и как. Иначе это абсолютно не даёт пользы а может даже наносить вред тем, что будет скрывать от тебя твои же собственные ошибки PS: Так дело не пойдёт. В прерывании start я вообще не нашёл reti. И величина её запредельная. Тебе придётся полностью изменить логику работы программы. Опиши алгоритм хотябы общими словами
|
|
|
|
|
Jan 22 2008, 03:26
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 2-04-07
Пользователь №: 26 711

|
Александр спасибо за помощь . Всё , что вы сказали проанализирую сегодня вечером . Могу предоставить алгаритм как блок схему (сначало перед написанием составил ) и подробно описать, как задуманно, что бы работало. Ещё раз спасибо за помощь.
Выключи свой wdt.
Я его сбрасывал потому, что не правильно настроет был и проц постоянно сбрасывался на начале ..... Исправлюсь.
|
|
|
|
|
Jan 22 2008, 06:26
|

Местный
  
Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836

|
Ну что вы все фанатично записываете адреса регистров значениями? Код ldi r23,0b00000000;установка режима порт С out $14,r23 ldi r23,0b11111111;установка режима порт B out $17,r23 ldi r23,0b00010011;установка режима порт D out $11,r23 ldi r16,0b11110010 ldi r17,0b00001101 out $11,r16;установка регистра DDR_D out $12,r17;установка регистра PORT_D Удобнее/читабельней же так: Код ldi tmp,0b00000000;установка режима порт С out ddrc,tmp ldi tmp,0b11111111;установка режима порт B out ddrb,tmp ldi tmp,0b11110010;установка режима порт D out ddrd,tmp ldi tmp,0b00001101 out portd,tmp;установка регистра PORT_D По wdt советую установить сброс только в одном месте, и лучше в прерывании от таймера! Причем ,естественно, время срабатывания wdt должно быть больше периода срабатывания таймера. Так вы гарантированно защитите защитите свою программу от таких ошибок как зацикливание программы в основном цикле при запрещенных прерываниях, случайный сброс настроек/отключение таймера и т.п.
--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
|
|
|
|
|
Jan 29 2008, 03:48
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 2-04-07
Пользователь №: 26 711

|
Здравствуйте. Исправил всё как вы мне подсказали. 1 Векторы объявил 2 Про порты свою фанатичность убрал. 3 Сброс вачдока оставил только после прерывания по таймеру. Немного переделал программу reset (сделал по шаблону как у вас Александр. Цикл вывода сигнала сброс переместил в подпрограмму reset)/ Не понял как правильно реализовать прерывания по таймеру . Мне нужно забрать по всем 6 каналам значения через определённый промижуток времени (это основное в программе). Я понял вы мне советуете По прерыванию от таймера сначало взять данные, потом переопредилить канал и выйти . Следующее прерывание по таймеру я уже точно заберу со второго и преобразования точно завершаться (что бы впустую не ждать пока преобразует АЦП). Пока не допёр . Попробую подумать сам сегодня ещё раз. Привожу описание и прогу Программа reset ;программа перезагрузки и установки режимов. После по rjmp aa вы выдаем импульсы (проц работает) на 4 пин порта D.После переполнения нуль таймера получаем с помощью ацп с 0и 1 каналов значение перемножаем их и ложим в накопитель старший или младший . Если старший разряд накопителя (младшего или старшего) больше константы младшего или старшего накопителя, в форме дисятичного значения прибавляем 1 (программа rcall form) остальные программы вспомогательные. С помощью программы ;программа приёма номера счётчика / передачи данный по USART по компьютеру смотрим десятичное значение. Забыл исправить ошибку. PS: Так дело не пойдёт. В прерывании start я вообще не нашёл reti. И величина её запредельная. Тебе придётся полностью изменить логику работы программы. Опиши алгоритм хотябы общими словами Сейчас заметил ёщё хотел исправить забыл. (может в ней то и собака зарыта)
Прикрепленные файлы
sav.txt ( 18.73 килобайт )
Кол-во скачиваний: 61
|
|
|
|
|
Jan 29 2008, 22:44
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Прерывание - это уникальное средство. Его надо понять. И понять правильно. Прерывание вызывается из любого места основной проги. В начале прерывания (средствами компилятора) осуществляется сохранение состояния процессора, а по завершению прерывания восстановление состояния. Таким образом основная программа "как бы не замечает" работы прерывания и может быть написана как логически завершённая задача (и это правильный подход). С другой стороны прерывание - тоже является логически законченой процедурой. Так сказать фоновым процессом. Если у вас несколько прерываний - то получается несколько фоновых задач. Возможно также построение, когда в голове имеется несколько независимых задач, а в прерывании осуществляется переключение между ними. Тогда говорят об ОС. Из этого видно, что само прерывание в той или иной степени "как бы распаралеливает задачи на несколько". Это надо понять. И найболее правильным подходом является общение между этими независимыми программами через данные. Тогда ваши задачи будут максимально независимы, а значит их будет легко отлаживать и они приобретут прозрачность построения. Ну например. Фоновая задача в прерывании по таймеру читает значение АЦП и ложит их в соответствующие глобальные переменные. После того,как данные обновлены она выставляет флаг завершения измерения. Голова ждёт флага завершения измерения и обрабатывает данные из глобальных переменных после чего сбрасывает флаг. Если через пол года вы измените измерение каналов АЦП на измерение частотных датчиков, к примеру, то вам необходимо будет только переписать прерывание. (Это как пример) Теперь надо понимать ещё один момент. Во время когда работает прерывание (берём общий случай и берём AVR для простоты картины) останавливается работа головы, а также задерживаются остальные прерывания. Это, естественно, не есть хорошо. К примеру если за время работы прерывания по UART придут 3 символа, то один будет потерян. Более того, если вы вызываете прерывание от таймера скажем каждые 100 мкс, а обработка этого прерывания будет занимать более 100 мкс, то очевидно, что часть прерываний будет потеряна. Короче, из этого проистекает, что прерывания должны быть максимально короткими. Этого добиваются разными способами. Например вам надо читать 6 каналов АЦП. Найболее частым решением будет следующее: 1) За одно прерывание читаем только 1 канал. 2) Процедура следующая: читаем канал - переключаем канал на следующий - выходим. Прога будет выглядеть примерно так. (Это конечно от балды выдумано) Код #pragma vector=TIMER1_OVF_vect __interrupt static void pvPWMEnd(void) { // Перезапуск таймера на той же частоте TCNT1=-KPWM; // Период следования 16МГц/3200 = 5кГц Adc[TekChan++]=ADCH; // Прочитать значение АЦП if(TekChan==MAXADC) { TekChan=0; // начать сначала Flag.fADCConv=1; // Результат измерений получен } ADMUX=KADMUX | TekChan; // Выбрать канал ADCSRA =KADCSRA; // Начать отсчёт заново } Ой простите. На асме - так Код Tim0_Ovf: push wl in wl,sreg push wl push Xl push Xh
ldi wl, -KPWM out TCNT0,wl
ldi Xl, low(MemAdc) ldi Xh, high(MemAdc) add Xl, TekChan ldi wl, 0 adc Xh, wl
in wl, ADCH st X, wl
inc TekChan
ldi wl, MAXADC cp TekChan, wl brne Tim0_Ovf_0 clr TekChan sbr Flag, exp2(fADCConv) Tim0_Ovf_0: ldi wl, KADMUX or wl, TekChan out ADMUX,wl ldi wl, KADCSRA out ADCSRA, wl
pop Xh pop Xl pop wl out sreg,wl pop wl reti Простите делал на скорую руку. Прямо тут. Естественно не самым оптимальным образом. Всё зависит от проекта. От распределения памяти и свободных регистров. Всё это естественно можно ужать.
|
|
|
|
|
Feb 3 2008, 14:03
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 2-04-07
Пользователь №: 26 711

|
Спасибо за ответ. До вашего ответа я немного набрасал как оптимально сделать прерывание . Проанализирую с вашим вариантом.
|
|
|
|
|
Feb 12 2008, 04:08
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 2-04-07
Пользователь №: 26 711

|
Здравствуйте. Переделал прерывание от таймера следующим оброзом. В программе инициализации (reset)запускаю ацп выставляю 0 канал . Когда приходит прерывание по таймеру (start) смотрю флаг что преобразование закончилось считываю значение . Потом смотрю если это был 1 или 3 или 5 канал то на программу переумножения выставляю следующий и выхожу. Если 5 канал то выставляю 0 канал и выхожу. Получилось много условий . можно запутаться . Оставил предыдущий вариант (линейный ) тупо выстовляю канал жду флаг равершения и тд. Оставил потому что как бы это его оснавная программа и он только и ей должен заниматься.
но дело в том, я её зашил в проц . Он вообще не работает ни как .
первый вариан (самый первый хоть как то работал ) второй который без строчки волшебной изменялась только первый разряд до 2 и всё сначало. Чего делать ............. весь мозг сломал. Я вот подумал может он сбрасываеться из за того что преобразование дольше идёт чем настроен таймер или ещё что ....................................
Сообщение отредактировал Sholkin - Feb 12 2008, 04:10
|
|
|
|
|
Feb 20 2008, 05:07
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 2-04-07
Пользователь №: 26 711

|
Привет всем. Что то уже больше недели смотрю тема моя опускаеться ниже ниже. И Александр с adc перестал мне помогать. Вроде сейчас то написано более менее. Ребята помогайте . А то прогу переписал, типа научился писать всё хоре. Хочеться до конца довести а не бросить .
|
|
|
|
|
Feb 26 2008, 05:16
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 2-04-07
Пользователь №: 26 711

|
Ребята помогите пожалуйста ? Код программы есть . Что не так написано? Или напишите ,что не будете смотреть . Я тогда отстану. Буду что нибудь дальше думать. Или в другую конференцию обращусь.
|
|
|
|
|
Feb 26 2008, 07:35
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 2-04-07
Пользователь №: 26 711

|
Да дело то в том , что в имуляторе работает , я бы не кричал зря. То что мне советовали и как переделать я сделал (кроме забора данных с ацп оставил ленейно в лоб. Хочу потом массивом сделать как предлогали раньше , но немного не так . Но что бы зделать более грамотно надо хоть это заставить работать). Она не работает в проце . Я не знаю как выловить ошибку. Сейчас она после переделки вообще не работает, ни как. У меня опыта не хватает, как что сейчас предпринять не знаю. Имулятор ошибки не показывает. Индикатор на компе ни каких данных не пренимает . Диод не горит. Как будто он мёртвый . Зашиваю старый вариант . Он работает не так как надо, но проц чего то делает. А новый вариант болт.
|
|
|
|
|
Feb 28 2008, 06:35
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 2-04-07
Пользователь №: 26 711

|
Здравствуйте. Во вторник с человеком поговорил . По его мнению ошибку нужно искать в прерывании по таймеру. Вчера посидел примерно набросал програмку прерывания по таймеру . Дело в том щас не могу отлаживать программу из за того , что при зашивании в проц, она не работает вообще. Помогите хотя бы в этом . Программу периписал по этому шаблону , который предоставил Александр include "m8def.inc" ; объявили МК ... ; объявляем переменные и константы ... .cseg ; начинаем сегмент кода .org 0; с начала rjmp init ; Переходим на инициализацию .org INT0addr ; Описываем вектор прерывания от INT0 (если есть) rjmp j_int0; Переходим к обработке прерывания INT0 ; Описываем все другие вектора прерывания, задействованные в программе .... init: ; метка начали инициализации программы ldi tmpl,low(RAMEND);инициализация стека out SPL,tmpl ldi tmpl,high(RAMEND) out SPH,tmpl ; Прочая инициализация оборудования .... main: ; главный цикл .... ; работа ... rjmp main INT0addr:; метка обработки прерывания от INT0 ... ; обработка прерывания ... reti ; возврат из прерывания Может я его не правильно понял. Старый вариант в проце работает. Старый и новый предоставляю . Там только переместилась подпрограмма антисброса . Я её запихал в программу reset . Выши было сказано, что величина запредельная jamp и старт не быстрый я и переделал. Где 01_v1 старый вариант
Прикрепленные файлы
sav01_v1.txt ( 15.1 килобайт )
Кол-во скачиваний: 77
sav.txt ( 18.75 килобайт )
Кол-во скачиваний: 149
|
|
|
|
|
Mar 3 2008, 10:10
|
Участник

Группа: Новичок
Сообщений: 41
Регистрация: 2-04-07
Пользователь №: 26 711

|
sav.txt ( 18.94 килобайт )
Кол-во скачиваний: 240Частично заставил работать. Я вот только понять не могу . Алгоритм одинаково написан. А один работает так другой вообще не так. Вобщем посидел в пятницу суботу. Вот чего родил. vet вам спасибо за ответ не надеялся , что кто нибудь ответит, поэтому воял до вашего поста. Регистры я не сохроняю, потому что для каждой программы свои. Вот с флагами сказали не обязательно. Но послушаюсь вашего совета , мне и раньше это говорили . Просто один одно говорит другой другое. Раньше советовали Александр и abc Сейчас они пропали А каждый по своему советует. Некоторые советы я просто не понимаю , а человека рядом нет, всё труба у кого разьяснение получить. по существу. Отключил вачдок . Не знаю правильно или нет . Вопрос по нему . Писал прогу записи в еепром. Я его сначало задействовал , потом убрал команду . Осталось всё по прежнему . Потом я его стал сбрасывать. Всё пошло. У меня вопрос как его заглушить ? Он что, если его не настроить он по умолчанию какие то настройки имеет ? Сохронять флаги после прерывания сразу первой строчкой в программе прерывания ? разрешаете прерывания внутри прерываний - неоправданное усложнение Частично убрал. свой код прилогаю. Замыкалось всё на чтении. Когда убрал чтение и вочдок диод стал гореть очень очень тускло (зажигает программа сброса чтоб проц не завис). Когда частично перенёс подпрограммы в основную из подпрограммы START стал гореть ярко. Тоже не понятно. Сейчас после модификации программы свето диод горит . Нет передачи по ком порту . Так и не понял почему. отключил таймер пока. Вопросы Как правильно записать флаги (наверно в память в начале подпрограммы потом обратно в конце)? Что значит метки на ячейки памяти и как правильно? Как отключить вачдок ? Сейчас работаю с этим вариантом.
Сообщение отредактировал Sholkin - Mar 3 2008, 10:14
|
|
|
|
|
Mar 3 2008, 19:31
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(Sholkin @ Mar 3 2008, 14:10)  Просто один одно говорит другой другое. Раньше советовали Александр и abc Сейчас они пропали А каждый по своему советует. Посмотрите внимательно. Вот советы (совершенно правильные) vet, которые он даёт в 41 (!!!) посте от рождества темы. Итак. Цитата не сохраняете регистры и флаги, используемые в прерываниях - программа почти гарантированно не будет работать. Посмотрите пост 2(!!!) GM и 33 мой. Ну просто один в один!!! Цитата включили ватчдог - зачем он вам во время отладки? лишняя сложность и потенциальный источник трудноотлавливаемых сбросов. Посмотрите пост 29 мой. Слово в слово. Два разных человека. Цитата циклы ожидания в прерываниях, запись в еепром в прерывании - плохая практика. прерывание должно выполняться как можно быстрее, все медленные процессы должны выполняться в программе. Почитайте внимательно и вдумчиво мой пост 29 Цитата разрешаете прерывания внутри прерываний - неоправданное усложнение. Вложенные прерывания - это нормальный вариант для меня. Но для вас это просто смерть. Возможно это тоже скрывает ошибку учитывая размер прерывания, который вы раздули!!! Цитата стек инициализировали с ошибкой. И это после поста 19, 21 от adc и моего примера!!! Я в шоке! Цитата из прерываний возвращаться нужно командой reti, а не ret. Это после моего поста 29!!! перечитайте. Слово в слово. Более 10 постов!!!! Вы их вообще читаете??? Цитата касательно оформления - продолжаете записывать адреса ячеек памяти цифрами, вместо меток. при обозначении регистров смешиваете Rxx и идентификаторы. всё это усложняет понимание и отладку. Про это просто промолчу. Несколько моих постов с примерами и вариантами оформления. Прерывание я просто написал. Посмотрите. Там сохранение регистров, их восстановление (включая SREG) и reti. Так как вам ещё написать, чтобы дошло? И стоит ли вообще это делать? Мне кажется, в мире есть сотни разных профессий. Займитесь другим делом.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|