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
Zeig halt mal deine Versuche her, dann sehen wir vielleicht auch den Fehler...
;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
achso, und end sollte nicht ein label end sein, sondern leerzeichen 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
Hier ein Testprogramm, was deine LED am Port D4 blinken läßt. Sollte sie es nicht tun, so liegt ein Hardwarefehler vor.
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
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.
Bei deinem Programm müsstest du aber ein blitzen der Led von fast 8ms zu sehen bekommen.
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
..Mist, ist einfach zu spät, hab' das falsche File erwischt. jetzt stimmt's mfG Bruddler
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
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 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.