PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehler im Code



Vorobo
09.10.2004, 10:35
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:



;************************************************* *************
;*
;* 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

Fritzli
09.10.2004, 10:45
Hallo

Das Ende Deiner Initialisierung


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

Vorobo
09.10.2004, 12:39
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

Fritzli
09.10.2004, 13:11
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

Vorobo
09.10.2004, 16:07
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? 8-[

Fritzli
09.10.2004, 17:03
Kannste den neuen Code nochmals posten, ich seh's gerade nicht

Vorobo
09.10.2004, 19:49
;************************************************* *************
;*
;* 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*

Fritzli
09.10.2004, 21:07
Hab mir mal folgendes mit Datenblatt angeschaut:



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

Vorobo
10.10.2004, 13:43
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