Moin ich bin neu hier und haben mal ein paar Fragen zu meinem aktuellem Projekt. Habe in der Schule folgende Aufgabe bekommen:
(würde meine Programmierkenntnisse als mittel bis anfänger einschätzen)

Es soll eine Wetterstation installiert werden. Die Daten sollen durch den Pic16F887 aufgearbeitet werden. Entwickeln sie ein Programm, in welchem die Umweltdaten (Temperatur, Feuchtigkeit, Luftdruck) zur Anzeige gebracht werden.

Angezeigt werden sollen:
- Temperatur (0°C ...50°C ) 0,1 V pro °C
- Luftfeuchtigkeit (0...99%) siehe Kennlinie
- Luftdruck (950...1050mbar) siehe Kennlinie

Folgende Sensoren bzw Module werden verwendet:
-Temperatursensor PT100 (Schaltung muss noch entwickelt werden)
-Feuchtigkeitsmodul, Sensor HIH 4000
-Luftdruckmodul, Sensor MPX 4115A

SCHALTERSTELLUNG FÜR DIE ANZEIGE:
Schalter 1 Schalter 2 Funktion
0 0 Automatikbetrieb
0 1 Temperatur
1 0 Luftfeuchtigkeit
1 1 Luftdruck

Festlegung der Eingänge:
Eingabe Port
Schalter 1 Port A, Bit 7
Schalter 2 Port A, Bit 6
Temperatursensor Port A, Bit 0 (Kanal 0)
Feuchtigkeitssensor Port A, Bit 1 (Kanal 1)
Luftdruck-Sensor Port A, Bit 2 (Kanal 2)

Festlegung der Ausgänge:
Ausgabe Port
7-Segmentanzeige Port D
Freigabe für 7-Seg. D0 (Einer) Port B, Bit 0
Freigabe für 7-Seg. D1 (Zehner) Port B, Bit 1
Freigabe für 7-Seg. D2 (Hundert) Port B, Bit 2
Freigabe für 7-Seg. D3 (Tausend) Port B, Bit 3

Hier sind meine Fragen:

1. Erstmal wollte ich ganz gern wissen ob man dass überhaupt so machen kann? Und ob ich noch was an meinem Programmierstil verbessern kann? (nimm gerne Tips an)

2. Ich bin mir nicht ganz sicher, ob ich das mit der Variablen Deklaration so machen kann? Habe noch nicht so viel mit cblock gearbeitet.?

3. Kann ich zur Bankauswahl BANKSEL benutzen oder muss ich RP0 und RP1 setzen?

4. Ich bin mir nicht sicher wie ich die Schritte einteilen kann, also bei der Temperatur z.B. soll ja von 0 bis 50 angezeigt werden und im Moment gibt er bei mir ja jeden Schritt aus, also 0 bis 255. Wenn man das aufteilt könnte man ja sagen das man den Wert durch 5 dividiert das müsste ungefähr hinkommen. Ich bin mir aber nicht sicher wie ich das umsetzen kann.

5. Gibt es vllt für den Automatikbetrieb noch eine elegantere Lösung? Ich habe da ja jetzt nur alle drei hintereinander geschrieben mit nem kleinen delay.?


(die schleife "delay2s" hab ich noch nicht, ist aber kein Problem)

Vielen Dank schonmal im Vorraus. Lg IceBobo


hier mein bisheriger Code:
Code:
;***************************************
; Syntax zur PIC-Programmierung
List P=16F887
; Einbindung der Includedatei
#include <P16F887.INC>
; Konfigurationseinstellungen
__CONFIG _CONFIG1, _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF
__CONFIG _CONFIG2, _BOR21V & _WRT_OFF
;**************************************


;Deklarieren der Variablen 

	cblock 0x27
					loop_A						;Variable für delay
					loop_B						;Variable für delay
					loop_C						;Variable für delay
					Ergebnis					;Ergebnis der AD-Wandlung
					old_level					;Merker für Pegel		
					bin_val						;Hilfsvariable fuer BCD-Converter
					dispval						;Variable fuer 7-Segment-Converter
					bcd1						;Einerstellen
					bcd10						;Zehnerstellen
					bcd100						;Hunderterstellen
					bcd1000						;Tausenderstellen
	endc
	
;**************************************
; PROGRAMMSTART
	org		0x00					;Startadresse
	goto 	init					;Springe zu "init"




;********************************************
; Grundinitialisierung

