Forum: Mikrocontroller und Digitale Elektronik Pic 16f84a Unterprogramm


von Myho (Gast)


Lesenswert?

hi,
ich bin noch Anfänger im programmieren und hab eine Frage zum 16F84A. 
Ich möchte gern ein Lauflicht programmieren. PortA 2 Schalter für 4 
Variablem und PortB für den output (LEDs). Ich möchte mit Hilfe der 
Schalterstellungen 4 unterschiedliche kleine Lauflicht-Programme 
ansteuern und dafür aber eine Warteschleife für alle benutzten. Geht 
das? Springt der dann auch mit dem Befehl RETLW dahin wieder zurück wo 
ich das CALL hingesetzt habe? Hätte ja dann mehrere CALLS.

Ach und noch eine Kleinigkeit. Wenn ich das Ding dann fertig habe und 
das ganz normale Lauflicht läuft und ich schalte dann ein Schalter um, 
springt der dann sofort auf das andere Programm oder muss ich noch sone 
Art reset Taster mit einbaun?

danke schonmal im Vorraus
mfg Ingo

von Claus P. (claus)


Lesenswert?

Myho wrote:
> Springt der dann auch mit dem Befehl RETLW dahin wieder zurück wo
> ich das CALL hingesetzt habe? Hätte ja dann mehrere CALLS.

natürlich, das ist der Unterschied zwischen einem GOTO und einem 
CALL-Befehl

> Ach und noch eine Kleinigkeit. Wenn ich das Ding dann fertig habe und
> das ganz normale Lauflicht läuft und ich schalte dann ein Schalter um,
> springt der dann sofort auf das andere Programm oder muss ich noch sone
> Art reset Taster mit einbaun?
>

Das hängt von deinem Programm ab. Wenn du nach jedem Lauflichtdurchlauf 
die Schalterstellungen abfragst, wechselt das Programm gleich. Werden 
die Schalterstellungen nur einmal beim Initialisieren abgefragt, 
brauchst du einen Reset.

Claus

von Myho (Gast)


Lesenswert?

Das ist super danke. Hab das mit dem Reset jetzt so gelöst, dass er nach 
jedem durchlauf die pinbelegung wieder abfragt und vorher PortB nochmals 
komplett löscht. Ist das so in Ordnung?
1. Normales Lauflicht
2. Jeden zweite LED leuchtet
3. Läuft vor und zurück
4. Blinken im Takt

Ist für mich rein zur Übung und weil es spaß macht

;**************************************************************
; Includedatei für den 16F84A einbinden
;
  #include <P16f84A.INC>
;
; bis 4 MHz: Power on Timer, kein Watchdog, XT-Oscillator
        __CONFIG        _PWRTE_ON & _WDT_OFF & _XT_OSC
;
;**************************************************************
; los gehts mit dem Programm

Init
  BSF     STATUS, 0  ; auf Bank 1 umschalten
  MOVLW  B'00000011'  ; PortA RA0 und RA1 Eingang
  MOVWF  TRISA
  MOVLW  B'00000000'  ; PortB alle output
  MOVWF  TRISB
  BCF     STATUS, 0  ; auf Bank 0 zurückschalten

MAIN
  CLRF  PORTB    ; alle LEDs ausschalten
  BTFSS  PORTA, 0  ; überspringe wenn Pin 0 am Port A "1" ist
  GOTO  MAIN2
  GOTO  MAIN3

MAIN2
  BTFSS  PORTA, 1  ; überspringe wenn Pin 1 am Port A "1" ist
  GOTO  LAUF1
  GOTO  LAUF2

MAIN3
  BTFSS  PORTA, 1  ; überspringe wenn Pin 1 am Port A "1" ist
  GOTO  LAUF3
  GOTO  BLINK

;**********************************************************

LAUF1
  BSF  PORTB, 0  ; LED an RB0 einschalten
  CALL  WAIT    ; Wartezeit
  RLF  PORTB,f    ; laufen zur nächsten LED
  GOTO  MAIN

;**********************************************************

LAUF2
  BSF  PROTB, 0
  CALL  WAIT
  BCF  PORTB, 0
  BSF  PORTB, 2
  CALL  WAIT
  BCF  PORTB, 2
  BSF  PORTB, 4
  CALL  WAIT
  BCF  PORTB, 4
  BSF  PORTB, 6
  CALL  WAIT
  BCF  PORTB, 6
  GOTO  MAIN

;**********************************************************

LAUF3
  BSF  PROTB, 0
  CALL  WAIT
  BCF  PORTB, 0
  BSF  PORTB, 1
  CALL  WAIT
  BCF  PORTB, 1
  BSF  PORTB, 2
  CALL  WAIT
  BCF  PORTB, 2
  BSF  PORTB, 3
  CALL  WAIT
  BCF  PORTB, 3
  BSF  PROTB, 4
  CALL  WAIT
  BCF  PORTB, 4
  BSF  PORTB, 5
  CALL  WAIT
  BCF  PORTB, 5
  BSF  PORTB, 6
  CALL  WAIT
  BCF  PORTB, 6
  BSF  PORTB, 7
  CALL  WAIT
  BCF  PORTB, 7
  BSF  PROTB, 6
  CALL  WAIT
  BCF  PORTB, 6
  BSF  PORTB, 5
  CALL  WAIT
  BCF  PORTB, 5
  BSF  PORTB, 4
  CALL  WAIT
  BCF  PORTB, 4
  BSF  PORTB, 3
  CALL  WAIT
  BCF  PORTB, 3
  BSF  PROTB, 2
  CALL  WAIT
  BCF  PORTB, 2
  BSF  PORTB, 1
  CALL  WAIT
  BCF  PORTB, 1
  BSF  PORTB, 0
  CALL  WAIT
  BCF  PORTB, 0
  GOTO  MAIN

;**********************************************************

BLINK
  BSF  PORTB
  CALL  WAIT
  CALL  WAIT
  BCF  PORTB
  GOTO  MAIN

;**********************************************************
; Warteschleife 250 ms

WAIT
  MOVLW  D'250'    ; 250 ms Pause
  MOVFW  0x22

WAI
  MOVLW   .110    ; Zeitkonstante für 1ms
        MOVWF   0x23

WAI2
  NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        DECFSZ  0x23, F    ; 1 ms vorbei?
        GOTO    WAI2    ; nein, noch nicht

        DECFSZ  0x22, F    ; 250 ms vorbei?
        GOTO    WAI    ; nein, noch nicht
        RETLW   0    ; das Warten hat ein Ende

  END

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.