
![]() |
||||||||||
|
||||||||||
|
Mit dieser Schaltung lassen sich (ohmsche) 230-Volt Lasten mittels eines TTL-Pins (A0) steuern:
Bei größeren Lasten ist unbedingt ein Kühlkörper vorzusehen. 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:
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
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
Für kleine Schaltungen mit Microcontrollern wie z.B. Dimmer lohnt sich
ein konventionelles Netzteil oft nicht. Dieser Abschnitt zeigt eine preiswerte
Alternative.
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.
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. 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
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() ![]() |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||