Современные технологии автоматизации» («СТА») —  журнал для квалифицированных специалистов по промышленной автоматизации Форум СТА — современные технологии автоматизации Домашняя страница
Домашняя страница форума CTA Домашняя страница форума CTA > II. АСУТП и SCADA > Программное обеспечение
  Активные темы Активные темы
  FAQ FAQ  Искать в форуме   Зарегистрироваться Зарегистрироваться  Вход в систему Вход в систему

Помогите состыковать програмный модуль на Ассемблере с UltraLogik

 Ответить Ответить Страница  12>
Автор
Сообщение
Vladimir_V Смотреть выпадающим
Новичок
Новичок


Присоединился: 04 Ноябрь 2005
Категория: Kazakhstan
Online Status: Offline
Публикации: 16
Свойства публикации Свойства публикации   Ответить, цитируя автора - Vladimir_V Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Тема сообщения: Помогите состыковать програмный модуль на Ассемблере с UltraLogik
    Опубликовано: 03 Июль 2006 09:30

Подскажите пожалуйста, где ошибка в программном модуле для UltraLogik16 (программа для сброса Wathcdog Timer)

.386
.model small
.code
STACK segment para use16  stack 'STACK'
 dw 32 dup(?)
STACK ends
SYSTEM SEGMENT byte public 'code' use16
 ASSUME ds:DGROUP, CS:SYSTEM, SS:STACK
RWQ proc near
 push ds
 push ss
 push sp
 push bp
 mov al,13h ; unlock configuration register
 out 22h,al
 mov al,0c5h
 out 23h,al
 mov al,3ch ; reset timer
 out 22h,al
 in al,23h
 or al,01000000b
 out 23h,al
 mov al,13h ; luck configuration register
 out 22h,al
 mov al,00
 out 23h,al
 pop bp
 pop sp
 pop ss
 pop ds
 retn
RWQ endp
SYSTEM ends
 end RWQ

Запуск программы на UltraLogik с программным модулем сброса Watchdog Timer приводит к зависанию контроллера - черный(чуть подсвеченный экран) На клавиатуру (Enter, Alt+Ctrl+Del) не реагирует. Но программный модуль однократно сбрасывает Watchdog (судя по времени перезагрузки).

Наверх
Vel_ Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 25 Апрель 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 116
Свойства публикации Свойства публикации   Ответить, цитируя автора - Vel_ Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 04 Июль 2006 07:36

Посмотри мой пример: http://forum.cta.ru/forum_posts.asp?TID=1743&PN=3

А для какого контроллера подпрограмма?

Vel
Наверх
Vladimir_V Смотреть выпадающим
Новичок
Новичок


Присоединился: 04 Ноябрь 2005
Категория: Kazakhstan
Online Status: Offline
Публикации: 16
Свойства публикации Свойства публикации   Ответить, цитируя автора - Vladimir_V Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 04 Июль 2006 11:15
Контроллер ICOP-6021 (на чипе M6117D, совместимый 386SX CPU)
Наверх
AlexZ Смотреть выпадающим
Участник
Участник


Присоединился: 27 Апрель 2005
Категория: Ukraine
Online Status: Offline
Публикации: 81
Свойства публикации Свойства публикации   Ответить, цитируя автора - AlexZ Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 04 Июль 2006 15:07

Первоначально опубликовано Vladimir_V

Контроллер ICOP-6021 (на чипе M6117D, совместимый 386SX CPU)

Не делайте lock в конце процедуры. Потому что другие библиотеки, которые обращаются к системным регистрам (например GPIO), делают unlock и все. Поэтому, если вы вызываете в таком порядке:

1) GPIO_Init

2) Watch_Dog_Init

3) InGpio - подвесит программу

AlexZ
Наверх
Vladimir_V Смотреть выпадающим
Новичок
Новичок


Присоединился: 04 Ноябрь 2005
Категория: Kazakhstan
Online Status: Offline
Публикации: 16
Свойства публикации Свойства публикации   Ответить, цитируя автора - Vladimir_V Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 05 Июль 2006 08:21

Сделал модуль без блокировки регистра конфигураций (Lock configuration register). Та же самая проблема. GPIO не используется.

Похоже, что программный модуль не стыкуется с UltraLogik16 

Наверх
AlexZ Смотреть выпадающим
Участник
Участник


Присоединился: 27 Апрель 2005
Категория: Ukraine
Online Status: Offline
Публикации: 81
Свойства публикации Свойства публикации   Ответить, цитируя автора - AlexZ Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 05 Июль 2006 11:06

Вот мой кусок кода для программы для ICOP 6015, основная часть написана на C++.

        .286
        .model large,C
        .code
  public wd_init, wd_reset, wd_unhook

read_cr proc near  ; на входе al = адрес, на выходе al - знач.
  out 22h,al
  jmp $+2
  in al,23h
  jmp $+2
  retn
read_cr endp

write_cr proc near    ; на входе al = адрес, ah - знач.
  out 22h,al
  jmp $+2
  xchg al,ah
  out 23h,al
  jmp $+2
  retn
write_cr endp

wd_init proc
  cli
; disable wd
  mov ax,37h
  call read_cr
  and al,0BFh
  mov ah,37h
  xchg ah,al
  call write_cr
