Страница 1 из 8 123 ... Последняя
Показано с 1 по 20 из 154

Тема: Знактокам MC68HC908 или перенос программы с одного ОМК на другой.

  1. #1
    Новичок
    Автор темы
    Аватар для Wladimir_TS
    Регистрация
    25.01.2010
    Адрес
    Россия
    Сообщений
    77

    По умолчанию Знактокам MC68HC908 или перенос программы с одного ОМК на другой.

    Вот нашел я себе "интересное и увлекательное" занятие - а именно задался идеей перенести программу с одного ОМК на другой, а заодно в них разобраться.

    Исходный текст программы на языке ассемблера, под неведомый компилятор есть для MC68HC908GP32, а перенести хочу на ATMega32A

    Имеется аппаратный внутрисхемный отладчик JTAG ICE-2. Среда AVRStudio 4.13

    Буду сюда выкладывать вопросы свои. Пока основные по собственно ассемблеру Моторолловского изделия. Собственно что что значит в мнемонике.

    Вот первый :
    "
    Код:
    xScrTab	fcb	255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0
    	fcb	1,1,1,1,1,1,1,1,2,2,2,2,2,2,2
    	fcb	2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1
    	fcb	0,0,0,0,0,0,0,0,255,255,255,255,255,255,255
    ;
    YScrTab	fcb	250,252,254,0,2,4,6,8,8,6,4,2,0,254,252,250
    	fcb	250,252,254,0,2,4,6,8,8,6,4,2,0,254,252
    	fcb	250,252,254,0,2,4,6,8,8,6,4,2,0,254,252,250
    	fcb	250,252,254,0,2,4,6,8,8,6,4,2,0,254,252
    ;
    ScrTabL	equ	*-YScrTab
    "

    Чему будет или должна быть равна переменная ScrTabL для использования при сравненении ?

    Код:
    	lda	ScrX
    	cmp	#ScrTabL

  2. #2
    Завсегдатай Аватар для Openreel
    Регистрация
    02.09.2006
    Адрес
    Санкт-Петербург
    Возраст
    49
    Сообщений
    3,163

    По умолчанию Re: Знактокам MC68HC908 или перенос программы с одного ОМК на другой.

    Цитата Сообщение от Wladimir_TS Посмотреть сообщение
    что что значит в мнемонике.
    refmanual на этот вопрос содержит исчерпывающий ответ. И на 99.9999% последующих вопросов.

    Симулятор на сей камень(архитектуру) не помешает. Оно древнее как мамонт, симулятор должен быть.
    WBR, Michael.
    Цель расчетов - понимание, а не числа (с) Хемминг.

  3. #3
    Новичок
    Автор темы
    Аватар для Wladimir_TS
    Регистрация
    25.01.2010
    Адрес
    Россия
    Сообщений
    77

    По умолчанию Re: Знактокам MC68HC908 или перенос программы с одного ОМК на другой.

    Не сыскал - вообще кроме даташита и кусков какого-то русскоязычного курса ранне 2000х не сыскал ничего.

    А еще почему-то у меня не работает команды ATMega LPM и LPM Rхх, Z

    Заношу в R30 младший байт адреса, в R31 старший - а читает с какого-то адреса меньше, так как дальше за читаемой ячейкой одни FFh

    Отладчик показывает корректный адрес в R30, R31

    И еще момент - одну подпрограмму вынес в отдельный ASM файл и его командой .include "ххх.asm" подключил.
    При вызове подпрограммы - отрабатывает переход нормально, а вот возврат идет по нулевому адресу.

    Причем при начальном запуске программы указатель стоит на RET этой подпрограммы а не на нулевом адресе.
    Последний раз редактировалось Wladimir_TS; 30.01.2023 в 18:28.

  4. #4
    Завсегдатай Аватар для Openreel
    Регистрация
    02.09.2006
    Адрес
    Санкт-Петербург
    Возраст
    49
    Сообщений
    3,163

    По умолчанию Re: Знактокам MC68HC908 или перенос программы с одного ОМК на другой.

    Цитата Сообщение от Wladimir_TS Посмотреть сообщение
    Не сыскал
    Навалом по 68хх в инете, тоннами лежит.
    M68HC05TB.pdf
    WBR, Michael.
    Цель расчетов - понимание, а не числа (с) Хемминг.

  5. #5
    Завсегдатай Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,577

    По умолчанию Re: Знактокам MC68HC908 или перенос программы с одного ОМК на другой.

    Недавно перегонял свой асм-овский код с PIC16 на ATMega88. Причём это был первый или второй опыт вообще на Атмегах. И ничего, пашет. Леонид кое-что подсказывал, конечно.

  6. #6
    Новичок
    Автор темы
    Аватар для Wladimir_TS
    Регистрация
    25.01.2010
    Адрес
    Россия
    Сообщений
    77

    По умолчанию Re: Знактокам MC68HC908 или перенос программы с одного ОМК на другой.

    Цитата Сообщение от Openreel Посмотреть сообщение
    Навалом по 68хх в инете, тоннами лежит.
    Я искал на конкретный процессор - но в данном документе я утону и изучать его придется лет 5. Все-ж актуальнее спросить тех, кто к нему хоть какое дело имел. Так как таблицу команд я расписал - и что делается в программе в общем случае понятно. А вот специфика описания в конкретном компиляторе (я даже не ведаю, что это за компилятор) мне непонятна и тоже тут прямо информации не найти.

    Второй вопрос - как в ATMega организовать таблицу данных в памяти программ и корректно выбирать из неё данные. При условии известности адреса первого байта и величина смещения от начала.

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    кое-что подсказывал, конечно.
    Вот это вот ключевое - без подсказок тяжко - очень большой объем информации и всё на импортных языках, которые очень тяжко переводятся. Вроде что написано понятно но в совокупности бред полный получается.

  7. #7
    Завсегдатай Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,577

    По умолчанию Re: Знактокам MC68HC908 или перенос программы с одного ОМК на другой.

    Если исходник на ассемблере, то описание команд семейства годится.

    ---------- Сообщение добавлено 19:36 ---------- Предыдущее сообщение было 19:34 ----------

    У вас семейство 08 вроде. Описание на 05 семейство может быть близко, если не совпадает.

  8. #8
    Завсегдатай Аватар для Openreel
    Регистрация
    02.09.2006
    Адрес
    Санкт-Петербург
    Возраст
    49
    Сообщений
    3,163

    По умолчанию Re: Знактокам MC68HC908 или перенос программы с одного ОМК на другой.

    Цитата Сообщение от Wladimir_TS Посмотреть сообщение
    и всё на импортных языках, которые очень тяжко переводятся.
    Надо учить язык. Без вариантов, поскольку документ на 300 страниц в программерской профессии - ни о чем, так, мелкая записка. Придется читать несравнимо больше.
    Цитата Сообщение от Wladimir_TS Посмотреть сообщение
    Я искал на конкретный процессор
    А надо было на семейство. И для начала можно на более раннее семейство, если документ лучше или доступней. Потом только мелкие отличия выяснять.

    Цитата Сообщение от Wladimir_TS Посмотреть сообщение
    я даже не ведаю, что это за компилятор
    От рождения никто не ведал. Придется попробовать разных.
    WBR, Michael.
    Цель расчетов - понимание, а не числа (с) Хемминг.

  9. #9
    Завсегдатай Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,577

    По умолчанию Re: Знактокам MC68HC908 или перенос программы с одного ОМК на другой.

    Пришлите мне в личку кусок исходника (если он на моторолловском ассемблере) строк на 100...200. Интересно стало. Переведу себе на PIC. Потом и на атмеловский попробую.

  10. #10
    Новичок
    Автор темы
    Аватар для Wladimir_TS
    Регистрация
    25.01.2010
    Адрес
    Россия
    Сообщений
    77

    По умолчанию Re: Знактокам MC68HC908 или перенос программы с одного ОМК на другой.

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Если исходник на ассемблере, то описание команд семейства годится.
    Это всё уже подготовлено. Тут вопрос по вспомогательным командам и описаниям конкретного компилятора. Собственно - вопрос стоял - чему будет равна константа - похоже она 8ми разрядная - значит не полный адрес, а что тогда ?

    Цитата Сообщение от Openreel Посмотреть сообщение
    Надо учить язык. Без вариантов, поскольку документ на 300 страниц в программерской профессии - ни о чем, так, мелкая записка.
    Таки я не программист вообще ни разу, я только вот попробовать захотел, для себя, для саморазвития. А языки - увы не мое - сколько не учил - толку почти ноль. Собственно просто переношу код, алгоритмов не изобретая и то хрень выходит полосатая. Перенесено 1,7% без учета таблиц.

    Цитата Сообщение от Openreel Посмотреть сообщение
    От рождения никто не ведал. Придется попробовать разных.
    Так тут актуален симулятор в сборе. Что-б симотреть как оно какие записи во что преобразовывает, но вот в AVR студии например хрень полная - адрес есть в регистре -смотрим память, смотрим по адресу - оно, читаем память - фигня читается.

    ---------- Сообщение добавлено 21:50 ---------- Предыдущее сообщение было 21:48 ----------

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    Пришлите мне в личку кусок исходника
    Механизм отправки ? Так как исходная программа опенсоурсная - то её не проблема отправить и целиком. Как архив прикрепить (исходный сайт из США недоступен). Всего 189 кБ в 18 файлах. Могу тут опубликовать - но как убрать под спойлеры.

    Вот пробую (надеюсь не пристрелят за размер сообщения). Головной файл.

    Код:
    ;       main.asm        SC200C Scope Clock program
    ;
    ; Copyright (C) 2008 David Forbes
    ;
    ; This program is free software; you can redistribute it and/or modify
    ; it under the terms of the GNU General Public License as published by
    ; the Free Software Foundation; either version 2 of the License, or
    ; (at your option) any later version.
    ;
    ; This program is distributed in the hope that it will be useful,
    ; but WITHOUT ANY WARRANTY; without even the implied warranty of
    ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    ; GNU General Public License for more details.
    ;
    ; --------------------- Version info -----------------------
    ;
    ; V 1.00  4/07/08 DF  Initial release
    ;
    ; THINGS TO DO
    ;
    ; Add early blank in DoSeg if SegTime < 6
    ;
    ;----------------------- Description -----------------------
    ;
    ; Target CPU: MC68HC908GP32
    ; Clock speed: 19.6608 MHz pin, 4.9152 MHz execution
    ;
    ; Basic description
    ;
    ; The scope clock uses circles to display the time.
    ; The circle generator is an AD7304 wired as an X,Y position DAC
    ; and a sin/cos multiplying DAC. The sin and cos may be cos,cos
    ; or cos,-cos to make positive or negative slope lines instead of
    ; circles.
    ; The quad DAC is loaded by the SPI port.
    ; Arcs are made by means of an octant blanking circuit. It*s driven
    ; from Port B, one octant per bit. A bit of 1 is drawn, 0 is blank.
    ;
    ; Timekeeping
    ;
    ; The timebase is Timer 2 interrupt set to 300 Hz. This is divided
    ; by 5 or 6 depending on locale. This synchronizes display to mains,
    ; resulting in a stable image.
    ;
    ; Draw list
    ;
    ; Text display is done with a draw list of ASCII character codes.
    ; The clock displays are draw lists with their text strings modified
    ; by the timekeeping code.
    ;
    ; All text strings are centered in the display for best appearance.
    ;
    ; The draw list contains one or more entries per line of text. Each
    ; string is a zero-terminated string of ASCII characters. The last string
    ; on each line contains a NL before the 0. The draw list contains
    ; the X,Y start position of the string, the scale factor, the text
    ; pointer, and code pointer in case it*s a menu or field item.
    ;
    ; There are non-text draw list items as well. These are things such
    ; as clock face markers, outlines, etc.
    ;
    ; The Center routine centers the text items in X and Y
    ; on a line-by-line basis.
    ;
    ; A draw list is copied to RAM so that the display code can
    ; pre-calculate the X,Y start position of each line and update the
    ; menu item selection status.
    ;
    $INCLUDE        "gp32.asm"      ; CPU hardware bit assignments
    $INCLUDE        "defs.asm"      ; our bit assignments and constants
    $INCLUDE        "ramvars.asm"   ; RAM variable assignments
    ;
    ; Rx int vector
    ;
            org     SCIRVEC         ; SCI Rx ready int vector
            fdb     RxISR
    ;
    ; timer interrupt vector
    ;
            org     T2OVEC
            fdb     JifISR          ; timer int service routine addr
    ;
    ; 1PPS on IRQ interrupt vector
    ;
            org     IRQVEC
            fdb     PpsISR          ; 1PPS int service routine addr
    ;
    ; reset vector
    ;
            org     resvec
            fdb     Start
    ;
    ; ---------------------------- Initialization -----------------------------
    ;
    ; The reset vector points here
    
            org     ROM
    Start   equ     *               ;Start label
    
            ldhx    #$0240          ; Put stack in page 2 of RAM
            txs                     ;SP <- (H:X) - 1
    ;
    ; Set up System Clock to use OSC1 input of 19.6608 MHz
    ; internally divided by two for 9.8304 MHz CPU bus frequency
    ;
            bclr    PLLON,PCTL      ;Turn off PLL
            mov     #$03,CONFIG2    ;OSCSTOPEN, SCIBDSRC
            mov     #$07,CONFIG1    ;SSREC, enable STOP, disable COP
    ;
    ; Initialize port registers
    ;
            mov     #$00,PTA        ;Zero Port A
            mov     #$00,PTB        ;Zero Port B
            mov     #$10,PTC        ;Set PTC4 to enable display power
            mov     #$00,PTD        ;Zero Port D
            mov     #$01,PTE        ;Zero Port E, Tx marking
    ;
    ; Set port direction bits as needed
    ;
            mov     #PADir,DDRA     ;Make Port A inputs
            mov     #PBDir,DDRB     ;Make Port B outputs
            mov     #PCDir,DDRC     ;Make Port C outputs
            mov     #PDDir,DDRD     ;Make Port D outputs
            mov     #PDDir,DDRE     ;Make Port E outputs, RxD input
    
            mov     #$7E,PTAPUE     ; pull up encoder and button inputs
            mov     #$00,PTCPUE
            mov     #$00,PTEPUE
    
    ; Initialize RAM storage
    
            lda     #$100-RAM
            ldx     #RAM
            clrh
    ClrLoop clr     ,x              ; clear all of RAM to avoid surprises
            incx
            deca
            bne     ClrLoop
    
            mov     #60,Hertz       ; assume 60 Hz for us Americans
            mov     #5,JifTick
            mov     #30,HalfSec
            mov     #20,Century
            mov     #8,Years
            mov     #1,Mons         ; set date to 2008/01/01
            mov     #1,Days
            mov     #$45,rn1        ; random number seed
            mov     #$45,rn2        ; random number seed
            mov     #$45,rn3        ; random number seed
            mov     #$45,rn4        ; random number seed
            mov     #NL,FlwStr+4    ; give newline to FLW 
            jsr     MakeFLW         ; make a four letter word
            ldhx    #TimeString
            sthx    SrcPtr
            ldhx    #TimeStr        ; initialize TimeStr from ROM
            sthx    DestPtr
            jsr     CopyIt
            ldhx    #DateString
            sthx    SrcPtr
            ldhx    #DateStr        ; initialize DateStr from ROM
            sthx    DestPtr
            jsr     CopyIt
            ldhx    #ZoneString
            sthx    SrcPtr
            ldhx    #ZoneStr        ; initialize ZoneStr from ROM
            sthx    DestPtr
            jsr     CopyIt
            jsr     InitEnc         ; initialize encoder history
            cli                     ; enable interrupts in status register
    ;
    ; start the SPI port
    ;
            mov     #$38,SPCR       ; init SPI master no ints
            mov     #$00,SPSCR      ; set baud rate
            mov     #$3A,SPCR       ; enable SPI
    ;
    ; Timer 2 setup for timekeeping at 300 Hz overflow interrupt
    ;
    ; Set to use bus clock for input, prescale to 1, modulo 8192.
    ;
            mov     #$40,T2SC               ; enable count, OF int, prescaler=1
            mov     #$40,T2MODH             ; Set Modulo to 16384
            mov     #$00,T2MODL             ; TIM2 Counter Modulo Register Low
            mov     #$00,T2SC0              ; TIM2 Channel 0 Status and Control Register
            mov     #$00,T2CH0H             ; TIM2 Channel 0 Register High
            mov     #$00,T2CH0L             ; TIM2 Channel 0 Register Low
            mov     #$00,T2SC1              ; TIM2 Channel 1 Status and Control Register
            mov     #$00,T2CH1H             ; TIM2 Channel 1 Register High
            mov     #$00,T2CH1L             ; TIM2 Channel 1 Register Low
    ;
    ; Serial init code
    ;
            ldhx    #RxBuf                  ; initialize Rx FIFO pointers
            sthx    RxIPtr
            sthx    RxOPtr
            clr     RxCnt
            mov     #$40,SCC1               ; enable the serial port
            mov     #$2C,SCC2               ; enable Rx, Tx, Rx int, 8-N-1
            mov     #$00,SCC3               ; no error ints
            mov     #$22,SCBR               ; 4800 baud
    ;
    ; Display a splash screen till knob moved or pushed
    ;
            ldhx    #Splash         ; point to the currently selected draw list
            sthx    SrcPtr
            ldhx    #DrList         ; copy draw list to RAM
            sthx    DestPtr
            jsr     CopyIt
            jsr     Center          ; center all the strings on screen
    SplLoop jsr     DoEnc           ; read encoder wheel
            jsr     DoButt          ; read encoder pushbutton
            brset   InButt,MenuFlg,Main     ; if button, go to main loop
            tst     EncDir
            bne     Main            ; if knob turned, go to main loop
            jsr     DoList          ; display the draw list
    
    WaitSpl wait                    ; synchronize to 60 Hz to stop screen wiggling
            brclr   GotJifI,Time,WaitSpl    ; did we get timer int (instead of 1PPS int)?
            bclr    GotJifI,Time    ; arm for next test
            bra     SplLoop
    ;
    ; --------------------------- Main loop --------------------------
    ;
    ; Before displaying anything, set up the draw list.
    ;
    Main    clr     EncDir          ; reset encoder motion for next time
            bclr    InButt,MenuFlg  ; use up button press
            ldhx    #MainMenu       ; Start with the main menu
            sthx    TheList
            lda     #1              ; point to first menu entry
            sta     HotItem
            bset    InMenu,MenuFlg  ; start in a menu
            jsr     InitEnc         ; initialize encoder history
    MainLp  jsr     DoEnc           ; read encoder wheel
            jsr     DoButt          ; read encoder pushbutton
            brclr   InMenu,MenuFlg,DoClock  ; if not in menu, don*t do it!
            bsr     DoMenus         ; process menu selections
            bclr    InButt,MenuFlg  ; use up button press
            clr     EncDir          ; reset encoder motion for next time
            bra     MenuDon
    DoClock tst     EncDir          ; display clock face choice
            beq     NoClkSw         ; if knob not turned, don*t switch clock mode
            jsr     ModClk
            clr     EncDir
    NoClkSw clrh
            lda     Clock
            lsla                    ; index into clock list with Clock*2
            tax
            lda     ClkList,x
            sta     TheList         ; store as the draw list
            lda     ClkList+1,x
            sta     TheList+1
            tst     Clock
            bne     NoHands         ; Look, Ma, no hands!
            jsr     DrawClk         ; draw analog clock hands
    NoHands brclr   InButt,MenuFlg,MenuDon  ; if button pushed, enter maim menu
            ldhx    #MainMenu       ; initialize main menu
            sthx    TheList
            lda     #1              ; point to first menu entry
            sta     HotItem
            bset    InMenu,MenuFlg  ; start in a menu
    MenuDon ldhx    TheList         ; point to the currently selected draw list
            sthx    SrcPtr
            ldhx    #DrList         ; copy draw list to RAM
            sthx    DestPtr
            jsr     CopyIt
            jsr     DoGPS           ; read GPS receiver and parse time string
            jsr     MakeTim         ; fill in the time strings with current time
            jsr     Center          ; center all the strings on screen
            jsr     DoList          ; display the draw list
    WaitMor wait                    ; synchronize to mains to stop screen wiggling
            brclr   GotJifI,Time,WaitMor    ; not jiffy int, wait again
            bclr    GotJifI,time    ; arm for next test
            bset    Probe,PTD       ; toggle probe to trigger scope
            bclr    Probe,PTD
            brset   PwrGood,PTC,MainLp      ; do it until power goes off
    ;
    ; Power went down - turn off outputs to analog stuff, wait till 12V restored
    ;
            mov     #00,DDRC        ; turn off port C outputs to DAC
            mov     #00,DDRD        ; turn off port D outputs to DAC, kills PSON too
    PDownLp brclr   PwrGood,PTC,PDownLp     ; wait for power to return
            mov     #PCDir,DDRC     ; Make Port C outputs
            mov     #PDDir,DDRD     ; Make Port D outputs
            jmp     MainLp          ; go back to displaying things
    ;
    ; -------------------------- Menu navigation -----------------------
    ;
    ; DoMenus acts on the encoder to change which menu we*re in or
    ; adjust a parameter setting. It uses the information placed in
    ; the menu variables by DoList.
    ; It changes TheList and HotItem and the flag InParam.
    ; When it needs to process a parameter or menu item, it calls MenuCod.
    ;
    ; Logic:
    ; If in a parameter field, enter parameter-changing mode by pushing button
    ; If changing parameter and button pushed, goto next field
    ; If in a menu item and encoder moves, move up or down to next item
    ; If in a menu item and button pushed, execute its menu code
    ; If not in a menu at all and encoder moves, change display mode
    ;
    DoMenus brclr   InField,MenuFlg,NoField ; if in a field
            tst     EncDir                  ; Any encoder action?
            beq     NoFEnc                  ; no, check button
            brclr   InParam,MenuFlg,NoFPar  ; param mode?
            ldhx    MenuCod
            jsr     ,x                      ; execute menu code
            rts
    NoFPar  jsr     ModMenu                 ; else, modify menu
            rts
    NoFEnc  brclr   InButt,MenuFlg,NoFButt  ; if button pressed
            brclr   InParam,MenuFlg,NoBPar  ; if param mode
            jsr     IncHot                  ; move to next field
            rts
    NoBPar  bset    InParam,MenuFlg         ; else set param mode
    NoFButt rts
    NoField brclr   InMenu,MenuFlg,NoMenu   ; else if in a menu
            brclr   InButt,MenuFlg,NoMButt  ; if button pressed
            ldhx    MenuCod
            jsr     ,x                      ; execute menu code
            rts
    NoMButt tst     EncDir                  ; Any encoder action?
            beq     NoMEnc
            jsr     ModMenu                 ; yes, apply to menu hot item
    NoMEnc  rts                             ; done with menu
    
    NoMenu  ; navigate display screens from encoder
            tst     EncDir                  ; Any encoder action?
            beq     NoDEnc                  ; no, check button
    NoDEnc  rts
    ;
    ; -------------------------- Other files ------------------------------
    ;
    $INCLUDE        "sio.asm"       ; Code to talk to serial port
    $INCLUDE        "center.asm"    ; Code to center the text in screen
    $INCLUDE        "draw.asm"      ; Code to draw lists etc. on screen
    $INCLUDE        "analog.asm"    ; Code to draw analog clock hands on screen
    $INCLUDE        "mod.asm"       ; Code to modify parameter fields
    $INCLUDE        "time.asm"      ; Code to keep track of time
    $INCLUDE        "encoder.asm"   ; Code to follow rotary encoder/button
    $INCLUDE        "gps.asm"       ; Code to configure and parse GPS receiver data
    $INCLUDE        "drawlist.asm"  ; the draw lists, menus, strings, etc.
    $INCLUDE        "font.asm"      ; ASCII character font in 12x20 proportional
    $INCLUDE        "fourletter.asm" ; Code to make four letter words
    $INCLUDE        "flwcommon.asm" ; A dictionary of boring four letter words

  11. #11
    Завсегдатай Аватар для Openreel
    Регистрация
    02.09.2006
    Адрес
    Санкт-Петербург
    Возраст
    49
    Сообщений
    3,163

    По умолчанию Re: Знактокам MC68HC908 или перенос программы с одного ОМК на другой.

    Цитата Сообщение от Wladimir_TS Посмотреть сообщение
    Собственно - вопрос стоял - чему будет равна константа - похоже она 8ми разрядная - значит не полный адрес, а что тогда ?
    Это ScrTabL equ *-YScrTab?
    Судя по названию и логике - это способ узнать размер таблицы в байтах. Надо смотреть синтаксис конкретного ассемблера(компилятора).
    Цитата Сообщение от Wladimir_TS Посмотреть сообщение
    Как архив прикрепить
    Положить на яндекс диск например.
    WBR, Michael.
    Цель расчетов - понимание, а не числа (с) Хемминг.

  12. #12
    Новичок
    Автор темы
    Аватар для Wladimir_TS
    Регистрация
    25.01.2010
    Адрес
    Россия
    Сообщений
    77

    По умолчанию Re: Знактокам MC68HC908 или перенос программы с одного ОМК на другой.

    Это старая мечта моя - часы с индикацией на экране ЭЛТ. Хожу вокруг и около уже лет 7, наконец вот давно сделанную плату дососбрал (пока только цифровую часть, но микросхему ЦАП уже достал, не подобрат только "от питания до питания" ОУ, желательно доступный , работающие от +/-5В по 4 в корпусе ДИП)).

    Самое страшное после ПО это БП для ЭЛТ, но и он потихоньку делается на базе ВВ блока от С1-65А (надо добавить ступень умножения для получения +10 кВ/-1700В. Подобран трансформатор для питания накала с подходящей изоляцией 4.700.666 от индикаторов на запоминающих ЭЛТ отечественных АЧХометров и анализаторов спектра.

    ЭЛТ 13ЛО16А добыты с запасом. Там еще есть вопросы про питание сетки - так как в родном для данной трубы С1-74 питание сетки регулируется +/-125В относительно второго анода, а в паспорте на ЭЛТ указывается регулировка 0...-200В относительно второго анода.

  13. #13
    Завсегдатай Аватар для Openreel
    Регистрация
    02.09.2006
    Адрес
    Санкт-Петербург
    Возраст
    49
    Сообщений
    3,163

    По умолчанию Re: Знактокам MC68HC908 или перенос программы с одного ОМК на другой.

    Цитата Сообщение от Wladimir_TS Посмотреть сообщение
    Собственно просто переношу код, алгоритмов не изобретая и то хрень выходит полосатая.
    Шансов на работоспособное мало при таком подходе, точней они стремятся к нулю при сколь нить сложной исходной конструкции. Надо реверсить исходную задачу.
    WBR, Michael.
    Цель расчетов - понимание, а не числа (с) Хемминг.

  14. #14
    Новичок
    Автор темы
    Аватар для Wladimir_TS
    Регистрация
    25.01.2010
    Адрес
    Россия
    Сообщений
    77

    По умолчанию Re: Знактокам MC68HC908 или перенос программы с одного ОМК на другой.

    Цитата Сообщение от Openreel Посмотреть сообщение
    Судя по названию и логике - это способ узнать размер таблицы в байтах. Надо смотреть синтаксис конкретного ассемблера(компилятора).
    Вот и у меня логика в ту сторону смотрит исходя из того что это сравнение для счётчика.

    ---------- Сообщение добавлено 22:09 ---------- Предыдущее сообщение было 22:05 ----------

    Цитата Сообщение от Openreel Посмотреть сообщение
    Шансов на работоспособное мало при таком подходе, точней они стремятся к нулю при сколь нить сложной исходной конструкции. Надо реверсить исходную задачу.
    Я отчасти задачу реверсирую. Например понял что некоторые узлы программы мне пока не нужны и их переносить не требуется - проще поставить "заглушки". Например синхронизация времени по GPS или внешним сигналом 1 Гц. Я потом лучше попытаюсь подключить (она смонтирована) микросхему RTC, но покопавшись в описании контролера TWI/I2C я понял - что то очень сложно - там одних ошибок отрабатывать надо штук 30, даже если только режим ведущего использовать.

    Вот пока не могу на этом Atmel сделать - то чтение таблицы констант из памяти программ. А там этих таблиц очень много. Все знаки прописаны знакогенератора. (там полярная система координат если что) - так что аппаратное черчение окружностей.

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

    Код:
    ;       time.asm        SC200 timekeeping code
    ;
    ; Copyright (C) 2008 David Forbes
    ;
    ; This program is free software; you can redistribute it and/or modify
    ; it under the terms of the GNU General Public License as published by
    ; the Free Software Foundation; either version 2 of the License, or
    ; (at your option) any later version.
    ;
    ; This program is distributed in the hope that it will be useful,
    ; but WITHOUT ANY WARRANTY; without even the implied warranty of
    ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    ; GNU General Public License for more details.
    ;
    ; ------------------------ Timekeeping -----------------------
    ;
    ; This code increments the local time from the jiffy (1/300sec)
    ; all the way to the century. It may be called at several places
    ; as needed, for instance 1PPS starts at the second, GPS needs
    ; day correction, etc. This deals with leap years too.
    ;
    ; JifISR is called by timer at a 300 Hz rate
    ;
    JifISR  pshh                    ; used in screensaver code below
            bclr    TOF,T2SC        ; clear overflow bit
            inc     Jiffies
            lda     Jiffies         ; have enough jiffies gone by to equal one tick?
            cmp     JifTick         ; (this depends on mains frequency)
            bne     NoJifI          ; no, skip
            clr     Jiffies
            bsr     IncTick         ; count up another tick
            bset    GotJifI,Time    ; flag that we saw timer interrupt
    NoJifI  pulh
            rti                     ; return from ISR to main code
    ;
    ; PpsISR is called when 1PPS on com port makes IRQ go low at a 1 Hz rate
    ;
    PpsISR  pshh                    ; to be safe!
            bset    IACK,INTSCR     ; acknowledge interrupt on Irq, re-enable
            bset    IrqOn,Time      ; turn on Irq mode since it*s wiggling
            bsr     IncSecs         ; inc time by one second
            clr     Jiffies
            clr     Ticks           ; put us at the top of the second for hands
            pulh
            rti                     ; return from ISR to main code
    ;
    ; Use timer interrupt to synchronize display to Hertz,
    ; but don*t increment seconds with timer when we have
    ; an atomic clock feeding us 1PPS on Irq.
    ;
    ; IncTick increments the time by one tick (1/Hertz sec)
    ;
    IncTick inc     Blink           ; advance blinking state
            inc     Ticks           ; advance tick count
            lda     Ticks
    FirstH  cmp     Hertz           ; overflow to secs? (depends on mains freq)
            bne     TimeDon
            brset   IrqOn,Time,TimeDon      ; 1PPS mode, let Irq increment seconds
            clr     Ticks           ; don*t clear if 1PPS to prevent backwards twitch
    ;
    ; IncSec increments the time by one second from 1PPS Irq
    ; It handles overflows into the minutes and hours.
    ;
    IncSecs lda     Secs
            and     #3
            bne     NoFLW
            jsr     MakeFLW         ; a new word every four seconds
    NoFLW   inc     Secs
            lda     Secs
            cmp     #60             ; overflow?
            bne     TimeDon
            clr     Secs            ; yes, go to next minute
    
            inc     Mins
            lda     Mins
            cmp     #60             ; overflow?
            bne     TimeDon
            clr     Mins            ; yes, go to next hour
    ;
    ; Once an hour, advance the screensaver to the next position
    ; in the list. This subtly moves the display but spreads out
    ; and phosphor burn over a 4 by 8 pixel area.
    ;
            inc     ScrX            ; bump screensaver index hourly
            lda     ScrX
            cmp     #ScrTabL        ; end of table?
            blt     ScrDon          ; yes, return to start
            clr     ScrX
    ScrDon  clrh
            ldx     ScrX            ; get pointer to screensaver
            lda     XScrTab,x       ; get x offset
            sta     XSaver
            lda     YScrTab,x       ; get y offset
            sta     YSaver
            inc     Hrs             ; bump hours
            lda     Hrs
            cmp     #24             ; past end?
            blt     TimeDon         ; no, skip reset
            clr     Hrs             ; reset hours to 0 o*clock amd...
    ;
    ; Update the calendar as the days drag on
    ;
    IncDays inc     Days            ; bump day of month
            clrh
            ldx     Mons            ; look up days in a month
            lda     Years
            and     #3              ; Is it an even multiple of 4?
            bne     INotLY          ; no, use first part of table
            aix     #12             ; use leap year part
    INotLY  lda     Days            ; get current day
            cmp     NDays,x         ; is it past end of month?
            ble     TimeDon         ; no, skip reset
            mov     #1,Days         ; reset day to 1 and...
    
            inc     Mons            ; bump months
            lda     Mons
            cmp     #12             ; past end?
            ble     TimeDon         ; no, skip reset
            mov     #1,Mons         ; reset month to 1
    
            inc     Years           ; bump years
            lda     Years
            cmp     #100            ; past end?
            blt     TimeDon         ; no, skip reset
            clr     Years           ; reset years to 0
    
            inc     Century         ; bump century
    TimeDon rts                     ; don*t handle overflow (not Y10K compliant!)
    ;
    ; Move backwards in calendar if needed due to GPS -> local conversion
    ; On month borrow, we go to the last day in the previous month
    ;
    DecDays dec     Days            ; unbump day of month
            bne     DecDone         ; still in the same month
            dec     Mons            ; unbump months
            bne     DecYrDn         ; still in same year
            mov     #12,Mons        ; oops, set month to December and
    
            dec     Years           ; unbump years
            bge     DecYrDn         ; Gone back a century?
            mov     #99,Years       ; yes, set years to 99
            dec     Century         ; unbump century
    DecYrDn clrh
            ldx     Mons            ; look up days in the new month
            lda     Years
            and     #3              ; Is it an even multiple of 4?
            bne     DNotLY          ; no, use first part of table
            aix     #12             ; use leap year part
    DNotLY  lda     NDays,x         ; Get last day of month
            sta     Days            ; save as current day
    DecDone rts
    ;
    ; ----------------------- Time string generator -----------------------
    ;
    ; MakeTim fills in the time and date strings in RAM with the
    ; current time in ASCII. The month string pointer is set also.
    ;
    MakeTim brclr   Hr12,Time,Not12M        ; 12/24 hour mode
            lda     #"1"
            sta     HrSelStr
            lda     #"2"
            sta     HrSelStr+1
            bra     Not24M
    Not12M  lda     #"2"
            sta     HrSelStr
            lda     #"4"
            sta     HrSelStr+1
    Not24M  lda     Century         ; do century
            clrh
            ldx     #10
            div                     ; H:A/X -> ArH
            ora     #$30
            sta     KYrs
            pshh
            pula
            ora     #$30
            sta     HYrs
            lda     Years           ; do year
            clrh
            ldx     #10
            div                     ; H:A/X -> ArH
            ora     #$30
            sta     TYrs
            pshh
            pula
            ora     #$30
            sta     UYrs
            lda     Mons            ; do month
            clrh
            ldx     #10
            div                     ; H:A/X -> ArH
            ora     #$30
            sta     TMon
            pshh
            pula
            ora     #$30
            sta     UMon
            lda     Days            ; do day
            clrh
            ldx     #10
            div                     ; H:A/X -> ArH
            ora     #$30
            sta     TDay
            pshh
            pula
            ora     #$30
            sta     UDay            ; Remove leading zero on day of month
            lda     TDay
            cmp     #"0"            ; is it a zero?
            bne     TDnotZ          ; if 10+, don*t do zeading zero work
            lda     UDay            ; move units to first position in string
            sta     TDay
            mov     #NL,UDay        ; turn 2nd digit into term char.
    ;
    ; hours are tricky if 12 hour mode - leading zero is quashed
    ;
    TDnotZ  lda     Hrs             ; do hour
            brclr   Hr12,Time,NotG12H       ; 24 hour mode, skip the insanity
            tsta
            bne     NotZH
            lda     #12             ; zero is 12 o*clock
    NotZH   cmp     #13
            blt     NotG12H         ; map 13-23 to 1-11
            sub     #12
    NotG12H clrh
            ldx     #10
            div                     ; H:A/X -> ArH
            ora     #$30
            sta     THrs
            pshh
            pula
            ora     #$30
            sta     UHrs
            brclr   Hr12,Time,THnotZ        ; skip zeading zero check if 24 hr
            lda     THrs
            cmp     #"0"            ; is it a zero?
            bne     THnotZ          ; if 10-12, don*t do zeading zero work
            lda     UHrs            ; move units to first position in string
            sta     THrs
            clr     UHrs            ; turn 2nd digit into term char.
    THnotZ  lda     Mins            ; do minute
            clrh
            ldx     #10
            div                     ; H:A/X -> ArH
            ora     #$30
            sta     TMins
            pshh
            pula
            ora     #$30
            sta     UMins
            lda     Secs            ; do second
            clrh
            ldx     #10
            div                     ; H:A/X -> ArH
            ora     #$30
            sta     TSecs
            pshh
            pula
            ora     #$30
            sta     USecs
    ;
    ; Make DST string from DST flag byte
    ;
            brclr   0,DST,NotDS     ; select which string to use
            ldhx    #OnStr
            bra     DSDone
    NotDS   ldhx    #OffStr
    DSDone  mov     x+,DSTStr
            mov     x+,DSTStr+1
            mov     x+,DSTStr+2     ; copy it to RAM
            mov     x+,DSTStr+3
    ;
    ; Make timezone strings for hours and minutes
    ;
    ; Range is -12 to +11 and leading zero is quashed
    ;
            lda     #"+"
            sta     ZonSign         ; set zone sign display positive
            lda     Zone            ; get timezone hour
            tsta
            bpl     NotZNeg         ; if GMT+nn, skip this
            nega                    ; make it positive
            psha                    ; save it for now
            lda     #"-"
            sta     ZonSign         ; set zone sign display negative
            pula
    NotZNeg clrh
            ldx     #10
            div                     ; H:A/X -> ArH
            ora     #$30
            sta     TZone
            pshh
            pula
            ora     #$30
            sta     UZone
            lda     TZone
            cmp     #"0"            ; is it a zero?
            bne     ZHnotZ          ; if 10-12, don*t do zeading zero work
            lda     UZone           ; move units to first position in string
            sta     TZone
            clr     UZone           ; turn 2nd digit into term char.
    ZHnotZ  lda     Zmins           ; do minute
            clrh
            ldx     #10
            div                     ; H:A/X -> ArH
            ora     #$30
            sta     TZmin
            pshh
            pula
            ora     #$30
            sta     UZMin
    ;
    ; Make text string for month of year in MonthStr
    ;
            lda     Mons            ; get months to make string pointer
            deca                    ; first entry is month 1 - Jan.
            lsla
            sta     MonthStr        ; save month x 2
            lsla                    ; make month x 4
            add     MonthStr        ; add month x 2 = month x 6
            tax
            clrh
            lda     JanStr,x        ; copy the string to RAM
            sta     MonthStr
            lda     JanStr+1,x      ; this is rather brute-force, but it works
            sta     MonthStr+1
            lda     JanStr+2,x
            sta     MonthStr+2
            lda     JanStr+3,x
            sta     MonthStr+3
            lda     JanStr+4,x
            sta     MonthStr+4
            lda     JanStr+5,x
            sta     MonthStr+5
    ;
    ; Make day of week from date variables
    ;
    ; Peter M. Klausler gives this algorithm on his website.
    ;
    ; For dates in 1900 through 2099, compute the day of the week as follows.
    ;
    ; 1. Subtract 1900.
    ; 2. To that number, add one fourth of itself, discarding any remainder.
    ;    This sum is the year*s skew value
    ; 3. If the month in question is January or February in a leap year,
    ;    subtract 1 from the sum.
    ; 4. Add the date in the month.
    ; 5. Add the month*s skew value from the table
    ; 6. The sum is the number of days after Sunday on which the date falls.
    ;
    GetWDay lda     Century         ; assumes Century>=19
            sub     #19             ; Jan 1 1900 = Sunday
            ldx     #100            ; this will fail in 2156
            mul
            add     Years           ; years since 1900
            sta     WDay
            lsra
            lsra
            add     WDay            ; year * 5 is Jan 1 Sunday cycle period
            sta     WDay            ; save it
            lda     #3
            and     Years
            bne     NotLY           ; check for leap years
            lda     Mons
            cmp     #2              ; Jan or Feb
            bgt     NotLY
            dec     WDay            ; first 2 months of leap year shifted
    NotLY   lda     WDay
            add     Days            ; add in day of month
            sta     WDay
            clrh
            ldx     Mons            ; lookup start day of month
            lda     DayLkUp,x
            add     WDay
            clrh
            ldx     #7              ; take modulo 7
            div
            pshh                    ; remainder is weekday
            pula
            sta     WDay
    ;
    ; Fill WDayStr with the correct string for this weekday
    ;
    MakWDay lda     WDay            ; get numeric weekday
            lsla
            lsla
            lsla                    ; index into 8 byte string table
            tax
            clrh
            lda     SunStr,x        ; copy the string tediously
            sta     WDayStr
            lda     SunStr+1,x
            sta     WDayStr+1
            lda     SunStr+2,x
            sta     WDayStr+2
            lda     SunStr+3,x
            sta     WDayStr+3
            lda     SunStr+4,x
            sta     WDayStr+4
            lda     SunStr+5,x
            sta     WDayStr+5
            lda     SunStr+6,x
            sta     WDayStr+6
            rts
    ;
    ; ----------------------------- Tables -----------------------------
    ;
    ; Number of days in a month
    ;
    ;                 JanFebMarAprMayJunJulAugSepOctNovDec
    NDays   fcb     0,31,28,31,30,31,30,31,31,30,31,30,31   ; normal year
            fcb       31,29,31,30,31,30,31,31,30,31,30,31   ; leap year
    ;
    ; Months of the year - each string is 6 bytes long
    ;
    JanStr  fcb     "Jan",0,0,0
    FebStr  fcb     "Feb",0,0,0
    MarStr  fcb     "March",0
    AprStr  fcb     "April",0
    MayStr  fcb     "May",0,0,0
    JunStr  fcb     "June",0,0
    JulStr  fcb     "July",0,0
    AugStr  fcb     "Aug",0,0,0
    SepStr  fcb     "Sept",0,0
    OctStr  fcb     "Oct",0,0,0
    NovStr  fcb     "Nov",0,0,0
    DecStr  fcb     "Dec",0,0,0
    ;
    ; Position table for screensaver
    ;
    ; This table is 2 * 31 entries long, but has 32
    ; different x-y positions on screen. The display sits
    ; at the first and last positions for one not two hours,
    ; so that movement is obtained every hour.
    ; 31 is a prime number... this ensures that every
    ; hour numeral gets put in every screen position.
    ;
    xScrTab fcb     255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0
            fcb     1,1,1,1,1,1,1,1,2,2,2,2,2,2,2
            fcb     2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1
            fcb     0,0,0,0,0,0,0,0,255,255,255,255,255,255,255
    ;
    YScrTab fcb     250,252,254,0,2,4,6,8,8,6,4,2,0,254,252,250
            fcb     250,252,254,0,2,4,6,8,8,6,4,2,0,254,252
            fcb     250,252,254,0,2,4,6,8,8,6,4,2,0,254,252,250
            fcb     250,252,254,0,2,4,6,8,8,6,4,2,0,254,252
    ;
    ScrTabL equ     *-YScrTab
    ;
    ; Which day of week this month starts on (if Jan 1=Sunday)
    ;
    DayLkUp fcb     0,0,3,3,6,1,4,6,2,5,0,3,5       ; Jan is 1 (ignore zero)
    ;
    ; Weekday strings, leaving out the "day" part
    ; Each is eight bytes long for easy lookup
    ;
    SunStr  fcb     "Sun",0,0,0,0,0
            fcb     "Mon",0,0,0,0,0
            fcb     "Tues",0,0,0,0
            fcb     "Wednes",0,0
            fcb     "Thurs",0,0,0
            fcb     "Fri",0,0,0,0,0
            fcb     "Satur",0,0,0
    Перенесен примерно до подпрограммы "MakeTim", далее я пока не совался. Подпрограмма "DecDays" нужна только для работы с синхронизацией по GPS в теоретическом случае пересечения линии перемены дат. Потому не рассматривалось.

  15. #15
    Завсегдатай Аватар для Openreel
    Регистрация
    02.09.2006
    Адрес
    Санкт-Петербург
    Возраст
    49
    Сообщений
    3,163

    По умолчанию Re: Знактокам MC68HC908 или перенос программы с одного ОМК на другой.

    Цитата Сообщение от Wladimir_TS Посмотреть сообщение
    Вот пробую (надеюсь не пристрелят за размер сообщения). Головной файл.
    все доступно
    http://www.cathodecorner.com/sc200c.html
    WBR, Michael.
    Цель расчетов - понимание, а не числа (с) Хемминг.

  16. #16
    Новичок
    Автор темы
    Аватар для Wladimir_TS
    Регистрация
    25.01.2010
    Адрес
    Россия
    Сообщений
    77

    По умолчанию Re: Знактокам MC68HC908 или перенос программы с одного ОМК на другой.

    У меня не открывается вообще. Но там на сайте была ссылка на Гитхаб вроде. Если она еще сохранилась....

    Естественно в основном файле я проинициализировал порты ВВ, настроил таймер и прерывания. SPI пока не начинал - надо-б сделать узал с ЦАПом - но пока с "производством" ПП у меня полная...нету нормальных принтеров на предприятии - последний, который берег от всех - приказали изъять в пользу отдела у которого свой сломался, а что есть в нашем не годится, у него размеры плавают по площади листа "волнами". На тексте не видно.

  17. #17
    Завсегдатай Аватар для Turbo_man
    Регистрация
    06.04.2010
    Адрес
    Moscow
    Сообщений
    5,577

    По умолчанию Re: Знактокам MC68HC908 или перенос программы с одного ОМК на другой.

    У меня открылась ссылка и скачались исходники со схемой.
    Прикольная оказалась задачка. НО ПОЧЕМУ НА ЭЛТ?

  18. #18
    Новичок
    Автор темы
    Аватар для Wladimir_TS
    Регистрация
    25.01.2010
    Адрес
    Россия
    Сообщений
    77

    По умолчанию Re: Знактокам MC68HC908 или перенос программы с одного ОМК на другой.

    Странно - может со старых операционок/браузеров отлуп даёт. У меня скачано было давно. Частично и грубо переведён текст. Подготовка шла, а тут понял, что если не замучу что-то свое - своей проект, то совсем печаль будет.

    ---------- Сообщение добавлено 22:50 ---------- Предыдущее сообщение было 22:31 ----------

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    НО ПОЧЕМУ НА ЭЛТ?
    Редкая реализация. На просторах РФ вроде как вообще один был проект свой "Злошник" "3ЛОшник" на 3ЛО1И и вроде еще один проект с R2R ЦАПами. Еще человек был из Прибалтики, но похоже у него что-то на этот проект похожее но преработанное вестимо. К сожалению общение с ним на задалось.

  19. #19
    Завсегдатай Аватар для Openreel
    Регистрация
    02.09.2006
    Адрес
    Санкт-Петербург
    Возраст
    49
    Сообщений
    3,163

    По умолчанию Re: Знактокам MC68HC908 или перенос программы с одного ОМК на другой.

    Цитата Сообщение от Turbo_man Посмотреть сообщение
    НО ПОЧЕМУ НА ЭЛТ?
    Красивое!!!!
    Описание глянь, там очень интересный векторный дисплей аппаратно реализован. Заметь - знакогенератор не только линиями, но и дугами рисует.
    WBR, Michael.
    Цель расчетов - понимание, а не числа (с) Хемминг.

  20. #20
    Частый гость Аватар для alex3
    Регистрация
    27.01.2014
    Адрес
    Королёв
    Сообщений
    377

    По умолчанию Re: Знактокам MC68HC908 или перенос программы с одного ОМК на другой.

    Библиотек arduino для управления ЭЛТ не видел. Стоит только этот кусок "перевести" из ассемблера. Всего остального навалом уже написанного и протестированного, и для работы с gps модулями и для работы с разными RTC-чипами.
    Кстати по соотношению цена/функциональность/производительность семейство stm32 привлекательнее выглядит чем ардуины всякие. Может сразу stm32 ?

Страница 1 из 8 123 ... Последняя

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •