- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 9 von 9

Thema: Fehler im Code

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    09.10.2004
    Ort
    Bonn
    Alter
    44
    Beiträge
    6

    Fehler im Code

    Anzeige

    Praxistest und DIY Projekte
    Hallo Leute,

    ich bin neu hier im Forum und vor allem ein Neuling was PICs angeht.
    Darum hab ich auch Probleme mit dem folgenden Code:

    Code:
    ;**************************************************************
    ;*
    ;* Pinbelegung
    ;*	----------------------------------	
    ;*	PORTA: 	
    ;*	 	Pin	Funktion
    ;*		0	Ausgang
    ;*		1 	Ausgang
    ;*		2 	Ausgang
    ;*		3 	Ausgang
    ;*		4 	Ausgang
    ;*		5 	Ausgang
    ;*
    ;*	PORTB:	
    ;*	 	Pin	Funktion
    ;*		0	Ausgang
    ;*		1 	Ausgang
    ;*		2 	Ausgang
    ;*		3 	Ausgang
    ;*		4 	Ausgang
    ;*		5 	Ausgang
    ;*		6 	Ausgang
    ;*		7 	Ausgang
    ;*
    ;*	PORTC:
    ;*		NN
    ;*		
    ;*
    ;**************************************************************
    ; Includedatei für den 16F84 einbinden
    
    	list p=16f876
    	#include <P16f876.INC>
    
    	ERRORLEVEL      -302    ;	SUPPRESS BANK SELECTION MESSAGES
    
    ;**********************************************************
    ; Variablennamen vergeben
    
    dx			EQU	0x20
    dy			EQU	0x21
    
    	org	0			; 	Programmstart immer bei 0
    
    	goto	init			; 	Init ausführen
    
    
    ;**********************************************************
    ; Anfangsinitialisierung
    
    init
    	CLRF	dx			; 	Schleifenende
    	CLRF	dy			;	Schleifenzaehler
    
    	MOVLW 	H'55'			; 	Schleifenlaenge ins W-Register setzen`
    	MOVWF	dx				;	Schleifenlaenge aus W-Register nach dx
    
    	BSF	STATUS, RP0		;	auf Bank 1 umschalten
    	BCF	STATUS, RP1		;	
    	MOVLW	B'00000000'		;	PortA alle output
    	MOVWF	TRISA
    	MOVLW	B'10001111'		;	PortA dig output
    	MOVWF	ADCON1	
    	MOVLW	B'00000000'		;	PortB alle output
    	MOVWF	TRISB
    	
    	
    	BSF	STATUS, RP0		; 	auf Bank 0 zurückschalten
    	BCF	STATUS, RP1		; 
    	CLRF	PORTB			; 	alle Port A Latches ausschalten
    	CLRF	PORTA			;	alle Port B Latches ausschalten
    
    ;**********************************************************
    ; Hauptprogrammschleife
    
    Main
    	MOVF	dx,0			;	lädt Schleifenende 
    	MOVWF	dy			;	setzt Schleifenzähler
    
    SchleifeBegin
    	MOVF	dy,0			; 	hohle Schleifenzähler ins W-Register
    
    	NOP
    	MOVWF	PORTA			; 	W-Register auf PORT A ausgeben
    	
    	XORLW 	H'00'			;	Komplement bilden
    	MOVWF	PORTB			;	Komplement auf PORT B ausgeben
    	
    	DECF	dy,1			; 	dy um eins erniedrigen
    	MOVF	dy,1			; 	Prüfen auf 0 und Zero-Flag setzen
    	BNZ	SchleifeBegin
    
    	NOP				; 	ende
    	
    	end
    Irgendwie läuft das Alles nicht so richtig!

    Könnt ihr mir helfen?
    Danke Vinc

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.08.2004
    Ort
    Winterthur
    Beiträge
    312
    Hallo

    Das Ende Deiner Initialisierung
    Code:
     
      BSF  STATUS, RP0    ;   auf Bank 0 zurückschalten
      BCF  STATUS, RP1    ; 
      CLRF  PORTB      ;   alle Port A Latches ausschalten
      CLRF  PORTA      ;  alle Port B Latches ausschalten
    
    ;**********************************************************
    Du schaltest eben gerade NICHT auf Bank0 zurück, sondern bleibst auf Bank 1. Damit operiert die Hauptprogrammschleife nicht auf den Ports sondern auf den TRIS-Registern.

    Es ist ziemlich gefährlich die Bank-Warnings auszuschalten, wenn man noch keine grosse Erfahrung mit den PICs hat (ich unterstelle Dir das hier einfach mal, falls falsch, sorry)

    Gruess
    Felix

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    09.10.2004
    Ort
    Bonn
    Alter
    44
    Beiträge
    6
    Ahh, danke Frizli!

    Ich hab tatsächloch noch keine Ahnung davon, aber ich bin dabei mir das zu erarbeiten.

    Der Code ist mir gegeben worden: "Hier, guck dir mal an! Ist ne einfache Schleife die 85 runterzählt und ausgibt. Könnten noch nen paar Kleinigkeiten falsch sein, findeste aber schon!" - Nix da! Find ich eben nicht!

    Das mit dem Bankwechsel war ja schon mal auf jeden Fall falsch!
    Könntest du dir noch mal die Main Schleife angucken?
    Der soll ja angeblich das Komplement auf B ausgeben... Aber wenn ich nen Bit-Xor mit 0 mache, dann kommt da bei mir kein Komplement raus...oder??

    Und, ähm ich hab ja im Datenblatt gesucht, aber was heißt "BNZ"?

    Vinc

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.08.2004
    Ort
    Winterthur
    Beiträge
    312
    Hallo

    Könntest du dir noch mal die Main Schleife angucken?
    Der soll ja angeblich das Komplement auf B ausgeben... Aber wenn ich nen Bit-Xor mit 0 mache, dann kommt da bei mir kein Komplement raus...oder??
    Ah, das hab ich nicht gesehen, aber Du hast Recht, um ein Byte bitweise zu komplementieren (1er-Komplement, nicht zu verwechseln mit 2er-Komplement) muss man es mit 0xFF XORen.

    Und, ähm ich hab ja im Datenblatt gesucht, aber was heißt "BNZ"?
    Das steht nicht im Datenblatt, da das kein "normaler" Befehl ist, sondern ein Assembler-Makro. Das müsste irgendwo im MPASM Handbuch stehen.
    BNZ dürfte für "Branch if Not Zero" stehen, also springe, wenn Zero-Flag nicht gesetzt ist

    Gute PIC-Seite: http://www.sprut.de

    Gruess
    Fritzli

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    09.10.2004
    Ort
    Bonn
    Alter
    44
    Beiträge
    6
    Haha!!!
    Tuts fast!!!

    Aber irgendwie hab ich auf PORTA nicht das Original sondern auf PORTB.
    Wobei die beiden gleich sind, ab der Hälfte.
    Komisch....

    Irgend ne Idee dazu? Vielleicht?

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.08.2004
    Ort
    Winterthur
    Beiträge
    312
    Kannste den neuen Code nochmals posten, ich seh's gerade nicht

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    09.10.2004
    Ort
    Bonn
    Alter
    44
    Beiträge
    6
    Code:
    ;**************************************************************
    ;*
    ;* Pinbelegung
    ;*	----------------------------------	
    ;*	PORTA: 	
    ;*	 	Pin	Funktion
    ;*		0	Ausgang
    ;*		1 	Ausgang
    ;*		2 	Ausgang
    ;*		3 	Ausgang
    ;*		4 	Ausgang
    ;*		5 	Ausgang
    ;*
    ;*	PORTB:	
    ;*	 	Pin	Funktion
    ;*		0	Ausgang
    ;*		1 	Ausgang
    ;*		2 	Ausgang
    ;*		3 	Ausgang
    ;*		4 	Ausgang
    ;*		5 	Ausgang
    ;*		6 	Ausgang
    ;*		7 	Ausgang
    ;*
    ;*	PORTC:
    ;*		NN
    ;*		
    ;*
    ;**************************************************************
    ; Includedatei für den 16F84 einbinden
    
    	list p=16f876
    	#include <P16f876.INC>
    
    	ERRORLEVEL      -302    ;	SUPPRESS BANK SELECTION MESSAGES
    
    ;**********************************************************
    ; Variablennamen vergeben
    
    dx			EQU	0x20
    dy			EQU	0x21
    
    	org	0			; 	Programmstart immer bei 0
    
    	goto	init	; 	Init ausführen
    
    
    ;**********************************************************
    ; Anfangsinitialisierung
    
    init
    	CLRF	dx				; 	Schleifenende
    	CLRF	dy				;	Schleifenzaehler
    
    	MOVLW 	H'55'			; 	Schleifenlaenge ins W-Register setzen`
    	MOVWF	dx				;	Schleifenlaenge aus W-Register nach dx
    
    	BSF	STATUS, RP0			;	auf Bank 1 umschalten
    	BCF	STATUS, RP1			;	
    	MOVLW	B'00000000'		;	PortA alle output
    	MOVWF	TRISA
    	MOVLW	B'10001111'		;	PortA dig output
    	MOVWF	ADCON1	
    	MOVLW	B'00000000'		;	PortB alle output
    	MOVWF	TRISB
    	
    
    	BCF STATUS, RP0		 	;	auf Bank 0 zurückschalten
    	CLRF	PORTA			; 	alle Port A Latches ausschalten
    	CLRF	PORTB			;	alle Port B Latches ausschalten
    
    ;**********************************************************
    ; Hauptprogrammschleife
    
    Main
    	MOVF	dx,0			;	lädt Schleifenende 
    	MOVWF	dy				;	setzt Schleifenzähler
    
    SchleifeBegin
    	MOVF	dy,0			; 	hohle Schleifenzähler ins W-Register
    
    	NOP
    	MOVWF	PORTA			; 	W-Register auf PORT A ausgeben
    	
    	XORLW 	H'FF'			;	Komplement bilden
    	MOVWF	PORTB			;	Komplement auf PORT B ausgeben
    	
    	DECF	dy,1			; 	dy um eins erniedrigen
    	MOVF	dy,1			; 	Prüfen auf 0 und Zero-Flag setzen
    	BNZ	SchleifeBegin
    
    	NOP						; 	ende
    	
    	end
    Ich hab also das Problem das er meiner Meinung nach eigentlich dy auf PORTA ausgeben sollte! Und da er das ja nach dem MOVWF PORTA ja noch im Accu hat sollte das mit der Komplementierung kein Problem sein! Die anschließende Ausgabe auf PORTB müsste dann ja auch noch möglich sein, schließlich hat der das ja alles noch im Accu und kanns direkt schreiben.
    Ich versteh einfach nicht wieso der das nicht hinkriegt!!

    *heul*

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.08.2004
    Ort
    Winterthur
    Beiträge
    312
    Hab mir mal folgendes mit Datenblatt angeschaut:

    Code:
    MOVWF  TRISA 
    MOVLW  B'10001111'    ;  PortA dig output
    Das macht *nicht* das was Du willst. Um alle Pins auf digital umzuschalten gehört da im niederwertigen Nibble nicht 1111 sondern 0111 rein (siehe Datenblatt)
    Sonst finde ich nichts...

    Gruess
    Felix

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    09.10.2004
    Ort
    Bonn
    Alter
    44
    Beiträge
    6
    Mühsam ernährt sich das Eichhörnchen...

    Danke nochmal Fritzli!
    Ich änder das noch grad mal um und guck ob's dann läuft. Wenn nicht dann hab ich halt Pech gehabt. Während der ganzen Suche hab ich aber einige andere (bessere) Codes gefunden, an denen man mehr sieht.

    Hab mich gestern mal hingesetzt und was geschrieben um Daten im Speicher hin und her zu schieben. Einfach mal ein bisschen mit der indirekten Adressierung rumgespielt. Scheint auch so zu funktioniren!

    Ich versuch jetzt mal was Neues!

    bis dann!
    Vinc

Berechtigungen

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

12V Akku bauen