Ich muss mit dem Programm MPLAB eine Software schreiben, die 35 Assembler Befehle sind mir bekannt und ich benutze den PIC16F887. Meine Aufgabe ist, mit zwei Taster (up & down) Auf und Abwärts-Zählen erstmal mit 8 Led´s RB0-RB7. Bei einmaligem kurzem Tastendruck erfolgt nur ein Aufwärts-Zählschritt, bei Taste gedrückt halten soll schnell gezählt werden. Die Taster sind an RA0 und RA1, bin totaler Neuling und weiß nicht wie ich die Software schreiben muss. Auf der Seite spruts.de bin ich nicht weiter gekommen, hoffe IHR könnt mir helfen.
schreib dir halt einfach mal deinen Algorithmus in Pseudosprache hin, und dann überlegst du dir welches Register du wofür nehmen könntest
Jan Owczarek schrieb: > die 35 > Assembler Befehle sind mir bekannt Du mußt wirklich in PIC-Assembler schreiben? Mein herzliches Beileid. Ansonsten, Programmieren heißt, man schalte den PC aus, nehme sich Papier und Bleistift und erstelle erstmal den Programmablaufplan. Hat man den fertig und überprüft, daß er logisch korrekt ist, kann man den PC wieder anschalten und den Code einhacken.
Jan Owczarek schrieb: > weiß nicht wie ich die Software schreiben muss. Was hast du denn schon mit dem PIC gemacht? Blinkende LED? Lauflicht? Taster einlesen? Uhr? Wenn nicht: dann fang damit an. Das dabei gelernte wirst du für die gestellte (und relativ einfache) Aufgabe brauchen. Dieser Lernprozess kann dauern. Es ist möglich, dass man für sowas simples wie ein Uhr ein ganzes Wochenende vergräbt. Ich habe z.B. schon einige Male nach durchgemachter Nacht dem Zeitungsboten morgens die Zeitung aus der Hand genommen... Jan Owczarek schrieb: > Meine Aufgabe ist, mit zwei Taster (up & down) Auf und Abwärts-Zählen > erstmal mit 8 Led´s RB0-RB7. Bei einmaligem kurzem Tastendruck erfolgt > nur ein Aufwärts-Zählschritt, bei Taste gedrückt halten soll schnell > gezählt werden. Dann musst du auf jeden Fall 2 Aufgaben bewältigen: 1. einen Zähler mit Up und Down-Eingang machen und den auf LEDs ausgeben 2. eine Tastenauswertung schreiben, die dem Zähler die Zählimpulse liefert Die Aufgabe 2 kannst du nochmal unterteilen: a) erstmal einfach bei einem Tastendruck einmal zählen b) die Wiederholfunktion mit einbauen
hab bis jetzt das bei einmaligem kurzem Tastendruck ein Aufwärts oder Abwärts-Zählt aber versteh nicht wie ich jetzt weiter mach das bei längerem Taste gedrückt so lange gezählt wird bis ich wieder los lasse???
1 | list p=16f887 ; list definiert den Controller |
2 | #include <p16f887.inc> ; Headerdatei mit Registernamen |
3 | errorlevel -302 ; suppress message 302 from list file |
4 | |
5 | __CONFIG _CONFIG1, _LVP_OFF&_FCMEN_OFF&_IESO_OFF&_BOR_OFF&_CPD_OFF&_CP_OFF&_MCLRE_ON&_PWRTE_ON&_WDT_OFF&_INTRC_OSC_NOCLKOUT |
6 | __CONFIG _CONFIG2, _WRT_OFF&_BOR21V |
7 | ;---------------------------------------------------------------------- |
8 | ; Configuration Word Register1: |
9 | ; Low Voltage Programming -> LVP_OFF(disabled) |
10 | ; Monitor Clock Fail-safe -> FCMEN_OFF(disabled) |
11 | ; Internal External Switch Over Mode -> IESO_OFF(disabled) |
12 | ; Brown Out Detect -> BOR_OFF(disabled) |
13 | ; Data EE Read Protect -> CPD_OFF (disabled) |
14 | ; Code Protect -> CP_OFF |
15 | ; Master Clear Enable -> MCLRE_ON (enabled) |
16 | ; Power Up Timer -> PWRTE_ON (enabled) |
17 | ; Watchdog Timer -> WDT_OFF (disabled) |
18 | ; Oscillator -> INTRC_OSC_NOCLKOUT (Internal RC No Clock) |
19 | ; Configuration Word Register2: |
20 | ; Flash Memory Write Protection off -> WRT_OFF (disabled) |
21 | ; Brown-out Reset Voltage -> BORV21 (2,1 V) |
22 | ;---------------------------------------------------------------------- |
23 | ; VARIABLE DEFINITIONS |
24 | ;---------------------------------------------------------------------- |
25 | CBLOCK 0x20 ; Block beginnt bei 0x20 (RAM-Bank 0) |
26 | temp_01 |
27 | temp_02 |
28 | count |
29 | ENDC ; Ende des Registerblocks |
30 | ;---------------------------------------------------------------------- |
31 | ORG 0x000 ; Anfangsadresse 0x000 |
32 | ResetVector movlw high(main) |
33 | movwf PCLATH |
34 | goto main |
35 | ;---------------------------------------------------------------------- |
36 | ; Unterprogramm: _delay_2.5m |
37 | ; benötigte Zählregister: temp_01, temp_02 |
38 | ; Grundverzögerung: 2.5 ms |
39 | ; Multiplikator: Übergabe durch w-Register |
40 | ;---------------------------------------------------------------------- |
41 | _delay_2.5m movwf temp_02 ; w -> temp_02 |
42 | wait_2 movlw d'250' ; 250 -> w |
43 | movwf temp_01 ; w -> temp_01 |
44 | wait_1 nop ; 1µs |
45 | nop ; 1µs |
46 | nop ; 1µs |
47 | nop ; 1µs |
48 | nop ; 1µs |
49 | nop ; 1µs |
50 | nop ; 1µs |
51 | decfsz temp_01, f ; 1 µs |
52 | goto wait_1 ; 2 µs |
53 | decfsz temp_02, f ; 1 µs |
54 | goto wait_2 ; 2 µs |
55 | return |
56 | ;---------------------------------------------------------------------- |
57 | ; Hauptprogramm: main |
58 | ;---------------------------------------------------------------------- |
59 | main |
60 | BANKSEL ANSEL ; -> Bank 3 |
61 | clrf ANSEL ; Port A, Port E: Analog-Fkt. aus, digital I/O |
62 | clrf ANSELH ; Port B: Analog-Fkt. aus, digital I/O |
63 | |
64 | BANKSEL TRISA ; -> Bank 1 |
65 | movlw 0xff |
66 | movwf TRISA ; RA0-RA7 Eingänge |
67 | movlw 0x00 |
68 | movwf TRISB ; RB0-RB7 Ausgänge |
69 | |
70 | BANKSEL PORTB ; Bank 0 |
71 | clrf PORTB ; Port B löschen |
72 | clrf count |
73 | ;---------------------------------------------------------------------- |
74 | mainloop movf count, w ; count -> w |
75 | movwf PORTB ; w -> Port B |
76 | movlw d'2' ; 2 * 2,5ms |
77 | call _delay_2.5m ; Entprellen |
78 | up btfss PORTA, 0 ; RA1=1 ? |
79 | goto down ; nein -> down |
80 | btfsc PORTA, 0 ; ja -> Taster ? |
81 | goto $-1 ; ja |
82 | incf count, f ; nein -> inc |
83 | goto mainloop ; |
84 | down btfss PORTA, 1 ; RA2=1 ? |
85 | goto mainloop ; nein |
86 | btfsc PORTA, 1 ; ja -> Taster ? |
87 | goto $-1 ; ja |
88 | decf count, f ; nein -> dec |
89 | goto mainloop ; |
90 | ;---------------------------------------------------------------------- |
91 | END ; Programmende |
92 | ;---------------------------------------------------------------------- |
:
Bearbeitet durch User
hier ....
1 | btfsc PORTA, 0 ; ja -> Taster ? |
2 | goto $-1 ; ja |
... in dieser Schleife wartet das Programm, bis der Benutzer die Taste wieder loslässt. Da würde ich mal einen Aufruf in die delay_2.5ms (um dem ganzen eine Zeitbasis zu geben) mit einbauen und dann ganz einfach einen Zähler bei jedem Durchlauf um 1 hochzählen. Ist ein gewisser Zählerstand erreicht, dann war die Taste 'lang' gedrückt und es wird 1 zum count dazugezählt, die Ausgabe auf den Port erledigt und weiter durch die Schleife gelaufen, bis eben der Benutzer irgendwann mal loslässt.
:
Bearbeitet durch User
Danke für die schnelle Antwort. Kannst du mir zeigen wo und wie ich das da zufügen oder verändern muss, bin gerade ein wenig überfordert
Jan Owczarek schrieb: > Danke für die schnelle Antwort. > > Kannst du mir zeigen wo und wie ich das da zufügen oder verändern muss, > bin gerade ein wenig überfordert Das merk ich. Da ich kein einziges Wort PIC-Assembler spreche, kann ich dir da nicht helfen. Um ehrlich zu sein. Ich glaub dir auch nicht, dass du das selber geschrieben hast. Denn sonst hättest du gewusst, welche Befehle das Programm abarbeitet, wenn eine Taste gedrückt ist und dann müsste das Stichwort 'mitzählen wie oft die Schleife durchlaufen wird' eigentlich schon völlig ausreichen um zu wissen, was zu tun ist. Das heißt: geschrieben hast du es vielleicht sogar, indem du anderen Code zusammengestoppelt hast. Aber du hast keinen blassen Schimmer davon, wie die Codestellen funktionieren.
1 | up btfss PORTA, 0 ; RA1=1 ? |
2 | goto down ; nein -> down |
3 | | |
4 | | |
5 | v |
6 | zähler auf 0 setzen |
7 | +-----> call _delay_2.5m |
8 | | zähler um 1 erhöhen Nein |
9 | | zähler gleich 200? ------+ ; 200 * 2.5ms macht 500ms, also 1/2 Sekunde |
10 | | | Ja | |
11 | | v | |
12 | | count um 1 erhöhen | |
13 | | count am Port ausgeben | |
14 | | zähler auf 0 setzen | |
15 | | | | |
16 | | +<-----------------------+ |
17 | | | |
18 | | v |
19 | | btfsc PORTA, 0 ; Taste losgelassen? |
20 | +------- goto ; nicht losgelassen! |
21 | | |
22 | v |
23 | incf count, f |
24 | goto mainloop |
:
Bearbeitet durch User
Ja stimmt, wie schon geschrieben, bin totaler Neuling. Hab ein Beispiel genommen, ein wenig verändert und ausprobiert. Unser Ausbilder will das ich es mit MPLAB mach, nervt mich total weil ich echt Schwierigkeiten hab Assembler zu verstehen. Hoffe aber DU oder Ihr könnt mir weiterhin helfen. Danke schon mal im voraus.
Wir werden Dir keine fertige Lösung liefern, denn das wäre unfair. Wenn Du die Sprache oder den Ablauf des Programmes nach diesen Hinweisen nicht verstehst, kannst und sollst Du auch keine gute Arbeit abliefern. Wir helfen gerne, die Gedanken in die richtige Richtung zu lenken. Aber die Leistung muss schon von Dir selbst kommen.
Das geht ja noch, Ich habe 1 Jahr von meinem Vorgesetzten "frei" bekommen um Asambler zu lernen. und dieses "frei" war harte arbeit! Mittlerweile kann ich auch "blind" den 16F1939 Programmieren. Aber vorab vergiss alle Hochsprachen die du bisher hattest und denke "Binär" also nur ja nein und dann schaue dir noch mal die Seite vom sprut an.
Hallo Jan, Nur aus Interresse was machst du für eine Ausbildung ?
Hallo Jan, natürlich kann man alle 2 Tage dieselbe Frage neu einstellen unter Nutzung eines neuen Betreffs Beitrag "Re: Programm schreiben mit MPLAB 8.70" aber ob dann zufällig mehr Hilfestellung kommt ist fraglich. Es kann auch Verärgerung kommen. HALLO LEUTE, das ist ein DOPPELPOST und der Fragesteller ist ZU FAUL selbst was zu tun und was ZU LERNEN. Gruss
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.