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]