Индикатор загрузки процессора на микроконтроллере PIC16F628

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Индикатор загрузки процессора на микроконтроллере PIC16

Сообщение Мурик »

Ariadna-on-Line писал(а):Буду очень признателен, если кто уточнит, что такое загрузка процессора. В процентах наверно, но от чего?
Откройте диспетчер задач и там увидите.
Ariadna-on-Line писал(а):И как, например, в Дельфи или в Визуал Бейсике накатать соответствующую программулину?
Чем имеющаяся не подошла?
По сравнению с дельфи, программа значительно меньше весит, а по сравнению в VB, не требует рантайма, поэтому переписывание на эти языки, весьма сомнительное занятие, т. к. вообще нет никаких преимуществ.

Если нужно, могу накатать DLL, которая будет возвращать текущую загрузку процессора.
Реклама
Аватара пользователя
Ariadna-on-Line
Это не хвост, это антенна
Сообщения: 1482
Зарегистрирован: Вс май 13, 2012 00:01:54

Re: Индикатор загрузки процессора на микроконтроллере PIC16

Сообщение Ariadna-on-Line »

Мурик-у. Лет 15 назад я взял грех на душу - послав подальше одного буржуинского программиста, предложившего купить у него DLL-ку на 300кбайт, вместо прямого ответа на заданный вопрос,- как регулировать громкость звуковой карты. Пришлось самому искать инфу. Оказалось - достаточно всего одной команды на Бейсике. Так что уж лучше назвали бы API-функцию Виндоуса. Вы ведь ими воспользовались? Здесь ведь всё-таки форум, а не торговый центр. Без обид.
Реклама
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Индикатор загрузки процессора на микроконтроллере PIC16

Сообщение Мурик »

Ariadna-on-Line писал(а):Так что уж лучше назвали бы API-функцию Виндоуса. Вы ведь ими воспользовались? Здесь ведь всё-таки форум, а не торговый центр.
Не хотите DLL в несколько кило? Ладно вот исходник функции CpuUsage().
Спойлер

Код: Выделить всё

;-------------------------------------------------
;-------------------------------------------------
;
; CPU monitor for Win9x/ME + NT/2k/XP
;
;-------------------------------------------------
;-------------------------------------------------
;
;------------------------------------------------------------------------------
;                                                           INCLUDE           ;
;------------------------------------------------------------------------------
;%INCLUDE "macros.asm"

;------------------------------------------------------------------------------
;                                                           EXPORTS           ;
;------------------------------------------------------------------------------
GLOBAL PB_InitCPUmonitor
GLOBAL PB_CloseCPUmonitor
GLOBAL PB_CpuUsage


;------------------------------------------------------------------------------
;                                                           CONSTANTS         ;
;------------------------------------------------------------------------------
;  WinNT/2k/XP
SYSTEM_BASICINFORMATION       equ 0h
SYSTEM_PERFORMANCEINFORMATION equ 2h
SYSTEM_TIMEINFORMATION        equ 3h
NO_ERROR                      equ 0h
;   Win9x/ME
STANDARD_RIGHTS_ALL           equ 1F0000h
KEY_QUERY_VALUE               equ 1h
KEY_SET_VALUE                 equ 2h
KEY_CREATE_SUB_KEY            equ 4h
KEY_ENUMERATE_SUB_KEYS        equ 8h
KEY_NOTIFY                    equ 10h
KEY_CREATE_LINK               equ 20h
SYNCHRONIZE                   equ 100000h
READ_CONTROL                  equ 20000h
STANDARD_RIGHTS_READ          equ READ_CONTROL
HKEY_DYN_DATA                 equ 80000006h
;#KEY_ALL_ACCESS = (#STANDARD_RIGHTS_ALL|#KEY_QUERY_VALUE|#KEY_SET_VALUE|#KEY_CREATE_SUB_KEY|#KEY_ENUMERATE_SUB_KEYS|#KEY_NOTIFY|#KEY_CREATE_LINK) & (~#SYNCHRONIZE)
;#KEY_READ = (#STANDARD_RIGHTS_READ|#KEY_QUERY_VALUE|#KEY_ENUMERATE_SUB_KEYS|#KEY_NOTIFY) & (~#SYNCHRONIZE)
KEY_ALL_ACCESS                equ 0F003Fh
KEY_READ                      equ 20019h
ERROR_SUCCESS                 equ 0h

