Hi leute, ich hab mit die aufgabe gestellt einen erweiterbaren ( Kannäle ) Soft-PWM zu schrieben, hier mal mein ergebnis:

Code:
;µC-Typ bestimmen

.include "2313def.inc"                ; AT90S2313


;Register definition

.def tmp = r16                        ; Allgem. Arbeitsregister
.def pwm = r17                        ; PWM Vergleichswert
.def cout = r18                       ; Zähler

;Interupt Config. I 

.org 0000 
rjmp start 

.org OVF1addr                         ; Sprungvektoren einrichten
rjmp ovf1 

Start:
 
;IO Config.

ldi tmp, (1<<PB0)                     ; Pinb.0 als Ausgan setzen
out ddrb, tmp


;Interupt Config II 

ldi tmp, (1<<TOIE1)                   ; Timer1 Interrupt 
out timsk, tmp                        ; aktivieren

clr tmp                               ; TCCR1 High auf 0
out tccr1a,tmp
 
ldi tmp,(1<<ICNC1)|(1<<CS10)          ; Noiscanceler deaktiv.
out tccr1b,tmp                        ; Timer1 Clock = Clock

ldi tmp,0xff                          ; Timervorgabewerte:
out tcnt1h, tmp                       ; Highbyte= 0xff
ldi tmp,0xfa                          ; Lowbyte = 0xfa
out tcnt1l, tmp    

sei                                   ; Interuptts freigeben


;Hauptprogramm

main:
ldi pwm, 255
rjmp main


;Timer1 Overflow Interrupt

ovf1:
  push tmp
  in tmp, sreg
  push tmp

  
  ldi tmp,0xff                        ; Timervorgabewerte:
  out tcnt1h, tmp                     ; Highbyte= 0xff
  ldi tmp,0xfa                        ; Lowbyte = 0xfa
  out tcnt1l, tmp     

  cpi cout,255
  brne notzero
  
  cbi portb, pinb0
  
  notzero:
  cp cout,pwm
  brne noteq

  sbi portb, pinb0
  
  noteq:
  dec cout                             ; Zählerwert erhöhen

  
  pop tmp
  out sreg,tmp
  pop tmp
reti
Jetztz das prob, ich kann ja nur geringe PWM frequenzen erzeugen, gäbs ne bessere Lösung? Wie ist mein Code? Kann man noch was verbessern?

Grezzles teslanikola