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

 
 
3 страниц V   1 2 3 >  
Closed TopicStart new topic
> Пишется лажа в память
Sholkin
сообщение Dec 16 2007, 14:45
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 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
 
Go to the top of the page
 
+Quote Post
Guest_=AVR=_*
сообщение Dec 16 2007, 18:36
Сообщение #2





Guests






Так писать нельзя, потому что так нельзя писать. Совсем. Это не просто безграмотно, что встречается в 90% случаев - это ВОПИЮЩЕ БЕЗГРАМОТНО!

[CENSORED] отправляйся на атмел.ру и атмел.сом, и учись пользоваться ассемблером и писать для начала простейший код - на конкретных примерах. Дальше можешь постепенно усложнять задачи, но научись понимать суть происходящего [CENSORED]

Сообщение отредактировал IgorKossak - Dec 24 2007, 11:46
Go to the top of the page
 
+Quote Post
=GM=
сообщение Dec 16 2007, 23:59
Сообщение #3


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


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
adc
сообщение Dec 17 2007, 06:34
Сообщение #4


Местный
***

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


--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
Go to the top of the page
 
+Quote Post
Sholkin
сообщение Dec 18 2007, 13:47
Сообщение #5


Участник
*

Группа: Новичок
Сообщений: 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
во какой парадокс не могу понять пока связь как так вообще происходит
Go to the top of the page
 
+Quote Post
bodja74
сообщение Dec 18 2007, 16:58
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Просто невероятное упорство автора темы или ... smile.gif

http://electronix.ru/forum/index.php?showtopic=32062&hl=
http://electronix.ru/forum/index.php?showtopic=29586&hl=

Больше всего поражает ,что данные ранее советы идут в полный игнор smile.gif
Go to the top of the page
 
+Quote Post
Sholkin
сообщение Dec 24 2007, 07:57
Сообщение #7


Участник
*

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



Здравствуйте.
Не упорство. Конечно вы все здесь провессионалы спору нет и пишите по другому но я то нет. Вы прогромируете 24 часа в сутки и по этому вам уже почи всё понятно. Я пробовал на си Но так как я его не очень то ещё больше стал путаться и не совсем понимать чего делать по этому написал пока так как мне понятно а не как вы привыкли писать по профессианальному. В таком виде а хотябы знаю что как происходит немного. что бы воловить ошибку. Хочю получить работающий код а потом уже как надо переписать на си чтоб было что работающее.
По моему ошибку локолизовал пока на 100 не знаю прогроматор отказал пока его починил. Сегодня попробую. По моему напутано у меня с прерывание по таймеру нулевому кода его задействую то лажа идет попробую без него посмотреть.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Dec 24 2007, 19:11
Сообщение #8


Гуру
******

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



Цитата(bodja74 @ Dec 18 2007, 20:58) *
Просто невероятное упорство автора темы или ... smile.gif

http://electronix.ru/forum/index.php?showtopic=32062&hl=
http://electronix.ru/forum/index.php?showtopic=29586&hl=

Больше всего поражает ,что данные ранее советы идут в полный игнор smile.gif


А автор уже добился своего. Его вопросы тоже прямиком идут в игнор. За полное неуважение ко всем участникам форума. Люди ведь пытаются читать и разбираться в его кроказябрах.
Go to the top of the page
 
+Quote Post
Sholkin
сообщение Dec 26 2007, 14:09
Сообщение #9


Участник
*

Группа: Новичок
Сообщений: 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 . Оставил передачу и умножение всё зациклил (умножение данных и преобразование в десетичный) проц работает делает несколько преобразовании в ресет уходит.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Dec 26 2007, 19:42
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Sholkin
сообщение Dec 29 2007, 08:24
Сообщение #11


Участник
*

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



Здравствуйте.
Первое большое спасибо за ответ . Разбираться буду и учиться.
Второе
beer.gif Поздравляю всех с новым годом
Go to the top of the page
 
+Quote Post
Sholkin
сообщение Jan 6 2008, 15:08
Сообщение #12


Участник
*

Группа: Новичок
Сообщений: 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 декабря комп накрылся
Не везуха. щас праздники отремонтировать ни как запчасть нужна. Ну эта моя проблема.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 6 2008, 16:15
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 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. Если программа хотябы средняя, то очень скоро вы абсолютно запутаетесь что это за регистры, какие используются в том или ином месте, а какие можно использовать.

