Hello Jan,

Jan Kromhout writes:

> Hi,
>
> I have this simple Arduino program thats put a PWM signal to port 9 of the 
> Arduino.
> Checked with my RIGOL and the PWM is changed when I change the value of ppm.
>
> #define PWM_A  9 /* Pin-9 on Arduino Board */
>
> void setup() {
>   Serial.begin(115200);
>
>   int pwm = 200;  /* duty 50% */
>   pinMode(PWM_A,  OUTPUT);
>   /* PWM speed is at 20 kHz      */
>   /*Set the timers               */
>   TCCR1A = 0b10100000;
>   TCCR1B = 0b00010001;
>   ICR1 = 400;
>
>   /* value of 400 = 100 % ppm */
>
>   OCR1A = pwm;
> }
>
> void loop() {
> }
>
>
> Convert it to amForth.
>
> \ Address of Timer/Counter Arduino UNO
> \ Adresses are taken from device.py
> \ Partname ATmega328P
>
> $80 constant TCCR1A \ Timer/Counter1 Control Register A
> $81 constant TCCR1B \ Timer/Counter1 Control Register B
> $86 constant ICR1   \ Timer/Counter1 Input Capture Register
> $88 constant OCR1A  \ Timer/Counter1 Output Compare Register A
> $8a constant OCR1B  \ Timer/Counter1 Output Compare Register B
>
> PORTB 1 portpin: PWM_A \ alias for digital pin 9 (PB1)
>
> : PWM_init
>   PWM_A pin_output       \ Set pin 9 (PB1) to output
>   %10100000 TCCR1A c!    \ Store constant
>   %00010001 TCCR1B c!    \ Store constant
>   &400 OCR1A c!           \ Store constant
> ;

400 is larger than 255, so "c!" will not do, what you think.

I have this snippet in my code (check amforth commented projects
clockworks) for your inspiration.

\ enable ticks
\ crystal:   11059200 /sec
\ prescaler: 256
\            43200 /sec
\ TOP+1:     1350
\            32 /sec
: +ticks
  0 ct.ticks        !
  0 ct.ticks.follow !
  0 last.tick[4]    !
  0 last.tick[5]    !

  \ --- timer1 ! ---
  [ %00000000                 \ WGM1[10] CTC mode
    %01000000 or              \ COM1A[10] toggle OC1A on compare match
  ] literal TCCR1A c!
  #1350 1-  OCR1A   !         \ TOP or compare match value rather
  DDRD c@ $80 or DDRD c!      \ pin OC2A output  
  [ %00000100                 \ CS1[210] clock_ts2/256
    %00001000 or              \ WGM1[32] CTC mode
  ] literal TCCR1B c! 
                              \ register isr
  ['] tick_isr TIMER1_COMPAAddr int! 
  TIMSK1 c@ $02 or TIMSK1 c!  \ enable OCIE1A interupt
;

Cheers, Erich



>
> : PWM_set  ( value -- )  \ PWM is between 0..400
>   OCR1A c!               \ Store into OCR1A
> ;
>
>
>> PWM_init
>> 200 PWM_set
>
>
>
> It will not work. What do I wrong.
> Thanks for any help
>
> Cheers,
>
> Jan
>
> _______________________________________________
> Amforth-devel mailing list for http://amforth.sf.net/
> Amforth-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/amforth-devel


-- 
May the Forth be with you ...


_______________________________________________
Amforth-devel mailing list for http://amforth.sf.net/
Amforth-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/amforth-devel

Reply via email to