Archiv verlassen und diese Seite im Standarddesign anzeigen : brauche dringend hilfe beim debuggen vom assembler code...
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
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
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
Ich bin ein wenig eingerostet. Aber der springt doch ÜBER den Goto drüber ?
BTFSC ADCON0,1 ;Is conversion done?
GOTO Next
Dann würde er letzlich wieder von vorne beginnen
Was steht denn nach dem "goto " ?
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
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]
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
Ich bin ein wenig eingerostet. Aber der springt doch ÜBER den Goto drüber ?
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?
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...
Moment: der WDT gehört regelmäßig zurückgesetzt, nicht nur einmal
ja clrwdt steht hinter Main, also wird er bei jeden programmdurchlauf zurückgesetzt
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
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.