До всего этого вы и сами дойдёте, только сначала понабиваете шишек.
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Jan 6 2008, 18:12
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(Sholkin @ Jan 6 2008, 18:08) *
ldi wl, (ADEN<<1)+(ADPS1<<1)+(ADPS2<<1)

Наверно все же ldi wl, (1<<ADEN)+(1<<ADPS1)+(1<<ADPS2) smile.gif
Go to the top of the page
 
+Quote Post
Sholkin
сообщение Jan 9 2008, 03:37
Сообщение #15


Участник
*

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



Привет всем.
Я не говорю что вы навязываете. Просто возмущает в конфе агрессивность к новичкам (в часности ко мне). Я готов вас внимательно слушать . Вечером сегодня посмотрю обязательно этот фаил. Я эту переменую пробовал обьявить как остальные , в начале программы, не вышло. Сегодня попробую исправить. А шишки готов набивать
Александр пока я исправляю кракозябы я паралельно всё же пытаюсь заставить проц работать .
Вопрос (я уже писал выше какие монипуляции проделал) из за чего в ресет уходит проц какие причины могут быть, так из опыта ? (напоминаю прога в имуляторе работает как надо) Уже всё по отключал. оставил настроики ( прога PESET вывод сигнала сброс считывание с ацп 0и 1 каналов их перемножаю и вывод FORM программа ) .
Происходит следуещее забивает ячеики памяти 111111 где то 20 чиклов проходит (снимаю по комп порту 121111) потом опять все единицы. Тоеть ыходит в ресет и опять записывает все 1
Go to the top of the page
 
+Quote Post
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
adc
сообщение Jan 22 2008, 06:26
Сообщение #31


Местный
***

Группа: Свой
Сообщений: 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 должно быть больше периода срабатывания таймера. Так вы гарантированно защитите защитите свою программу от таких ошибок как зацикливание программы в основном цикле при запрещенных прерываниях, случайный сброс настроек/отключение таймера и т.п.


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


Участник
*

Группа: Новичок
Сообщений: 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
 
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 29 2008, 22:44
Сообщение #33


Гуру
******

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


Простите делал на скорую руку. Прямо тут. Естественно не самым оптимальным образом. Всё зависит от проекта. От распределения памяти и свободных регистров. Всё это естественно можно ужать.
Go to the top of the page
 
+Quote Post
Sholkin
сообщение Feb 3 2008, 14:03
Сообщение #34


Участник
*

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



Спасибо за ответ.
До вашего ответа я немного набрасал как оптимально сделать прерывание . Проанализирую с вашим вариантом.
Go to the top of the page
 
+Quote Post
Sholkin
сообщение Feb 12 2008, 04:08
Сообщение #35


Участник
*

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



Здравствуйте.
Переделал прерывание от таймера следующим оброзом.
В программе инициализации (reset)запускаю ацп выставляю 0 канал . Когда приходит прерывание по таймеру (start) смотрю флаг что преобразование закончилось считываю значение . Потом смотрю если это был 1 или 3 или 5 канал то на программу переумножения выставляю следующий и выхожу. Если 5 канал то выставляю 0 канал и выхожу. Получилось много условий . можно запутаться .
Оставил предыдущий вариант (линейный ) тупо выстовляю канал жду флаг равершения и тд.
Оставил потому что как бы это его оснавная программа и он только и ей должен заниматься.

но дело в том, я её зашил в проц . Он вообще не работает ни как .

первый вариан (самый первый хоть как то работал ) второй который без строчки волшебной изменялась только первый разряд до 2 и всё сначало.
Чего делать ............. весь мозг сломал.
Я вот подумал может он сбрасываеться из за того что преобразование дольше идёт чем настроен таймер или ещё что ....................................

Сообщение отредактировал Sholkin - Feb 12 2008, 04:10
Go to the top of the page
 
+Quote Post
Sholkin
сообщение Feb 20 2008, 05:07
Сообщение #36


Участник
*

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



Привет всем.
Что то уже больше недели смотрю тема моя опускаеться ниже ниже. И Александр с adc перестал мне помогать.
Вроде сейчас то написано более менее. Ребята помогайте . А то прогу переписал, типа научился писать всё хоре. Хочеться до конца довести а не бросить .
Go to the top of the page
 
+Quote Post
Sholkin
сообщение Feb 26 2008, 05:16
Сообщение #37


Участник
*

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



