Pulsgeber mit ATtiny13

; Pulsgeber mit Delay-Variation
; Board mit Atmel ATtiny13
; Gerd Heinz, 08/2009
; Assembler-Programm für AVR-Studio 4.15.6.23

/*
Funktion

Für die Simulation variierender Pulsbreiten (PPM) bei Pulsschweißmaschinen wurde 
diese kompakte Schaltung entwickelt. Sie eignet sich ebenso zum Endlagen- und 
Geschwindigkeitstest von Servos. 

Der Pulsgeber wird über vier Tasten und vier zugeordnete LEDs an PB0...3 bedient. 
An PB4 wird ein Puls variabler Länge (1...2 ms) ausgegeben. 

Tasten/LEDs b0...b2 (verbunden mit Portpins PB0...PB2) sind für manuelle Vorgabe 
der Pulslänge vorgesehen. Drückt man b0, so wird eine Pulslänge von 1.0 ms ausgegeben, 
beim Druck auf b1 werden 1.5 ms und beim Druck auf b2 werden 2.0 ms ausgegeben. 
Die Pulspause ist auf 25 ms fixiert.

Manuell - feste Pulslänge:
	 b2: 2,0 ms
	 b1: 1,5 ms
	 b0: 1,0 ms

Die zur Taste gehörende LED leuchtet dauernd.

Taste PB3 (Mode) schaltet um auf Automatikmode, dabei wird zwischen den Endlagen 
hin- und hergeschaltet (1ms -> 2ms -> 1ms -> ... ). Die Zeitdauer des Umschaltens 
ist in Zehntelsekunden vorgebbar. Sie wird auf den vier LEDs binär codiert blinkend angezeigt.
(Start mit 1.0 Sekunden (0x0A), Ende mit 0.1 Sekunden (0x01):

Mode (b3 ~ PB3):
			blinkende Anzeige	b3 b2 b1 b0:
 	einmal drücken   	-> Pulsdauer 1.0 s	-> 1010
	zweimal drücken 	-> Pulsdauer 0.9 s	-> 1001
	dreimal gedrückt	-> Pulsdauer 0.8 s	-> 1000
	viermal gedrückt	-> Pulsdauer 0.7 s	-> 0111
	fünfmal gedrückt	-> Pulsdauer 0.6 s	-> 0110
	sechmal gedrückt	-> Pulsdauer 0.5 s	-> 0101
	siebenx gedrückt	-> Pulsdauer 0.4 s	-> 0100
	achtmal gedrückt	-> Pulsdauer 0.3 s	-> 0011
	viermal gedrückt	-> Pulsdauer 0.2 s	-> 0010
	letzter Druck    	-> Pulsdauer 0.1 s 	-> 0001
Danach rücksetzen auf Handbetrieb. 

Wird im Automatikmode eine der Tasten PB0...2 gedrückt, erfolgt ebenfalls Umschaltung auf Handbetrieb.

*/
; 
;  	Mode Handbetrieb (startup):
; 		BTN0	1 ms	LED0 an
; 		BTN1	1,5 ms	LED1 an
; 		BTN2	2 ms	LED2 an 
; 		BTN3 	n-mal drücken für auto-hin/zurück
; 	Binärwert wird auf LEDs 0...3 blinkend angezeigt
;
; Automatikmode (hin/zurück):
;	Dauer = schritte * 4 * 25,5 ms =  schritte * 102 ms
; Beispiel:
; 	Anzeige binär 0x0a (zehn): Dauer = 10*4*25,5ms = 1,02 sec

.equ schritte = 0x0b	; Maximale Zahl von Tastendrücken bei auto plus Eins

; Prozessor: ATMEL ATtiny13A mit 5V und Fuse 9,6MHz interner RC-Osz.
.include "tn13def.inc"	; Prozessordaten

; 
; Pinout 8-PDIP/SOIC: 	
; 				 ________
;				    `´
; 		/RESET	PB5	|1	8| VCC
; 			PB3	|2	7| PB2	SCK
; 			PB4	|3	6| PB1	MISO
; 			GND	|4	5| PB0	MOSI
; 	 			 ________
; Ports:
; 	PB0:	LED0 	BTN0 	1.0 ms
; 	PB1:	LED1 	BTN0 	1.5 ms
; 	PB2:	LED2 	BTN0 	2.0 ms
; 	PB3:	LED3 	BTN3 	Mode
; 	PB4:	Ausgabe Puls
; 
; 	Beschaltung Ports 0 bis 3 (4x LED/Button an PB0...3):
; 	BTNx ziehen auf +5V	- aktiv high !!!
; 	LEDx leuchten bei 1 - aktiv high !!!
; 	Test von LED und Button: 	PBx auf H -> LED leuchtet
; 						BTNx drücken -> LED aus

; Timing:
; 	Puls variabel 1...2ms, Pause 25,5ms fix
; 	PWM-Timer: clocks laufen von 10 bis 20 (mal 0,1 sec)
; 	Pause 25,5 ms anhängen
; 	OCR0A erzeugt Puls	10...20
; 	Timer-Overflow erzeugt 255 ~> 25,5 ms Pause


; Ziel Pulsdauer (0,1000 ms) für clocks:
;	interner clock 	104,166 ns ~ 9,6 MHz (RC-Oszillator)
; 	Vorteiler 1024: 104,166ns x 1024 = 106,66 µs -> zu lang:
;
; Grundtakt 0,100 ms erzeugen:
; 	Oscillator von 9,6 auf 10,240 MHz setzen
; 	dazu Oszillator höher trimmen
;
; Frequenzerhöhung um  106,666 % von 9,6 auf 10,24 MHz
; dazu oscal zunächst aus ATtiny auslesen, dann soft überschreiben:
; 
; Beispiel:
; 	MHz	9,6	10,24		Typ
; oscal		0x57 	0x5c		ATtiny13A
; oscal		0x68 	0x6e		ATtiny13
.equ oscal = 0x6e	; oscillator calibration (maximum frequency 0x7f)
; nachmessen und oscal ggf. leicht korrigieren



Bilder



Bild 1: Aufbau auf Lochrasterplatte, die SMD Widerstände
befinden sich auf der Leiterseite



Bild 2: Layout der Frontplatte



Bild 3: In Betrieb: Eine hex-Sieben blinkt:
0,7 Sekunden sind eingestellt.



Bild 4: Schaltung



Bild 5: Einbau erfolgt in ein flaches,
40x40 mm großes Plastgehäuse

Downloads

Datei/speichern unter ...

Sourcecode (Assembler)

Hexcode (für den AVR-ISP-mkII Programmer)