init								
	;bsf 	STATUS, RP0				;Setze Bit RP0	
	;bsf	STATUS, RP1				;Setze Bit RP1
	BANKSEL	ANSEL					;Bankauswahl
	movlw	B'11111111'				;PORTA wird als Analog definiert
	movwf	ANSEL

	BANKSEL	ANSELH					;Bankauswahl
	clrf	ANSELH					;PORTB wird als Digital definiert

	BANKSEL	TRISA					;Bankauswahl
	movlw	B'11111111'				;PORTA wird als Eingang definiert
	movwf	TRISA	
	clrf	TRISB					;PORTB wird als Ausgang definiert
	clrf	TRISD					;PORTD wird als Ausgang definiert
	clrf	ADCON1					;loesche Register ADCON1

	BANKSEL	ADCON0					;Bankauswahl
	movlw	B'01000001'				;Einstellungen für Register ADCON0
	movwf	ADCON0					;Einstellungen in Register ADCON0 laden
			
	clrf	PORTA					;PORTA loeschen
	clrf	PORTB					;PORTB loeschen
	clrf	PORTD					;PORTD loeschen

	goto	main					;springe zu "main"


;*************************************************************************************



;Hauptprogramm

main

	btfss	PORTA, 7				;Abfrage Schalter 1, springe wenn gesetzt
	goto	Schalter1_nein			;springe zu "Schalter1_nein"	
	goto	Schalter1_ja			;springe zu "Schalter1_ja"

Schalter1_nein

	btfss	PORTA, 6				;Abfrage Schalter 2, springe wenn gesetzt
	goto	Automatik				;springe zu "Automatik"
	goto	Temperatur				;springe zu "Temperatur"

Schalter1_ja

	btfss	PORTA, 6				;Abfrage Schalter 2, springe wenn gesetzt
	goto	Luftfeuchtigkeit		;springe zu "Luftfeuchtigkeit"
	goto	Luftdruck				;springe zu "Luftdruck"

Temperatur

	BANKSEL	ADCON1					;Bankauswahl
	movlw	B'00000000'				;Ergebnis = linksbündig
	movwf	ADCON1

	BANKSEL	ADCON0					;Bankauswahl
	movlw 	B'01000001'				;FOSC/8---Kanal 0---AD-Wandlung aktiviert
	movwf	ADCON0
	bsf		ADCON0, 1				;starte AD-Wandlung
	btfsc	ADCON0, 1				;fertig?
	goto	$-1						;sonst warte

;Speichern
	movf	ADRESH, w				;kopiere Inhalt aus ADRESH in Arbeitsregister
	movwf	Ergebnis				;schreibe Inhalt aus Arbeitsregister in "Ergebnis"
	
	goto 	main					;springe zu "main"

Luftfeuchtigkeit

	BANKSEL	ADCON1					;Bankauswahl
	movlw	B'00000000'				;Ergebnis = linksbündig
	movwf	ADCON1

	BANKSEL	ADCON0					;Bankauswahl
	movlw 	B'01000101'				;FOSC/8---Kanal 1---AD-Wandlung aktiviert
	movwf	ADCON0
	bsf		ADCON0, 1				;starte AD-Wandlung
	btfsc	ADCON0, 1				;fertig?
	goto	$-1						;sonst warte

;Speichern
	movf	ADRESH, w				;kopiere Inhalt aus ADRESH in Arbeitsregister
	movwf	Ergebnis				;schreibe Inhalt aus Arbeitsregister in "Ergebnis"
	
	goto 	main					;springe zu "main"

Luftdruck

	BANKSEL	ADCON1					;Bankauswahl
	movlw	B'00000000'				;Ergebnis = linksbündig
	movwf	ADCON1

	BANKSEL	ADCON0					;Bankauswahl
	movlw 	B'01001001'				;FOSC/8---Kanal 2---AD-Wandlung aktiviert
	movwf	ADCON0
	bsf		ADCON0, 1				;starte AD-Wandlung
	btfsc	ADCON0, 1				;fertig?
	goto	$-1						;sonst warte

;Speichern
	movf	ADRESH, w				;kopiere Inhalt aus ADRESH in Arbeitsregister
	movwf	Ergebnis				;schreibe Inhalt aus Arbeitsregister in "Ergebnis"
	
	goto 	main					;springe zu "main"

Automatik

