- LiTime Speicher und Akkus         
Ergebnis 1 bis 5 von 5

Thema: spruts adc zu lcd nachbauen, ASM problem

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2006
    Beiträge
    1.178

    spruts adc zu lcd nachbauen, ASM problem

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Fehlermeldung in IDELAB:
    Code:
    Clean: Deleting intermediary and output files.
    Clean: Done.
    Executing: "C:\Programme\Microchip\MPASM Suite\MPAsmWin.exe" /q /p16F876A "adclcd.asm" /l"adclcd.lst" /e"adclcd.err"
    Warning[205] C:\VELLEMAN\K8048\PROGS\ADCLCD.ASM 1 : Found directive in column 1. (list)
    Warning[205] C:\VELLEMAN\K8048\PROGS\ADCLCD.ASM 3 : Found directive in column 1. (ERRORLEVEL)
    Error[118]   C:\VELLEMAN\K8048\PROGS\ADCLCD.ASM 403 : Overwriting previous address contents (2007)
    Error[118]   C:\VELLEMAN\K8048\PROGS\ADCLCD.ASM 403 : Overwriting previous address contents (2007)
    Halting build on first failure as requested.
    BUILD FAILED: Mon Apr 02 22:57:28 2007
    weil mein asm nie die *.inc files findet egal wo se sind,
    mußte ich wieder das ding davor kopieren.

    hab schon paar kleinigkeiten (warning) entfernt bekommen,
    aber irgendwie finde ich die 2 fehler oben net, ich weiß auch net was mir das sagen soll..
    vermutlich zeile 403, aber da is nix .. ?
    bzw, was ist 0x22 in '...FF' geschrieben

    Hilfää!
    Danke!

    teil vom code um zeile 403:

    ;************************************************* *******
    ; Variablen festlegen

    ;16 Bit Rechenregister
    xw0 equ 0x22 ; ZEILE403
    xw1 equ 0x23 ;
    f0 equ 0x24 ;
    f1 equ 0x25 ;

    ach.. son käse das..

    edit:
    wenn ich das fertige hexfile benutze und brenne gibts zwar keine fehlermeldung, aber das lcd bleibt "tot"
    die kästchen sind zwar sichtbar, aber es wird nix angezeigt ausser kästchen, kontrasteinstellen nütz auch nix, von schwarz bis unsichtbar..
    GrußundTschüß \/
    ~Jürgen

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    16.03.2007
    Alter
    36
    Beiträge
    58
    hi PSiQ,
    also
    Warning[205] C:\VELLEMAN\K8048\PROGS\ADCLCD.ASM 1 : Found directive in column 1. (list)
    Warning[205] C:\VELLEMAN\K8048\PROGS\ADCLCD.ASM 3 : Found directive in column 1. (ERRORLEVEL)

    heißt das du die anweisung list und errorlevel zu weit links stehen hast. setze den cursor vor diese beiden zeilen und drücke jeweils einmal tab so das diese beiden anweisungen nicht mehr ganz vorne stehen.
    das 403 drei heißt wie du vermutet hast zeile 403.
    lass mir doch am besten mal die komplette asm datei zukommen. kann damit eher was anfangen wie mit nem ausschnitt.

    gruß carsten

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2006
    Beiträge
    1.178
    also:
    ich hab spruts programm genommen,
    davor manuell die *.inc eingefügt, weil das mein assembler nicht hinbekommt, egal wohin ich die datei stopf,

    und dann hab ich angefangen die config namen "equ" dinger aus dem reinkopierten *.inv zu löschen, die im programm eh nicht benutzt werden.
    hat an den fehlern aber nichts geändert
    (ich glaub einer wurde weniger, ne doppelbenennung oderso)

    hier die komplette Fehlermeldung:
    die 2 kleinen fehler sind jetzt weg, dank leerstellen
    Code:
    Clean: Deleting intermediary and output files.
    Clean: Done.
    Executing: "C:\Programme\Microchip\MPASM Suite\MPAsmWin.exe" /q /p16F876A "adclcd.asm" /l"adclcd.lst" /e"adclcd.err"
    Error[118]   C:\VELLEMAN\K8048\PROGS\ADCLCD.ASM 403 : Overwriting previous address contents (2007)
    Error[118]   C:\VELLEMAN\K8048\PROGS\ADCLCD.ASM 403 : Overwriting previous address contents (2007)
    Halting build on first failure as requested.
    BUILD FAILED: Wed Apr 04 21:49:01 2007

    Hardwaremäßig hab ichs genau so aufgebaut wie auf spruts seite, nochmal auseinander und wieder zusammen.
    (lcd 16x2 von reichelt)
    Quarz 10Mhz
    5V
    nur
    -lcd
    -eingangspin mit 1k , dahinter ein poti von 0-5V

    Danke!
    GrußundTschüß \/
    ~Jürgen

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2006
    Beiträge
    1.178
    Der komplette Code:
    Code:
    	list p=16f876a
    
    	ERRORLEVEL      -302    	;SUPPRESS BANK SELECTION MESSAGES
            
            IFNDEF __16F876A
               MESSG "Processor-header file mismatch.  Verify selected processor."
            ENDIF
    
    ;==========================================================================
    ;
    ;       Register Definitions
    ;
    ;==========================================================================
    
    W                            EQU     H'0000'
    F                            EQU     H'0001'
    
    ;----- Register Files------------------------------------------------------
    
    INDF                         EQU     H'0000'
    TMR0                         EQU     H'0001'
    PCL                          EQU     H'0002'
    STATUS                       EQU     H'0003'
    FSR                          EQU     H'0004'
    PORTA                        EQU     H'0005'
    PORTB                        EQU     H'0006'
    PORTC                        EQU     H'0007'
    PCLATH                       EQU     H'000A'
    INTCON                       EQU     H'000B'
    PIR1                         EQU     H'000C'
    PIR2                         EQU     H'000D'
    TMR1L                        EQU     H'000E'
    TMR1H                        EQU     H'000F'
    T1CON                        EQU     H'0010'
    TMR2                         EQU     H'0011'
    T2CON                        EQU     H'0012'
    SSPBUF                       EQU     H'0013'
    SSPCON                       EQU     H'0014'
    CCPR1L                       EQU     H'0015'
    CCPR1H                       EQU     H'0016'
    CCP1CON                      EQU     H'0017'
    RCSTA                        EQU     H'0018'
    TXREG                        EQU     H'0019'
    RCREG                        EQU     H'001A'
    CCPR2L                       EQU     H'001B'
    CCPR2H                       EQU     H'001C'
    CCP2CON                      EQU     H'001D'
    ADRESH                       EQU     H'001E'
    ADCON0                       EQU     H'001F'
    
    OPTION_REG                   EQU     H'0081'
    TRISA                        EQU     H'0085'
    TRISB                        EQU     H'0086'
    TRISC                        EQU     H'0087'
    PIE1                         EQU     H'008C'
    PIE2                         EQU     H'008D'
    PCON                         EQU     H'008E'
    SSPCON2                      EQU     H'0091'
    PR2                          EQU     H'0092'
    SSPADD                       EQU     H'0093'
    SSPSTAT                      EQU     H'0094'
    TXSTA                        EQU     H'0098'
    SPBRG                        EQU     H'0099'
    CMCON                        EQU     H'009C'
    CVRCON                       EQU     H'009D'
    ADRESL                       EQU     H'009E'
    ADCON1                       EQU     H'009F'
    
    EEDATA                       EQU     H'010C'
    EEADR                        EQU     H'010D'
    EEDATH                       EQU     H'010E'
    EEADRH                       EQU     H'010F'
    
    EECON1                       EQU     H'018C'
    EECON2                       EQU     H'018D'
    
    ;----- STATUS Bits --------------------------------------------------------
    
    IRP                          EQU     H'0007'
    RP1                          EQU     H'0006'
    RP0                          EQU     H'0005'
    NOT_TO                       EQU     H'0004'
    NOT_PD                       EQU     H'0003'
    Z                            EQU     H'0002'
    DC                           EQU     H'0001'
    C                            EQU     H'0000'
    
    ;----- INTCON Bits --------------------------------------------------------
    
    GIE                          EQU     H'0007'
    PEIE                         EQU     H'0006'
    T0IE                         EQU     H'0005'
    INTE                         EQU     H'0004'
    RBIE                         EQU     H'0003'
    T0IF                         EQU     H'0002'
    INTF                         EQU     H'0001'
    RBIF                         EQU     H'0000'
    
    ;----- PIR1 Bits ----------------------------------------------------------
    
    ADIF                         EQU     H'0006'
    RCIF                         EQU     H'0005'
    TXIF                         EQU     H'0004'
    SSPIF                        EQU     H'0003'
    CCP1IF                       EQU     H'0002'
    TMR2IF                       EQU     H'0001'
    TMR1IF                       EQU     H'0000'
    
    ;----- PIR2 Bits ----------------------------------------------------------
    
    CMIF			     EQU     H'0006'
    EEIF                         EQU     H'0004'
    BCLIF                        EQU     H'0003'
    CCP2IF                       EQU     H'0000'
    
    ;----- T1CON Bits ---------------------------------------------------------
    
    T1CKPS1                      EQU     H'0005'
    T1CKPS0                      EQU     H'0004'
    T1OSCEN                      EQU     H'0003'
    NOT_T1SYNC                   EQU     H'0002'
    T1INSYNC                     EQU     H'0002'    ; Backward compatibility only
    T1SYNC                       EQU     H'0002'
    TMR1CS                       EQU     H'0001'
    TMR1ON                       EQU     H'0000'
    
    ;----- T2CON Bits ---------------------------------------------------------
    
    TOUTPS3                      EQU     H'0006'
    TOUTPS2                      EQU     H'0005'
    TOUTPS1                      EQU     H'0004'
    TOUTPS0                      EQU     H'0003'
    TMR2ON                       EQU     H'0002'
    T2CKPS1                      EQU     H'0001'
    T2CKPS0                      EQU     H'0000'
    
    ;----- SSPCON Bits --------------------------------------------------------
    
    WCOL                         EQU     H'0007'
    SSPOV                        EQU     H'0006'
    SSPEN                        EQU     H'0005'
    CKP                          EQU     H'0004'
    SSPM3                        EQU     H'0003'
    SSPM2                        EQU     H'0002'
    SSPM1                        EQU     H'0001'
    SSPM0                        EQU     H'0000'
    
    ;----- CCP1CON Bits -------------------------------------------------------
    
    CCP1X                        EQU     H'0005'
    CCP1Y                        EQU     H'0004'
    CCP1M3                       EQU     H'0003'
    CCP1M2                       EQU     H'0002'
    CCP1M1                       EQU     H'0001'
    CCP1M0                       EQU     H'0000'
    
    ;----- RCSTA Bits ---------------------------------------------------------
    
    SPEN                         EQU     H'0007'
    RX9                          EQU     H'0006'
    RC9                          EQU     H'0006'    ; Backward compatibility only
    NOT_RC8                      EQU     H'0006'    ; Backward compatibility only
    RC8_9                        EQU     H'0006'    ; Backward compatibility only
    SREN                         EQU     H'0005'
    CREN                         EQU     H'0004'
    ADDEN                        EQU     H'0003'
    FERR                         EQU     H'0002'
    OERR                         EQU     H'0001'
    RX9D                         EQU     H'0000'
    RCD8                         EQU     H'0000'    ; Backward compatibility only
    
    ;----- CCP2CON Bits -------------------------------------------------------
    
    CCP2X                        EQU     H'0005'
    CCP2Y                        EQU     H'0004'
    CCP2M3                       EQU     H'0003'
    CCP2M2                       EQU     H'0002'
    CCP2M1                       EQU     H'0001'
    CCP2M0                       EQU     H'0000'
    
    ;----- ADCON0 Bits --------------------------------------------------------
    
    ADCS1                        EQU     H'0007'
    ADCS0                        EQU     H'0006'
    CHS2                         EQU     H'0005'
    CHS1                         EQU     H'0004'
    CHS0                         EQU     H'0003'
    GO                           EQU     H'0002'
    NOT_DONE                     EQU     H'0002'
    GO_DONE                      EQU     H'0002'
    ADON                         EQU     H'0000'
    
    ;----- OPTION_REG Bits -----------------------------------------------------
    
    NOT_RBPU                     EQU     H'0007'
    INTEDG                       EQU     H'0006'
    T0CS                         EQU     H'0005'
    T0SE                         EQU     H'0004'
    PSA                          EQU     H'0003'
    PS2                          EQU     H'0002'
    PS1                          EQU     H'0001'
    PS0                          EQU     H'0000'
    
    ;----- PIE1 Bits ----------------------------------------------------------
    
    ADIE                         EQU     H'0006'
    RCIE                         EQU     H'0005'
    TXIE                         EQU     H'0004'
    SSPIE                        EQU     H'0003'
    CCP1IE                       EQU     H'0002'
    TMR2IE                       EQU     H'0001'
    TMR1IE                       EQU     H'0000'
    
    ;----- PIE2 Bits ----------------------------------------------------------
    
    CMIE			     EQU     H'0006'
    EEIE                         EQU     H'0004'
    BCLIE                        EQU     H'0003'
    CCP2IE                       EQU     H'0000'
    
    ;----- PCON Bits ----------------------------------------------------------
    
    NOT_POR                      EQU     H'0001'
    NOT_BO                       EQU     H'0000'
    NOT_BOR                      EQU     H'0000'
    
    ;----- SSPCON2 Bits --------------------------------------------------------
    
    GCEN                         EQU     H'0007'
    ACKSTAT                      EQU     H'0006'
    ACKDT                        EQU     H'0005'
    ACKEN                        EQU     H'0004'
    RCEN                         EQU     H'0003'
    PEN                          EQU     H'0002'
    RSEN                         EQU     H'0001'   
    SEN                          EQU     H'0000'   
    
    ;----- SSPSTAT Bits -------------------------------------------------------
    
    SMP                          EQU     H'0007'
    CKE                          EQU     H'0006'
    D                            EQU     H'0005'
    I2C_DATA                     EQU     H'0005'
    NOT_A                        EQU     H'0005'
    NOT_ADDRESS                  EQU     H'0005'
    D_A                          EQU     H'0005'
    DATA_ADDRESS                 EQU     H'0005'
    P                            EQU     H'0004'
    I2C_STOP                     EQU     H'0004'
    S                            EQU     H'0003'
    I2C_START                    EQU     H'0003'
    R                            EQU     H'0002'
    I2C_READ                     EQU     H'0002'
    NOT_W                        EQU     H'0002'
    NOT_WRITE                    EQU     H'0002'
    R_W                          EQU     H'0002'
    READ_WRITE                   EQU     H'0002'
    UA                           EQU     H'0001'
    BF                           EQU     H'0000'
    
    ;----- TXSTA Bits ---------------------------------------------------------
    
    CSRC                         EQU     H'0007'
    TX9                          EQU     H'0006'
    NOT_TX8                      EQU     H'0006'    ; Backward compatibility only
    TX8_9                        EQU     H'0006'    ; Backward compatibility only
    TXEN                         EQU     H'0005'
    SYNC                         EQU     H'0004'
    BRGH                         EQU     H'0002'
    TRMT                         EQU     H'0001'
    TX9D                         EQU     H'0000'
    TXD8                         EQU     H'0000'    ; Backward compatibility only
    
    
    ;----- CMCON Bits ---------------------------------------------------------
    C2OUT                        EQU     H'0007'
    C1OUT                        EQU     H'0006'
    C2INV                        EQU     H'0005'
    C1INV                        EQU     H'0004'
    CIS                          EQU     H'0003'
    CM2                          EQU     H'0002'
    CM1                          EQU     H'0001'
    CM0                          EQU     H'0000'
    
    ;----- CVRCON Bits --------------------------------------------------------
    CVREN                        EQU     H'0007'
    CVROE                        EQU     H'0006'
    CVRR                         EQU     H'0005'
    CVR3                         EQU     H'0003'
    CVR2                         EQU     H'0002'
    CVR1                         EQU     H'0001'
    CVR0                         EQU     H'0000'
    
    ;----- ADCON1 Bits --------------------------------------------------------
    
    ADFM                         EQU     H'0007'
    PCFG3                        EQU     H'0003'
    PCFG2                        EQU     H'0002'
    PCFG1                        EQU     H'0001'
    PCFG0                        EQU     H'0000'
    
    ;----- EECON1 Bits --------------------------------------------------------
    
    EEPGD                        EQU     H'0007'
    WRERR                        EQU     H'0003'
    WREN                         EQU     H'0002'
    WR                           EQU     H'0001'
    RD                           EQU     H'0000'
    
    ;==========================================================================
    ;
    ;       RAM Definition
    ;
    ;==========================================================================
    
            __MAXRAM H'1FF'
            __BADRAM H'8F'-H'90', H'95'-H'97', H'9A'-H'9B'
            __BADRAM H'105', H'107'-H'109'
            __BADRAM H'185', H'187'-H'189', H'18E'-H'18F'
    GrußundTschüß \/
    ~Jürgen

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2006
    Beiträge
    1.178
    Ab hier das sprutprogramm
    Code:
    ;==========================================================================
    ;
    ;       Configuration Bits
    ;
    ;==========================================================================
    
    
    _CP_OFF                      EQU     H'3FFF'
    _DEBUG_OFF                   EQU     H'3FFF'
    
    
    _LVP_OFF                     EQU     H'3F7F'
    _WRT_OFF                     EQU     H'3FFF'
    
    
    _PWRTE_ON                    EQU     H'3FF7'
    
    _WDT_OFF                     EQU     H'3FFB'
    _BODEN_OFF                   EQU     H'3FBF'
    _HS_OSC                      EQU     H'3FFE'
    
    
            LIST
    
    
    ;==========================================================================
    ;
    ;       Configuration 
    ;
    ;==========================================================================
    
    
    	__CONFIG        _CP_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF & _PWRTE_ON & _WDT_OFF & _BODEN_OFF & _HS_OSC
    
    ;**************************************************************
    ;*  	Pinbelegung
    ;*	----------------------------------	
    ;*	PORTA: 	0 < Spannung U
    ;*		1 -
    ;*		2 -
    ;*		3 -
    ;*		4 -
    ;*		5 -
    ;*		6 -
    ;*		7 -
    ;*
    ;*	PORTB:	0 LCD Display E
    ;*		1 -
    ;*		2 LCD Display RS
    ;*		3 LCD Display R/W
    ;*		4 LCD Display D4
    ;*		5 LCD Display D5
    ;*		6 LCD Display D6
    ;*		7 LCD Display D7
    ;*	
    ;*	PORTC:	0 -
    ;*		1 -
    ;*		2 -
    ;*		3 -
    ;*		4 -
    ;*		5 -
    ;*		6 -    
    ;*		7 -
    ;*	
    ;**************************************************************
    ;
    ;sprut (zero) Bredendiek 01/2003
    ;
    ; Lehrbeispiel: ADC mit LCD
    ;
    ; Prozessor 16F876 
    ;
    ; Prozessor-Takt 10 MHz
    ;
    ; LCD am PortB
    ;**********************************************************
    
    	ERRORLEVEL      -302    	;SUPPRESS BANK SELECTION MESSAGES
    
    
    ; Configuration festlegen:
    ; Power on Timer, kein Watchdog, HS-Oscillator, kein Brown out, kein LV-programming
    	__CONFIG	_PWRTE_ON & _WDT_OFF & _HS_OSC & _BODEN_OFF & _LVP_OFF
    
    
    ;********************************************************
    ; Variablen festlegen
    
    ;16 Bit Rechenregister
    xw0		equ	0x22	; 
    xw1		equ	0x23	; 
    f0		equ	0x24	; 
    f1		equ	0x25	; 
    counter		equ	0x26	; 
    Fehler		equ	0x27	; 
    ST		equ	0x28	; 
    SZ		equ	0x29	; 
    SH		equ	0x2A	; 
    SE		equ	0x2B	; 
    loops		equ	0x2C	; timer für wait
    loops2		equ	0x2D	; timer für wait
    LcdStatus	equ	0x2E	;
    LcdDaten	equ	0x2F	;
    
    
    Ini_con		Equ	B'00000000'	; TMR0 -> Interupt disable
    Ini_opt		Equ	B'00000010'	; pull-up
    
    ; für LCD-Pins
    #define	LcdE		PORTB,0		; enable Lcd
    #define	LcdRw		PORTB,3		; read Lcd
    #define	LcdRs		PORTB,2		; Daten Lcd (nicht control)	
    #define LcdPort		PORTB		; Datenbus des LCD (obere 4 Bit)
    
    ;********************************************************
    ; Das Programm beginnt mit der Initialisierung
    
    Init	bsf     STATUS, RP0	; Bank 1
    	movlw   Ini_opt     	; pull-up on
    	movwf   OPTION_REG 
    	movlw	B'00000000'	; PortB alle outputs 
    	movwf	TRISB
    	bcf     STATUS, RP0	; Bank 0
    	clrf	PORTB
    	movlw   Ini_con     	; Interupt disable
    	movwf   INTCON   
    
    ; ADC initialisieren
    	; ADC einschalten
    	BSF	ADCON0, 0	; ADON=1
    	; ADC-Eingang AN0 auswählen
    	BCF	ADCON0, 5	; ADCHS2=0
    	BCF	ADCON0, 4	; ADCHS1=0
    	BCF	ADCON0, 3	; ADCHS0=0
    	; ADC speed für 5 ... 20 MHz einstellen
    	BSF	ADCON0, 7	; ADCS1=1
    	BCF	ADCON0, 6	; ADCS0=0
    	; Daten rechtsbündig
    	BSF	STATUS,RP0	; Bank1
    	clrf	ADCON1
    	BSF	ADCON1, 7	; ADFM=1
    	BCF	STATUS,RP0	; Bank0
    
    
    ;Display initialisieren
    	call	InitLcd
    
    Mainloop
    	call	ADC		; Spannung messen nach f1,f0
    	call	mV		; Wandlung in Millivolt nach f1,f0
    	call	B2D		; Wandlung in dezimal nach ST,SH,SH,SE
    	call	Ausgabe		; anzeigen am LCD
    	goto	Mainloop
    
    
    ;*****************************************************
    ; Spannung mit ADC messen
    ; Ergebnis nach F1,f0
    ADC
    	BSF	ADCON0, 2	; ADC starten
    ADCloop
    	BTFSC	ADCON0, 2	; ist der ADC fertig?
    	GOTO	ADCloop		; nein, weiter warten
    	movfw	ADRESH		; obere  2 Bit auslesen
    	movwf	f1		; obere  2-Bit nach U1H
    	bsf	STATUS,RP0	; Bank1
    	movfw	ADRESL		; untere 8 Bit auslesen
    	bcf	STATUS,RP0	; Bank0
    	movwf	f0		; untere 8-Bit nach U1L
    	return
    
    
    ;*********************************************************************
    ;16 bit Adition, C-Flag bei Überlauf gesetzt
    Add16                           ; 16-bit add: f := f + xw
             movf    xw0,W           ; xw0 nach W
             addwf   f0,F            ; f0 := f0 + xw0
    
             movf    xw1,W           ; xw1 nach W
             btfsc   STATUS,C        ; fall ein Überlauf auftrat:
             incfsz  xw1,W           ;   xw1+1 nach W
             addwf   f1,F            ; f1 := f1 + xw1
    
             return                  ; fertig
    
    
    ;*****************************************************
    ; 16 Bit Subtraktion, bei Überlauf (neg. Ergebnis) ist C gesetzt
    Sub16                           ; 16 bit f:=f-xw 
             clrf    Fehler          ; extraflags löschen 
    
             movf    xw0, w          ; f0:=f0-xw0
             subwf   f0, f
    
             btfsc   STATUS,C
             goto    Sub16a
             movlw   0x01            ; borgen von f1
             subwf   f1, f
    
             btfss   STATUS,C
             bsf     Fehler, C       ; Unterlauf
    
    Sub16a
             movf    xw1,w           ; f1:=f1-xw1
             subwf   f1    ,f
    
             btfss   STATUS,C
             bsf     Fehler, C       ; Unterlauf
    
             bcf     STATUS, C       ; C-Flag invertieren
             btfsc   Fehler, C
             bsf     STATUS, C
             return
    
    
    ;*****************************************************
    ; Division durch 2 wird w-mal ausgeführt
    ; die zu dividierende Zahl steht in xw
    Div2 
             movwf   counter         ; Anzahl der Divisionen speichern
    Div2a                           ; 16 bit xw:=xw/2
             bcf     STATUS, C       ; carry löschen
             rrf     xw1, f
             rrf     xw0, f
      
             decfsz  counter, f         ; fertig?
             goto    Div2a           ; nein: noch mal
             return
    
    ;*****************************************************
    ; Wandlung des ADC-Wert in Millivolt (binär)
    ; Der ADC-Wert steht in f1,f0
    ; Ergebnis steht in f1,f0
    mV
    	; zunächst die Multiplikation mal 5
    	movfw	f0
    	movwf	xw0
    	movfw	f1
    	movwf	xw1
    	call	Add16		; f := 2xADC
    	call	Add16		; f := 3xADC
    	call	Add16		; f := 4xADC
    	call	Add16		; f := 5xADC
    
    	; ADC * 5 nach xw kopieren
    	movfw	f0
    	movwf	xw0
    	movfw	f1
    	movwf	xw1		; xw := 5xADC
    
    	; xw durch 64 dividieren (6 mal durch 2)
    	; dann ist xw = 5xADC/64
    	movlw	6
    	call	Div2
    	call	Sub16		; f := 5xADC - 5xADC/64
    
    	; xw auf 5xADC/128 verringern
    	movlw	1
    	call	Div2
    	call	Sub16		; f := 5xADC - 5xADC/64 - 5xADC/128 
    	return			; fertig
    
    
    ;*****************************************************
    ; Wandlung einer Binärzahl (< 10000) in eine Dezimalzahl
    ; Die Binärzahl steht in f1,f0
    ; die Dezimalstellen werden in ST (tausender), SH (hunderter),
    ;    SZ (zehner) und SE (einer) gespeichert im BCD-Code
    B2D
    	; Test auf tausender 1000d = 0x03E8
    	movlw	0x03
    	movwf	xw1
    	movlw	0xE8
    	movwf	xw0
    	call	B2Da
    	movwf	ST
    	; Test auf hunderter 100d = 0x0064
    	clrf	xw1
    	movlw	0x64
    	movwf	xw0
    	call	B2Da
    	movwf	SH
    	; Test auf zehner 10d = 0x000A
    	clrf	xw1
    	movlw	0x0A
    	movwf	xw0
    	call	B2Da
    	movwf	SZ
    	movfw	f0
    	movwf	SE
    	return
    
    B2Da
    	clrf	counter
    B2Sb	incf	counter, f	; wie oft abgezogen?
    	call	Sub16		; f:=f-xw	
    	btfss	STATUS, C	; zu oft abgezogen?
    	goto	B2Sb		; nein: noch einmal
    	call	Add16		; f:=f+xw
    	decf	counter, w	; weil immer 1 zuviel gezählt wird
    	return
    
    
    ;*****************************************************
    ;Anzeige der dezimalzahl am LCD mit 'mV'
    ; input: ST, SH, SZ, SE dezimalstellen im BCD-Code
    Ausgabe
    	movlw	B'10000000'	; 1. Zeile
    	call	OutLcdControl
    	movlw	'0'		; 30h = '0011 0000'
    	iorwf	ST, w		; BCD -> ASCII
    	call	OutLcdDaten	; zum LCD
    	movlw	'0'
    	iorwf	SH, w
    	call	OutLcdDaten
    	movlw	'0'
    	iorwf	SZ, w
    	call	OutLcdDaten
    	movlw	'0'
    	iorwf	SE, w
    	call	OutLcdDaten
    	movlw	'm'		; 'mA' anhängen
    	call	OutLcdDaten
    	movlw	'V'
    	call	OutLcdDaten
    	return
    
    
    ;*****************************************************
    ;+++LCD-Routinen**************************************
    ;*****************************************************
    ;LCD initialisieren, Begrüßung ausgeben
    
    InitLcd
    	movlw	D'255'		; 250 ms Pause nach dem Einschalten
    	movwf	loops	
    	call	WAIT		
    
    	movlw	B'00110000'	; 1
    	movwf	LcdPort
    	bsf	LcdE
    	nop	
    	bcf	LcdE
    	
    	movlw	D'50'		; 50 ms Pause
    	movwf	loops
    	call	WAIT
    	
    	movlw	B'00110000'	; 2
    	call	Control8Bit
    	movlw	B'00110000'	; 3
    	call 	Control8Bit
    	movlw	B'00100000'	; 4
    	call 	Control8Bit
    
    	movlw	B'00000001'	; löschen und cusor home
    	call	OutLcdControl	
    	movlw	B'00101000'	; 5 function set, 4-bit  2-zeilig,  5x7
    	call	OutLcdControl	
    	movlw	B'00001000'	; 6 display off
    	call	OutLcdControl
    	movlw	B'00000110'	; 7 entry mode, increment, disable display-shift
    	call	OutLcdControl
    	movlw	B'00000011'	; 8 cursor home, cursor home
    	call	OutLcdControl
    	movlw	B'00001100'	; 9 display on, Kursor aus , Blinken aus
    	call	OutLcdControl
    	return
    
    ;*****************************************************
    ; ein Steuerbyte 8-bittig übertragen
    Control8Bit
    	movwf	LcdPort
    	bsf	LcdE
    	nop
    	bcf	LcdE
    	movlw	D'10'
    	movwf	loops
    	call 	WAIT
    	return
    
    ;*****************************************************
    ; darauf warten, daß das Display bereit zur Datenannahme ist
    LcdBusy
            bsf     STATUS, RP0	; make Port B4..7 input
    	movlw	B'11110000'
    	iorwf   TRISB, f 
            bcf     STATUS, RP0
    BusyLoop		
    	bcf	LcdRs
    	bsf	LcdRw		; Lesen
    	bsf	LcdE
    	nop
    	movf	LcdPort, w
    	movwf	LcdStatus
    	bcf	LcdE
    	nop
    	bsf	LcdE		; Enable
    	nop
    	bcf	LcdE
    	btfsc	LcdStatus, 7	; teste bit 7
    	goto	BusyLoop
    	bcf	LcdRw
            bsf     STATUS, RP0	; make Port B4..7 output
    	movlw	B'00001111'
    	andwf   TRISB, f    
            bcf     STATUS, RP0
    	return	
    
    ;*****************************************************
    ; aus W ein Byte mit Steuerdaten zum Display übertragen
    OutLcdControl
    	movwf	LcdDaten
    	call	LcdBusy
    	movf	LcdDaten, w
    	andlw	H'F0'
    	movwf	LcdPort		; Hi-teil Daten schreiben
    	bsf	LcdE
    	nop
    	bcf	LcdE		; Disable LcdBus
    	swapf	LcdDaten, w
    	andlw	H'F0'
    	movwf	LcdPort		; Lo-teil Daten schreiben
    	bsf	LcdE
    	nop
    	bcf	LcdE		; Disable LcdBus
    	return
    
    ;*****************************************************
    ; aus W ein Datenbyte zum Display übertragen
    OutLcdDaten
    	movwf	LcdDaten
    	call	LcdBusy
    	movf	LcdDaten, w
    	andlw	H'F0'
    	movwf	LcdPort		; Hi-teil Daten schreiben
    	bsf	LcdRs		; Daten
    	bsf	LcdE		; Enable LcdBus
    	nop
    	bcf	LcdE		; Disable LcdBus	
    	swapf	LcdDaten, w
    	andlw	H'F0'
    	movwf	LcdPort		; Lo-teil Daten schreiben
    	bsf	LcdRs		; Daten
    	bsf	LcdE
    	nop
    	bcf	LcdE		; Disable LcdBus	
    	bcf	LcdRs		;
    	return
    
    
    ;*****************************************************
    ;Zeitverzögerung um loops * 1 ms
    ; 10 MHz externer Takt bedeutet 2,5 MHz interner Takt
    ; also dauert 1 ms genau 2500 Befehle
    ; 250 Schleifen a 10 Befehle sind 2500 Befehle = 1 ms
    
    WAIT
    top     movlw   .250           ; timing adjustment variable (1ms)
            movwf   loops2
    top2    nop                    ; sit and wait
            nop
            nop
            nop
    	nop
            nop
            nop
            decfsz  loops2, F      ; inner loops complete?
            goto    top2           ; no, go again
                                   ;
            decfsz  loops, F       ; outer loops complete?
            goto    top            ; no, go again
            retlw   0              ; yes, return from subWAIT
    
    
    	end
    Prozessor:
    PIC16F876A I/SP
    GrußundTschüß \/
    ~Jürgen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus