-
        

Ergebnis 1 bis 10 von 10

Thema: brauche dringend hilfe beim debuggen vom assembler code...

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    08.05.2005
    Beiträge
    13

    brauche dringend hilfe beim debuggen vom assembler code...

    Anzeige

    Hallo,
    Ich brauche dringend hilfe beim debuggen dieses codes, nach ca 5-10 minuten gibt der adc falsche werte aus. Könnt ihr Fehler in der initialisierung finden?

    mfg, spec


    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

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.10.2004
    Ort
    Nordschwarzwald
    Alter
    34
    Beiträge
    506
    versuchst du es erstmals nach 5-10 minuten oder gibt er davor immer korrekte werte aus und nur danach nicht mehr?

    typischer fehler, der erst nach einiger zeit auftritt, wäre ein stack-overflow.
    das kannst du am besten im simulator überprüfen, du kannst dir da den stack anzeigen lassen.

    MfG
    stefan

  3. #3
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Ich bin ein wenig eingerostet. Aber der springt doch ÜBER den Goto drüber ?
    Code:
                 BTFSC ADCON0,1 ;Is conversion done? 
                  GOTO Next
    Dann würde er letzlich wieder von vorne beginnen

    Was steht denn nach dem "goto " ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    08.05.2005
    Beiträge
    13
    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]

  5. #5
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Na, die Pics haben einen Hardware-Stack für Rücksprungadressen nach einem Call, und der ist beim 16f877 grad mal 8 ebenen tief.
    Darüber hinaus überschreibt es sich selber und macht dann den Teufel was.
    Trotzdem kommt man normalerweise aus. aber irgendein CALL ohne RET dazu ist natürlich der Tod
    UND was anderes: der berühmte Überlauf an einer Frame-Grenze ganz auch ganzschön Spaß machen.
    schau mal bei den "Programmierfallen" www.sprut.de
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.10.2004
    Ort
    Nordschwarzwald
    Alter
    34
    Beiträge
    506
    Zitat Zitat von PicNick
    Ich bin ein wenig eingerostet. Aber der springt doch ÜBER den Goto drüber ?
    Code:
                 BTFSC ADCON0,1 ;Is conversion done? 
                  GOTO Next
    Dann würde er letzlich wieder von vorne beginnen

    Was steht denn nach dem "goto " ?
    PicNick hat Recht - BTFSC = Bit Test File-Register, Skip if Clear...
    der springt weiter, schafft das ganze Programm ab und kommt irgendwann wieder dorthin - dann ist auch der richtige Wert da irgendwann mal da (klar, irgendwann ist die Conversion mal "done" und keine neue gestartet und damit hängt der in der Schleife fest.

    Probier mal ein BTFSS

    Oder ist das Done-Flag ne 0 und geht bei "schaffen" auf 1?

    Wie sieht es eigentlich mit dem Rücksetzen davon aus?

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    08.05.2005
    Beiträge
    13
    hab nochmal ne andere frage.
    ich wollte mal den watchdog mit einbauen, vielleicht schmiert der pic ja auch einfach nur ab...

    mein problem ist nun das ich den zeitraum des wdt timers nicht ändern kann, im datenblatt steht das ich den bis maximal ca. 268 sekunden stellen kann.
    so nun habe ich den wdt vorteiler auf maximum gestellt(1:65536), und den clrwdt befehl am programmanfang gestetzt.
    mplad sim zeigt mir aber trotzdem immer an das der wdt den pic resetet. mein programm läuft aber garantiert nicht 268 sekunden.
    der clrwdt befehl steht direkt hinter Main, der wird also definitiv ausgeführt...

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Moment: der WDT gehört regelmäßig zurückgesetzt, nicht nur einmal
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    08.05.2005
    Beiträge
    13
    ja clrwdt steht hinter Main, also wird er bei jeden programmdurchlauf zurückgesetzt

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    27.01.2006
    Beiträge
    44
    Hallo,

    ich hab mal einen Blick auf den Source geworfen. Abgesehen davon dass er etwas wirr programmiert ist, sieht die ganze Sache gut aus. Mir ist zumindest kein Fehler aufgefallen.

    Mal ne Frage: Du schreibst, dass der ADC nach ca. 10 Min schlechte Werte liefert.

    Daraus würde ich nun mal ableiten, dass das Programm sehrwohl weiterrent, nur am Eingang des ADC gibts ein Problem. Hast Du die Spannung da mal gecheckt?

    Oder anders rum gefragt: Woraus schließt Du dass es am Code liegt?
    Simuliert MPLAB das nicht anstandslos. Du kannst Dir die verstichene Zeit in der StopWatch ansehen.

    Den ADC kannst Du übrigens auch in MPLAB simulieren. Mithilfe des Simulus und der SCL (Im Microchip-Forum gibts dazu ein Beispiel Skript)
    kannst Du die Eingabe von Analogen Signalen nachstellen.

    Ich würde aber eher auf ein HW-Problem tippen mit den Informationen die Du hier gibst.

    Gruß
    Mario

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •