Ad-Wandler intrerrupt
Dienstag, 22. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  Programmiersprache Assembler  |  AD-Wandler (Assembler)  |  Ad-Wandler intrerrupt « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: Ad-Wandler intrerrupt  (Gelesen 3796 mal)
 
Komu
Gast
« am: Juni 23, 2004, 14:06:48 »

Hallo

Ich habe einen 16f876 und will einen Interrupt auslösen, wenn der AD-Wandler fertig ist. Ich habe es mit der Initialisierung wie folgt verucht:

; Interrupt einschalten
   BSF   INTCON, GIE   ; interrups einschalten
   BSF   INTCON, PEIE   ; pie1 register aktivieren
   BSF   PIE1, ADIE      ; A/D Interrups einschalten
   BCF   PIE1, ADIF      ; Interruptbit löschen

aber es will nicht funktionieren, hat jemand eine Idee wo der fehler liegen könnte.
Vielen Dank im Voraus
Gespeichert
Steffen
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 1235


Profil anzeigen
« Antworten #1 am: Juni 23, 2004, 14:18:06 »

Die AD-Wandlung hast Du aber durch setzen von ADCON0,GO gestartet?

Wie sieht der Rest der Konfiguration aus?

Steffen
Gespeichert
Komu
Gast
« Antworten #2 am: Juni 23, 2004, 14:51:23 »

Hatte ich noch nicht drin, aber auch damit funktionierts nicht.

Da mein ganzer Code:
Code:

; Includedatei für den 16F84 einbinden

list p=16f876
#include <P16f876.INC>

ERRORLEVEL      -302     ;SUPPRESS BANK SELECTION MESSAGES

; Configuration festlegen
        _CONFIG     EQU     H'3FFE'  ; Wert von Configure


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

; Variablen
wait EQU 0x20 ; wird nicht gebraucht
W_TEMP   EQU 0x20 ; Backup für Akkuregister
STATUS_TEMP EQU 0x21 ; Backup für Statusregister
PCLATH_TEMP EQU 0x22 ; Backup für PCLATCH-Register


org    0
goto   INIT             ; Sprung zum Hauptprogramm

ORG 4
;**********************************************************
; Interruptroutine
MOVWF   W_TEMP
    SWAPF   STATUS,W
    CLRF    STATUS
    MOVWF   STATUS_TEMP
    MOVF    PCLATH, W
    MOVWF   PCLATH_TEMP
    CLRF    PCLATH         ; Bank 0
;************************************* Eigentliche Routine
; Wert an PWM übergeben
; MOVWF CCPR1L ; obere 8 Bit sind PWM
BSF ADCON0, 2 ; ADC starten
; COMF PORTB, 1 ; PortB invertieren
BSF PORTB, 1
BCF PIR1, ADIF ; Interruptbit löschen

;************************************* Eigentliche Routine
MOVF    PCLATH_TEMP, W
   MOVWF   PCLATH
   SWAPF   STATUS_TEMP,W
   MOVWF   STATUS
   SWAPF   W_TEMP,F
   SWAPF   W_TEMP,W
   RETFIE

;*********************************************************
; Anfangsinitialisierung

INIT
; PWM vorbereiten
; Vorteiler 1:1 und Timer2 einschalten
BSF T2CON,TMR2ON ; Timer2 ein

; Frequenz auf 19.53 kHz einstellen
BSF STATUS,RP0 ; Bank1
MOVLW H'FF'
MOVWF PR2 ; siehe Datasheet s.62
BCF STATUS,RP0 ; Bank1

; Tastverhältnis auf 50% einstellen
; MOVLW H'70'
; MOVWF CCPR1L ; 50%

; RC2/CCP1 auf Ausgang stellen
BSF STATUS,RP0 ; Bank1
BCF TRISC, 2 ; RC2: output=0
BCF STATUS,RP0 ; Bank 0

; PWM MODE mit CCP1 initialisieren
CLRF CCP1CON ; CCP1-Modus aus
BSF CCP1CON,CCP1M3 ; CCP1-Modus PWM-Mode
BSF CCP1CON,CCP1M2

; ADC vorbereiten
; PortB vorbereiten
bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'00000000' ; PortB alle output
movwf TRISB
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
clrf PORTB ; alle LEDs ausschalten
BSF PORTB, 0

; 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 20 MHz einstellen auf Fosc/32
BSF ADCON0, 7 ; ADCS1=1
BCF ADCON0, 6 ; ADCS0=0

; Daten linksbündig
BSF STATUS,RP0 ; Bank1
BCF ADCON1, 7 ; ADFM=0
BCF STATUS,RP0 ; Bank0

; Interrupt einschalten
BSF             INTCON, GIE ; interrups einschalten
BSF NTCON, PEIE ; pie1 register aktivieren
BSF PIE1, ADIE ; A/D Interrups einschalten
BCF PIE1, ADIF ; Interruptbit löschen

;**********************************************************
; Hauptprogrammschleife

BSF ADCON0, 2 ; ADC starten
LOOP
GOTO LOOP ; Endlosschlaufe

end

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


EDIT
Bitte Code-Tags verwenden! Sandynister
Gespeichert
Steffen
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 1235


Profil anzeigen
« Antworten #3 am: Juni 23, 2004, 16:05:26 »

Du hast PIE1 und PIR1 durcheinandergebracht. PIR1 liegt in Bank0 und PIE1 in Bank1.

So funktionierts:
Code:

; Daten linksbündig
   BSF      STATUS,RP0   ; Bank1
   BCF      ADCON1, 7   ; ADFM=0

; Interrupt einschalten
   BSF             INTCON, GIE   ; interrups einschalten
   BSF   INTCON, PEIE   ; pie1 register aktivieren
   BSF   PIE1, ADIE      ; A/D Interrups einschalten
   BCF      STATUS,RP0   ; Bank0
   BCF   PIR1, ADIF      ; Interruptbit löschen


Steffen
Gespeichert
Komu

Offline Offline

Beiträge: 3


Profil anzeigen
« Antworten #4 am: Juni 24, 2004, 08:08:28 »

Vielen Dank

Funktioniert!!!
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.037 Sekunden mit 18 Zugriffen.
 
Top! Top!