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

 
 
3 страниц V  < 1 2 3 >  
Closed TopicStart new topic
> Пишется лажа в память
adc
сообщение Jan 9 2008, 06:06
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 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


--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 9 2008, 11:09
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 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. Просто обписался. crying.gif

Любая вещь "может добавить путаницу в программе", а может и не добавить. Всё зависит от автора и программы. Живой пример - регистры 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
...


Я сейчас на Си пишу, и это ещё более стимулирует к продуманности написания программы. Как это не выглядит нелепо, но лучше потратить "день, а потом за час долететь". smile.gif Правильно написанная прога, потом вам сэкономит кучу времени. При отладке, при поиске ошибки, при заимствовании, при переносе. Постепенно у вас сложится свой стиль написания и вы так будете писать автоматически. Даже не задумываясь.
Go to the top of the page
 
+Quote Post
Sholkin
сообщение Jan 10 2008, 07:50
Сообщение #18


Участник
*

Группа: Новичок
Сообщений: 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 вроде так понял.
Все таки про ухода процессора в ресет ?
И ещё вопрос как сделать , что бы проц остановился дальше программа не шла не циклилась как бы на одну команду, а дошла до определенного места остановилась и дальше пошла в том случае когда пришло прерывание внешнене например по ком порту ?
Не знаю как подробнее ещё обьяснить .
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 10 2008, 12:01
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Вы немножко не поняли. smile.gif
Эти определения, которые вы написали, на самом деле не нужны. Они уже написаны за вас самой фирмой Atmel. К тому же без ошибок. Вам просто необходимо подключить соответствующий файл в свой проект!

Ну например вы в проекте используете мегу8. Тогда первой строчкой проекта вы должны написать:
.include "m8def.inc"
И всё! Все регистры и биты данного микроконнтроллера, а также его распределение памяти, вектора и прочее - всё указано в данном файле и, соответственно, объявлено в вашем. Вам необходимо только объявить свои переменные и работать!

Про уход процессора в резет.
Причин может быть несколько сотен. smile.gif Но, учитывая ваш уровень, смею предположить что вы не проинициализировали стек. Или сделали это неверно. Обычное написание начала программы выглядит так(убрал комментарии, дабы уменьшить текст):
Код
.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  ; возврат из прерывания


Ну а вообще неплохо бы теорию какую-нибудь почитать. Хотябы книжку какую по данной тематике. А то вы выполняете кучу глупой работы. То есть быстрый старт у вас получается не очень быстрым. smile.gif
Go to the top of the page
 
+Quote Post
Sholkin
сообщение Jan 14 2008, 03:58
Сообщение #20


Участник
*

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



Здравствуйте.
Документация есть (на английском правда) скачал ещё книжку Евстифеева 2007.
Понял. что нужно подключить (просто прошлыи раз писали, есть такая волшебная строчка, а что за строчка ........).
В программе исправил.
Можно по подробнее почему старт не быстрый и какую глупую работу делаю (что бы в дальнейшем не делать).

Про стек вопрос
зделал его вот так

ldi r16,$DF ;инициализация стека
out SPL,r16
Подсказал один человек (нужно записать ячейку памяти в SPL где будет PointStack ). Посмотрел по документации вроде так . Не могли бы подсказать ?

Программу переписал . Осталось свои переменные описать.

Вопрос вот ещё какой (глупый наверно )
Как правильно свои переменые описать например constEEPROM = 0b00111111.
Пробовал как регистры, ругаеться .
Go to the top of the page
 
+Quote Post
adc
сообщение Jan 14 2008, 05:07
Сообщение #21


Местный
***

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



Цитата(Sholkin @ Jan 14 2008, 06:58) *
Про стек вопрос
зделал его вот так
ldi r16,$DF ;инициализация стека
out SPL,r16
Подсказал один человек (нужно записать ячейку памяти в SPL где будет PointStack ). Посмотрел по документации вроде так . Не могли бы подсказать ?

Вам же уже все разжевали, осталось проглотить... smile.gif См. пост выше.

Цитата(Sholkin @ Jan 14 2008, 06:58) *
Вопрос вот ещё какой (глупый наверно )
Как правильно свои переменые описать например constEEPROM = 0b00111111.

Вот:
Код
.equ constEEPROM = 0b00111111

зы: Обращайте Ваше драгоценное внимание на посты.. Даже шаблон Вам уже написали..
зы2: И еще полезно почитать хелп авр студии: menu/help/avr tools user guide.. далее AVR Assembler/Directives здесь ответ про волшебную строчку. cool.gif


--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
Go to the top of the page
 
+Quote Post
adc
сообщение Jan 14 2008, 06:16
Сообщение #22


Местный
***

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



Цитата(Sholkin @ Jan 14 2008, 06:58) *
Как правильно свои переменые описать например constEEPROM = 0b00111111.

Уточню:
Так описываются константы:
Код
.equ constEEPROM = 0b00111111

так переменные в озу:
Код
//Начало сегмента данных озу
.dseg
constEEPROM:        .byte 1        //зарезирвируем один байт в озу
//Начало сегмента кода в Flash
.cseg    
....


--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
Go to the top of the page
 
+Quote Post
Sholkin
сообщение Jan 14 2008, 07:24
Сообщение #23


Участник
*

