This code pertains to the ATMega320p, but can be easily ported to other microcontrollers. The ability to generate PWM output on non-PWM pins can come in handy, specially if you are working with hardware that is hardwired to the microcontroller leaving you with limited freedom to pick pins.

The following code uses Timer/Counter 0 with the OCR0B match and TCNT0 overflow interrupts enabled. When the OCR0B interrupt is called, the output on pin D6 (a non PWM pin), goes LOW. When the counter overflows, the output on D6 goes HIGH. By changing the value of the OCR0B match, the width of the output can be changed. The error in the output timing depends on the length of your interrupt service routines are. For very low error, you can remove saving/restoring the SREG, taking care that the commands inside the ISRs do not affect the SREG.

pwmsetup:
; Setup the 8-bit Timer/Counter 0 to operate in Fast PWM mode
  ldi r16, 0b00000111
  sts TIMSK0, r16
  ldi r16, (0<<COM0B1)|(0<<COM0B0)|(0<<COM0A1)|(0<<COM0A0)|(1<<WGM01)|(1<<WGM00)
  out TCCR0A ,r16
  ldi r16 , (0<<WGM02)|(1<<CS02)|(0<<CS01)|(1<<CS00)
  out TCCR0B , r16
  ldi r16 , 0x7F ; sample time location between 0-255
  out OCR0A , r16
  ldi r16, 0x01 ; width of the ping
  out OCR0B, r16
ret

OCR0B_int:
  in r25, SREG ; save SREG
  cbi DDRD, 6
  cbi PORTD, 6
  out SREG , r25 ; restore SREG
reti

TCNT0_ovflow_int:
  in r23, SREG ; save SREG
  sbi DDRD, 6
  sbi PORTD, 6        
  out SREG , r23 ; restore SREG
reti