9S08QG8 PWM in assembly

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

9S08QG8 PWM in assembly

ソリューションへジャンプ
1,158件の閲覧回数
wolfgangs
Contributor I

Hello everyone, I am trying to program a continuous 100Hz 50% duty cycle signal on pin 16 (TPMCH0) using the 9s08qg8 in assembly.  I am using the internal oscillator (FBI mode) f=16kHz.  I observe some strange behavior.  As soon as power is supplied to the MCU, pin 16 illuminates for about 3.5 seconds at what appears to be full duty.  Even after changing various variables, this behavior continues.  Can anyone help me please?  Thanks.

 

; Include derivative-specific definitions

        INCLUDE 'derivative.inc'

 

; export symbols to be refer. in the linker .prm file

        XDEF _Startup, main

 

        XREF __SEG_END_SSTACK

; symbol defined by the linker for the end of the stack

 

 

; variable/data section

MY_ZEROPAGE: SECTION  SHORT

 

; no variables defined

 

 

; Code section

MyCode: SECTION

 

_Startup:

main:   LDHX  #__SEG_END_SSTACK ; init stack pointer

        TXS

        CLI                     ; enable interrupts

        LDA   #%01110011

        STA   SOPT1

        MOV   #%01000100,ICSC1

        MOV   #%00000000,ICSC2

        MOV   #%00001000,MTIMCLK     ;timer not necessarily used.

        MOV   #62,MTIMMOD     

        MOV   #%00000000,MTIMSC 

           

      MOV   #156,TPMMODL                ;Bus clock / TPMMODL = 15625/156=100Hz

      MOV   #156,TPMC0VL                 ;100% duty, but tried 0-100%

      MOV   #$28,TPMC0SC                ;no interupt, edge aligned, high-true pulse

      MOV   #$08,TPMSC                      ;Edge aligned, no interupt, using bus clock, prescale=1  

LOOP  BRA   LOOP                              ;run forever

      SWI

 

;*****************************************************

;      ROUTINES

;*****************************************************

;timer not necessarily used.

TIMER   BRCLR 7,MTIMSC,TIMER      ;WAIT FOR TOF

        BCLR  7,MTIMSC            ;CLEAR TOF

        RTS


ラベル(1)
0 件の賞賛
返信
1 解決策
936件の閲覧回数
bigmac
Specialist III

Hello,

There would be a problem with your code because you are writing to the low byte only of the 16-bit registers TPMMOD and TPMC0V.  Both bytes require to be written for the new values to take effect.  The following code snippet should achieve 50 percent PWM duty -


   LDHX  #155                ; Bus clock/(TPMMOD+1) = 15625 / 156 = 100Hz

   STHX  TPMMOD

   LDHX  #78                 ; 50% duty

   STHX  TPMC0V

However, I might also expect that your bus frequency will actually be considerably higher than 15.625 kHz.  I suggest that you check your ISC settings.

Regards,

Mac

元の投稿で解決策を見る

0 件の賞賛
返信
2 返答(返信)
937件の閲覧回数
bigmac
Specialist III

Hello,

There would be a problem with your code because you are writing to the low byte only of the 16-bit registers TPMMOD and TPMC0V.  Both bytes require to be written for the new values to take effect.  The following code snippet should achieve 50 percent PWM duty -


   LDHX  #155                ; Bus clock/(TPMMOD+1) = 15625 / 156 = 100Hz

   STHX  TPMMOD

   LDHX  #78                 ; 50% duty

   STHX  TPMC0V

However, I might also expect that your bus frequency will actually be considerably higher than 15.625 kHz.  I suggest that you check your ISC settings.

Regards,

Mac

0 件の賞賛
返信
936件の閲覧回数
wolfgangs
Contributor I

Thanks a lot bigmac!  That is exactly what I needed!

0 件の賞賛
返信