Группа: Новичок
Сообщений: 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 спасибо за ответ ?
Go to the top of the page
 
+Quote Post
adc
сообщение Jan 14 2008, 08:05
Сообщение #24


Местный
***

Группа: Свой
Сообщений: 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"


--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
Go to the top of the page
 
+Quote Post
Sholkin
сообщение Jan 17 2008, 04:31
Сообщение #25


Участник
*

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



Здравствуйте .
Где эта строчка я нашёл (выше писал).
Я понимаю что всё разжевали , но я хочу разобраться, а не тупо списал и всё . Ни когда не списывал и списывать ...... . Лучше выглядеть тупым спросить и разобраться чем списать просто.

Просидел 3 вечера переписал программу . Посмотрите так не так , не так, то что не правильно.
Периписал не всю , основной код как вы сказали . Просто так нужно или нет ?

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

Ещё почему то в первом варианте подключаю волшебную строчку ругаеться во втором естественно всё идёт.

что то фаил не прошёл.
Подключил наконец.
Прикрепленные файлы
Прикрепленный файл  sav01_v1.txt ( 20.21 килобайт ) Кол-во скачиваний: 94
Прикрепленный файл  sav.txt ( 18.86 килобайт ) Кол-во скачиваний: 98
 
Go to the top of the page
 
+Quote Post
adc
сообщение Jan 17 2008, 06:10
Сообщение #26


Местный
***

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



Цитата(Sholkin @ Jan 17 2008, 07:31) *
Сразу оговорюсь там два варианта с подлючением волшебной строчки и без.
Когда не знал, что подключить надо так писал ну и чтоб разобраться.
Некоторые регистры я не обозвал , так мне при тросировке в окно с регистрами смотреть удобнее (там то нет их названий, да и они просто переменные для определённой подпрограммы).

smile.gif Есть! просто надо забить... Нажимаете во время отладки кнопу "Toggle Watch Windows" и в первом поле введите название регистра (вами определенного в программе). И все будет показывать!
Цитата(Sholkin @ Jan 17 2008, 07:31) *
Ещё почему то в первом варианте подключаю волшебную строчку ругаеться во втором естественно всё идёт.
что то фаил не прошёл.

В первом случае Вы уже определили константы которые находятся в "волшебном" файле, по этому он заругался.. smile.gif


--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
Go to the top of the page
 
+Quote Post
Sholkin
сообщение Jan 21 2008, 03:37
Сообщение #27


Участник
*

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



Здрасте.
Что то не кто не ответил . Сейчас то у меня правильно пишиться прога ? или нет ?
Запрогромировал проц с новым вариантом, ещё хуже стало . К старой ошибки добавилась ещё.
Стало передоваться только 5 цифр . А если ингорировать ацп (не обращаться к нему) вообще одна цифра и то не известно какая . Вообще не знаю, что делать. Два вечера убил толку..........
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 21 2008, 13:54
Сообщение #28


кекс
******

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



2 SasaVitebsk, adc

Неплохая попытка smile.gif
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 21 2008, 17:53
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Sholkin @ Jan 21 2008, 07:37) *
Здрасте.
Что то не кто не ответил . Сейчас то у меня правильно пишиться прога ? или нет ?


Привет. Сейчас более-менее прилично. Времени не вагон, поэтому задержки с ответом и замечания будут поступательные. По мере прочтения документа.

Сначала некоторые замечания по оформлению
Лучше всего все вектора объявлять ч/з org. Иначе ОБЯЗАТЕЛЬНО наступите на грабли.

Теперь по существу.
Прерывание от таймера для измерения АЦП реализовано неправильно. Точнее так не делают. Вообще все прерывания делают найкрадчайшими. У вас в самом прерывании будет задержка на ответ от измерения АЦП. Это значительная величина. И её элементарно можно избежать.

Для того, чтобы её избежать делается след. образом.
1) По входу в прерывание сразу читается значение.
2) Потом переключается канал
3) перестартовывается и выходят.

Таким образом к следующему прерыванию таймера АЦП гарантировано завершило преобразование. Если одного прерывания недостаточно, то делают счётчик прерываний.

Буду читать дальше


Да ещё одно замечание.

Выключи свой wdt.

ты должен отладить прогу так, чтобы работала как часы без wdt. wdt это сложная и отдельная песня. Правильная и добросовестная его настройка занимает половину времени от написания проекта. smile.gif Плюс надо понимание что и зачем и как. Иначе это абсолютно не даёт пользы а может даже наносить вред тем, что будет скрывать от тебя твои же собственные ошибки



PS: Так дело не пойдёт. В прерывании start я вообще не нашёл reti. И величина её запредельная. Тебе придётся полностью изменить логику работы программы. Опиши алгоритм хотябы общими словами
Go to the top of the page
 
+Quote Post
Sholkin
сообщение Jan 22 2008, 03:26
Сообщение #30


Участник
*

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



Александр спасибо за помощь . Всё , что вы сказали проанализирую сегодня вечером . Могу предоставить алгаритм как блок схему (сначало перед написанием составил ) и подробно описать, как задуманно, что бы работало.
Ещё раз спасибо за помощь.

Выключи свой wdt.

Я его сбрасывал потому, что не правильно настроет был и проц постоянно сбрасывался на начале ..... Исправлюсь.
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Closed TopicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 21:39
Рейтинг@Mail.ru


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