;------------------------------------------------------------------------------
;                                                           MACROS            ;
;------------------------------------------------------------------------------
%macro BEEP 2
EXTERN _Beep@8
    PUSH dword %2
    PUSH dword %1
    CALL _Beep@8
%endmacro

%macro ProcedureReturn 1
    MOV  dword EAX, %1
    RET
%endmacro

%macro NtQuerySystemInformation 4
    PUSH dword %4
    PUSH dword %3
    PUSH dword %2
    PUSH dword %1
    CALL [adr_NtQuerySystemInformation]
%endmacro

%macro RegOpenKeyEx 5
    PUSH dword %5
    PUSH dword %4
    PUSH dword %3
    PUSH dword %2
    PUSH dword %1
    CALL [adr_RegOpenKeyEx]
%endmacro

%macro RegQueryValueEx 6
    PUSH dword %6
    PUSH dword %5
    PUSH dword %4
    PUSH dword %3
    PUSH dword %2
    PUSH dword %1
    CALL [adr_RegQueryValueEx]
%endmacro

%macro RegCloseKey 1
    PUSH dword %1
    CALL [adr_RegCloseKey]
%endmacro

%macro INVOKE 2-9 ;Macro INVOKE, same as stdcall
%define _j %1
%rep %0-1
    %rotate -1
    push dword %1      ; added DWORD for Win32
%endrep
    call _j
%endmacro



;------------------------------------------------------------------------------
;                                                           IMPORTS           ;
;------------------------------------------------------------------------------
;EXTERN PB_StringBase
EXTERN _GetVersionExA@4                 ; KERNEL32
EXTERN _LoadLibraryA@4                  ; KERNEL32
EXTERN _FreeLibrary@4                   ; KERNEL32
EXTERN _GetProcAddress@8                ; KERNEL32

