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

 
 
> Пишется лажа в память
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
 
Start new topic
Ответов
SasaVitebsk
сообщение Jan 29 2008, 22:44
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 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   Пишется лажа в память   Dec 16 2007, 14:45
- - =AVR=   Так писать нельзя, потому что так нельзя писать. С...   Dec 16 2007, 18:36
- - =GM=   Цитата(Sholkin @ Dec 16 2007, 14:45) Проб...   Dec 16 2007, 23:59
- - adc   Цитата(Sholkin @ Dec 16 2007, 17:45) како...   Dec 17 2007, 06:34
- - Sholkin   Здравствуйте. ADC вы не нашли где я записываю еди...   Dec 18 2007, 13:47
- - bodja74   Просто невероятное упорство автора темы или ... ...   Dec 18 2007, 16:58
|- - SasaVitebsk   Цитата(bodja74 @ Dec 18 2007, 20:58) Прос...   Dec 24 2007, 19:11
- - Sholkin   Здравствуйте. Не упорство. Конечно вы все здесь пр...   Dec 24 2007, 07:57
- - Sholkin   Здравствуйте. Александр моей целью не было каго то...   Dec 26 2007, 14:09
- - SasaVitebsk   Давайте попробуем ещё раз. Придерживайтесь следующ...   Dec 26 2007, 19:42
- - Sholkin   Здравствуйте. Первое большое спасибо за ответ . Ра...   Dec 29 2007, 08:24
- - Sholkin   Здравствуйте. Александр я и так почти везде испол...   Jan 6 2008, 15:08
|- - Qwertty   Цитата(Sholkin @ Jan 6 2008, 18:08) ldi w...   Jan 6 2008, 18:12
- - SasaVitebsk   Компилятор вам сообщает, что он не знает такого им...   Jan 6 2008, 16:15
|- - adc   Цитата(SasaVitebsk @ Jan 6 2008, 19:15) ....   Jan 9 2008, 06:06
|- - SasaVitebsk   Цитата(adc @ Jan 9 2008, 10:06) Поделитес...   Jan 9 2008, 11:09
- - Sholkin   Привет всем. Я не говорю что вы навязываете. Прост...   Jan 9 2008, 03:37
- - Sholkin   Здравствуйте. Переписал в такой вид ;описание пер...   Jan 10 2008, 07:50
- - SasaVitebsk   Вы немножко не поняли. Эти определения, которые...   Jan 10 2008, 12:01
- - Sholkin   Здравствуйте. Документация есть (на английском пра...   Jan 14 2008, 03:58
|- - adc   Цитата(Sholkin @ Jan 14 2008, 06:58) Про ...   Jan 14 2008, 05:07
|- - adc   Цитата(Sholkin @ Jan 14 2008, 06:58) Как ...   Jan 14 2008, 06:16
- - Sholkin   Пробовал так .equ constEEPROM = 0b00111111 Ошибку...   Jan 14 2008, 07:24
|- - adc   Цитата(Sholkin @ Jan 14 2008, 10:24) Проб...   Jan 14 2008, 08:05
- - Sholkin   Здравствуйте . Где эта строчка я нашёл (выше писал...   Jan 17 2008, 04:31
|- - adc   Цитата(Sholkin @ Jan 17 2008, 07:31) Сраз...   Jan 17 2008, 06:10
- - Sholkin   Здрасте. Что то не кто не ответил . Сейчас то у ме...   Jan 21 2008, 03:37
|- - defunct   2 SasaVitebsk, adc Неплохая попытка   Jan 21 2008, 13:54
|- - SasaVitebsk   Цитата(Sholkin @ Jan 21 2008, 07:37) Здра...   Jan 21 2008, 17:53
- - Sholkin   Александр спасибо за помощь . Всё , что вы сказали...   Jan 22 2008, 03:26
|- - adc   Ну что вы все фанатично записываете адреса регистр...   Jan 22 2008, 06:26
- - Sholkin   Здравствуйте. Исправил всё как вы мне подсказали. ...   Jan 29 2008, 03:48
- - Sholkin   Спасибо за ответ. До вашего ответа я немного набра...   Feb 3 2008, 14:03
- - Sholkin   Здравствуйте. Переделал прерывание от таймера след...   Feb 12 2008, 04:08
- - Sholkin   Привет всем. Что то уже больше недели смотрю тема...   Feb 20 2008, 05:07
- - Sholkin   Ребята помогите пожалуйста ? Код программы есть . ...   Feb 26 2008, 05:16
- - vet   ну что тут советовать? загружайте программу в симу...   Feb 26 2008, 05:35
- - Sholkin   Да дело то в том , что в имуляторе работает , я б...   Feb 26 2008, 07:35
- - Sholkin   Здравствуйте. Во вторник с человеком поговорил . П...   Feb 28 2008, 06:35
- - vet   только то, что бросилось в глаза. не сохраняете р...   Feb 28 2008, 07:58
- - Sholkin   Частично заставил работать. Я вот только понять не...   Mar 3 2008, 10:10
|- - SasaVitebsk   Цитата(Sholkin @ Mar 3 2008, 14:10) Прост...   Mar 3 2008, 19:31
- - IgorKossak   На этом и закончим. Sholkin, у Вас будет возможнос...   Mar 3 2008, 20:10


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

 


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


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