Forum: Mikrocontroller und Digitale Elektronik Einfaches Assemblerprogramm


von d.caine (Gast)


Angehängte Dateien:

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

von nocheinGast (Gast)


Lesenswert?

Zeig halt mal deine Versuche her, dann sehen wir vielleicht auch den 
Fehler...

von d.caine (Gast)


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

von pic_user (Gast)


Lesenswert?

Mach noch ein
  goto $

vor END , dann sollte es stimmen.

von pic_user (Gast)


Lesenswert?

achso, und end sollte nicht ein label end sein, sondern leerzeichen END

von d.caine (Gast)


Lesenswert?

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

von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

Hier ein Testprogramm, was deine
LED am Port D4 blinken läßt.
Sollte sie es nicht tun, so liegt
ein Hardwarefehler vor.

von pic_user (Gast)


Lesenswert?

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


    END

von pic_user (Gast)


Lesenswert?

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

von pic_user (Gast)


Lesenswert?

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

von l-hase (Gast)


Lesenswert?

solltest die Led auf Low schalten

l-hase

von d.caine (Gast)


Lesenswert?

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.

von pic_user (Gast)


Lesenswert?

Bei deinem Programm müsstest du aber ein blitzen der Led von fast 8ms zu 
sehen bekommen.

von d.caine (Gast)


Lesenswert?

bei meinem Programm leuchtet die LED nur.
KA warum.

von d.caine (Gast)


Lesenswert?

1-hase
Wie meinst Du das ?
Kannst du ein Beispiel machen?

von John B. (johnbauer)


Lesenswert?

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

von W.S. (Gast)


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.

von John B. (johnbauer)


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

von John B. (johnbauer)


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

von d.caine (Gast)


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

von W.S. (Gast)


Lesenswert?

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.

von d.caine (Gast)


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 ??

von pic_user (Gast)


Lesenswert?

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

von d.caine (Gast)


Lesenswert?

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???

von Bruddler (Gast)


Angehängte Dateien:

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

von Bruddler (Gast)


Lesenswert?

In "Init"    TASTER_UP  auskommentieren = ;TASTER_UP!
sorry - Bruddler

von Bruddler (Gast)


Angehängte Dateien:

Lesenswert?

..Mist, ist einfach zu spät, hab' das falsche File erwischt. jetzt 
stimmt's
mfG Bruddler

von d.caine (Gast)


Lesenswert?

Danke für die schnelle Hilfe..bin jetzt den code am durchgehen ..wo 
steht den welcher Port-pin der Schalter ist ? :-) RB1 ist ja 
auskommentiert

von John B. (johnbauer)


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

von Bruddler (Gast)


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

von W.S. (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.