SEGMENT .text USE32 CLASS=CODE
;------------------------------------------------------------------------------
;                                                           InitCPUmonitor()  ;
;------------------------------------------------------------------------------
PB_InitCPUmonitor:

     .IsWinNT:
         MOV  dword [OSVERSIONINFO.dwOSVersionInfoSize], 148  ; SizeOf(OSVERSIONINFO)
         INVOKE _GetVersionExA@4, OSVERSIONINFO
         CMP  dword [OSVERSIONINFO.dwPlatformId], 2           ; 2 = WinNT
         JNE  .NTchecked
              MOV  dword [IsWinNT], 1                          ; IsWinNT = 1 = WinNT
      .NTchecked:

          CMP  dword [IsWinNT], 1
          JNE  NEAR _Win9x
       .WinNT:                                                 ; WinNT
             INVOKE _LoadLibraryA@4, _ntdll
              OR   dword EAX,EAX   ; Is EAX = 0 ??
              JNZ  _LoadLib         ; EAX = 0:
              ret                  ; Return if LoadLibrary failed
          _LoadLib:
             MOV  dword [DLL_HANDLE], EAX
             INVOKE _GetProcAddress@8, EAX, _NtQuerySystemInformation
              OR   dword EAX,EAX   ; Is EAX = 0 ??
              JNZ  _ProcAdr        ; EAX = 0:
              ret                  ; Return if GetProcAddress failed
          _ProcAdr:
             MOV  dword [adr_NtQuerySystemInformation], EAX

             NtQuerySystemInformation SYSTEM_TIMEINFORMATION, SYSTEM_TIME_INFORMATION, 32, 0
             OR   dword EAX,EAX   ; Is EAX = 0 ??
             JZ   _OK1
                ;MessageRequester("ERROR", "Error While initializing the system's time!", 0)
                BEEP 1400, 5000
                ProcedureReturn 0
          _OK1:
             NtQuerySystemInformation SYSTEM_PERFORMANCEINFORMATION, SYSTEM_PERFORMANCE_INFORMATION, 312, 0
             OR   dword EAX,EAX   ; Is EAX = 0 ??
             JZ   _OK2
                ;MessageRequester("ERROR", "Error While initializing the CPU's idle time!", 0)
                BEEP 1000, 5000
                ProcedureReturn 0
          _OK2:
             ; store new CPU's idle And system time
             MOV  dword EAX, [SYSTEM_PERFORMANCE_INFORMATION.liIdleTime_dwLow]
             MOV  dword [liOldIdleTime_dwLow],EAX
             MOV  dword EAX, [SYSTEM_PERFORMANCE_INFORMATION.liIdleTime_dwHigh]
             MOV  dword [liOldIdleTime_dwHigh], EAX

             MOV  dword EAX, [SYSTEM_TIME_INFORMATION.liKeSystemTime_dwLow]
             MOV  dword [liOldSystemTime_dwLow],EAX
             MOV  dword EAX, [SYSTEM_TIME_INFORMATION.liKeSystemTime_dwHigh]
             MOV  dword [liOldSystemTime_dwHigh], EAX

             ProcedureReturn 1

       _Win9x:                                                 ; Win9x
          ; Win9x/ME
      ; start the counter by reading the value of the 'StartStat' key

             INVOKE _LoadLibraryA@4, _advapi32
              OR   dword EAX,EAX   ; Is EAX = 0 ??
              JNZ  _LoadLibOK      ; EAX = 0:
              ret                  ; Return if LoadLibrary failed
          _LoadLibOK:
             MOV  dword [DLL_HANDLE], EAX
             INVOKE _GetProcAddress@8, EAX, _RegOpenKeyEx
              OR   dword EAX,EAX   ; Is EAX = 0 ??
              JNZ  _ProcAdr01      ; EAX = 0:
              ret                  ; Return if GetProcAddress failed
          _ProcAdr01:
             MOV  dword [adr_RegOpenKeyEx], EAX

             INVOKE _GetProcAddress@8, [DLL_HANDLE], _RegQueryValueEx
              OR   dword EAX,EAX   ; Is EAX = 0 ??
              JNZ  _ProcAdr02      ; EAX = 0:
              ret                  ; Return if GetProcAddress failed
          _ProcAdr02:
             MOV  dword [adr_RegQueryValueEx], EAX

             INVOKE _GetProcAddress@8, [DLL_HANDLE], _RegCloseKey
              OR   dword EAX,EAX   ; Is EAX = 0 ??
              JNZ  _ProcAdr03      ; EAX = 0:
              ret                  ; Return if GetProcAddress failed
          _ProcAdr03:
             MOV  dword [adr_RegCloseKey], EAX


             RegOpenKeyEx HKEY_DYN_DATA, _string01, 0, KEY_ALL_ACCESS, hKey
              OR   dword EAX,EAX   ; Is EAX = 0 ??
              JZ  _DONE01         ; EAX = 0:
                   ;MessageRequester("ERROR", "Error While initializing counter",0)
                   ProcedureReturn 0
          _DONE01:
              MOV  dword [dwDataSize], 4    ;'Length of Long
              RegQueryValueEx [hKey], _string02, 0, dwType, dwCpuUsage, dwDataSize
              RegCloseKey [hKey]
              ; get current counter's value
              RegOpenKeyEx HKEY_DYN_DATA, _string03, 0, KEY_READ, hKey
              OR   dword EAX,EAX   ; Is EAX = 0 ??
              JZ  _DONE02         ; EAX = 0:
                   ;MessageRequester("ERROR", "Error While opening counter key", 0)
                   ProcedureReturn 0
          _DONE02:
              ProcedureReturn 1
