kopia lustrzana https://github.com/pimoroni/pimoroni-pico
				
				
				
			
		
			
				
	
	
		
			72 wiersze
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
			
		
		
	
	
			72 wiersze
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
| ; --------------------------------------------------
 | |
| ;              32-Channel PWM using PIO
 | |
| ;      by Christopher (@ZodiusInfuser) Parrott
 | |
| ; --------------------------------------------------
 | |
| ;
 | |
| ; Outputs PWM signals to up to 32 pins using a single
 | |
| ; state-machine. This is achieved by representing the
 | |
| ; problem as a sequence of state changes and time delays.
 | |
| ;
 | |
| ; This requires the use of DMA or a very fast loop to
 | |
| ; provide data at a sufficient rate to prevent stalling.
 | |
| ;
 | |
| ; The program pulls in two words:
 | |
| ; - The first is a 32-bit pin mask of the states to
 | |
| ;   change the pins to. Only the pins configured for
 | |
| ;   use by this SM will be affected.
 | |
| ; - The second is the time delay to wait before
 | |
| ;   pulling in the next states.
 | |
| ;
 | |
| ; Each loop of the program takes 5 cycles, including an
 | |
| ; initial 5 cycles when new data is loaded in. As such,
 | |
| ; the time delay should be set to your "intended_delay - 1".
 | |
| ;
 | |
| ; To aid in debugging there is a variant program that uses
 | |
| ; a sideset pin to show when new data is pulled in, as well
 | |
| ; as when each loop has elapsed.These look like:
 | |
| ;
 | |
| ;      New Data                    Loop
 | |
| ;     ._|‾|_._._                |‾.‾.‾.‾|_
 | |
| ;      1 2 3 4 5                 1 2 3 4 5
 | |
| 
 | |
| 
 | |
| ; Debounce Constants
 | |
| ; --------------------------------------------------
 | |
| .define public PWM_CLUSTER_CYCLES     5
 | |
| 
 | |
| 
 | |
| ; PWM Program
 | |
| ; --------------------------------------------------
 | |
| .program pwm_cluster
 | |
| 
 | |
| .wrap_target
 | |
|     pull                    ; Pull in the new pin states
 | |
|     out pins, 32            ; Immediately set the pins to their new state
 | |
|     pull                    ; Pull in the delay counter
 | |
|     out y, 32               ; Set the counter
 | |
| count_check:
 | |
|     jmp y-- delay           ; Check if the counter is 0, and if so wrap around.
 | |
|                             ; If not decrement the counter and jump to the delay
 | |
| .wrap
 | |
| 
 | |
| delay:
 | |
|     jmp count_check [3]     ; Wait a few cycles then jump back to the loop
 | |
| 
 | |
| 
 | |
| ; Debug PWM Program
 | |
| ; --------------------------------------------------
 | |
| .program debug_pwm_cluster
 | |
| .side_set 1
 | |
| 
 | |
| .wrap_target
 | |
|     pull side 0                     ; Pull in the new pin states
 | |
|     out pins, 32 side 1             ; Immediately set the pins to their new state
 | |
|     pull side 0                     ; Pull in the delay counter
 | |
|     out y, 32 side 0                ; Set the counter
 | |
| count_check:
 | |
|     jmp y-- delay side 0            ; Check if the counter is 0, and if so wrap around.
 | |
|                                     ;If not decrement the counter and jump to the delay
 | |
| .wrap
 | |
| 
 | |
| delay:
 | |
|     jmp count_check [3] side 1      ; Wait a few cycles then jump back to the loop |