uC News Programmer Apps & More Downloads Info & Shop Contact Forum


230-Volt Verbraucher schalten

Mit dieser Schaltung lassen sich (ohmsche) 230-Volt Lasten mittels eines TTL-Pins (A0) steuern:

230V-Schalt-Modul: Schaltplan, Stückliste & TRIACs
IC 1 MOC 3020 oder TIL 3020
R 1 220 Ohm (bei 5,0 Volt)
R 2 220 Ohm
TR 1 TIC 206M

Beispiel-TRIACs mit Leistungsangabe
Typ TIC 206 M TIC 216 M TIC 226 M TIC 236 M TIC 246 M TIC 256 M TIC 266 M
Schaltleistung 4 A 6 A 8 A 12 A 16 A 20 A 25 A


Die 3020 Optokoppler benötigen einen LED-Strom von 18 mA. Steht dieser nicht zur Verfügung, so kann man auf die Typen 3021 oder 3022 ausweichen, welche mit weniger Strom auskommen. Vorsicht ist mit 304x-Typen geboten: Diese haben einen Nullspannungsschalter integriert was eine Phasenanschnittsteuerung unmöglich macht.

Bei größeren Lasten ist unbedingt ein Kühlkörper vorzusehen.



A/D-Wander (ADC) ansprechen

Dieses Beispiel zeigt, wie man einen ADC an einen PIC anschließt. Zur Verwendung kommt hierbei der TLV 1544 (Link auf Datenblatt) der Firma Texas Instruments. Dieser ADC hat folgende Eigenschaften:
  •  4 Kanäle (Der TLV 1548 hat 8 Kanäle.)
  •  10 Bit Auflösung
  •  Wandlungszeit < 10 uS (Langsamer Modus <40 uS)
  •  Programmierbarer Stromsparmodus (< 1 uA)
  •  serielles Interface (SPI kompatibel)
Anschluß des TLV 1544 an den PIC 12C508


Anschluß des TLV 1544 an den PIC 12C508 (der gestrichelte Teil zeigt das EVA-Board)

Der Source-Code:

 
adc:	bcf	port,cs	; Baustein selektieren
	movwf	out	; Kanalnummer speichern
	swapf	out,f	; und zur Ausgabe vorbereiten
	movlw	.10	; 10 Bits senden (nur die ersten 4 sind wichtig)
	movwf	cnt
rlp1:	btfsc	out,7	; Port-Pin entsprechend einstellen
	bsf	port,dto 
	btfss	out,7
	bcf	port,dto
 	rlf	out,f	; Kanalnummer schieben
	bsf	port,clk	; Clock-Impuls erzeugen
	nop
	bcf	port,clk
	decfsz	cnt,f	; schon fertig ?
	goto	rlp1	; nein, noch ein Bit senden
	bsf	port,cs	; Baustein deselektieren

	movlw	.15	; Warteschleife : 45 uS bis Ergebnis vorliegt
	movwf	cnt
rlp2:	decfsz	cnt,f
	goto	rlp2

	bcf	port,cs	; den Baustein wieder aktivieren
	clrf	res1	; das (alte) Ergebnis loeschen
	clrf	res2
	bsf	port,dto	; Stromsparmodus vorbereiten (Code: 8)
	btfsc	port,dti	; Ergebnis-Bit 9 lesen
	bsf	res1,1
	bsf	port,clk	; naechstes Bit holen
	nop
	bcf	port,clk
	bcf	port,dto	; Stromsparmodus einschalten
	btfsc	port,dti
	bsf	res1,0	; Ergebnis-Bit 8 lesen
	movlw	.8	; Jetzt das LSB (Bit 7 bis 0)
	movwf	cnt
rlp3:	bsf	port,clk
	nop
	bcf	port,clk
	rlf	res2,f	; LSB schieben
	bcf	res2,0
	btfsc	port,dti
	bsf	res2,0	; aktuelles Ergebnisbit ggf. setzen
	decfsz	cnt,f
	goto	rlp3
	bsf	port,cs	; Baustein ausschalten
	return		; Fertig ! Ergebnis steht jetzt in res1 & res2.


Diese Routine setzt voraus, daß beim Aufruf
  •  CS = high
  •  die entsprechenden I/O-Pins als Ausgang programmiert sind
  •  die Kanal-/Befehlnummer im W-Register ist.