RET

;------------------------------------------------------------------------------
;                                                           CloseCPUmonitor() ;
;------------------------------------------------------------------------------
PB_CloseCPUmonitor:
          CMP  dword [IsWinNT], 1
          JNE  NEAR .Win9x
       .WinNT:                                                 ; WinNT
          INVOKE _FreeLibrary@4, [DLL_HANDLE]
          ProcedureReturn 1
       .Win9x:                                                 ; Win9x
          RegCloseKey [hKey]
          ;'stopping the counter
          RegOpenKeyEx HKEY_DYN_DATA, _string04, 0, KEY_ALL_ACCESS, hKey
              OR   dword EAX,EAX   ; Is EAX = 0 ??
              JZ  _DONE_01         ; EAX = 0:
                   ;MessageRequester("ERROR", "Error While stopping counter", 0)
                   ProcedureReturn 0
       _DONE_01:
          MOV  dword [dwDataSize], 4   ;'length of Long
          RegQueryValueEx [hKey], _string02, 0, dwType, dwCpuUsage, dwDataSize
          RegCloseKey [hKey]
          ProcedureReturn 1
RET

;------------------------------------------------------------------------------
;                                                           CpuUsage()        ;
;------------------------------------------------------------------------------
PB_CpuUsage:
          CMP  dword [IsWinNT], 1
          JNE  NEAR _Win95
       .WinNT:                                                 ; WinNT
          NtQuerySystemInformation SYSTEM_BASICINFORMATION, SYSTEM_BASIC_INFORMATION, 44, 0
          OR   dword EAX,EAX   ; Is EAX = 0 ??
          JZ   .OK1
                 ;MessageRequester("ERROR", "Error While retrieving the number of processors!", 0)
                 ProcedureReturn -1
       .OK1:
          ; get new system time
          NtQuerySystemInformation SYSTEM_TIMEINFORMATION, SYSTEM_TIME_INFORMATION, 32, 0
          OR   dword EAX,EAX   ; Is EAX = 0 ??
          JZ   .OK2
                 ;MessageRequester("ERROR", "Error While retrieving the system's time!", 0)
                 ProcedureReturn -1
       .OK2:
          ; get new CPU's idle time
          NtQuerySystemInformation SYSTEM_PERFORMANCEINFORMATION, SYSTEM_PERFORMANCE_INFORMATION, 312, 0
          OR   dword EAX,EAX   ; Is EAX = 0 ??
          JZ   .OK3
                 ;MessageRequester("ERROR", "Error While retrieving the CPU's idle time!", 0)
                 ProcedureReturn -1
       .OK3:

          ;dbIdleTime = LI2Currency(SysPerfInfo.liIdleTime) - LI2Currency(liOldIdleTime)
          FILD qword [liOldIdleTime_dwLow]
          FILD qword [SYSTEM_PERFORMANCE_INFORMATION]
          FSUB ST0,ST1
          FSTP dword [dbIdleTime]
          FSTP dword [dbTemp]
          ;dbSystemTime = LI2Currency(SysTimeInfo.liKeSystemTime) - LI2Currency(liOldSystemTime)
          FILD qword [liOldSystemTime_dwLow]
          FILD qword [SYSTEM_TIME_INFORMATION+8]
          FSUB ST0,ST1
          FSTP dword [dbSystemTime]
          FSTP dword [dbTemp]

          ; CurrentCpuIdle = IdleTime / SystemTime
          ; If proc_CPUmonitor_dbSystemTime <> 0.0
          FLD    dword [dbSystemTime]
          MOV    dword [dbTemp],0
          FCOMP  dword [dbTemp]
          FNSTSW ax    ; FNSTSW ; Status Word
          TEST   ah,40h
          JNE    .Weiter_01
          ; proc_CPUmonitor_dbIdleTime = proc_CPUmonitor_dbIdleTime / proc_CPUmonitor_dbSystemTime
             FLD    dword [dbIdleTime]
             FDIV   dword [dbSystemTime]
             FSTP   dword [dbIdleTime]
       .Weiter_01:
          ; CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors
          ; proc_CPUmonitor_dbIdleTime = 100 - (proc_CPUmonitor_dbIdleTime *100) / proc_CPUmonitor_SysBaseInfo\bKeNumberProcessors + 0.5
          FLD    dword [dbIdleTime]
          MOV    dword [dbTemp],1120403456
          FMUL   dword [dbTemp]
          ;MOV    dword [dbTemp],100
          ;FIMUL  dword [dbTemp]
          XOR    dword EAX, EAX
          MOV    byte  AL, [SYSTEM_BASIC_INFORMATION.bKeNumberProcessors]
          MOV    dword [dbTemp], eax
          FIDIV  dword [dbTemp]
          FCHS
          MOV    dword [dbTemp],1120468992
          FADD   dword [dbTemp]
          ;MOV    dword [dbTemp],100
          ;FIADD  dword [dbTemp]

          FSTP   dword [dbIdleTime]

          ; store new CPU's idle And system time
          MOV  dword EAX, [SYSTEM_PERFORMANCE_INFORMATION.liIdleTime_dwLow]
          MOV  dword [liOldIdleTime_dwLow],EAX
          MOV  dword EAX, [SYSTEM_PERFORMANCE_INFORMATION.liIdleTime_dwHigh]
          MOV  dword [liOldIdleTime_dwHigh], EAX

          MOV  dword EAX, [SYSTEM_TIME_INFORMATION.liKeSystemTime_dwLow]
          MOV  dword [liOldSystemTime_dwLow],EAX
          MOV  dword EAX, [SYSTEM_TIME_INFORMATION.liKeSystemTime_dwHigh]
          MOV  dword [liOldSystemTime_dwHigh], EAX

          ; FLOAT -> INTEGER
          ; because Result is Integer
          FLD   dword [dbIdleTime]
          FISTP dword [dbIdleTime]

          ProcedureReturn [dbIdleTime]

       _Win95:                                                 ; Win9x
          MOV  dword [dwDataSize], 4 ;'size of Long
          ; Query the counter
          RegQueryValueEx [hKey], _string02, 0, dwType, dwCpuUsage, dwDataSize
          ProcedureReturn [dwCpuUsage]