;***Temperatur***
	BANKSEL	ADCON1					;Bankauswahl
	movlw	B'00000000'				;Ergebnis = linksbündig
	movwf	ADCON1

	BANKSEL	ADCON0					;Bankauswahl
	movlw 	B'01000001'				;FOSC/8---Kanal 0---AD-Wandlung aktiviert
	movwf	ADCON0
	bsf		ADCON0, 1				;starte AD-Wandlung
	btfsc	ADCON0, 1				;fertig?
	goto	$-1						;sonst warte

	;Speichern
	movf	ADRESH, w				;kopiere Inhalt aus ADRESH in Arbeitsregister
	movwf	Ergebnis				;schreibe Inhalt aus Arbeitsregister in "Ergebnis"

	call	delay2s

;***Luftfeuchtigkeit***
	BANKSEL	ADCON1					;Bankauswahl
	movlw	B'00000000'				;Ergebnis = linksbündig
	movwf	ADCON1

	BANKSEL	ADCON0					;Bankauswahl
	movlw 	B'01000101'				;FOSC/8---Kanal 1---AD-Wandlung aktiviert
	movwf	ADCON0
	bsf		ADCON0, 1				;starte AD-Wandlung
	btfsc	ADCON0, 1				;fertig?
	goto	$-1						;sonst warte

	;Speichern
	movf	ADRESH, w				;kopiere Inhalt aus ADRESH in Arbeitsregister
	movwf	Ergebnis				;schreibe Inhalt aus Arbeitsregister in "Ergebnis"

	call	delay2s
	
;***Luftdruck***
	BANKSEL	ADCON1					;Bankauswahl
	movlw	B'00000000'				;Ergebnis = linksbündig
	movwf	ADCON1

	BANKSEL	ADCON0					;Bankauswahl
	movlw 	B'01001001'				;FOSC/8---Kanal 2---AD-Wandlung aktiviert
	movwf	ADCON0
	bsf		ADCON0, 1				;starte AD-Wandlung
	btfsc	ADCON0, 1				;fertig?
	goto	$-1						;sonst warte

;Speichern
	movf	ADRESH, w				;kopiere Inhalt aus ADRESH in Arbeitsregister
	movwf	Ergebnis				;schreibe Inhalt aus Arbeitsregister in "Ergebnis"

	call	delay2s

	goto 	main


	


delay500us
	movlw 	D'5' 					;schreibe "5" in "loop_A" 
	movwf 	loop_A 
z6 
	movlw 	D'50' 					;schreibe "50" in "loop_B" 
	movwf 	loop_B 
z5 
	movlw 	D'50' 					;schreibe "50" in "loop_C" 	
	movwf 	loop_C 
z4 	
	decfsz 	loop_C 					;ziehe "1" von "loop_C" ab 
	goto 	z4
	decfsz 	loop_B 					;ziehe "1" von "loop_B" ab 
	goto 	z5
	decfsz 	loop_A 					;ziehe "1" von "loop_A" ab 
	goto 	z6

return


;Unterprogramm Displayausgabe mit BCD dreistellig (sr_display, sr_conv7seg)

; ------------------------------------------------------------------------
; Display Ausgabe auf 7-Segmentdisplay mit BCD dreistellig
; ------------------------------------------------------------------------
sr_display
		clrf	bcd1000				; bcd10000 loeschen
		clrf   	bcd100				; bcd100 loeschen
		clrf	bcd10				; bcd10 loeschen
		clrf 	bcd1				; bcd1 loeschen
		movf	Ergebnis,w			; Ergebnis in w laden
		movwf 	bin_val				; w nach bin_val

									; Division durch 1000
		movlw	d'1000' 			; lade w mit 1000
loop1000
		subwf	bin_val,1			; subtrahiere 1000 von bin_val, Resultat nach bin_val
		btfss	STATUS,C			; Resultat < 1000 ?
		goto   	end1000				; ja -> dann 100er Stelle 
		incf	bcd1000				; bcd1000 + 1
		goto	loop1000			; naechster Durchgang
end1000
		addwf	bin_val,1			; addiere 1000 zu bin_val, Korrektur der letzten Pruefung
									; Division durch 100
		movlw	d'100' 				; lade w mit 100
loop100
		subwf	bin_val,1			; subtrahiere 100 von bin_val, Resultat nach bin_val
		btfss	STATUS,C			; Resultat < 100 ?
		goto   	end100				; ja -> dann 10er Stelle 
		incf	bcd100				; bcd100 + 1
		goto	loop100				; naechster Durchgang
