-
        
+ Antworten
Seite 1 von 5 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 42

Thema: Wo ist der Fehler in der Software

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.08.2004
    Beiträge
    1.065

    Wo ist der Fehler in der Software

    moin,
    ich hoffe mir kann jemand helfen.
    bin ein neueinsteiger was die microcontroller angeht und hab nun vor gehabt eine zeitschaltuhr zu bauen, um meinen platinenbelichter zu steuern.
    ich hab die tutorials usw bei sprut.de durchgearbeitet und mich nun daran gesetzt. aber es will und will nicht funktionieren und ich hab auch sonst niemanden der mir sagen könnte, wo der fehler ist.
    deswegen hoffe ich jemand findet hier zeit einmal über den quellcode zu gucken.

    Was passieren soll: eine 4stellige sieben segment anzeige zeigt die zeit an, die vorher über 2 taster eingestellt wurde. wenn man die starttaste drückt, läuft die uhr rückwärts und schaltet dabei ein relais (momentan nur eine led zu testzwecken) bis sie auf null steht.

    problem: es passiert nichts. alles bleibt dunkel
    Angehängte Dateien Angehängte Dateien

  2. #2
    Gast
    wo isn dein Code ????????

    (hier sind keine Hellseher)

    Gerhard

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.08.2004
    Beiträge
    1.065
    der liegt als asm datei im anhang, kann sein, dass du den nicht sehen oder runterladen kannst. ich poste den mal so rein
    Code:
    	list p=16F876A
    ;	Durch 4 Tasten lässt sich der Countdown einstellen, starten und der controller reseten.
    ;	die zeit wird auf einer 4stelligen sieben segment anzeige angezeigt und runtergezählt. 
    ; 	in der zeit von Start bis 0 wird ein relais eingeschaltet.
    ;
    ;**************************************************************
    ;* Anzeige : MM:SS
    ;* Pinbelegung
    ;*	----------------------------------	
    ;*	PORTA: 	0 Ziffer1	-----------------------------------------+
    ;*			1 Ziffer2	-----------------------------+           I
    ;*			2 Ziffer3	-----------------+           I           I
    ;*			3 Ziffer4	-----+           I           I           I
    ;*			4 Eingang	     I           I           I           I  
    ;*	PORTB:	0 Segment B	   AAAAA	   AAAAA	   AAAAA	   AAAAA
    ;*			1 Segment F	  F     B	  F     B	  F     B	  F     B
    ;*			2 Segment A	  F     B	  F     B	  F     B	  F     B
    ;*			3 Segment G	   GGGGG  	   GGGGG  	   GGGGG  	   GGGGG  
    ;*			4 Segment H	  E     C	  E     C	  E     C	  E     C
    ;*			5 Segment C	  E     C	  E     C	  E     C	  E     C
    ;*			6 Segment E	   DDDDD  HH   DDDDD  HH   DDDDD  HH   DDDDD  HH
    ;*			7 Segment D    
    ;*
    ;    
    ;   RC0 = Taster (Minuten)
    ;	RC1 = Taster (Sekunden)
    ;	RC2 = Taster (Start)
    ;	RC3 = Ausgang für das Relais
    	include "P16F876A.inc"
    	
    	__CONFIG	_WDT_OFF & _XT_OSC & _PWRTE_ON
    
    	ERRORLEVEL      -302            ;SUPPRESS BANK SELECTION MESSAGES 
    ;Variablen und Konstanten werden vereinbart.
    W_TEMP		equ	0x20	;rettung beim interrupt
    STATUS_TEMP	equ	0x21	;rettung beim interrupt
    PCLATH_TEMP	equ	0x22	;rettung beim interrupt
    MinZehner	equ 0x23	
    MinEiner	equ	0x24
    SekZehner	equ	0x25
    SekEiner	equ	0x26
    Digit		equ	0x27	;bei welcher ziffer sind wir?
    help		equ	0x28
    Startsignal	equ	0x29	;steht hier eine 1, ist das das startsignal
    Timer		equ	0x30	;zählt bis 50 um den takt von 50hz auf 1hz zu verringern
    
    	#define	MinTaste	PORTC, 0
    	#define	SekTaste	PORTC, 1
    	#define	StartTaste	PORTC, 2
    	#define	Relais		PORTC, 3
    
    	org    0x00                 ;Startadresse nach Reset ist 0 hier startet der PIC 
        goto   main                 ;Sprung zum Hauptprogramm 
        org    0x04                 ;Interruptvector ist 0x04, 
    intvec
    	bcf		INTCON, GIE		;interrupts nicht erlaubt
    	
    	movwf   W_TEMP 			;w, status und pclath retten.
        swapf   STATUS,W 
        clrf    STATUS 
        movwf   STATUS_TEMP 
        movfw   PCLATH 
        movwf   PCLATH_TEMP 
        
    	movlw	D'131'
    	movwf	TMR0
    
    int_service
    	bcf		TRISA,0		;Schaltet Ziffer1 aus
    	bcf		TRISA,1		;Schaltet Ziffer2 aus
    	bcf		TRISA,2		;Schaltet Ziffer3 aus
    	bcf		TRISA,3		;Schaltat Ziffer4 aus
    
    	decf	Digit,f	
    	bz		int_0
    	movfw	Digit
    	movwf	help
    	decf	help,f
    	bz		int_1
    	decf	help,f
    	bz		int_2
    	decf	help,f
    	bz		int_3
    	goto	int_4
    
    int_0
    	movlw	D'5'
    	movwf	Digit
    	btfss	Startsignal, 0
    	goto	int_end
    	bsf		Relais
    
    	decf	Timer,f			;ist es der 50ste durchgang diese sekunde?
    	btfss	STATUS,Z
    	goto	int_end
    	
    	movlw	D'50'				;dann füll Timer wieder auf 50 auf
    	movwf	Timer
    	decf	SekEiner,f		;reduziere SekEiner um eine Sekunde
    	movlw	D'255'				;überprüfe ob die zelle unter null springt
    	subwf	SekEiner,w		
    	bnz		int_end			;wenn nicht, dann gehts normal weiter
    	
    	movlw	D'9'				;wenn doch, schreib 9 in die SekEiner
    	movwf	SekEiner		
    	decf	SekZehner,f		;und verringer Sekzehner
    	movlw	D'255'				;es wird geprüft ob 255 in SekZehner steht
    	subwf	SekZehner,w		
    	bnz		int_end			;wenn SekZehner nicht 255, gehts weiter, sonst
    	
    	movlw	D'5'				;wird SekZehner auf 5 gesetzt
    	movwf	SekZehner	
    	decf	MinEiner,f		;und MinEiner um 1 reduziert
    	movlw	D'255'				;es wird geprüft ob 255 in MinEiner steht
    	subwf	MinEiner,w
    	bnz		int_end			;wenn nicht geht es weiter, sonst
    	
    	movlw	D'9'				;wird MinEiner auf 9 gesetzt
    	movwf	MinEiner		
    	decf	MinZehner,f		;und MinZehner um einen gesengt
    	goto	int_end			;weiter gehts
    	
    int_1
    	movfw	SekEiner
    	call	Segmente
    	movwf	PORTB
    	bsf		PORTA, 0
    	goto	int_end
    int_2
    	movfw	SekZehner
    	call	Segmente
    	movwf	PORTB
    	bsf		PORTA, 1
    	goto	int_end
    int_3
    	movfw	MinEiner
    	call	Segmente	
    	movwf	PORTB
    	bsf		PORTA, 2
    	goto	int_end
    int_4	                            
    	movfw	MinZehner
    	call	Segmente	
    	movwf	PORTB
    	bsf		PORTA,3
    	goto	int_end
    
    ; 7-Segment-Tabelle
    Segmente
    	addwf	PCL, f
    	retlw	B'00011000'	; 0
    	retlw	B'11011110'	; 1
    	retlw	B'00110010'	; 2
    	retlw	B'01010010'	; 3
    	retlw	B'11010100'	; 4
    	retlw	B'01010001'	; 5
    	retlw	B'00010001'	; 6
    	retlw	B'11011010'	; 7
    	retlw	B'00010000'	; 8
    	retlw	B'01010000'	; 9
    
    int_end
    	movfw	SekEiner				;hier wird überprüft, ob der Zählerstand auf null ist.
    	iorwf	SekZehner, 0
    	iorwf	MinEiner, 0
    	iorwf	MinZehner, 0
    	btfss	STATUS,Z			; wenn ja, dann
    	goto	int_end		
    	bcf		Relais				;wird das relais abgeschaltet
    	bcf		Startsignal, 0		;und das Startsignal gelöscht    
    
    	movfw	PCLATH_TEMP 
        movwf   PCLATH 
        swapf   STATUS_TEMP,W 
        movwf   STATUS 
        swapf   W_TEMP,F 
        swapf   W_TEMP,W 
        
    	bcf		INTCON,T0IF
    	bsf		INTCON, GIE
    	retfie 
    ;hier muß die Interruptbehandlungsroutine stehen, 
    ;falls Interrupts genutzt werden sollen 
    
    
    ;die Grundeinstellungen werden vorgenommen
    main 
    	bsf		STATUS, RP0			
    	movlw	B'110'
    	movwf	ADCON1		;PortA von Analog auf digital
    	clrf	TRISA		;PortA ist Ausgang
    	clrf	TRISB		;PortB ist Ausgang
    	movlw	B'11110111'	;RC3 ist Ausgang, rest Eingang
    	movwf	TRISC
    	movlw	B'10010100'	;Timer0 bekommt den Vorteiler 32
    	movwf	OPTION_REG
    	bcf		STATUS, RP0
    	movlw	D'131'
    	movwf	TMR0
    	bsf		INTCON, T0IE
    	bsf		INTCON, GIE
    ; Zeit 0 einstellen
    	clrf	SekEiner
    	clrf	SekZehner
    	clrf	MinEiner
    	clrf	MinZehner
    
    	movlw	5
    	movwf	Digit		; Ziffernzähler einstellen
    	movlw	50
    	movwf	Timer
    
    Einstellen
    	btfss	MinTaste		;Minutentaste gedrückt?
    	call	MinPlus			;dann geh nach MinPlus
    	btfss	SekTaste		;Sekundentaste gedrückt?
    	call	SekPlus			;dann geh nach Sekplus
    	btfss	StartTaste		;StartTaste gedrückt? 
    	call	Start			;dann geh nach Start
    	goto	Einstellen 		;nichts gedrückt? dann frag nochmal ab.
    
    SekPlus
    	incf	SekEiner,f		;erhöhe SekEiner
    	movlw	D'10'			;Subtrahiere 10 von SekEiner
    	subwf	SekEiner, 0
    	bz		SekEinerVoll	;wenn also SekEiner =10 geh nach SekEinerVoll
    	return
    
    SekEinerVoll
    	clrf	SekEiner		;setze SekEiner auf 0
    	incf	SekZehner,f		;erhöhe SekZehner
    	movlw	D'6'			;subtrahiere 6 von SekZehner
    	subwf	SekZehner, 0
    	bz		SekMinVerschieben	;wenn SekZehner = 6 geh nach SekMinVerschieben
    	return
    
    SekMinVerschieben
    	clrf	SekZehner		;setze SekZehner auf 0
    	incf	MinEiner,f		;erhöhe MinEiner um 1
    	return
    
    MinPlus
    	incf	MinEiner,f 		;erhöhe MinEiner
    	movlw	D'10'			;subtrahiere 10 von MinEiner
    	subwf	MinEiner, 0		
    	bz		MinEinerVoll	;wenn MinEiner = 10 geh nach MinEinerVoll
    	return
    
    MinEinerVoll
    	clrf	MinEiner		;setze MinEiner auf 0
    	incf	MinZehner,f		;erhöhe MinZehner um 1
    	return
    
    
    Start
    	bsf		Startsignal, 0
    	return
    
    
       
    	end                         ;das Ende des Programms

    als schaltplan hab ich mir den hier genommen
    http://www.thelastinstance.de/elek/f...schaltplan.gif

    ist eigentlich abgeguckt, aber ich will das als lernhilfe benutzen , deswegen schnapp ich mir nicht einfach nen AVR und den bei den entwicklern geposteten code

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    20.08.2004
    Ort
    Unterschleissheim
    Beiträge
    218
    Hallo

    sorry, ich hätte mich einloggen sollen...

    Also, der Code, das sind schon ein paar Zeilen....
    Hast Du den Code schon in der Simulation laufen lassen ?

    Wenn ja, und er funktioniert da, liegts oft an der hardware:
    1.Test: läuft der Oszillator ?
    2.Test: wenn's nicht tut, einen Toggleausgang bauen, den man mit nem Oszi überprüfen kann.

    Irgendwie schaff ich es nicht Deinen Schaltplan anzuschauen. Da sind nur wagrechte Striche aber keine senkrechten. Les was von nem AVR.

    Und was ist da für ein Quarz oder Oszillator dran ?

    Gerhard

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.08.2004
    Beiträge
    1.065
    ich weiß dass mplab einen simulator hat, aber nicht wirklich was ich damit machen soll

    es ist ein 4mhz keramikresonator, jaja, fehlertoleranz und so, aber die uhr muss erstmal laufen, nicht genau gehen

    schau mal wegen dem schaltplan hier.
    das ist die seite , von der ich die idee hab
    http://www.thelastinstance.de/elek/project01.phtml

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    20.08.2004
    Ort
    Unterschleissheim
    Beiträge
    218
    Hallo

    ich meine nicht die Fehlertoleranz, ich meine, ob der Oszillator überhaupt arbeitet. Nach meiner Erfahrung ist das - zumindest bei meinen Schaltungen - der häufigste Fehler. Hast Du ein Oszi, mit Du überprüfen kannst, ob der Oszillator schwingt ? An den Schlüssen des resonators, am PIC muß irgend eine Schwingung mit den 4 MHz sichtbar sein. Wenn es nur ne Gleichspannung ist, schwingt er nicht, tut der PIC dann auch nix.

    Den Simulator kannst Du in MPLAB unter Debugger - Select Tool - MPLAB SIM auswählen. Dann Compilieren und dann kann das Programm durchgesteppt werden. Mit View - Watch kann ein Watch-Fenster geöffnet werden, mit dem register und Variable während des durchsteppens des Programms beobachtet werden kann. ich simuliere meine Programme immer erst mal auf diese Weise um zumindest die wichtigsten Fehelr zu finden.

    Gerhard

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.08.2004
    Beiträge
    1.065
    ne, mit nem oszilloskop kann ich nicht dienen, aber ich werd mal n idiotensicheren code schreiben, um zu testen, ob der pic und die anzeige werkelt

    mh wenn ich den simulator anwerfe dann geht er auch immer schön seine schritte, aber springt nicht in dei interruptroutine, dummerweise ist die aber das kernstück der software

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    20.08.2004
    Ort
    Unterschleissheim
    Beiträge
    218
    Hallo

    wenn im Simulator der Interrupt nicht ausgelöst wird, dann ist im Code ein Fehler. Denn eine ISR kann im Simulator ebenfalls angesprungen und durchgesteppt werden.

    Gerhard

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.08.2004
    Beiträge
    1.065
    halt, er springt doch in die interrupt routine, dauert aber bloß

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    20.08.2004
    Ort
    Unterschleissheim
    Beiträge
    218
    Prima

    dann gilts noch festzustellen, ob der Oszillator schwingt. Ist ohne Oszi nicht einfach, zumal man die Anschlüsse des Oszilators nicht stark belasten kann. evtl funktionierts aber auch mit nem Digitalmultimeter in AC-Einstellung

    Gerhard

+ Antworten
Seite 1 von 5 123 ... LetzteLetzte

Berechtigungen

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