RET


[section .data]
  ALIGN  4
_ntdll:                                 db "ntdll.dll",0
_advapi32:                              db "advapi32.dll",0
_NtQuerySystemInformation:              db "NtQuerySystemInformation",0
_RegOpenKeyEx:                          db "RegOpenKeyExA",0
_RegQueryValueEx:                       db "RegQueryValueExA",0
_RegCloseKey:                           db "RegCloseKey",0
_string01:                              db "PerfStats\StartStat",0
_string02:                              db "KERNEL\CPUUsage",0
_string03:                              db "PerfStats\StatData",0
_string04:                              db "PerfStats\StopStat",0
IsWinNT:                                dd 0

[section .bss]
  ALIGN  4
; Variables for DLL-Functions
DLL_HANDLE:                             RESD 1
adr_NtQuerySystemInformation:           RESD 1
adr_RegOpenKeyEx:                       RESD 1
adr_RegQueryValueEx:                    RESD 1
adr_RegCloseKey:                        RESD 1

; winNT/2k/XP
liOldIdleTime_dwLow:                    RESD 1
liOldIdleTime_dwHigh:                   RESD 1
liOldSystemTime_dwLow:                  RESD 1
liOldSystemTime_dwHigh:                 RESD 1

dbIdleTime:                             RESD 1
dbSystemTime:                           RESD 1
dbTemp:                                 RESD 1

; win9x/ME
hKey                                    RESD 1
dwDataSize                              RESD 1
dwCpuUsage                              RESD 1
dwType                                  RESD 1

