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]







Zitieren

Lesezeichen