🇩🇪
Zitat von: ^Cobra in 07.04.2025, 12:17:39 CESTDer 18F mag wohl die in der Doku verwendete sprung methode nicht. $-1
Error - file './build/default/production/Main.o', section 'Haupt', Symbol '_Haupt_002A' is not word-aligned.
It can not be used as the target of a call or goto instruction.
Errors : 1
Banksel TRISC
clrf TRISC ;Port C Ausgänge
movlw B'00110000'
movwf ADCON1
banksel WPUB
movwf WPUB
movlw b'00001111' ;RA0-RA2 u RA4 Analog, RC0-RC3 Digital
movwf ANSEL
;Akuuspannung messen
movlw b'00000001' ; A/D wandler einschalten, AN= aktiv, VDD als Vref, messung starten
movwf ADCON0
movlw d'50'
CALL WaitX ;50ms warten
BSF ADCON0,GO ;Start conversion
BTFSC ADCON0,GO ;Is conversion done?
GOTO $-1 ;No, test again
movfw ADRESH ; Akku Spannung messen
movwf Temp0 ;
; Example of using GPR Uninitialized Data
;
GPR_VAR UDATA
Temp0 RES 1 ; User variable linker places
Temp1 RES 1 ; User variable linker places
Temp2 RES 1 ; User variable linker places
PV_State RES 1 ; Status Register von der PC Steuerung
;
; ; Example of using Access Uninitialized Data Section (when available)
; ; The variables for the context saving in the device datasheet may need
; ; memory reserved here.
; INT_VAR UDATA_ACS
; W_TEMP RES 1 ; w register for context saving (ACCESS)
; STATUS_TEMP RES 1 ; status used for context saving
; BSR_TEMP RES 1 ; bank select used for ISR context saving
;
;*******************************************************************************
; TODO PLACE VARIABLE DEFINITIONS GO HERE
;*******************************************************************************
; Reset Vector
;*******************************************************************************
RES_VECT CODE 0x0000 ; processor reset vector
GOTO START ; go to beginning of program
;*******************************************************************************
; TODO Step #4 - Interrupt Service Routines
;
; There are a few different ways to structure interrupt routines in the 8
; bit device families. On PIC18's the high priority and low priority
; interrupts are located at 0x0008 and 0x0018, respectively. On PIC16's and
; lower the interrupt is at 0x0004. Between device families there is subtle
; variation in the both the hardware supporting the ISR (for restoring
; interrupt context) as well as the software used to restore the context
; (without corrupting the STATUS bits).
;
; General formats are shown below in relocatible format.
;
;------------------------------PIC16's and below--------------------------------
;
ISR CODE 0x0004 ; interrupt vector location
;
; <Search the device datasheet for 'context' and copy interrupt
; context saving code here. Older devices need context saving code,
; but newer devices like the 16F#### don't need context saving code.>
;
; RETFIE
;
; TODO INSERT ISR HERE
;*******************************************************************************
; MAIN PROGRAM
;*******************************************************************************
#include GeneralConfigs.inc
; CONFIG
; __config 0x3FCC
__CONFIG _FOSC_INTRCIO & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _IESO_OFF & _FCMEN_OFF
#Define StatusLED PORTC,0
#Define Relais PORTC,1
#Define ErrorLED PORTC,2
#Define AkkuVolt PORTA,0 ;BereitMeldung PV Akku und Heizung bereit zum zuheizen
#Define Temperatur1 PORTA,1
#Define EIN_Taster PORTB,4
#Define AkkuVoltOK PV_State,0 ;Akku ist so gut wie voll und Heizung ist aufnahme bereit
#Define AkkuTempOK PV_State,1
#Define AutoON PV_State,2
extern WaitX
global Temp0,Temp1,Temp2
MAIN_PROG CODE ; let linker place main program
START
;IO Config setzen
bsf OSCCON,SCS ;internen takt benutzten
clrf PORTC
Banksel TRISC
clrf TRISC ;Port C Ausgänge
movlw B'00110000'
movwf ADCON1
movlw b'11110000' ; Pull UP für RB4-RB7 ON
banksel WPUB
movwf WPUB
movlw b'00001111' ;RA0-RA2 u RA4 Analog, RC0-RC3 Digital
movwf ANSEL
clrf ANSELH ;RB4-5 und RC 6-7 Digital IO
BCF STATUS,RP0 ;Bank 0
BCF STATUS,RP1
bcf AkkuVoltOK
StartWait
CLRWDT ;Watchdog zurück setzen
bsf StatusLED ; LED einschalten -> Spannung liegt an
;Akuuspannung messen
movlw b'00000001' ; A/D wandler einschalten, AN= aktiv, VDD als Vref, messung starten
movwf ADCON0
movlw d'50'
CALL WaitX ;50ms warten
BSF ADCON0,GO ;Start conversion
BTFSC ADCON0,GO ;Is conversion done?
GOTO $-1 ;No, test again
movfw ADRESH ; Akku Spannung messen
movwf Temp0 ;
;
; Spannungsteiler wird so eingestellt das bei 32V 5V am Pic ankommen
;es ergeben sich diese Spannungen
;5V/1024 => 0,0048828125 ca 0,005v => ein digit
;32V => 5V
;28V=>5V/32*28=>4,375 - start spannung
;22V=>5/32*22=>3,43 - stopp spannung
;5V=> 1024
;4,37=>1024/5*4,375=> 896 => 11100000/00 (224) 0xE0 -start Wert D'224' nur High in klammer
;3,43=>1024/5*3,43=> 702=> 10101111/10 (175) 0xAF -stopp Wert D'175' nur High in klammer
;einschalten
bsf STATUS,C ;Carry bit setzen
SUBLW d'224' ; Startwert-akku Spannung wenn Akkuspannung > startwertist carry bit false
btfss STATUS,C ;überspringe nachfolgenden wenn gesetzt
bsf AkkuVoltOK
;ausschalten
movfw Temp0
SUBLW d'175' ; Startwert-akku Spannung wenn Akkuspannung > Endwert ist carry bit false
btfsc STATUS,C ;überspringe nachfolgenden wenn gesetzt
bcf AkkuVoltOK
;Schalter Automatik EIN
BCF AutoON
BTFSS EIN_Taster ;//Wenn Schalter belegt bit = False
bsf AutoON
;Freigabe heizen zusammen legen
movfw PV_State
SUBLW B'00000101'
BTFSS STATUS,Z
goto RelaisOFF
goto RelaisON
RelaisON
bsf Relais
goto StartWait
RelaisOFF
bcf Relais
goto StartWait
END