; Structures
OSVERSIONINFO:                          ; SIZE 148
.dwOSVersionInfoSize:                   RESD 1
.dwMajorVersion:                        RESD 1
.dwMinorVersion:                        RESD 1
.dwBuildNumber:                         RESD 1
.dwPlatformId:                          RESD 1
.szCSDVersion:                          times 128 RESB 1

SYSTEM_TIME_INFORMATION:                ; SIZE 32
.liKeBootTime_dwLow:                    RESD 1         ; liKeBootTime.myLARGE_INTEGER
.liKeBootTime_dwHigh:                   RESD 1
.liKeSystemTime_dwLow:                  RESD 1         ; liKeSystemTime.myLARGE_INTEGER
.liKeSystemTime_dwHigh:                 RESD 1
.liExpTimeZoneBias_dwLow:               RESD 1         ; liExpTimeZoneBias.myLARGE_INTEGER
.liExpTimeZoneBias_dwHigh:              RESD 1
.uCurrentTimeZoneId:                    RESD 1 
.dwReserved:                            RESD 1

SYSTEM_PERFORMANCE_INFORMATION:         ; SIZE 312
.liIdleTime_dwLow:                      RESD 1           ; liIdleTime.myLARGE_INTEGER
.liIdleTime_dwHigh:                     RESD 1
.dwSpare:                               times 76 RESD 1  ; dwSpare.l[76] ; (0 To 75) As Long

SYSTEM_BASIC_INFORMATION:               ; SIZE 44
.dwUnknown1                             RESD 1
.uKeMaximumIncrement                    RESD 1
.uPageSize                              RESD 1
.uMmNumberOfPhysicalPages               RESD 1
.uMmLowestPhysicalPage                  RESD 1
.uMmHighestPhysicalPage                 RESD 1
.uAllocationGranularity                 RESD 1
.pLowestUserAddress                     RESD 1
.pMmHighestUserAddress                  RESD 1
.uKeActiveProcessors                    RESD 1
.bKeNumberProcessors                    RESB 1
.bUnknown2                              RESB 1
.wUnknown3                              RESW 1 ; INTEGER
Гуглите функцию NtQuerySystemInformation() и все что с ней связанно.
А если прога будет еще и на Win9x запускаться, то еще нужно с реестром работать.
Так что в данном случае, дело не ограничивается одной WinAPI функцией.
Аватара пользователя
Ariadna-on-Line
Это не хвост, это антенна
Сообщения: 1482
Зарегистрирован: Вс май 13, 2012 00:01:54

Re: Индикатор загрузки процессора на микроконтроллере PIC16

Сообщение Ariadna-on-Line »

Мурик-у. Ого, я думал, что тут попроще. Ну чтож, спасибо, буду разбираться.
Но вопрос повторю, - поближе к нашим баранам. Написать программу для PICа там или AVRа, чтобы он сам посчитал степень своей загрузки. Именно это я собственно и хотел узнать. С уважухой.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Индикатор загрузки процессора на микроконтроллере PIC16

Сообщение Мурик »

Нужно узнать степень загрузки PIC или AVR контролера?
Тут и так все ясно - все время 100% потому что процессорах нет инструкций для пропуска тактов.
Реклама
Аватара пользователя
Ariadna-on-Line
Это не хвост, это антенна
Сообщения: 1482
Зарегистрирован: Вс май 13, 2012 00:01:54

Re: Индикатор загрузки процессора на микроконтроллере PIC16

Сообщение Ariadna-on-Line »

1 Не, чёто тут не то. Например у них есть инструкция NOP. Ну будет проц 99% времени молотить через NOP-ы. Ну и какая же здесь полезная работа? Что есть на деле термин "загрузка процессора" - вот чего я не могу понять. 2 Разве процессор может пропускать такты? Можно хоть приблизительную ссылку на инфу о чем речь?
Реклама
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Индикатор загрузки процессора на микроконтроллере PIC16

