naja, PortA hatnoch weitere funkrtionen außer dem digitalen I/O ist da denn alles richtig initialisiert??
Wenn dein PortA Input ist kannst du dem kein Signal vorgeben, sondern liest mit btfsc die pegel der Portpins...
Hallöchen
Ich lerne gerade Assembler und habe da ein kleines Problem, wobei ich denke das es sich um ein reines Anfängerproblem handelt.
Nach meinem Verständnis sollte hiermit der Pin RB0 als Ausgang definiert sein und alle anderen Pins ein Low level haben.Code:Adresse equ 0x20 ; Vergleichsadresse, kann irgendein 5bit enthalten. Zum testen schreibe ich einfach 0h MOVLW 0h ; Wert in W MOVWF Adresse ; W nach Register MOVLW b'00000111' ; Komperatorausgänge nutzen MOVWF 1Fh BSF STATUS, RP0 ; auf BAnk 1 wechseln BCF TRISB, 0 ; Soll als Augang fungieren BCF STATUS, RP0 ; zurück nach Bank 0 CLRF PORTA ; Eingänge PortA auf low CLRF PORTB ; Eingänge PortB auf low
Dann möchte ich die Pegel an den Pins abfragen:
Hierbei sollten nach meinem Verständnis die BSF Befehle ignoriert werden, da die eingelesenen Pegel = 0 sind. Das scheint auch zu funktionieren.Code:BTFSC PORTA, 0 BSF Adresse, 0 BTFSC PORTA, 1 BSF Adresse, 1 BTFSC PORTA, 2 BSF Adresse, 2 BTFSC PORTA, 3 BSF Adresse, 3 BTFSC PORTA, 4 BSF Adresse, 4
Wenn ich aber in das Register PORTA = ffh schreibe, müssten hierbei doch die Ausgänge alle auf High stehen und somit bei dem letzten Codeabschnitt die BSF Befehle ausführen. Oder sehe ich das falsch??
Nur falls die Frage aufkommt was die Schaltung können soll:
Beim initialisieren wird das REgister Adresse mit einem Nullwert erstellt. Beim einlesen der Pin Pegel von PortA soll das anliegende Bitmuster in das Register geschrieben werden. Im weiteren Schritten die hier aber nicht aufgeführt sind soll später das Register mit einem 5 Bit Muster von PortB verglichen werden. Das macht vieleicht für euch nicht viel Sinn, aber für Mein Verständnis an diesen kleinen Teilchen unverzichtbar
Für eure Hilfe bedanke ich mich im voraus
naja, PortA hatnoch weitere funkrtionen außer dem digitalen I/O ist da denn alles richtig initialisiert??
Wenn dein PortA Input ist kannst du dem kein Signal vorgeben, sondern liest mit btfsc die pegel der Portpins...
Irgendwas ist immer...
hi schau dir mal folgendes an:
p.s. des mit dem banksel ist wesentlich einfacher als mit dem "bsf status RP0..." des mach den der compiler automatisch.Code:; PORTA banksel TRISA ; Bank Wekseln movlw B'00000000' ; PortA I/O setzen (1=In, 0=Out) (Reinfolge RA7,RA6...) movwf TRISA ; PortA I/O setzen movlw B'11111111' ; Analog/Digital I/O (0=Analog, 1=Digital) (Reinfolge RA0,RA1...) banksel ADCON1 ; Bank Wekseln movwf ADCON1 ; PortA I/O setzen clrf PORTA ; PortA auf 0 setzen ; PORTB banksel TRISB ; Bank Wekseln movlw B'000000000' ; PortB I/O setzen (1=In, 0=Out) (Reinfolge RB7,RB6...) movwf TRISB ; PortB I/O setzen banksel PORTB ; Bank Wekseln clrf PORTB ; PortB auf 0 setzen
Legastheniker on Bord !
Habe ich deine Antwort richtig verstanden?
der Befehl 'banksel adresse' wechselt automatisch in die Bank in der das Register 'adresse' liegt?
eine FFh nach TRISA definiert alle Pins an Port A als Eingänge?
Der PIC16F628a hat kein ADCON1 Register. Was soll dieser Befehl bewirken?
Ich habeden Wert 7h nach adresse 1Fh geschrieben um die Komperatoreingänge nutzen zu können.PortA hatnoch weitere funkrtionen außer dem digitalen I/O ist da denn alles richtig initialisiert??
kann ich nichtmit irgendeinem Befehl die Eingänge so simulieren das sie sich so verhalten wie in der späteren Schaltung (High/Low)?? Wie soll ich sonst den Code prüfen?
hi genau banksel wechselt in die jeweilige bank der angegebenen adresse
ADCON1 (876) ist um die ADC Eingänge auch Digitale I/O umzuschalten ich glaub beim 628a heißen die nur adcon.
ja du kannst nen Debugger benutzen um das verhalten zu testen ich benutze dafür gpsim bei mplab ist aber auch was bei.
Legastheniker on Bord !
naja, soweit ich das sehe ist der richtig initalisiert, du solltest die eingänge also nutzen können...
Ich verstehe aber noch nicht ganz wie du einen wert an den porta schreiben willst, in das register kannst du ja nicht schreiben (sollte zumindest keinen effekt haben da inputs)
Simulieren kann man sehr gut mit dem PIC SIMULATOR IDE ==>http://oshonsoft.com/pic.html
Ich persönlich würde aber niemandem einen PIC16F.... empfehlen! ===> Ein PIC18F.... hat schon lineare adressierung (also nix mehr mit Banksel)
Irgendwas ist immer...
Moin
Das ist ja eben mein Problem.Ich würde dem Code gerne vorflunkern das ein Pegel anliegt. Damit könnte ich erkennen ob der Code richtig arbeitet.Ich verstehe aber noch nicht ganz wie du einen wert an den porta schreiben willst
Beispiel:
An PortA RAxy simuliere ich ein High-Signal. Dieses High würde ich dann mit der Adresse XY Bit yx vergleichen. Wenn beide gleich dann mache weiter, wenn nicht springe ins Unterprogramm. So soll dann per anliegenden Pegel verschiedene Unterfunktionen aufgerufen werden.
Den Simulator werde ich mal ausprobieren
joa, mit dem simulator kann man das auf jeden fall testen, ansonsten musst du den port vorübergehend als Output einstellen damit du in das register schreiben kannst...
letzte möglichkeit wäre natürlich das ganze soweit aufzubauen das du das mit hardware testen kannst...
Irgendwas ist immer...
Hallo
Hier jetzt mal der gesamte Code. Sagt mir doch bitte ob darin ein nennenswerter Fehler ist:
Habe ich bis hierhin alles richtig gemacht?Code:; PIC auswaehlen list p=16f628a ; Include Datei fuer PIC #include <p16f628a.inc> ; Config Word __config _MCLRE_ON & _PWRTE_OFF & _XT_OSC & _WDT_OFF ; Comperator deaktivieren durch das schreiben vom Wert 0x07h in das CMCON Register ; Dadurch koennen die Comperatoreingaenge als digitale Eingaenge benutzt werden ; Um Fehler zu vermeiden wird die Bank 1 explicit ausgewaehlt BANKSEL CMCON MOVLW b'00000111' ; Inhalt Arbeitsregister W nach Register CMCON schreiben (1Fh) MOVWF 1Fh ; Mit BANKSEL automatisch in die Bank mit dem Register TRISA wechseln BANKSEL TRISA ; Von PORTA die Ports RA0-RA4 auf Input schalten ( 1=In 0=Out ) MOVLW B'00011111' ; Wert aus Arbeitsregister W nach TRISA schreiben MOVWF TRISA ; Von PORTB die Ports RB0-RB5, RB7 auf Input und RB6 auf Output MOVLW B'10111111' ; Wert aus Arbeitsregister W nach TRISB schreiben MOVWF TRISB ; Mit BANKSEL automatisch in die Bankmit dem Register PORTA und PORTB wechseln BANKSEL PORTA ; Pinne an PORTA mit dem Wert 0h loeschen CLRF PORTA ;Pinne an PORTB mit dem Wert 0h loeschen CLRF PORTB
ja, hast du! da ich noch ein paar zeichen fehlen...
Bisher kann ich in dem quellcode keinen fehler entdecken.
Irgendwas ist immer...
Lesezeichen