;mit Gleichstrommotor, Gabellichtschranke mit 2-Lochscheibe (4mm Bohrungen)

Motorregler Schaltplan

.include "C:\Programme\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn13def.inc"

.def    A       =     r16
.def    C       =    r17
.def    C1    =    r18
.def    Flag    =    r19
.def    soll    =       r20
.def    soll1    =      r21
.def    timer    =      r22
.def    dem    =    r23
.def    wait     =    r24

        rjmp Anfang
        .org 0x0001
        rjmp EXT_INT0
           
Anfang:
                                             ;init PWM      
        sbi    ddrb, 0             ;Datenrichtung PB0 auf Ausgang    
        ldi    A, 0x83              ;nur Kanal A
        out   TCCR0A, A
        ldi    A,2
        out   TCCR0B, A     ;Vorteiler /8    
        ldi      A, 25               ;Motoranlauf
        out   OCR0A, A
       
                                            ;init Interrupt
        ldi   A, 3                     ;Auslösung neg.Flanke
        out   MCUCR, A
        ldi   A, 0x40
        out  GIMSK,A            ;Enable
        sei                             ;Globaler Interrupt frei
        
        ldi timer,50              ;Startwert

Schleife:
        ldi wait,25                                  ;Anpassung an 2 Lochscheibe
Bremse:
            dec wait    
                brne Bremse               
                   ldi    soll,128                    ;Solleingabe
                       cpi    timer,255             ;Verhinderung timerüberlauf
                           breq OV
                              inc    timer
OV:                            mov C,timer                    
                             mov    soll1,soll
                          cp    soll,C                ;Soll / Ist-Vergleich
                      brlo negativ
                   sub    soll1,C                ;-xw, Motor zu schnell
                 sub soll,soll1                            
               mov dem,soll                ;Demand            
           rjmp Schleife
negativ:
       mov    C1,C
            sub    C1,soll1                ;+xw; Motor zu langsam                    
             add soll,C1                    
            mov    dem,soll                ;Demand
       rjmp    Schleife


EXT_INT0:
    sbrc    Flag,0
      rjmp    stop       
       ldi    timer,0                ;Timer löschen
          ldi    Flag, 1            ;setze flag    
            reti
stop:
            mov    C,timer      ;Zählerstand = 1/2 Umlaufzeit
          ldi    Flag,0            ;lösche Stopflag
       out OCR0A,dem      ;Ausgabe
    reti



Rolf Grauer, 13.04.2012