Das Ergebnis landet dann in den Registern res1 (Bit #9 und #8) und res2 (LSB).

Beispiels Initialisierung:

 

	w	equ 0      
	f	equ 1
	c	equ 0
	status	equ 0x02
	port	equ 0x06
	res1	equ 0x10
	res2	equ 0x11
	out	equ 0x12
	cnt	equ 0x13 	

	cs	equ 2	; GP 2
	dti	equ 3	; GP 3 (kann nur Eingang werden)
	dto	equ 5	; GP 5
	clk	equ 4	; GP 4

	bsf	port,cs
	bcf	port,clk
	movlw	0xcb
	tris	port
	movlw	0x09	; ADC init
	call	adc
	movlw	0x00	; Kanal 1 lesen (Codes von Kanal 2-4: 2/4/6) 
	call	adc


Praktische Anwendung:
Alle zum Nachbau nötigen Files können im Download-Bereich heruntergeladen werden. Die softwareseite Ansteuerung sieht folgendermaßen aus: Der Computer sendet zwei Bytes zum PIC - ein 'A' und ein Hex-Digit für Kanal- bzw. Befehlsnummer. Der PIC antwortet darauf mit den Bytes '$123',0x0d,0x0a wobei "123" eine dem Analogwert entsprechende ASCII-Hexadezimalzahl darstellt - es ist also auch per Terminalprogramm einfach testbar. Die Übertragungsparameter sind 2400 bps, 8N1.




Controller direkt aus 230V versorgen

Für kleine Schaltungen mit Microcontrollern wie z.B. Dimmer lohnt sich ein konventionelles Netzteil oft nicht. Dieser Abschnitt zeigt eine preiswerte Alternative.

Kondensatornetzteil: Schaltplan & Stückliste
D 1 ZPD 5,6 V / 500 mW
D 2 1 N 4001 o.ä.
R 1 60 Ohm / 0,25 W
C 1 680 nF / 250 V AC
C 2 220 uF / 16 V
C 3 100 nF Vielschicht
ACHTUNG: KEINE POTENTIALTRENNUNG !!!




LC-Display-Modul ansteuern
Hier geht es um die Ansteuerung eines 1 bis 4 zeiligen LCD-Moduls auf Basis des Hitachi-Controllers HD44780. Das Beispiel-Programm ist diesmal für die AVR-Serie von Atmel geschrieben.

LCD-Text-Modul: Anschlußplan & Pinbelegung
Pin Function
1 GND
2 Vcc
3 Vee
4 C/D
5 R/W
6 E
7 D0
8 D1
9 D2
10 D3
11 D4
12 D5
13 D6
14 D7


Die Pinbelegung ist vor Inbetriebnahme auf jeden Fall anhand des Modul-Datenblatts zu überprüfen ! Manche Module weichen nämlich von dieser Belegung ab und vertauschte GND-/Vcc-Pins können die sofortige Zerstörung des Moduls bewirken !

Das Modul wird im 4-Bit-Modus betrieben um uC-Pins zu sparen (einziger Unterschied zum 8-Bit-Modus: Bytes werden in 2 Schritten übertragen.). Ebenso wird auf die Auslesemöglichkeit verzichtet, was die Sache weiter vereinfacht. Um sicher zu gehen, das ein Befehl an das Modul ausgeführt worden ist, wartet die Software immer die maximale Ausführungszeit. Das Beispiel ist für einen AVR-Takt von 4 MHz gedacht.

Zunächst muss das Modul für den 4-Bit-Modus initialisiert werden. Dies erledigt die Routine 'lcdinit'. Dann kann man entweder einen Befehl ('lcdcmd') oder Daten ('lcddata') zum Display senden. In R18 muss vorher das Datum bzw. der Befehl geladen werden.

Alle Befehle hier zu erläutern würde zu weit führen (siehe Datenblatt HD44780), daher möchte ich hier nur den wichtigsten vorstellen - 'Set Data Address'. Dieser Befehl bestimmt, wohin im Speicher das nächste Zeichen geschrieben wird: Bit 7 muss immer '1' sein, die unteren Bits geben die gewünschte Adresse an (kurz: Adresse or $80). Die Adresse hängt stark vom Modul ab. Mein 1x16-Testmodell legt die ersten 8 Zeichen bei $00-$07 und die zweite Hälfte bei $40-$47 ab, andere 1x16 benutzen $00-$0f. Zweizeilige haben die erste Zeile in der Regel ab $00 und die zweite Zeile bei $40. Diese Werte finden sich aber ebenfalls im Modul-Datenblatt, man sie auch gefahrlos durch Probieren ermitteln.

Und nun die Software, welche als Test gleich noch etwas auf das Display schreibt.

 

; LCD - Ansteuerung mit AVR

.equ	portddr	= $11
.equ	portd	= $12
.equ	portdi	= $10
.equ	portbdr	= $17
.equ	portb	= $18
.equ	portbi	= $16
.equ	Stack	= $3d

.equ	d7	= 7	; Port B
.equ	d6	= 6
.equ	d5	= 5
.equ	d4	= 4  
.equ	rs	= 5	; Port D
.equ	e	= 6

.def	work	= r18
.def	wt1	= r25
.def	wt2	= r26

start:	

; Die folgenden zwei Zeilen sind erforderlich, wenn ein anderer AVR als
; der 90S1200 zum Einsatz kommt. Sie initialisieren den Software-Stack !

	ldi	work,$df	; init stack
	out	stack,work


	ldi	work,$60
	out	portddr,work
	ldi	work,$f0
	out	portbdr,work
	ldi	work,$00
	out	portd,work
	ldi	work,$00
	out	portb,work

	rcall	lcdinit

	ldi	work,$80
	rcall	lcdcmd
	ldi	work,'H'
	rcall	lcddata
	ldi	work,$81
	rcall	lcdcmd
	ldi	work,'a'
	rcall	lcddata
	ldi	work,$82
	rcall	lcdcmd
	ldi	work,'l'
	rcall	lcddata
	ldi	work,$83
	rcall	lcdcmd
	ldi	work,'l'
	rcall	lcddata
	ldi	work,$84
	rcall	lcdcmd
	ldi	work,'o'
	rcall	lcddata

finito:	rjmp	finito

	; Zeichen in den 'Bildschirmspeicher' schreiben -
	; es muss in 'R18' (work) gespeichert sein.

lcddata:	
	sbi	portd,rs     
	rjmp	docmd        

	; Befehl an das Display Modul senden -
	; er muss in 'R18' (work) gespeichert sein.

lcdcmd:	
	cbi	portd,rs     
docmd:	cbi	portd,e      
	cbi	portb,d7
	sbrc	work,7
	sbi	portb,d7
	cbi	portb,d6
	sbrc	work,6
	sbi	portb,d6
	cbi	portb,d5
	sbrc	work,5
	sbi	portb,d5
	cbi	portb,d4
	sbrc	work,4
	sbi	portb,d4
	rcall	epulse      
	cbi	portb,d7
	sbrc	work,3
	sbi	portb,d7
	cbi	portb,d6
	sbrc	work,2
	sbi	portb,d6
	cbi	portb,d5
	sbrc	work,1
	sbi	portb,d5
	cbi	portb,d4
	sbrc	work,0
	sbi	portb,d4
	rcall	epulse      
	rcall	delay5
	ret	

	; Diese Routine stellt das Display auf den
	; 4-Bit-Modus ein und loescht es.

lcdinit:	
	rcall	delay5        
	rcall	delay5          
	rcall	delay5
	cbi	portd,rs
	cbi	portd,e
	sbi	portb,d4
	sbi	portb,d5
	cbi	portb,d6
	cbi	portb,d7
	rcall	epulse	; set 8-Bit
	rcall	delay5
	rcall	epulse	; set 8-Bit
	rcall	delay5
	rcall	epulse	; set 8-Bit
	rcall	delay5
	cbi	portb,d4
	sbi	portb,d5
	cbi	portb,d6
	cbi	portb,d7
	rcall	epulse	; set 4-Bit
	rcall	delay5
	cbi	portb,d4
	sbi	portb,d5
	cbi	portb,d6
	cbi	portb,d7
	rcall	epulse	; set Font-A
	cbi	portb,d4
	cbi	portb,d5
	sbi	portb,d6
	sbi	portb,d7
	rcall	epulse	; set Font-B
	rcall	delay5
	cbi	portb,d4
	cbi	portb,d5
	cbi	portb,d6
	cbi	portb,d7
	rcall	epulse	; set Dsp-off-A
	cbi	portb,d4
	cbi	portb,d5
	cbi	portb,d6
	sbi	portb,d7
	rcall	epulse	; set Dsp-off-B
	rcall	delay5
	cbi	portb,d4
	cbi	portb,d5
	cbi	portb,d6
	cbi	portb,d7
	rcall	epulse	; set Cursor-A
	cbi	portb,d4
	cbi	portb,d5
	sbi	portb,d6
	sbi	portb,d7
	rcall	epulse	; set Cursor-B
	rcall	delay5
	cbi	portb,d4
	cbi	portb,d5
	cbi	portb,d6
	cbi	portb,d7
	rcall	epulse	; set Entry-A
	cbi	portb,d4
	cbi	portb,d5
	sbi	portb,d6
	cbi	portb,d7
	rcall	epulse	; set Entry-B
	rcall	delay5
	ret

epulse:	sbi	portd,e	; E-Takt-Impuls erzeugen
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	cbi	portd,e
	ret

delay5:	ldi	wt1,50	; Zeitverzoegerungsschleife 
wtlp1:	ldi	wt2,255
wtlp2:	dec	wt2
	brne	wtlp2
	dec	wt1
	brne	wtlp1
	ret



 Stand: 15.05.2003
© 1998-2003 by G.Müller 
 


Diese Seite darf nicht von diesem Server kopiert werden, weder auf ein anderes elektronisches Medium noch auf irgend eine andere Weise. Einzige Ausnahme stellt ein Ausdruck zum Zwecke des Nachbaus dar. Dieser darf nur für rein private Hobbyzwecke erfolgen, jedlicher kommerzieller Einsatz ist untersagt. Der Autor und die Betreiber dieses Servers übernehmen keinerlei Haftung für die Folgen von Bau und Einsatz des oben beschriebenen Geräts. Alle eventuell erwähnten Markennamen gehören ihren jeweiligen Eigentümern. Für Hinweise auf Fehler und Mißbrauch ist der Autor dankbar.