A A A A Автор Тема: Прошу помощи в написании программы на PIC.  (Прочитано 1158 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн MAKsutikАвтор темы

  • *****
  • Забанен!
  • Сообщений: 1 031
  • Благодарностей: 42
  • Украине - слава!!!
    • Skype - scotland_m
  • Награды Призер конкурса астрофото
    • Сообщения от MAKsutik
    • EQDrive
Было собрано "устройство", пока назовем так, потому что до конца еще нечего не сделано.
Устройство собрано на PIC16F688 тактовая 20мГц. Написано на ассемблере.
Схема меряет период поступающего сигнала, то что написали мне в коде не очень нравится как работает вот и хочу попробовать убрать косяки.
Сложность в том что что нужно измерить длительность периода в большом диапазоне частот от 0,1 до 500кГц поступающих на вход RA2, результат сохраняется во временных ячейках памяти.
То что сейчас набросал в голове выгладит так, измеряю не один период а 2 или 4 периода, потом соответственно усредняю делю на 2 или 4.
понимаю что тут нужно задействовать ТАЙМЕР_1.
Может кто какую идею подбросит, вечером постараюсь выложить сей кусок кода.

Оффлайн MAKsutikАвтор темы

  • *****
  • Забанен!
  • Сообщений: 1 031
  • Благодарностей: 42
  • Украине - слава!!!
    • Skype - scotland_m
  • Награды Призер конкурса астрофото
    • Сообщения от MAKsutik
    • EQDrive
прошу простить за код, последний раз писал в 2004г, блин как много забыл
Измеряю сразу два периода


Period_H   equ 0x25
Period_L      equ 0x26
Period_HL   equ 0x28
Period_HH   equ 0x2b

;Обработка прерываний

   org      0x04


   btfss   PIR1,TMR1IF   ;флаг таймера установлен
   return         ;то инкремент счетчика
   bcf   PIR1,TMR1IF   
   BANKSEL   Period_HL
   incf   Period_HL,F
   btfss   STATUS,Z
   return
   BANKSEL   Period_HH
   incf   Period_HH,F
   return

;разрешаем всепрерывания,
;таймер настроен на внутр.частоту f/4,
;разрешаем прерывание от RA2,вход настроен на переход от 0 к 1

izm_period
wait_0
   btfss   INTCON,INTF         ;ждем прерывание по RA2
   goto   wait_0
   BANKSEL   T1CON
   bsf   T1CON,0      ;вкл. таймер1
   bcf   INTCON,INTF
wait_1
   btfss   INTCON,INTF       ;ждем прерывание по RA2
   goto   wait_1
              bcf   INTCON,INTF
wait_2
   btfss   INTCON,INTF       ;ждем прерывание по RA2
   goto   wait_2
   bcf   T1CON,0      ;выкл. таймер1
   bcf   INTCON,GIE   ;0 = запретить все прерывания
   BANKSEL TMR1L
   movf   TMR1L,0
   movwf   Period_L
   BANKSEL TMR1H
   movf   TMR1H,0
   movwf   Period_H
   return


получаем 4 байта

Period_L
Period_H
Period_HL
Period_HH
« Последнее редактирование: 21 Ноя 2011 [18:32:10] от MAKsutik »

Оффлайн Anton

  • *****
  • Сообщений: 7 252
  • Благодарностей: 78
    • Сообщения от Anton
Лучше наверное все таки сюда с такими вопросами сходить. :)

Оффлайн MAKsutikАвтор темы

  • *****
  • Забанен!
  • Сообщений: 1 031
  • Благодарностей: 42
  • Украине - слава!!!
    • Skype - scotland_m
  • Награды Призер конкурса астрофото
    • Сообщения от MAKsutik
    • EQDrive
Антон да девайс как бы астрономический, да и регистрироваться надо, может кто с ЛА еще программированием страдает.

Оффлайн Константин Шевченко

  • *****
  • Сообщений: 500
  • Благодарностей: 16
  • Мне нравится этот форум! Но иногда бесит!
    • Сообщения от Константин Шевченко
