Inhaltsverzeichnis
PIC16(F/LF)XXX
UART Routine
Senden:
RS232send banksel TXREG ; Zur Bank von TXREG umschalten movwf TXREG ; Move w to TXREG banksel PIR1 ; Zur Bank von PIR1 umschalten Waittx btfss PIR1, TXIF ; Wenn bit in PIR1,TXIF HIGH übergehe den nästen Befehl goto Waittx ; Gehe zu WaitTX bcf PIR1, TXIF ; Interrupt Flag Löschen (Optionam muss nicht umbedinkt gemacht werden) return
Fehlerbehandlung:
uart_ferr ; Auf Frameerror testen btfsc RCSTA, FERR goto uart_err return uart_oerr ; Auf Overrunerror testen btfsc RCSTA, OERR goto uart_err return uart_err ; Fehlerbehandlung ; Fehlerbehanlungsroutine hier einfügen!!!!!!!!!!!!!!!!! ; z.b. Interupt beenden und RCREG nicht sichern bcf RCSTA, CREN ; Fehler Bits Löschen bsf RCSTA, CREN return ; Interupt beenden und zurück zur Main schleife
Entfangen per Interupt:
int ; Interupt STATUS und W sichern movwf wtemp ; W Sichern swapf STATUS, w ; Status Sichern movwf stemp ; Status Speichern btfss PIR1, RCIF ; Interupt vom USART wenn nicht goto intend ; Interupt beenden ; Interupt Code uart call uart_ferr ; Auf Frame Errors Testen <b>(siehe Fehlerbehandlung) </b> call uart_oerr ; Auf Overrunerrors Testen movf RCREG,w ; uart RX Reg sichern movwf rx intend ; Interupt beenden und STATUS + W zurückspielen bcf PIR1, RCIF ; Interuptflag Löschen swapf stemp, w ; Status restore movwf STATUS swapf wtemp, f ; W restore swapf wtemp, w retfie ; Interupt Beenden
DG-16080 Text-Mode
Senden:
movlw 0x00 movwf adrl ; LOW ADR movlw 0x00 movwf adrh ; High ADR call disp_send_char ; Adressregister setzen und vorbereiten zum Daten schreiben movlw B'01001000' ; H call disp_send_d movlw B'01100001' ; a call disp_send_d movlw B'01110101' ; u call disp_send_d
Display Anschlüsse:
#define RS PORTC, 0 ; Display Command(H)/DATA(L) #define RW PORTC, 2 ; Display Read(H)/Write(L) #define E PORTC, 3 ; Display Enable #define CS PORTC, 4 ; Display Chip Enable(L) #define WDATA PORTB ; Display Datenport (PORTB) #define YM PORTA, 3 ; Touch y- ADC #define YP PORTA, 2 ; Touch y+ PWR #define XP PORTA, 4 ; Touch x+ PWR #define XM PORTA, 1 ; Touch x- ADC
dg-16080.inc
disp_init ; Display Inialisieren bcf RW ; Startbedinungen herstellen nop bcf CS movlw 0x00 ; Mode Control REG call disp_send_c ; Send Command movlw b'00111000' ; DB5=ON/OFF, DB4=Master/Slave, DB3=Blink, DB2=Coursor, DB1/DB0=TEXT(00)/GRAFIG(10) call disp_send_d ; Send Data movlw 0x01 ; Character Pitch REG call disp_send_c ; Send Command movlw 0x75 ; 7x8px call disp_send_d ; Send Data movlw 0x02 ; Nummer oh Char REG call disp_send_c ; Send Command movlw D'26' ; Anzahl horit. Zeichen -1 call disp_send_d ; Send Data movlw 0x03 ; Display Duty REG call disp_send_c ; Send Command movlw 0x4F ; Display Duty call disp_send_d ; Send Data movlw 0x04 ; Cursor Position REG call disp_send_c ; Send Command movlw D'7' ; Curserstrich y-Pos -1 call disp_send_d ; Send Data return disp_send_c ; Send Command bsf RS movwf WDATA bsf E nop bcf E call delay_10_µs return disp_send_d ; Send DATA bcf RS movwf WDATA bsf E nop bcf E call delay_10_µs return disp_cls ; Display Löschen Textmode movlw 0x0A ; Low Reg call disp_send_c movlw 0x00 ; Low Adr call disp_send_d movlw 0x0B ; High Reg call disp_send_c movlw 0x00 ; High Adr call disp_send_d movlw 0x0C ; DATA REG call disp_send_c movlw D'65' movwf count disp_cls_loop movlw B'00100000' ; 65x5 call disp_send_d call disp_send_d call disp_send_d call disp_send_d call disp_send_d decfsz count,1 goto disp_cls_loop return disp_send_char ; Zeichen senden (ADRL,ADRH,Char) movlw 0x0A ; Low Reg call disp_send_c movf adrl,w ; Low Adr call disp_send_d movlw 0x0B ; High Reg call disp_send_c movf adrh,w ; High Adr call disp_send_d movlw 0x0C ; DATA REG call disp_send_c return
Touchscreen: Config für die ADCs VREF=VDD
banksel TRISA ; Zu Bank von TRISA umschalten movlw B'00001011' ; PortA I/O setzen (1=In, 0=Out) (Reinfolge RB7,RB6...) movwf TRISA ; PortA I/O setzen banksel ADCON1 ; Zur Bank von ADCON1 umschalten movlw B'10010100' ; Alle Analog VDD=VREF, Right jutyfy, fosc/8, AN0,1,3=AN, AN2,4-7=Dig. movwf ADCON1 ; Move w to ADCON1 banksel ADCON0 ; zu Bank von TRISA umschalten movlw B'01000001' ; Enable ADC movwf ADCON0 ; Move w to ADCON0
touch_read ; Y bcf YP bsf XP bcf ADCON0,5 ; ADC Auswehlen bcf ADCON0,4 bsf ADCON0,3 call adc_read ; Read ADC AD1 Daten banksel ADRESL movf ADRESL,w movwf ylow banksel ADRESH movf ADRESH,w movwf yhigh bcf YP bcf XP ; X bcf XP bsf YP bcf ADCON0,5 ; ADC Auswehlen bsf ADCON0,4 bsf ADCON0,3 call adc_read ; Read ADC AD3 Daten banksel ADRESL movf ADRESL,w movwf xlow banksel ADRESH movf ADRESH,w movwf xhigh bcf YP bcf XP return adc_read movlw D'30' ; Wait Acquisition Time 20MHz movwf count adc_read_loop decfsz count,F goto adc_read_loop bsf ADCON0,GO ; Setze ADCON0,GO, Int A/D Conversation adc_read_loop_1 ; Wen ADC bereit btfsc ADCON0,GO ; Ist ADCON0,GO = 0 dann ubergehe den nesten Befehl goto adc_read_loop_1 ; Warte bis ADC fertig return
--Theborg 12:00, 23. Jan 2010 (CET)
Schieberegister (z.b. CD4094)
; Datenleitungen Schiberegister alles Ausgänge #define CLK PORTB, 0 #define D PORTB, 1 #define STR PORTB, 2 #define OE PORTB, 3
cd4094_send banksel PORTB bcf OE bcf STR btfsc cdsend, 0 bsf D btfss cdsend, 0 bcf D bsf CLK bcf CLK btfsc cdsend, 1 bsf D btfss cdsend, 1 bcf D bsf CLK bcf CLK btfsc cdsend, 2 bsf D btfss cdsend, 2 bcf D bsf CLK bcf CLK btfsc cdsend, 3 bsf D btfss cdsend, 3 bcf D bsf CLK bcf CLK btfsc cdsend, 4 bsf D btfss cdsend, 4 bcf D bsf CLK bcf CLK btfsc cdsend, 5 bsf D btfss cdsend, 5 bcf D bsf CLK bcf CLK btfsc cdsend, 6 bsf D btfss cdsend, 6 bcf D bsf CLK bcf CLK btfsc cdsend, 7 bsf D btfss cdsend, 7 bcf D bsf CLK bcf CLK bsf STR bsf OE return
--Theborg 23:13, 15. Sep 2009 (CEST)
MAX7456 (S/W OSD)
Variabeln und I/0:
cblock 0x70 ; Variabeln ab 0x70 setzen alle Register max 16stk. SPI_DATA_WRITE ; Zu Sendene SPI Daten SPI_DATA_READ ; Gelesend SPI Daten m_char ; Maxim7456 und sda5708 Zeichen m_pos ; Maxim7456 Position endc ; Variabeln setzen beenden #define SPI_CS PORTC, 7; SPI Slave Select max7456
Config:
; PORTC banksel TRISC ; auf Bank 1 umschalten movlw B'10010000' ; PortC I/O setzen (1=In, 0=Out) (Reinfolge RC7,RC6...) movwf TRISC ; PortC I/O setzen banksel PORTC clrf PORTC ; PortC auf 0 setzen ; SPI banksel SSPSTAT movlw B'11000000' ; Mitlere Geschwindigkeit Output Time movwf SSPSTAT banksel SSPCON movlw B'00100001' ; MODE 1,1, SPI MASTER, 1/16 Tosc SSP ON movwf SSPCON banksel PORTC bsf SPI_CS ; SPI Slave Select aus (high) return
SPI Sende/Enfangs Rotinen:
SPI_Send banksel PORTC bcf SPI_CS ; Chip Select an (Low) nop nop nop banksel SSPBUF movf SPI_DATA_WRITE, W movwf SSPBUF banksel SSPSTAT SPI_Wait btfss SSPSTAT, BF ; Ist das Senden Komplet ? goto SPI_Wait ; Wen nicht gehe zu SPIWait nop nop nop banksel PORTC bsf SPI_CS ; Chip Select aus (High) return SPI_Read banksel PORTC bcf SPI_CS nop nop nop banksel SSPBUF movf SSPBUF, W movwf SPI_DATA_READ banksel PORTC nop nop nop banksel PORTC bsf SPI_CS return
Defines ASCII to MAX7456 Charset und Config und Schreibrotienen (Achtung es kann sein das die #define nicht mit mpasm Funktioniert mit gpasm wird groß und kleinschreibung unterschiden):
max7456_define ; Defines für den max7456 Zeichensatz #define m_sp 0x00 ; Space #define m_1 0x01 #define m_2 0x02 #define m_3 0x03 #define m_4 0x04 #define m_5 0x05 #define m_6 0x06 #define m_7 0x07 #define m_8 0x08 #define m_9 0x09 #define m_0 0x0A #define m_A 0x0B #define m_B 0x0C #define m_C 0x0D #define m_D 0x0E #define m_E 0x0F #define m_F 0x10 #define m_G 0x11 #define m_H 0x12 #define m_I 0x13 #define m_J 0x14 #define m_K 0x15 #define m_L 0x16 #define m_M 0x17 #define m_N 0x18 #define m_O 0x19 #define m_P 0x1A #define m_Q 0x1B #define m_R 0x1C #define m_S 0x1D #define m_T 0x1E #define m_U 0x1F #define m_V 0x20 #define m_W 0x21 #define m_X 0x22 #define m_Y 0x23 #define m_Z 0x24 #define m_a 0x25 #define m_b 0x26 #define m_c 0x27 #define m_d 0x28 #define m_e 0x29 #define m_f 0x2A #define m_g 0x2B #define m_h 0x2C #define m_i 0x2D #define m_j 0x2E #define m_k 0x2F #define m_l 0x30 #define m_m 0x31 #define m_n 0x32 #define m_o 0x33 #define m_p 0x34 #define m_q 0x35 #define m_r 0x36 #define m_s 0x37 #define m_t 0x38 #define m_u 0x39 #define m_v 0x3A #define m_w 0x3B #define m_x 0x3C #define m_y 0x3D #define m_z 0x3E #define m_KLa 0x3F ; ( #define m_KLz 0x40 ; ) #define m_. 0x41 #define m_? 0x42 #define m_sem 0x43 ; ; #define m_: 0x44 #define m_ko 0x45 ; , #define m_ag 0x46 ; Agostroff #define m_bs 0x47 ; Backslasch #define m_as 0x48 ; Anfürungsstriche #define m_minus 0x49 ; Minus #define m_ka 0x4A ; < #define m_ga 0x4B ; > #define m_at 0x4C ; @ oder at #define m_wait 0xfb ; Wartezeichen #define m_ls 0xf9 ; Lautsprecher #define m_lso 0xfa ; Tonsignal #define m_ff 0xff ; Ausgefültes feld return max7456_conf ; Max7456 Config movlw 0x00 ; VM0 Video Mode Register 0 (Write) movwf SPI_DATA_WRITE call SPI_Send movlw B'01001000' ; 0 , 1=PAL, 00=Auto Sync, 1=Enable OSD, 0=Enable OSD immer, 0=SW RST, 0=Enable Video Buffer movwf SPI_DATA_WRITE call SPI_Send movlw 0x01 ; VM1 Video Mode Register 1 movwf SPI_DATA_WRITE call SPI_Send movlw B'00000100' ; 0 = NA, 000=Background MODE Brightness 100%, 11=Blinking Time 160ms, 00=Blinking Duty Cycle BT:BT movwf SPI_DATA_WRITE call SPI_Send movlw 0x02 ; HOS Horizontal Offset Register movwf SPI_DATA_WRITE call SPI_Send movlw B'00101111' ; 00 = NA, 100000 = Horitzontal Offset movwf SPI_DATA_WRITE call SPI_Send movlw 0x03 ; VOS Vertical Offset Register movwf SPI_DATA_WRITE call SPI_Send movlw B'00010111' ; 000 = NA, 10000 = Vertical Offset movwf SPI_DATA_WRITE call SPI_Send return max7456_cls ; max7456 ausgabe Löschen movlw 0x00 ; VM0 Video Mode Register 0 (Write) movwf SPI_DATA_WRITE call SPI_Send movlw B'01001010' ; 0 , 1=PAL, 00=Auto Sync, 1=Enable OSD, 0=Enable OSD immer, 1=SW RST, 0=Enable Video Buffer movwf SPI_DATA_WRITE call SPI_Send call max7456_conf return max7456_add_high ; High adressbereich movlw 0x05 ; Ersten 256 zeichen Low = 0x00, Letzten 256 Zeichen High=0xff movwf SPI_DATA_WRITE call SPI_Send movlw 0xFF movwf SPI_DATA_WRITE call SPI_Send return max7456_add_low ; Low Adressbereich movlw 0x05 ; Ersten 256 zeichen Low = 000, Letzten 256 Zeichen High=225 movwf SPI_DATA_WRITE call SPI_Send movlw 0x00 movwf SPI_DATA_WRITE call SPI_Send return max7456_send_char movlw 0x06 ; Zeichen Position links nach rechts erste reihe 0-29, 30-...... movwf SPI_DATA_WRITE call SPI_Send movf m_pos, W movwf SPI_DATA_WRITE call SPI_Send movlw 0x07 ; Zeichen Sonderzeichen sihe Define in max7456.inc movwf SPI_DATA_WRITE call SPI_Send movf m_char, W movwf SPI_DATA_WRITE call SPI_Send return
Zeichen Senden:
movlw D'12' ; Position movwf m_pos movlw m_e ; Zeichen (hier das kleine e) oder direkt den wert des Zeichens im MAX7456 REG. movwf m_char call max7456_send_char; Schreiben
High/low Adressbereich (low = ersten 256 Zeichen, High die letzten 128 Zeichen);
call max7456_add_low ; Low Adressbereich ;call max7456_add_high; Low Adressbereich
--Theborg 23:13, 15. Sep 2009 (CEST)