Ok, hier isser. Aber mit Vorsicht zu genießen, ist mein erste Code
überhaupt.
list p=16f688 ; list directive to define processor
#include <P16F688.inc> ; processor specific variable definitions
;Grundeinstellungen des PIC setzen. Siehe Datenblatt
__CONFIG B'000011100001' ;Seite 100
;Speicheradressen con CONFIG liegen im .INC file
org 0x0000 ; Anfangsadresse des Programms
goto Start
;***** VARIABLE DEFINITIONS
RESULTO equ 0x20 ;Variable für Bit 9 und 10 des A/D Ergebnisses
RESULTU equ 0x21 ;Variable für Bits 1 bis 8 des A/D Ergebnisses
;**********************************************************************
Start
; Einstellungen für den internen Oszillator vornehmen
bsf STATUS,5 ; Bank 1 anwählen um in OSCCON zu schreiben
bcf STATUS,6
bcf OSCCON,0 ; Takt durch externen Oszillator bestimmt
bsf OSCCON,3 ; Takt durch externen Oszillator bestimmt
;bcf OSCCON,4 ; Damit wurde ein interner Takt von 4 MHZ ausgewähl
;bsf OSCCON,5 ; Ein Takt beträgt somit 1us
;bsf OSCCON,6 ; Nur nötig wenn interner Oszillator genutzt wird
; Einstellungen für I/O Pins und AD Wandler
bcf STATUS,5 ; in Bank 0 wechseln um ADCON0 zu beschreiben
bcf STATUS,6
bsf ADCON0,0 ; A/D Modul eingeschalten
bsf ADCON0,6 ; Vref wird von PIN 12 abgegriffen
bsf ADCON0,7 ; 10 Bit Ergebnis auf rechter Seite der ADRESH und
ADRESL Register
bcf ADCON0,2 ;
bsf ADCON0,3 ; Anschluss AN6 als Analoger Eingang ausgewählt
(PIN8)
; PIN 8 müsste auch auf Grundeinstellung bereits als Analoger Eingang
definiert sein
bsf ADCON0,4 ;
bsf STATUS,5 ; in Bank 1 wechseln um ADCON1,ANSEL und TRISC zu
beschreiben
bcf STATUS,6
bsf ANSEL,6 ; Anschluss AN6 auf Analogen Input gestellt
(zugehöriger
TRIS muss auch als Input gewählt sein!)
bsf TRISC,2 ; Pin 8 = RC2 als Input gewählt
bsf ADCON1,4 ;
bcf ADCON1,5 ; Auswahl des AD Taktes als 1/16 des Arbeitstaktes des
Prozessors(Oszillators). Damit beträgt ein A/D Takt ca. 4us. Und der
gesamte Umwandlungsprozess der
bsf ADCON1,6 ; A/D Wandlung ca. 44us (11 TAD)
;Einstellungen für die EUSART Schnittstelle
bsf TRISC,4 ;Eingänge auf PIN 5 und PIN 6 aktiviert
bsf TRISC,5
bcf PIE1,4 ;Interrupt ausgeschaltet
;Sende-und Empfangseinstellungen
bcf STATUS,5 ;in Bank 0 wechseln
bcf STATUS,6
bcf TXSTA,6 ;8-bit transmission
;bsf TXSTA,5 ;Transmit enabled
bcf TXSTA,4 ;Asynchronen Modus auswählen
bcf TXSTA,2 ;langsame Übertragung einstellen
bsf RCSTA,7 ;Serieller Port angeschaltet
bcf RCSTA,6 ;8-bit Empfang
bsf RCSTA,4 ;Receiver einschalten für asynchronen Modus
bcf BAUDCTL,4 ;TX und nicht TX-Quer ausgewählt
bcf BAUDCTL,3 ;8-Bit Baudeinstellung
bcf BAUDCTL,1 ;RX,DT Edges generieren keine Interrupts
bcf BAUDCTL,0 ;Auto-Baud Modus ausgeschaltet
movlw B'00011001' ;Laden der Zahl 25 ins SPBRG Register
movwf SPBRG ;Damit wird die Baudrate 2400 eingestellt
;***************Hauptprogrammschleife***********************************
***************
;A/D Wandlung
main
bcf STATUS,5 ;in Bank 0 wechseln
bcf STATUS,6
bsf ADCON0,1 ;A/D Wandlung wird gestartet
ADloop ;11.5 us vergehen bevor die Wandlung anfängt
btfsc ADCON0,1 ;ist Wandler schon fertig? Wenn 0 in ADCON0,1 steht
wird die nächste Zeile übersprungen
goto ADloop ;Diese Schleife sollte ca. 44us+11.5us Sekunden
benötigen
movf ADRESH,w ;obere 2 Bit des A/D Ergebnis in W laden (W=Akku,
oder
Arbeitsregister)
movwf RESULTO ;obere 2 Bit in Variable RESULTO laden
bsf STATUS,5 ;In Bank 1 Wechseln
bcf STATUS,6
movf ADRESL,W ;untere 8 Bit des A/D Ergebnis in W laden
bcf STATUS,5 ;In Bank 0 Wechseln
bcf STATUS,6
movwf RESULTU ;untere 8 Bit in Variable RESULTU laden
;ESUART
bsf TXSTA,5 ;Transmit enabled
movf RESULTU,W ;ersten 8-Bit in Akku laden
movwf TXREG ;ersten 8-Bit senden
gesendet
btfss TXSTA,1 ;nachschauen ob Daten bereits gesendet worden sind
goto gesendet ;nein, noch nicht gesendet, nochmal abfragen
movf RESULTO,W ;ja, gesendet, die übrigen 2-Bit in den Akku laden
movwf TXREG ;die übrigen 2-Bit senden
goto main
END ; directive 'end of program'