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 µ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 dankÄ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 \/ 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![]()
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
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".DU VERWENDEST EINEN ÖFFNER???
Das wusst ich gar nicht, ich schaue mir immer die Befehle bei sprut nachSCHREIBE 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 warwenn 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 .![]()
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....beim 4ten mal drücken = LED wieder aus und zurück an den Anfang
Mfg
Lesezeichen