end100
		addwf	bin_val,1			; addiere 100 zu bin_val, Korrektur der letzten Pruefung
									; Division durch 10
		movlw 	d'10' 				; lade w mit 10
loop10
		subwf	bin_val,1			; subtrahiere 10 von bin_val, Resultat nach bin_val
		btfss   STATUS,C			; Resultat < 10 ?
		goto   	end10				; ja -> dann 1er Stelle 
		incf	bcd10				; war groesser oder gleich 10, dann bcd10 + 1
		goto	loop10				; naechster Durchgang
end10
		addwf	bin_val,0			; addiere 10 zu bin_val, Korrektur der letzten Pruefung
		movwf 	bcd1				; Rest ist gleich Einerstelle

		movf	bcd1,0				; Uebergebe Einerstelle an Converter
		movwf	dispval
		call	sr_conv7seg			; Convertiere nach 7-Segment
		bsf		PORTB,0				; Schreibe nach Einerstelle
		call	delay500us
		bcf		PORTB,0
		call	delay500us

		movf	bcd10,w				; Uebergebe Zehnerstelle an Converter
		movwf	dispval
		call	sr_conv7seg			; Convertiere nach 7-Segment
		bsf		PORTB,1				; Schreibe nach Zehnerstelle
		call	delay500us
		bcf		PORTB,1
		call	delay500us

		movf	bcd100,w			; Uebergebe Hunderterstelle an Converter
		movwf	dispval
		call	sr_conv7seg			; Convertiere nach 7-Segment
		bsf		PORTB,2				; Schreibe nach Hunderterstelle
		call	delay500us
		bcf		PORTB,2
		call	delay500us

		movf	bcd1000,w			; Uebergebe Tausenderterstelle an Converter
		movwf	dispval
		call	sr_conv7seg			; Convertiere nach 7-Segment
		bsf		PORTB,3				; Schreibe nach Tausenderterstelle
		call	delay500us
		bcf		PORTB,3

return






; ------------------------------------------------------------------------
; 7-Segment Display Converter
; ------------------------------------------------------------------------

sr_conv7seg
		movlw		b'00111111'	; Displaycode für 0 
		movwf		PORTD		; nach PORTD
		movf		dispval,0
		sublw		D'0'		; subtrahiere den Pruefwert = 0
		btfsc		STATUS,Z	; wenn dispval = 0, dann Z=1?
		goto		write_sign	; ja, dann springe zur Ausgabe
								; nein, dann pruefe nächsten Wert

		movlw		b'00000110'	; Displaycode für 1 
		movwf		PORTD		; nach PORTD	
		movf		dispval,0
		sublw		D'1'		; subtrahiere den Pruefwert = 1		; 
		btfsc		STATUS,Z	; wenn dispval = 1, dann Z=1?
		goto		write_sign	; ja, dann springe zur Ausgabe
								; nein, pruefe nächsten Wert

		movlw		b'01011011'	; Displaycode für 2
		movwf		PORTD		
		movf		dispval,0
		sublw		D'2'		; 
		btfsc		STATUS,Z
		goto		write_sign

		movlw		b'01001111'	; Displaycode für 3
		movwf		PORTD	
		movf		dispval,0
		sublw		D'3'		; 
		btfsc		STATUS,Z
		goto		write_sign

		movlw		b'01100110'	; Displaycode für 4
		movwf		PORTD		
		movf		dispval,0
		sublw		D'4'		; 
		btfsc		STATUS,Z
		goto		write_sign

		movlw		b'01101101'	; Displaycode für 5
		movwf		PORTD		
		movf		dispval,0
		sublw		D'5'		; 
		btfsc		STATUS,Z
		goto		write_sign

		movlw		b'01111101'	; Displaycode für 6
		movwf		PORTD		
		movf		dispval,0
		sublw		D'6'		; 
		btfsc		STATUS,Z
		goto		write_sign

		movlw		b'00000111'	; Displaycode für 7
		movwf		PORTD		
		movf		dispval,0
		sublw		D'7'		; 
		btfsc		STATUS,Z
		goto		write_sign


		movlw		b'01111111'	; Displaycode für 8
		movwf		PORTD	
		movf		dispval,0
		sublw		D'8'		; 
		btfsc		STATUS,Z
		goto		write_sign

		movlw		b'01101111'	; Displaycode für 9
		movwf		PORTD		
		movf		dispval,0
		sublw		D'9'		; 
		btfsc		STATUS,Z
		goto		write_sign
		
write_sign

		return