; set counter 4 sec
  mov ax,023Bh
  call write_cr
  mov ax,3Ah
  call write_cr
  mov ax,39h
  call write_cr
; set action to reset
  mov ax,38h
  call read_cr
  and al,0Fh
  or al,0D0h
  mov ah,38h
  xchg ah,al
  call write_cr
; enable wd
  mov ax,37h
  call read_cr
  or al,40h
  mov ah,37h
  xchg ah,al
  call write_cr
  sti
  ret
wd_init endp

wd_reset proc
  pushf
  cli
  mov ax,3Ch
  call read_cr
  or al,40h
  mov ah,3Ch
  xchg ah,al
  call write_cr
  popf
  ret
wd_reset endp

wd_unhook proc
  pushf
  cli
; disable wd
  mov ax,37h
  call read_cr
  and al,0BFh
  mov ah,37h
  xchg ah,al
  call write_cr
  popf
  ret
wd_unhook endp

AlexZ
Наверх
AlexZ Смотреть выпадающим
Участник
Участник


Присоединился: 27 Апрель 2005
Категория: Ukraine
Online Status: Offline
Публикации: 81
Свойства публикации Свойства публикации   Ответить, цитируя автора - AlexZ Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 05 Июль 2006 18:18
Еще подумал и пришла следующая мысль: попробуйте сделать так, чтобы при создании исполнительного модуля также создавался .map файл (результат компоновки) и опубликуйте этот файл. Тогда, что-то можно будет сказать.
AlexZ
Наверх
Vladimir_V Смотреть выпадающим
Новичок
Новичок


Присоединился: 04 Ноябрь 2005
Категория: Kazakhstan
Online Status: Offline
Публикации: 16
Свойства публикации Свойства публикации   Ответить, цитируя автора - Vladimir_V Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 06 Июль 2006 14:00

Программа сделанная под DOS работает:
.386
.model small
.code
StacK   SEGMENT PARA STACK 'STACK'
        DB 32 DUP (?)
Stack   ends
SYSTEM SEGMENT byte public 'code' use16
 ASSUME CS:SYSTEM, SS:stack
RWQ proc near
        push ds
        sub ax,ax
        push ax
        mov al,13h ; unlock configuration register
        out 22h,al
        mov al,0c5h
        out 23h,al
        mov ax,03c3ch ; reset timer
        out 22h,al
        in al,23h
        or al,40h
        xchg ah,al
        out 22h,al
        xchg ah,al
        out 23h,al
        mov al,13h
        out 22h,al
        mov al,000h
        out 23h,al
        nop
        retn
        RWQ endp
SYSTEM  ends
        end RWQ
       
Аналогичная программа для Ultralogik (немного переделал сброс timer):
.386
.model small
.code
StacK   SEGMENT PARA STACK 'STACK'
        DB 32 DUP (?)
Stack   ends
SYSTEM SEGMENT byte public 'code' use16
 ASSUME CS:SYSTEM, SS:stack
        public RWQ
RWQ     proc near
        push ax
        push ds
        push ss
        push sp
        push bp
        mov al,13h ; unlock configuration register
        out 22h,al
        mov al,0c5h
        out 23h,al
        mov ax,03c3ch ; reset timer
        out 22h,al
        in al,23h
        or al,40h
        xchg ah,al
        out 22h,al
        xchg ah,al
        out 23h,al
        mov al,13h ; lock configuration register
        out 22h,al
        mov al,000h
        out 23h,al
        nop
        pop bp
        pop sp
        pop ss
        pop ds
        pop ax 
        retn
        RWQ endp
SYSTEM  ends
        end RWQ
вешает контроллер: т.е. при запуске исполняемой программы (UL) Wathdog Timer однократно сбрасывается и по истечении времени Wathdog Timer контроллер перезагружается.

RWQ.map содержит следующее:
 Start  Stop   Length Name               Class

 00000H 00000H 00000H _TEXT              CODE
 00000H 0002CH 0002DH SYSTEM             CODE
 00030H 00030H 00000H _DATA              DATA
 00030H 0004FH 00020H STACK              STACK

Program entry point at 0000:0000

Наверх
AlexZ Смотреть выпадающим
Участник
Участник


Присоединился: 27 Апрель 2005
Категория: Ukraine
Online Status: Offline
Публикации: 81
Свойства публикации Свойства публикации   Ответить, цитируя автора - AlexZ Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 07 Июль 2006 10:37

 1) Думаю нужно не <.386>, а <.286>

 2) сегмент стека не нужен - он в основной программе (assume оставьте только для кода).

 3) Вызывает сомнение модель small, т.к. скорей всего вся программа выполнена в модели large

 4) оставьте только push ax и pop ax!!!

AlexZ
Наверх
AlexZ Смотреть выпадающим
Участник
Участник


Присоединился: 27 Апрель 2005
Категория: Ukraine
Online Status: Offline
Публикации: 81
Свойства публикации Свойства публикации   Ответить, цитируя автора - AlexZ Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 07 Июль 2006 10:38
Ах да. Я уже вам писал не делайте lock config register!
AlexZ
Наверх
 Ответить Ответить Страница  12>

Переход на форум Права доступа на форуме Смотреть выпадающим

Bulletin Board Software by Web Wiz Forums® version 9.64
Powered by Web Wiz Forums Free Express Edition
Copyright ©2001-2009 Web Wiz