Ребята помогите пожалуйста ? Код программы есть . Что не так написано? Или напишите ,что не будете смотреть . Я тогда отстану. Буду что нибудь дальше думать. Или в другую конференцию обращусь.
Go to the top of the page
 
+Quote Post
vet
сообщение Feb 26 2008, 05:35
Сообщение #38


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



ну что тут советовать? загружайте программу в симулятор AVRStudio и смотрите, где возникает ошибка; ничего сложного, нужно просто уделить этому некоторое время.
вобще, в этой ветке насоветовали уже много дельных вещей; можно было бы внести их в проект.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
Sholkin
сообщение Feb 26 2008, 07:35
Сообщение #39


Участник
*

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



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


Участник
*

Группа: Новичок
Сообщений: 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
 
Go to the top of the page
 
+Quote Post
vet
сообщение Feb 28 2008, 07:58
Сообщение #41


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



только то, что бросилось в глаза.

не сохраняете регистры и флаги, используемые в прерываниях - программа почти гарантированно не будет работать.

включили ватчдог - зачем он вам во время отладки? лишняя сложность и потенциальный источник трудноотлавливаемых сбросов.

циклы ожидания в прерываниях, запись в еепром в прерывании - плохая практика. прерывание должно выполняться как можно быстрее, все медленные процессы должны выполняться в программе.

разрешаете прерывания внутри прерываний - неоправданное усложнение.

стек инициализировали с ошибкой.

из прерываний возвращаться нужно командой reti, а не ret.

касательно оформления - продолжаете записывать адреса ячеек памяти цифрами, вместо меток. при обозначении регистров смешиваете Rxx и идентификаторы. всё это усложняет понимание и отладку.

не держите несколько вариантов одного проекта. работайте над одним, самым правильным.
неважно, что он пока не работает - постепенно отладите.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
Sholkin
сообщение Mar 3 2008, 10:10
Сообщение #42


Участник
*

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



Прикрепленный файл  sav.txt ( 18.94 килобайт ) Кол-во скачиваний: 240
Частично заставил работать. Я вот только понять не могу . Алгоритм одинаково написан. А один работает так другой вообще не так.
Вобщем посидел в пятницу суботу. Вот чего родил.
vet вам спасибо за ответ не надеялся , что кто нибудь ответит, поэтому воял до вашего поста.

Регистры я не сохроняю, потому что для каждой программы свои. Вот с флагами сказали не обязательно. Но послушаюсь вашего совета , мне и раньше это говорили . Просто один одно говорит другой другое. Раньше советовали Александр и abc Сейчас они пропали А каждый по своему советует. Некоторые советы я просто не понимаю , а человека рядом нет, всё труба у кого разьяснение получить.

по существу.
Отключил вачдок . Не знаю правильно или нет . Вопрос по нему . Писал прогу записи в еепром. Я его сначало задействовал , потом убрал команду . Осталось всё по прежнему . Потом я его стал сбрасывать. Всё пошло. У меня вопрос как его заглушить ? Он что, если его не настроить он по умолчанию какие то настройки имеет ?
Сохронять флаги после прерывания сразу первой строчкой в программе прерывания ?

разрешаете прерывания внутри прерываний - неоправданное усложнение

Частично убрал. свой код прилогаю. Замыкалось всё на чтении. Когда убрал чтение и вочдок диод стал гореть очень очень тускло (зажигает программа сброса чтоб проц не завис).
Когда частично перенёс подпрограммы в основную из подпрограммы START стал гореть ярко. Тоже не понятно.
Сейчас после модификации программы свето диод горит . Нет передачи по ком порту . Так и не понял почему. отключил таймер пока.

Вопросы
Как правильно записать флаги (наверно в память в начале подпрограммы потом обратно в конце)?
Что значит метки на ячейки памяти и как правильно?
Как отключить вачдок ?
Сейчас работаю с этим вариантом.

Сообщение отредактировал Sholkin - Mar 3 2008, 10:14
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 3 2008, 19:31
Сообщение #43


Гуру
******

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


Так как вам ещё написать, чтобы дошло? И стоит ли вообще это делать?

Мне кажется, в мире есть сотни разных профессий.
Займитесь другим делом.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Mar 3 2008, 20:10
Сообщение #44


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



На этом и закончим.
Sholkin, у Вас будет возможность перечитать все посты ещё раз (или больше) и, наконец то, создать программу. Благо всё для этого уже есть.
Go to the top of the page
 
+Quote Post

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

 


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


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