PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] PIC Assembler: Zeitschleife funktioniert nicht



Lutzacht
07.03.2014, 15:44
Hallo Leute,
ich habe ein Programm zum Test einer Schaltung geschrieben. Diese Schaltung gibt nach Ansteuerung durch einen PIC16F1938 4-20 mA aus. Das funktioniert auch. Doch habe ich im Verlaufe der Tests Zeitschleifen eingebaut - sowohl mit Timer als auch ohne. Alle bisherigen Versuche enden damit, dass das Programm in der jeweils ersten Zeitschleife hängen bleibt. Nun sollte ja eine Zeitschleife das Einfachste an der ganzen Aufgabe sein. Doch finde ich keinen Fehler und werde langsam verrückt (oder war ich es vorher schon?).

So sieht der letzte Versuch aus - sollte zwischen 8 und 12 mA hin und her schalten:

BANKSEL APFCON
BCF APFCON,T1GSEL
BCF APFCON,SRNQSEL
BCF APFCON,C2OUTSEL
BCF APFCON,SSSEL
BCF INTCON,GIE
BCF INTCON,PEIE
BANKSEL ANSELA
BCF ANSELA,0
BANKSEL TRISA
MOVLW b'00000000' ;alle output
MOVWF TRISA
MOVLW b'00010011'
MOVWF TRISC
BANKSEL PORTA
BCF PORTA,0 ;Latch auf low
BANKSEL SSPCON1
BCF SSPSTAT,SMP
BSF SSPSTAT,CKE
MOVLW b'00100001'
MOVWF SSPCON1

Schleife0
BANKSEL PORTA
BSF PORTA,1 ;Latch auf high

MOVLW b'10000000'
BANKSEL SSPBUF
MOVWF SSPBUF
Check1
BTFSS SSPSTAT,BF
GOTO Check1
MOVF SSPBUF,w
BANKSEL PORTA
BCF PORTA,0
MOVLW b'00000000'
BANKSEL SSPBUF
MOVWF SSPBUF
Check2
BTFSS SSPSTAT,BF
GOTO Check2
MOVF SSPBUF,w
BANKSEL PORTA
BSF PORTA,0

MOVLW 0x1A
MOVWF Zaehler1
MOVLW 0x8B
MOVWF Zaehler2
MOVLW 0x07
MOVWF Zaehler3
Delay_0
DECFSZ Zaehler1,f
GOTO $+2
DECFSZ Zaehler2,f
GOTO $+2
DECFSZ Zaehler3,f
GOTO Delay_0

BCF SSPSTAT,BF
BCF SSPCON1,WCOL

MOVLW b'01000000'
BANKSEL SSPBUF
MOVWF SSPBUF
Check3
BTFSS SSPSTAT,BF
GOTO Check3
MOVF SSPBUF,w
BANKSEL PORTA
BCF PORTA,0
MOVLW b'00000000'
BANKSEL SSPBUF
MOVWF SSPBUF
Check4
BTFSS SSPSTAT,BF
GOTO Check4
MOVF SSPBUF,w
BANKSEL PORTA
BSF PORTA,0

MOVLW 0x1A
MOVWF Zaehler1
MOVLW 0x8B
MOVWF Zaehler2
MOVLW 0x07
MOVWF Zaehler3
Delay_1
DECFSZ Zaehler1,f
GOTO $+2
DECFSZ Zaehler2,f
GOTO $+2
DECFSZ Zaehler3,f
GOTO Delay_1

BCF SSPSTAT,BF
BCF SSPCON1,WCOL

GOTO Schleife0

RoboHolIC
07.03.2014, 21:44
Hallo Lutzacht.

Willkommen im Forum!

Was genau soll eigentlich diese Warteschleife bewirken?
Die Codierung mit drei Variablen und den skip und goto-Elementen ist für meine Augen sehr ungewöhnlich.
Ich habe einen Verdacht, wo (d)ein Denkfehler liegen könnte: DECFSZ <variable> dekrementiert immer, auch wenn <variable> bereits null ist, springt bei null wie erwartet, hat aber keinen "Anschlag" sondern macht weiter mit 0xFF, 0xFE, ...
Ich habe im Kopf versucht zu ergründen, was dort abgeht, aber mir wird von dem vielen Gehopse schwindelig ...
Schreib mal noch einen Satz zum Zweck, insbesondere wozu drei Variablen gut sind. Dann kann man weitersehen.

Gruß
RoboHolIC

Vielleicht eines noch: Kannst du bitte den Code in [ Code ]-Tags einschließen (Bearbeiten-Button, dann Schaltfläche "#"); dann bleibt es besser lesbar.

Siro
09.03.2014, 06:26
Ich habe es eben mal simuliert mit MPLAB 8
Bei mir ergibt deine Warteschleife 2999997 Zyklen

Also KEINE Endlosschleife.

Kann es sein das Dir der Watchdog reinhaut ? und dadurch ein Reset ausgelöst wird ?

Ich hab dein Programm jetzt komplett simuliert.
Da hängt normalerweise nicht und es läuft soweit.
Es kann eigentlich nur dann festhängen wenn dein "BF" Flag nicht kommt.
Diese Zeilen habe ich in meiner Simulation alle ausgeklammert.

Check4
BTFSS SSPSTAT,BF
GOTO Check4

Lutzacht
09.03.2014, 07:57
Hallo RoboHolIC und Siro,

vielen Dank für die schnelle Reaktion. Zu euren Fragen:

a) Ich teste meine Schaltung in möglichst kleinen Schritten, einfach um Fehler leichter eingrenzen zu können. Deshalb ist dieses Programm entstanden, um die Parametrierung des AD421 zu testen. Es soll einfach zwischen zwei mA Werten hin und her schalten. Um am Multimeter etwas ablesen zu können, braucht es eine Verzögerung.
b) Das Gehopse in der Schleife stammt nicht aus meiner Feder, sondern von einer Webseite, die ich jetzt auf die Schnelle nicht mehr finde. Davor habe ich selber zwei Warteschleifen geschrieben, eine mit und eine ohne Timer. Alle drei Versionen geben den gleichen Fehler. Das stützt Siro's Anregung, außerhalb des Codes zu suchen.

Deshalb habe ich jetzt WDTE auf OFF gesetzt... und...

ES GEHT!

Vielen Dank