Forum: Mikrocontroller und Digitale Elektronik Hilfe bei meinem Betrieblichen Auftrag für Prüfung


von Jan O. (jan_123)


Lesenswert?

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.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

schreib dir halt einfach mal deinen Algorithmus in Pseudosprache hin, 
und dann überlegst du dir welches Register du wofür nehmen könntest

von Peter D. (peda)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Jan O. (jan_123)


Lesenswert?

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
von Karl H. (kbuchegg)


Lesenswert?

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
von Jan O. (jan_123)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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
von Jan O. (jan_123)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

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.

von fuerst-rene (Gast)


Lesenswert?

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.

von Ausbilder (Gast)


Lesenswert?

Hallo Jan,

Nur aus Interresse was machst du für eine Ausbildung ?

von Erich (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.