- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 36

Thema: 2.Programm :)

  1. #11
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    72
    Beiträge
    11.077
    Anzeige

    LiFePo4 Akku selber bauen - Video
    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

  2. #12
    Neuer Benutzer Öfters hier
    Registriert seit
    17.03.2006
    Beiträge
    22
    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!

  3. #13
    Erfahrener Benutzer Begeisterter Techniker Avatar von µautonom
    Registriert seit
    04.04.2007
    Ort
    Paderborn
    Beiträge
    225
    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

    Ä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.
    Werd ich probieren, bis dahin vielen dank

    Mfg

  4. #14
    Erfahrener Benutzer Begeisterter Techniker Avatar von µautonom
    Registriert seit
    04.04.2007
    Ort
    Paderborn
    Beiträge
    225
    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.

    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
    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.


    Mfg

  5. #15
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    72
    Beiträge
    11.077
    Hi µautonom!

    Kannst Du, bitte, Dein PAD/PAP posten? Es ist viel einfacher zum Überprüfen und evtl. Fehler finden.

    MfG

  6. #16
    Erfahrener Benutzer Begeisterter Techniker Avatar von µautonom
    Registriert seit
    04.04.2007
    Ort
    Paderborn
    Beiträge
    225
    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

  7. #17
    Neuer Benutzer Öfters hier
    Registriert seit
    17.03.2006
    Beiträge
    22
    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

  8. #18
    Erfahrener Benutzer Begeisterter Techniker Avatar von µautonom
    Registriert seit
    04.04.2007
    Ort
    Paderborn
    Beiträge
    225
    Hi robotcheck, vielen Dank das du dir Mühe gemacht hast, jede Zeile kommentiert hast. An meinem Programmierstil muss ich noch arbeiten

    DU VERWENDEST EINEN ÖFFNER???
    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".

    SCHREIBE NUR decfsz 0x22
    Das wusst ich gar nicht, ich schaue mir immer die Befehle bei sprut nach
    Da ist die Syntax DECFSZ f,d

    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.
    Das mit nop und goto weiter hab ich vergessen zu editieren^^, wusste schon das das unsinnig war

    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

  9. #19
    Neuer Benutzer Öfters hier
    Registriert seit
    17.03.2006
    Beiträge
    22
    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.

  10. #20
    Erfahrener Benutzer Begeisterter Techniker Avatar von µautonom
    Registriert seit
    04.04.2007
    Ort
    Paderborn
    Beiträge
    225
    Ok danke für die Tipps, wenn ich das erstma geschaft hab
    ....beim 4ten mal drücken = LED wieder aus und zurück an den Anfang
    , 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

    Mfg

Seite 2 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen