PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : brauche dringend hilfe beim debuggen vom assembler code...



spec
18.02.2006, 10:15
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

stegr
19.02.2006, 13:30
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

PicNick
19.02.2006, 15:09
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 " ?

spec
19.02.2006, 19:12
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]

PicNick
19.02.2006, 19:18
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

stegr
20.02.2006, 06:16
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?

spec
20.02.2006, 22:02
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...

PicNick
21.02.2006, 06:26
Moment: der WDT gehört regelmäßig zurückgesetzt, nicht nur einmal

spec
21.02.2006, 09:47
ja clrwdt steht hinter Main, also wird er bei jeden programmdurchlauf zurückgesetzt

*Mario*
10.03.2006, 20:25
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