Code:
;===================================================================================
;========== Beachte: printout aus AVRStudio geht (nur) bis col 85 ==================
;* Target MCU : ATtiny13
;* Target Hardware : Servo auf PB4
;* Target cpu-frequ. : 4,8 MHz, interner Oszillator
;
;===================================================================================
;* Versionsgeschichte:
;x81 18Okt07 17:38 ;Quelle bereinigen
;x80 18Okt07 17:mm ;Servo variabel 1 -- 2 ms und Pause 18,5 ms ==> ok
;x04 18Okt07 15:21 ;Servo fest auf ca. 1,5 ms und Pause 18,5 ms ==> ok
;x03 18Okt07 14:56 ;20ms und 18,5 ms sind gesicherte Werte
;x01 18Okt07 13:42
;
;* Aufgabenstellung
;* Programm zum Testen des Servos (CARSON 502001)
; Servo über getrennte Leitung, max. 1 A, vom Labornetzteil versorgt
; Portbelegung, Schaltung auszugsweise
;
; Vcc(6V LNT) --------------------------------------Vcc-Servo
; +--------+
; Vcc2 (9VBlock) --+ LP2950 +------Vcc-tiny13
; +---+----+
; | tiny13-PB4-----Signal-Servo
; |
; +-----------GND-tiny13
; |
; GND--------------------+--------------------------GND-Servo
;
;* ===============================================
; ######### Original war:
;===================================================================================
; Speicherbelegung
; r20 Pausenwert Zähler, um r24,r25 rauf + runterzuzählen
; r21 Merker 100 ==> raufzählen, 0 ==> runterzählen
; r24 Word LSB vgl: ADIW Rd+1:Rd,K
; r25 Word MSB zu r24
; r26 word lsb Dies ist der COUNTER!! wird in Warte raufgezählt
; r27 word msb r24/r25 ist der Merker - der kann geändert werden
;===================================================================================
#include "tn13def.inc"
.org 0x0000 rjmp anfang ; Reset
;
;===================================================================================
; Deklarationen für den Praeprozessor
; Konstanten ####### evtl. auch keine Konstanten definiert
#define port4 servo
#define servo 4 ;Servo auf Port PB4
#define aufab r20 ;Register bis 240 rauf- und wied. runterzählen
#define ms185 65536-20655 ;Vorbelegung Counter-neu f 18,5 ms-wait (=18,44) OK
#define msvar 65536-1700 ;Vorbelegung Counter-neu f 1,5 ms-wait (=)
;===================================================================================
; Hauptprogramm
;===================================================================================
;
anfang:
rcall p_init ;Initialisierung
anfang2:
sbi portb,servo ;Schalte Servorampe ein
anf11: rcall wtvarms ;Warteschleife für aktive Rampe
cbi portb,servo ;Schalte Servorampe aus
anf31: rcall wt185ms ;Feste Warteschleife 18,5 ms
;
; Es folgt jetzt die Routine um den Servo (vorerst automatisch durch Zählen)
; runter- und raufzufahren. Später mit Tasten. Spannweite etwa 500 bis 3000
; das heisst: in 255 Schritten für etwas über 180 Grad Schwenkwinkel
; Zuerst: Variiere das Register aufab von 0 bis 250
; Prüfe ob rauf- oder runterzählen? Merker r21=100 ==> rauf, r21=0 ==> runter
;
andi r21,100 ;=100?
brne w_rauf ;bei 100 zähle word rauf um je 10
w_runtr:
sbiw r24,10 ;Zähle Merker word runter
dec aufab ;und dazu auch die Laufvariable
brne w_raus
ldi r21,100
rjmp w_raus
w_rauf:
adiw r24,10 ;Zähle Merker rauf
inc aufab ;und dazu auch die Laufvariable
brne w_raus
ldi r21,0
w_raus:
rjmp anfang2
;
;===================================================================================
; Prozeduren
;===================================================================================
;
p_init: ;=== Initialisiere den Mikrocontroller
; PB3 und PB4 als Ausgang
sbi ddrb,servo ;Datenrichtungsbit setzen
sbi ddrb,3 ;Datenrichtungsbit setzen
cbi portb,servo
sbi portb,3 ;Schalte
ldi aufab,125 ;Vorbelegen Merker für Hoch+ Runterzählen
ldi r21,100
ldi r24,low(msvar) ; Aktivzeit für Servo, kann durch Tasten hoch-
ldi r25,high(msvar) ; gefahren werden (wird noch realisiert)
ret ;=====----->>>>>
;
wt185ms: ;=== Warte 18,5 ms (===>> bei 4,8 MHz)
ldi r26,low(ms185) ;Lade Counter
ldi r27,high(ms185) ; mit festem Wert für 18,5 ms
wt185a:
adiw r26,1
brne wt185a
ret ;=====----->>>>>
;
wtvarms: ;=== Warte variable ms (angestrebt 1 .. 2 msec bei 4,8 MHz)
mov r26,r24 ;Lade Counter aus den Merker-Bytes. Der Merker
mov r27,r25 ; wird automatisch oder durch Tasten verändert
wtvara:
adiw r26,1
brne wtvara
ret ;=====----->>>>>
;
;===================================================================================
; Ende des Quellcodes
;===================================================================================
und wenns läuft, machts dann doch wieder Freude.
Lesezeichen