Hallo µautonom!
Hast Du schon in Wiki nachgeschaut? Vielleicht findest Du dort etwas nutzliches:
https://www.roboternetz.de/wissen/in.../PIC_Assembler
Viel Spass beim ewentuellen Lesen! :)
MfG
Druckbare Version
Hallo µautonom!
Hast Du schon in Wiki nachgeschaut? Vielleicht findest Du dort etwas nutzliches:
https://www.roboternetz.de/wissen/in.../PIC_Assembler
Viel Spass beim ewentuellen Lesen! :)
MfG
Hallo,
der PIC benötigt genau 4 Takte, um einen Befehl abzuarbeiten.
Bei 8 MHz arbeitet der PIC also in Wirklichkeit mit 2 MHz und das entspricht 0,5 µs/Befehl. Daher 10 ms = 20000 Takte. Du brauchst mindestens 2 Zählregister (verschachteln).
Ein Unterprogramm wird mit Call aufgerufen und das Unterprogramm mit Return wieder verlassen.
Vergiss aber fürs erste mal das Unterprogramm. Hier kann es nämlich noch notwendig werden, das W-Register, oder das Status-Register zu retten, weil die Zeitschleife diese Register verändert.
Baue die Zeitschleife für den Anfang direkt hinter die Schalterabfrage.
Ändere auch gleich (zum Test) Dein Programm so ab, dass es nach 3 mal Drücken die LED anmacht und stehenbleibt, also nicht mehr an den Anfang zurückspringt.
Unter WWW.sprut.de gibt es zu all diesen Problemen gute Beispiele.
Also weiterhin viel Glück!
Hallo Leute,
@PICture ich habs wahrscheinlich übersehen, dachte da gibt es nur Artikel zum AVR, werd ich mir mal alles gründlich durchlesen, danke.
@robotcheck
Danke fur die Info
Werd ich probieren, bis dahin vielen dankZitat:
Ändere auch gleich (zum Test) Dein Programm so ab, dass es nach 3 mal Drücken die LED anmacht und stehenbleibt, also nicht mehr an den Anfang zurückspringt.
Mfg
Hi Leute, puhhhh ich habs endlich geschafft \:D/ Die Led blinkt wenn ich den Taster 3mal betätigt hab! Schaut euch bitte meienn Code an, kann man da noch was verbesern? Was ist unnötig was könnte man rausnehemen.
Aber eine Sache stört mich immer noch, die LED leuchtet nicht so kräftig, wie bei den vorherigen Programmen die nicht funtkionierten, woran kann das liegen? Aufgebaut ist alles richtig, es muss am Programm liegen.Code:;*****************************************************************
;
; Includedatei für den PIC16F628A
list p=16f628a
include "p16f628a.inc"
;
;*****************************************************************
; Configuration festlegen
; 8Mhz Resonator: Brown out Reset on, Data Protection off, Power up Timer on, Watchdog off, LV-Programmierung off
__CONFIG _BODEN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_OFF & _HS_OSC & _LVP_OFF
org 0x0000 ;Programmstart
goto MAIN
org 0x004 ; Interruptbehandlung
;****************************************************************
; Pinfunktion festlegen
;****************************************************************
MAIN
bcf STATUS,RP0
bcf STATUS,RP1 ; Bank0
movlw 0x07 ;Comperators off
movwf CMCON ;I/O Funktion ermöglichen
clrf PORTA
clrf PORTB ; alle Ausgänge Low
BCF STATUS, RP1 ;Bank 1 auswählen
BSF STATUS, RP0
movlw 0x01 ;Pins config
movwf TRISA ;PORTA RA0 Input, rest Output
movlw 0x00 ;PortB Output
movwf TRISB
bcf STATUS, RP0 ;Bank 0 auswählen
; hier bei Bedarf andere Register
; für Timer,CCP,EEprom,Usart,Vref
; initialisieren
;*****************************************************************
;Programm
;*****************************************************************
movlw 3
movwf 0x20 ; Speicherzelle wird die Zahl3 geladen
anf
btfsc PORTA, 0
goto anf
movlw 255 ;Zählregister
movwf 0x21
S1 movlw 255
movwf 0x22
S11 decfsz 0x22, 1
goto S11
decfsz 0x21, 1
goto S1
goto weiter
weiter nop
nop
nop
nop
btfss PORTA, 0
goto anf
decfsz 0x20, 1
goto anf
bsf PORTB, 0
clrw
end
Mfg
Hi µautonom!
Kannst Du, bitte, Dein PAD/PAP posten? Es ist viel einfacher zum Überprüfen und evtl. Fehler finden.
MfG
Hi, PICture
meinst du damit den Programmablaufplan?
Ist der selbe Ablauf den du mir vorgeschlagen hast, nur das ich ne verschachtelte Zählschleife nach der 1.Tasterabfrage eingebaut habe.
Ich zeichne das immer auf einem Blatt Papier nur hab grad keinen Scanner da
mein Programmm funktioniert ja, die Sache ist nur die das die LED nicht so kräftig leuchtet, ich dneke das liegt daran das der PIC die LEd zu wieder löscht, weil ich ja ein Sprungbefehl zum Anfang eingebaut hab in der sie wieder gelöscht wird.
EDIT:// Ich hab den Code noch einmal ein wenig Kommentiert, sollte so übersichtlicher sein.
Code:;*****************************************************************
;Programm
;*****************************************************************
movlw 3
movwf 0x20 ; Speicherzelle wird die Zahl3 geladen
anf
btfsc PORTA, 0 ;Taster gedrückt = 0! zur Verschachtelen Zählschleife springen
goto anf
;*************************************************************************
;Zählschleife
;*************************************************************************
movlw 255 ; 1 Zählregister
movwf 0x21
S1 movlw 255 ; 2 Zählregister
movwf 0x22
S11 decfsz 0x22, 1
goto S11
decfsz 0x21, 1
goto S1
;*************************************************************************
goto weiter
weiter nop
nop
nop
nop
btfss PORTA, 0 ;Taster losgelassen =1? zum Counter übergehen
goto anf
decfsz 0x20, 1 ; Counter = 0 - Led an
goto anf
bsf PORTB, 0
clrw
end
Mfg
OK, es geht in die richtige Richtung :-k
Die LED leuchtet deshalb nicht hell, weil Dein Programm in das end hineinläuft. Das bedeutet, der Controller springt an die Adresse 0000 zurück und Dein Programm beginnt von vorn.
Dort werden die Ausgänge und somit die LED wieder ausgeschaltet.
Da die LED danach wieder eingeschaltet wird, ist das Programm nicht ganz in Ordnung. Zuerst musst Du dafür sorgen, dass das Programm nach dem Einschalten der LED stehenbleibt.
Bitte halte Dich an die Schreibregeln:
Wenn Du eine HEX-Zahl verwendest, dann schreibe 0x4C oder h'4C'
Wenn Du eine DEZIMALE-Zahl verwendest, dann schreibe d'255'
Wenn Du eine BINÄRE-Zahl verwendest, dann schreibe b'00001111'
Wenn Du einen Buchstaben aus der ASCII-Tabelle verwendest, dann schreibe a'T'
Hier sind ein paar Kommentare und Ergänzungen:
Code:;*****************************************************************
;Programm
;*****************************************************************
movlw 3 ; BITTE SCHREIBE movlw d'3' FÜR DEZIMALE ZAHL
movwf 0x20 ; Speicherzelle wird die Zahl3 geladen
anf
btfsc PORTA, 0 ; Taster gedrückt = 0! zur Verschachtelen Zählschleife springen
goto anf ; DU VERWENDEST EINEN ÖFFNER???
;*************************************************************************
;Zählschleife
;*************************************************************************
movlw 255 ; LADE REGISTER MIT movlw d'100'
movwf 0x21
S1
movlw 255 ; LADE REGISTER MIT movlw d'200'
movwf 0x22 ; 100 x 200 = 20000 TAKTE+Zusatzbefehle (goto...)
S11
decfsz 0x22, 1 ; SCHREIBE NUR decfsz 0x22
goto S11
decfsz 0x21, 1 ; SCHREIBE NUR decfsz 0x21
goto S1
;*************************************************************************
goto weiter ; RAUS, DAS goto IST ÜBERFLÜSSIG
weiter ; RAUS, DIE SPRUNGMARKE IST ÜBERFLÜSSIG
nop ; RAUS, BEFEHL IST ÜBERFLÜSSIG
nop ; RAUS, BEFEHL IST ÜBERFLÜSSIG
nop ; RAUS, BEFEHL IST ÜBERFLÜSSIG
nop ; RAUS, BEFEHL IST ÜBERFLÜSSIG
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
; DER TASTER WIRD GERADE GEDRÜCKT, ALSO WARTE, BIS WIEDER LOSGELASSEN
t_los
btfss PORTA, 0 ;Taster losgelassen =1? zum Counter übergehen
goto t_los
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
; NOCHMAL ZEITSCHLEIFE, WEIL DER TASTER AUCH BEIM LOSLASSEN PRELLEN KANN
movlw d'100' ; LADE REGISTER MIT movlw d'100'
movwf 0x21
S2
movlw d'200' ; LADE REGISTER MIT movlw d'200'
movwf 0x22 ; 100 x 200 = 20000 TAKTE+Zusatzbefehle (goto...)
S22
decfsz 0x22 ; SCHREIBE NUR decfsz 0x22
goto S22
decfsz 0x21 ; SCHREIBE NUR decfsz 0x21
goto S2
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
decfsz 0x20, 1 ; Counter = 0 - Led an ; SCHREIBE NUR decfsz 0x20
goto anf
bsf PORTB, 0
clrw ; RAUS, BEFEHL IST ÜBERFLÜSSIG
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
loop
goto loop ; ENDLOS-SCHLEIFE, HIER BLEIBT DAS PROGRAMM STEHEN UND LÄUFT NICHT IN end
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
end
Hi robotcheck, vielen Dank das du dir Mühe gemacht hast, jede Zeile kommentiert hast. An meinem Programmierstil muss ich noch arbeiten :D:D
Das liegt an der Tasterschaltung, von Sprut, dei taster sind alle auf High-Zustand, sobal ein Taster gedrückt wird, wird dieser auf Masse gezogen sprich = "0".Zitat:
DU VERWENDEST EINEN ÖFFNER???
Das wusst ich gar nicht, ich schaue mir immer die Befehle bei sprut nachZitat:
SCHREIBE NUR decfsz 0x22
Da ist die Syntax DECFSZ f,d
Das mit nop und goto weiter hab ich vergessen zu editieren^^, wusste schon das das unsinnig war :DZitat:
wenn d=0:
Vom Wert in f wird 1 abgezogen, und das Ergebnis in W gespeichert.
wenn d=1:
Vom Wert in f wird 1 abgezogen, und das Ergebnis wieder in f gespeichert.
Ist das Ergebnis der Subtraktion Null, dann wird der nächste Befehl im Programm übersprungen, und mit dem übernächsten weitergebacht.
ich könnte ja doch einfach am Ende nachdem die LEd angemacht wird, weider einen Zählschleife einbauen, sodas die LEd ein wenig länger blinkt damit man weider die Taster 3 mal betätigt um sie leuchten zu lassen, bei deine Endlosschleife würde sie doch die ganze Zeit anbleiben richtig?
Mfg
Hi,
Du hast Recht mit dem decfsz-Befehl . 8-[
Ich habe das Programm auf die Schnelle kommentiert.
Du kannst übrigens für d=0 auch W schreiben und für d=1 auch F.
Also decfsz,W oder decfsz,F
Falls Du gar nichts schreibst, wird d=1 gesetzt.
Aber das entspricht nicht unbedingt den Schreibregeln.
Die Idee mit der Zeitschleife am Ende des Programmes ist gut, sollte aber erst gemacht werden, wenn das eigentliche Programm läuft.
Also die LED muss erstmal HELL leuchten.
Außerdem brauchst Du dann eine große Zeitschleife aus mindestens 3-4 Registern, sonst ist die Schleife zu schnell runtergezählt.
Ich würde eher vorschlagen, den Taster nochmal abzufragen.
Also 3 x drücken = LED an und beim 4ten mal drücken = LED wieder aus und zurück an den Anfang.
Noch etwas: Die Endlosschleife sollte grundsätzlich bei jedem Programm vor dem end stehen, auch wenn sie gar nicht ausgeführt wird. Damit verhindert man sicher, dass das Programm (aus welchen Gründen auch immer) ins end hineinläuft.
Ok danke für die Tipps, wenn ich das erstma geschaft hab, werd ich mal versuchen das ganze mit Unterprogramm zu lösen sprich call und ret benutzen, so erspart man sich Schreibarbeit und ich kann dann die Zählschleife an jeder beliebigen Stelle aufrufen. Ist auch eleganter :DZitat:
....beim 4ten mal drücken = LED wieder aus und zurück an den Anfang
Mfg