По-моему мерить несколько импульсов длительностью более 10 сек (а они в этом "устройстве" будут) как-то накладно!
Да и 500 кгц - тоже лишнее, как мне кажется.
Как я думаю выглядеть должно - таймер в 16-битном режиме, при переполнении - инкремент какой-нить обнуленной переменной (тут в принципе не ограничена битность). Собственно по получившейся в итоге битности выбираем предел и выдаем округленный результат (к примеру к расчету нам надо максимум 14 бит, вот и берем для расчетов первые 14 бит, остальные отбрасываем). Собственно на тактовой частоте 20 мгц измерить 100 кгц можно с неплохой точностью за один период.
А по пиковским прогам не подскажу - сам программирую на 8051 совместимых.
Доб 320 , Тал-М, 80/512
БШ 10х50, БПЦ 20х60
ТАЛ-75+Коронадо-ПСТ

Оффлайн MAKsutikАвтор темы

  • *****
  • Забанен!
  • Сообщений: 1 031
  • Благодарностей: 42
  • Украине - слава!!!
    • Skype - scotland_m
  • Награды Призер конкурса астрофото
    • Сообщения от MAKsutik
    • EQDrive
Костя я использую для измерения периода таймер_1 , но блин то ли протеус глючит пока в нем гоняю то ли что то упустил, измеряю период пока одной секунды и результат измерения сильно плавает, вот и не пойму где траблы.

Оффлайн Timur Maksutov

  • ***
  • Сообщений: 104
  • Благодарностей: 6
  • Обратно в свой мир, на самое дно.
    • Сообщения от Timur Maksutov
думаю что не стоит забывать про то что пик исполняет команду за 4 такта, код не смотрел но частенько с этим траблы происходят при работе со временем
Celestron PowerSeeker 80eq, полностью переработанная eq1, мак 3М-5А, а также куча самопальных окуляров.

Оффлайн Павел Бахтинов

  • *****
  • Сообщений: 2 500
  • Благодарностей: 111
    • Сообщения от Павел Бахтинов
    • Искусство астрофотографии
   org      0x04


   btfss   PIR1,TMR1IF   ;флаг таймера установлен
   return         ;то инкремент счетчика
   bcf   PIR1,TMR1IF   
   BANKSEL   Period_HL
   incf   Period_HL,F
   btfss   STATUS,Z
   return
   BANKSEL   Period_HH
   incf   Period_HH,F
   return
Если это отработчик прерываний, то тут по крайней мере две ошибки ;)
Надо как-то так (такой пример кода есть в документации на PIC-и):
Interrupt:
      movwf tmpW
      swapf STATUS,W
      clrf  STATUS
      movwf tmpStatus

      btfss PIR1,TMR1IF
      goto  InterruptE
;
; тело отработчика
;
      bcf   PIR1,TMR1IF
InterruptE:
      swapf tmpStatus,W
      movwf STATUS
      swapf tmpW,F
      swapf tmpW,W
      retfie

Оффлайн MAKsutikАвтор темы

  • *****
  • Забанен!
  • Сообщений: 1 031
  • Благодарностей: 42
  • Украине - слава!!!
    • Skype - scotland_m
  • Награды Призер конкурса астрофото
    • Сообщения от MAKsutik
    • EQDrive
сохранение W, регистра STATUS
 ну я как бы знаю но подумал у меня в программе после прерывания не используются эти регистры, решил облегчить так сказать код обработки прерывания для более быстрого выполнения.
 Так не пойдет?

Оффлайн Павел Бахтинов

  • *****
  • Сообщений: 2 500
  • Благодарностей: 111
    • Сообщения от Павел Бахтинов
    • Искусство астрофотографии
сохранение W, регистра STATUS
 ну я как бы знаю но подумал у меня в программе после прерывания не используются эти регистры
STATUS - используется. Это первая ошибка.
return вместо retfie - это вторая.
А сохранение W действительно можно здесь не делать, это я и не посчитал :)


Оффлайн MAKsutikАвтор темы

  • *****
  • Забанен!
  • Сообщений: 1 031
  • Благодарностей: 42
  • Украине - слава!!!
    • Skype - scotland_m
  • Награды Призер конкурса астрофото
    • Сообщения от MAKsutik
    • EQDrive
Спасибо Павел, retfie в начале написал но программа почему то не правильно выходила с прерывания, вот и поставил return, может протеус еще косячит, в нем пока отладку веду.