Сообщение Мурик »

Ariadna-on-Line, рекомендую вам хоть немного ознакомится с инструкциями процессоров Intel x86-64.
Может тогда вы поймете чем отличается инструкция NOP.
Спойлерзанимает один бит, но ничего не значит, кроме как указатель инструкции. У неё нет операндов и она ничего не совершает.
От инструкции HLT.
Спойлерпрекращает выполнение инструкции и переводит прощессор в состояние остановки. Запущенное прерывание, отладочное исключение, BINIT, INIT или RESET продолжат выполнение. У этой инструкции нет операндов.
http://en.wikipedia.org/wiki/HLT
Может тогда вы поймете что выполняя инструкцию NOP, процессор все равно работает и его загрузка будет 100%, а вот выполнив инструкцию HLT, процессор начинает пропускать такты (засыпает) и поэтому "отдыхает". Его загрузка уменьшается, а в месте с ней и потребляемая мощность процессором.

Есть ли у PIC или AVR инструкция типа HLT?
Cheba
Мучитель микросхем
Сообщения: 447
Зарегистрирован: Ср сен 26, 2012 14:12:47
Откуда: Київ

Re: Индикатор загрузки процессора на микроконтроллере PIC16

Сообщение Cheba »

Мурик писал(а): Есть ли у PIC или AVR инструкция типа HLT?
Есть, к примеру у AVR есть аналогичная по назначению SLEEP.
Более того, SLEEP mode режимы можно переключать специальным регистром от обычного IDLE со свойствами как у Интела, до Power Save, StandBy и Power Down включительно.
Ariadna-on-Line писал(а):Написать программу для PICа там или AVRа, чтобы он сам посчитал степень своей загрузки.
А смысл? В многозадачных системах степень загрузки процессора одной задачей косвенно отражает, сколько ещё таких задач процессор может исполнять. В МК нет ни ОС, ни задач, и смысла в показателе "загрузка процессора" нет никакого. Хотите меньшего энергопотребления? Вводите периодически МК в SLEEP в основном цикле, если остаётся свободное время. А если МК в реалтайме занят вычислениями и выводом на индикатор, то о какой "загрузке" будет идти речь? Там всегда будет 100% :)

Да, и ещё один нюанс - чтобы посчитать загрузку процессора на ББ, вовсю используются специальные счётчики как внутри ОС, так и внутри самого процессора. В МК таких функций просто не предусмотрено.
Аватара пользователя
Ariadna-on-Line
Это не хвост, это антенна
Сообщения: 1482
Зарегистрирован: Вс май 13, 2012 00:01:54

Re: Индикатор загрузки процессора на микроконтроллере PIC16

Сообщение Ariadna-on-Line »

Вношу ясность: Мне нет пока нужды писАть программу подсчета загруженности PIC или AVR-а. Я инженер-электроник просто хочу постигнуть техническую суть понятия "загруженность процессора", а не какие DLL-ки и API-шки использовать. Зрю, как сказать, в корЕнь. Надо вынести вопрос в другую тему пока модер не попер за флуд. Всё, спасибо всем ответившим.
Аватара пользователя
pioneer1234
Встал на лапы
Сообщения: 109
Зарегистрирован: Вт янв 17, 2012 00:13:14
Откуда: Кременчуг

Re: Индикатор загрузки процессора на микроконтроллере PIC16

Сообщение pioneer1234 »

headshotbacs получилось у вас запустить индикатор загрузки? Нормально работает?
Я собрал а у меня восновном показывает 0 реже проскакивают цифры, хотя в трее закрузка 5-20%
Аватара пользователя
headshotbacs
Вымогатель припоя
Сообщения: 641
Зарегистрирован: Пт ноя 28, 2008 20:34:39
Откуда: Краматорск

Re: Индикатор загрузки процессора на микроконтроллере PIC16

Сообщение headshotbacs »

