Hallo, der adc wird ständig abgefragt, an der aquistion time kannns wohl nicht liegen, denn der Fehler tritt erst nach ca 10 min auf. Bis zu dem Fehler funktioniert es ja, die Werte stimmen...
Nach dem goto kommt noch mehr code..., das is nur nen ausschnitt
das mit dem stack overflow musst mir mal genau erklären.
Bei dem Program handelt es sich um nen Adapter für meine Lenkradfernbedienung in meinem Auto. Der Pic misst an der Lenkradfernbediehnung mittels ADC je nach Tastendruck verschiedene Spannungen. Das Signal zum Radio erfolgt über den Jvc standart IR Code.
Der obere Teil des Programmes überpüft ob der ADC Wert in einem bestimmten (tolleranz) Bereich liegt, den Code habe ich von hier: http://www.piclist.com/techref/microchip/rangechk.htm
Wenn das erfolgt ist, wird je nach Wert ein bestimmter IR Code gesendet...
Vielleicht entdeckt ihr noch einen Fehler im Code
Code:
list p=12F683
;************************************************************
;************************************************************
;*
;*
;*
;* input: GPIO0
;* output: GPIO1
;* Takt: 8 MHz
;*
;*
;************************************************************
; Includedatei für den 12F683 einbinden
#include <P12f683.INC>
; Configuration festlegen
; bis 4 MHz: Power on Timer, kein Watchdog, XT-Oscillator
__CONFIG _MCLRE_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT
;************************************************************
;Variablennamen vergeben
cycl_1 Equ 0x20
loop Equ 0x21 ; Zähler
loops Equ 0x22
loops2 Equ 0x23 ; Zähler
Byte Equ 0x24
Byte2 Equ 0x25
Byte3 Equ 0x26
status Equ 0x27
Zaehler Equ 0x28
;************************************************************
; los gehts mit dem Programm
; Pin RA2 auf Ausgabe stellen
Init
;12F683 alle Comparator-/ADC-Eingänge auf Digital umschalten
; beginnt in der Bank 0
BCF STATUS,RP0 ;Bank 0
CLRF GPIO ;Init GPIO
MOVLW 0x07 ;Set GP<2:0> to
MOVWF CMCON0 ;digital I/O
MOVLW 0x00 ;Left, Vdd Vref, AN0
MOVWF ADCON0
BSF STATUS,RP0 ;Bank 1
movlw B'01110101' ; interner Taktgenerator
movwf OSCCON ; 8-MHz
MOVLW 0x51 ;Set GP<1> to
MOVWF ANSEL ;digital I/O
MOVLW 0x01 ;Set GP<1> as output
MOVWF TRISIO
BCF STATUS,RP0 ;Bank 0
BSF ADCON0,0
Main
BSF ADCON0,1 ;Start conversion
Next
BTFSC ADCON0,1 ;Is conversion done?
GOTO Next
;************************************************************
;Hier wird der ADC Wert verglichen
;Vol+
MOVFW ADRESH
addlw d'143'
addlw d'21'
BTFSC STATUS,C
goto Vol_up
;Vol-
MOVFW ADRESH
addlw d'195'
addlw d'21'
BTFSC STATUS,C
goto Vol_down
;Seek+
MOVFW ADRESH
addlw d'61'
addlw d'21'
BTFSC STATUS,C
goto Seek_up
;Seek-
MOVFW ADRESH
addlw d'97'
addlw d'21'
BTFSC STATUS,C
goto Seek_down
;Mode
MOVFW ADRESH
addlw d'36'
addlw d'21'
BTFSC STATUS,C
goto Mode
bcf status,0
goto Main
;************************************************************
;Hier wird der jeweilige code gesendet
Vol_up
movlw 0xF1
movwf Byte3
movlw 0x21
movwf Byte2
call Signal_send
goto Main
Vol_down
movlw 0xF1
movwf Byte3
movlw 0xA1
movwf Byte2
call Signal_send
goto Main
Seek_up
movlw 0xF1
movwf Byte3
movlw 0x49
movwf Byte2
call Signal_send
goto Main
Seek_down
movlw 0xF1
movwf Byte3
movlw 0xC9
movwf Byte2
call Signal_send
goto Main
Mode
movlw 0xF1
movwf Byte3
movlw 0x11
movwf Byte2
call Signal_send
goto Main
;************************************************************
;Hier wird der IR code erzeugt
Signal_send
movlw D'3'
movwf Zaehler
btfss status,0
call Header ; wird nur ausgeführt wenn status bit 0 den wert 0 hat
Daten
call Send1 ; Datenwort ausgeben
call Send2
bsf GPIO,1
call wait5 ;
bcf GPIO,1
call wait21
decfsz Zaehler, F
goto Daten
return
Header
bsf status,0
movlw D'8' ;Schleife1
movwf loops
movlw .234 ; Schleife2
movwf loop
bsf GPIO,1
call Wai
movlw D'16' ;Schleife1
movwf loops
movlw .58 ; Schleife2
movwf loop
bcf GPIO,1
call Wai
return
Send1
movf Byte3,0 ;die ersten 8 bit des signals
movwf Byte
movlw 8
movwf cycl_1
goto Send_command
Send2
movf Byte2,0 ;die zweiten 8 bit des signals
movwf Byte
movlw 8
movwf cycl_1
Send_command
rlf Byte, f ; aktuelles Bit in das Carry-Flag schieben
btfsc STATUS, C
call eins ; Lo wenn Bit = 1
btfss STATUS, C
call null ; Hi wenn Bit = 0
decfsz cycl_1, f ; waren das schon 8 Bit?
goto Send_command ; nein, es geht weiter
return
null bsf GPIO,1
call wait5
bcf GPIO,1
call wait5
return
eins bsf GPIO,1
call wait5
bcf GPIO,1
call wait15
return
;************************************************************
;Hier sind die verschiedenen Warteschleifen für den IR code
; Warteschleife 5 µs
wait5
movlw D'2' ; 5 µs Pause
movwf loops
movlw .57
movwf loop
goto Wai
; Warteschleife 15 µs
wait15
movlw D'6' ; 15 µs Pause
movwf loops
movlw .57
movwf loop
goto Wai
; Warteschleife 210 µs
wait21
movlw D'84' ; 210 µs Pause
movwf loops
movlw .55
movwf loop
goto Wai
Wai
movfw loop ; Zeitkonstante für 1/2ms
movwf loops2
Wai2 nop
nop
nop
nop
nop
nop
decfsz loops2, F ; vorbei?
goto Wai2 ; nein, noch nicht
decfsz loops, F ; vorbei?
goto Wai ; nein, noch nicht
retlw 0 ; das Warten hat ein Ende
;**********************************************************
end
[/quote]
Lesezeichen