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