да, все нормально. может быть что-то с фьюзами.
Изображение
Аватара пользователя
pioneer1234
Встал на лапы
Сообщения: 109
Зарегистрирован: Вт янв 17, 2012 00:13:14
Откуда: Кременчуг

Re: Индикатор загрузки процессора на микроконтроллере PIC16

Сообщение pioneer1234 »

а какие фьюзы должны стоять?
если можна картинку.
Аватара пользователя
headshotbacs
Вымогатель припоя
Сообщения: 641
Зарегистрирован: Пт ноя 28, 2008 20:34:39
Откуда: Краматорск

Re: Индикатор загрузки процессора на микроконтроллере PIC16

Сообщение headshotbacs »

Вот
Изображение
Вложения
pic16f628a.PNG
(12.82 КБ) 1201 скачивание
Изображение
Аватара пользователя
pioneer1234
Встал на лапы
Сообщения: 109
Зарегистрирован: Вт янв 17, 2012 00:13:14
Откуда: Кременчуг

Re: Индикатор загрузки процессора на микроконтроллере PIC16

Сообщение pioneer1234 »

да всё так и стоит.
Может порт настраивать надо?
Аватара пользователя
headshotbacs
Вымогатель припоя
Сообщения: 641
Зарегистрирован: Пт ноя 28, 2008 20:34:39
Откуда: Краматорск

Re: Индикатор загрузки процессора на микроконтроллере PIC16

Сообщение headshotbacs »

вроде не надо, по крайней мере я ничего не делал. вот сейчас глянул скорость 9600 битсек стоит. поставил на максимум, ничего не поменялось. почитай мои посты в начале, может что поможет
Изображение
Аватара пользователя
headshotbacs
Вымогатель припоя
Сообщения: 641
Зарегистрирован: Пт ноя 28, 2008 20:34:39
Откуда: Краматорск

Re: Индикатор загрузки процессора на микроконтроллере PIC16

Сообщение headshotbacs »

попробуй сигнал прям на 7 ногу контроллера подцепить. у меня например с оптопарой никак не хотел работать. потом я ее выбросил и все норм. если просто включить только питание должно быть написано ОФФ, если и там мерцает, то это либо грязный монтаж либо фузы.
Изображение
Аватара пользователя
pioneer1234
Встал на лапы
Сообщения: 109
Зарегистрирован: Вт янв 17, 2012 00:13:14
Откуда: Кременчуг

Re: Индикатор загрузки процессора на микроконтроллере PIC16

Сообщение pioneer1234 »

Без сигнала "OFF" показывает, всё нормально. А если подать сигнал то зажигается 0 во втором сегменте.
Спасибо буду пробывать без оптопары
Аватара пользователя
headshotbacs
Вымогатель припоя
Сообщения: 641
Зарегистрирован: Пт ноя 28, 2008 20:34:39
Откуда: Краматорск

Re: Индикатор загрузки процессора на микроконтроллере PIC16

Сообщение headshotbacs »

может чего-то напутал. ноль в последнем должен быть
Изображение
Аватара пользователя
pioneer1234
Встал на лапы
Сообщения: 109
Зарегистрирован: Вт янв 17, 2012 00:13:14
Откуда: Кременчуг

Re: Индикатор загрузки процессора на микроконтроллере PIC16

Сообщение pioneer1234 »

буду разбиратся
Nix128
Родился
Сообщения: 9
Зарегистрирован: Пн дек 05, 2011 19:05:42

Re: Индикатор загрузки процессора на микроконтроллере PIC16

Сообщение Nix128 »

pioneer1234 писал(а):буду разбиратся
Оптопара нужна для развязки ком сигналов в ттл сигналы.поставь резюк и стабилитрон где-то 4.7 вольта и будет тебе счастье.
4.7 килоома.диод нужен для обрезания -12 вольт присутствующих в сом порту.
Ответить

Вернуться в «Интеграция с ПК»