PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anängerfehler PIC16f628a



Atmelbeginne
22.08.2008, 19:25
Hallöchen

Ich lerne gerade Assembler und habe da ein kleines Problem, wobei ich denke das es sich um ein reines Anfängerproblem handelt.






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



Nach meinem Verständnis sollte hiermit der Pin RB0 als Ausgang definiert sein und alle anderen Pins ein Low level haben.

Dann möchte ich die Pegel an den Pins abfragen:


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


Hierbei sollten nach meinem Verständnis die BSF Befehle ignoriert werden, da die eingelesenen Pegel = 0 sind. Das scheint auch zu funktionieren.
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 O:)


Für eure Hilfe bedanke ich mich im voraus

Lif79
23.08.2008, 11:35
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...

theborg
23.08.2008, 17:56
hi schau dir mal folgendes an:


; 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


p.s. des mit dem banksel ist wesentlich einfacher als mit dem "bsf status RP0..." des mach den der compiler automatisch.

Atmelbeginne
23.08.2008, 20:05
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?


PortA hatnoch weitere funkrtionen außer dem digitalen I/O ist da denn alles richtig initialisiert??


Ich habeden Wert 7h nach adresse 1Fh geschrieben um die Komperatoreingänge nutzen zu können.

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?

theborg
23.08.2008, 21:29
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.

Lif79
23.08.2008, 22:23
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)

Atmelbeginne
24.08.2008, 11:45
Moin



Ich verstehe aber noch nicht ganz wie du einen wert an den porta schreiben willst


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.

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

Lif79
24.08.2008, 13:07
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...

Atmelbeginne
24.08.2008, 15:41
Hallo

Hier jetzt mal der gesamte Code. Sagt mir doch bitte ob darin ein nennenswerter Fehler ist:



; 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



Habe ich bis hierhin alles richtig gemacht?

Lif79
24.08.2008, 16:36
ja, hast du! da ich noch ein paar zeichen fehlen...

Bisher kann ich in dem quellcode keinen fehler entdecken.

Atmelbeginne
24.08.2008, 16:47
Assembler ist garnicht schwer.... :cheesy:

Lif79
24.08.2008, 17:25
ist es auch nicht, da ein einfacher PIC16F... nur 35 Befehle hat kommen nur noch ein paar befehle assemblerbefehle dazu und fertig ist...

Ich persönlich nutze halt eher die 18F Serie, die hat auch nicht so viel mehr assembler befehle, aber dafür kein banking mehr. Versuche aber mich noch mehr mit C für PICs zu beschäftigen da ich momentan versuche auch ein paar PIC32 zum laufen zu bekommen... (Wieso gibt es die eigentlich nich im 100 Pin DIL gehäuse??? ;-) )

Atmelbeginne
25.08.2008, 06:55
Habe mir mal eine PIC Simulator IDE runtergeladen. Das Programm ist genial. Genau was ich gesucht habe. Das ist mir auch die 49€ Lizenzgebühren Wert. Da kannst du intuitiv alles mögliche einstellen.

Dann werde ich mich mal weiter an meinen Code begeben. Ich werde sicherlich noch Fragen haben. Erstmal ein dickes Danke!!!