Einfaches Assemblerprogramm

Gast #2727885
Lesenswert?

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
Angehängte Dateien:
Gast #2727913
Lesenswert?

;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
Gast #2727998
Lesenswert?

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.
#2728006
Lesenswert?

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
#2728014
Lesenswert?

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
Gast #2728031
Lesenswert?

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
Gast #2728065
Lesenswert?

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 ??
Gast #2728242
Lesenswert?

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
Angehängte Dateien:
#2728406
Lesenswert?

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
Gast #2728418
Lesenswert?

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
Gast #2729042
Lesenswert?

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 aus

DAS 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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren