Hallo Leute,
Fange gerade mit den Mikrocontrollern von Microchip an, also totaler
Neuling.
Habe erstmal eine Test Platine gebaut (siehe Anhang)
Will jetzt nur das wenn ich den Taster betätige das die LED´angeht.
Benutze ein 16f877 , habe auch einige male versucht das Programm zu
machen ..
aber es klappt einfach nicht.
Wäre sehr dankbar wenn mir jemand so ein Programm in Assembler machen
könnte damit ich sehen kann wie die IO´s konfiguriert werden und wie das
mmit dem Taster als Eingang geht, wenn das nicht zu aufwendig ist.
vielen vielen Dank im Voraus
Gruss Caine
;das ist das programm
list p=16f877
#include <P16f877.INC>
__CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC
org 0x00
init
bsf STATUS, RP0 ;Bank 1 setzen
movlw B'00000000' ;Port D alle out
movwf TRISD
bcf STATUS, RP0 ;Bank 0 setzen
clrw PORTD ;Alle LED´s aus
bsf STATUS, RP0 ;Bank 1 setzen
movlw B'11111111' ;Port B alle Eingänge
movwf TRISB
bcf STATUS, RP0 ;Bank 0 setzen
main
clrw
movfw PORTB ;Auslesen PortB
btfsc PORTB, 4 ; Port B Pin 0 lesen
goto main ; Sprung fall RB0 High ist
bsf PORTD,4 ;falls low LED an
end
so??
main
clrw
movfw PORTB ;Auslesen PortB
btfsc PORTB, 4 ; Port B Pin 0 lesen
goto main ; Sprung fall RB0 High ist
bsf PORTD,4 ;falls low LED an
goto $
end
so:
main
clrw
movfw PORTB ;Auslesen PortB
btfsc PORTB, 4 ; Port B Pin 0 lesen
goto main ; Sprung fall RB0 High ist
bsf PORTD,4 ;falls low LED an
goto $
end
so:
main
clrw
movfw PORTB ;Auslesen PortB
btfsc PORTB, 4 ; Port B Pin 0 lesen
goto main ; Sprung fall RB0 High ist
bsf PORTD,4 ;falls low LED an
goto $
END
Hallo Stefan
habe Dein test Programm im pic drinnen.
Es lässt die LED blinken so ungefähr in einer halben Sekunde takt.
Danke für das File.
Heist also meine Hardware ist okay.
Hallo Caine,
Da Du am Taster keinen Pull-Up Widerstand hast, solltest Du den Internen
Pull-Up von Port B einschalten:
bcf OPTION_REG,RBPU
Das OPTION_REG befindet sich in Bank 3.
Gruß
John
RB4 sollte per Widerstand hochgezogen werden. Mit dem integrierten
Hochzieher geht es zwar auch, ist aber nach meinem Gefühl keine saubere
Lösung.
Und:
main:
BTFSS PortB,4 ; Taste offen, d.h. Pin=hi ?
BCF PortD,4 ; LED aus
BTFSC PortB,4 ; Taste gedrückt ?
BSF PortD,4 ; LED einschalten
GOTO main
END
W.S.
Ich habe gerade festgestellt, dass sich das Optionsregister auch in Bank
1 befindet. Es wird in Bank 3 gespiegelt, es funktioniert also beides.
Das Bit RBPU hat negative Logik. Es ist im Include-File als NOT_RBPU
definiert. Der richtige Befehl zum einschalten der Pull-Ups ist:
bcf OPTION_REG,NOT_RBPU
Gruß
John
W.S. schrieb:> RB4 sollte per Widerstand hochgezogen werden. Mit dem integrierten> Hochzieher geht es zwar auch, ist aber nach meinem Gefühl keine saubere> Lösung.
Wenn die Leitungen zum Taster nicht allzu lang sind, es keine starken
EMV-Störungen in der Nähe gibt (oder von der Schaltung selbst) und der
Taster vergoldete Kontakte besitzt (wegen Mindeststrom) dann ist das
kein Problem.
Gruß
John
So Leute ,
habe eure Ratschläge befolgt das Programm sieht nun wie folgt aus (nur
Auschnitt) Pull upps sind hoch und das main ist anders.
Und es LÄUFT!!
Nur sobald ich den Taster drücke schalten alle Pins des Port D
Registers, heißt also wenn da noch andere LEDS an dem PORT D wären
würden sie auch Leuchten.
Aber es ist ein Fortschritt :-) DANKE LEUTE!!!
bsf STATUS, RP0 ;Bank 1 setzen
bcf OPTION_REG,NOT_RBPU
movlw B'00000000' ;Port D alle out
movwf TRISD
bcf STATUS, RP0 ;Bank 0 setzen
clrw PORTD ;Alle LED´s aus
bsf STATUS, RP0 ;Bank 1 setzen
movlw B'11111111' ;Port B alle Eingänge
movwf TRISB
bcf STATUS, RP0 ;Bank 0 setzen
main
BTFSS PORTB,4 ; Taste offen, d.h. Pin=hi ?
BCF PORTD,4 ; LED aus
BTFSC PORTB,4 ; Taste gedrückt ?
BSF PORTD,4 ; LED einschalten
GOTO main
END
John Bauer schrieb:> Wenn...
Es ist alles kein Problem, solange es kein Problem wird, weil man z.B.
mit den anderen Portbeinen was Anderes vorhat.
Also: Macht lieber keine Schaltungen, die sich auf Restströme, interne
Pullups und sonstige Nebenwirkungen verlassen.
W.S.
Natürlich habe ich auch mit den anderen Pins was vor.
Aber ich dachte jeden kann man einzeln ansteuern.
Da ich das Bit sozusagen auf den Pin setze und nicht auf das ganze
Register.
Und eine grundlegende Frage hätte ich noch.
Wenn der Taster betätigt wurde, kann mann das dann so machen das die LED
leuchtet auch wenn der Taser nicht mehr betätigt ist, oder braucht man
dafür eine selbsthaltungs-schaltung??
Also kann man das über das Programm machen oder muss da was
hardwaremäßiges her ??
dann mach sowas in dieser Art.
LEDS EQU 0x7D
main
BTFSS PORTB,4 ; Taste offen, d.h. Pin=hi ?
BCF LEDS,4 ; LED aus
BTFSC PORTB,4 ; Taste gedrückt ?
BSF LEDS,4 ; LED einschalten
MOVFW LEDS
MOVWF PORTD
GOTO main
Sehr komisch
laut Programm schaltet RB4 die LED aber auf meiner Testplatine macht das
RB3,
habe auch im Programm geändert das RB7 die LED schaltet aber es bleibt
trotzdem bei RB3.
Jemand eine Idee???
Hallo d.caine
hab mal schnell ein altes Programm vom 16F628 auf den 16F877 umgemoppelt
und mit MPLAB SIM gecheckt, dazu noch die Tastenfunktion mit Stimulus
geprüft, soweit ok. Müßte klappen. Die Port- und Pinbelegung kannst Du
unter "Labels" nach Bedarf umbenennen.
Nach dem gezeigte Prinzip dürfte es Dir nicht mehr schwer fallen, das
auf andere Ports und Pins zu übertragen.
...aller Anfang ist schwer :-)
mfg Bruddler
W.S. schrieb:> Also: Macht lieber keine Schaltungen, die sich auf Restströme, interne> Pullups und sonstige Nebenwirkungen verlassen.
Was ist denn das für ein Quatsch?
Bei den internen Pull-Ups handelt es sich weder um zuschaltbare
Restströme noch um zuschaltbare Nebenwirkungen.
Die Werte für die internen Pull-Ups sind im Datenblatt angegeben. Der
Toleranzbereich ist, zugegeben, recht groß. Er entspricht 12,5kΩ-100kΩ
(Typisch: 20kΩ) für die internen Pull-Ups. Aber wenn die Schaltung und
die verwendeten Komponenten damit zurecht kommen, ist es überhaupt kein
Problem diese zu verwenden.
Wenn der hier verwendete Taster keine vergoldeten Kontakte hat (was ich
auch geschrieben habe), wird es spätestens in ein paar Jahren Probleme
geben weil die Kontakte oxidiert sind. Aber für einen Testaufbau reicht
es allemal.
Und die pauschale Aussage, dass ein externer Widerstand besser sei als
der interne Pull-Up, ist auch ziemlich sinnfrei, wenn man nicht angibt
worauf man bei der Wahl der Wertes achten muss. Welchen Wert soll man
nehmen? Ist ein externer 100kΩ Pull-Up besser als der interne? Oder sind
vielleicht 10Ω oder 10MΩ besser?
John
d.caine schrieb:> ..wo> steht den welcher Port-pin der Schalter ist ? :-) RB1 ist ja> auskommentiert
Hallo d.caine
ich hoffe Du hast das Prinzip der Label-Definitionen verstanden. Es
vereinfach die Programmierung, insbesondere Änderungen im Code
kollossal!
TASTER equ 1 ;RB1
Taster hat den Wert 1, in Verbindung mit LED_PORT,TASTER ist der Taster
dem Pin PORTB,RB1 zugeordnet. Schreibst Du equ 6 dann ist es eben RB6.
LED_ROT equ 0 ;RB0
LED rot hat den Wert 0 in Verbindung mit LED_PORT,LED_ROT ist eben RB0
der Anschlusspin für die LED, schreibst Du equ 3 ist es eben der Pin RB3
#define LED_ROT_EIN bcf LED_PORT,LED_ROT ;LED rot EINschalten
ist auch nach 10 Jahren noch verständlicher als "bcf PORTB,0"
Ist ja Sinn der Sache, dass Du nicht mehr den ganzen Programmtext
durchgehen musst, um eine PIN- oder Port-Zuordnung zu ändern. Das machst
Du unter "LABELS". Hauptsache in dieser Abteilung stimmt alles
zueinander, dann ist auch im weiteren Code alles korrekt zugeordnet.
; #define TASTER_DOWN bcf FlagReg,TASTER ;Flag, Taster gedrückt
; #define TASTER_UP bsf FlagReg,TASTER ;Flag, Taster nicht
gedrückt.
Dieser auskommentierte Code ist erst relevant, wenn Du im Zusammenhang
mit dem Tasterdruck z.B. in der Interruptroutine ein Flag setzen/löschen
möchtest, um z.B. nach der Rückkehr vom Interrupt in der weiteren
Codeausführung,etwas bestimmtes bewirken zu können (LED ein/aus, Uhrzeit
stellen oder was weiß ich noch alles).
Gruss Bruddler
John Bauer schrieb:> Was ist denn das für ein Quatsch?
Diesen Quatsch nennt man Erfahrung.
Aber es ist wohl wahr, daß gar viele Leute erst selbst auf die Nase
fallen müssen, ehe sie was lernen - und selbst dann lernen es einige
immer noch nicht.
d.caine schrieb:> aber es klappt einfach nicht.
Mir kommt der Verdacht, daß wir hier auf dem falschen Problem
herumkauen. Wie groß ist denn der Vorwiderstand vor deiner LED?
Es ist nämlich so, daß die PIC's recht kräftige Port-Treiber haben und
der Strom, den so ein Portpin liefern soll, muß ja irgendwoher kommen,
nämlich aus der Versorgung (VCC) des PIC's. Wenn nun der Widerstand zu
klein und damit die Last am Pin zu groß wird, dann geht die VCC in die
Knie (weil der Treiber als kräftiger Kumpel zu sehr dran zieht) und der
PIC kriegt ein Reset wegen Unterspannung. Sowas geht innerhalb einiger
Mikrosekunden und du siehst es deswegen garnicht.
Ach ja, nochwas: Ich hatte mich schon vor knapp 20 Jahren an dem
damaligen PIC-Assembler gestört, weil der alles andere als gut gemacht
war und hatte mir deswegen meinen eigenen Assembler geschrieben, den ich
immer noch benutze. Wenn ich so die diversen Quellcode-Beiträge
anschaue, dann graust es mich genauso wie damals. Entweder ist der
Assembler im MPLAB immer noch so grottenschlecht oder die Schreiber der
obigen Beiträge. Ich hatte mich ja auch zurückgehalten mit
BTFSS PortB,4 ; Taste offen, d.h. Pin=hi ?
BCF PortD,4 ; LED aus
und so.
Man kann es so schreiben, aber es ist kein guter Stil, weil schlecht
les- und wartbar. Die Ratschläge vom Buddler sind im Prinzip richtig,
aber offenbar wird das ein Kampf gegen den schlechten Assembler. Viele
Fehler kommen daher, daß man bei Bit-Operationen irgendwo ne falsche
Zuordnung zwischen Bit und Byte schreibt und sich dann totsucht. Gleich
einen ganzen Befehl als Makro zu definieren, ist aber auch nicht gut.
Bei meinem Assembler kann ich die Bits einzeln definieren:
LED: BIT PortD,4
aber bei dem Microchip-Assembler muß man wohl mit
Preprozessor-Anweisungen arbeiten:
#define LED PortD,4
#define TASTER PortB,4
Dann kann man im ganzen Programm die Bit-Operationen etwa so schreiben:
BTFSS TASTER
BCF LED
Das hilft beim Lesen (wenn der Code mal größer wird..) und auch beim
Ändern, wenn du dich z.B. verlötet hast und dein Taster in Wirklichkeit
auf Port C,7 liegt.
d.caine schrieb:> clrw PORTD ;Alle LED´s ausDAS wundert mich allerdings sehr: Einen CLRW mit Argument hätte der
Assembler bemängeln müssen. Er ist wohl noch schlechter, als ich annahm.
W.S.