- 12V Akku mit 280 Ah bauen         
Seite 43 von 53 ErsteErste ... 334142434445 ... LetzteLetzte
Ergebnis 421 bis 430 von 524

Thema: Tutorial für alle Assembler-Anfänger _

  1. #421
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Anzeige

    E-Bike
    und zweimal reti, das hatten wir schonmal, oder?
    Logisch denken muß man hier, wenn Du in C/C++ mißt programmierst, merkt das der Compiler meistens und haut Dir auf die Finger, der Assembler macht das nicht.

    schau Du benutzt breq endeton,
    nimm doch einfach brne irgendwas:
    darunter schreibst Du die Befehle um den Timer anzuhalten
    dann das label irgendwas:
    und hier den Ausklang , verstanden?

  2. #422
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    Also so?
    Code:
    pruefSek:
    	push tmp					;tmp sichern
    	in tmp, SREG
    	push tmp					;SREG sichern
    		ldi tmp, HIGH(time1)	;Für den Timer1 (16Bit) benötigen
    		out	TCNT1H, tmp			;wir 2 Register, in denen wir den Wert
    		ldi tmp, LOW(time1)		;für die 1 Sekunde speichern ->
    		out TCNT1L, tmp			;"TCNT1H" und TCNT2L"
    			lpm                  		;Daten von tonleiter1: holen 
    		   	adiw ZL,1            		;Z um 1 erhöhen, nächstes Byte 
    		   	ldi tmp, LOW  ((tonleiter1 * 2) + daten_laenge)	;vergleiche LOW-Byte 
    		   	cp ZL, tmp 
    			ldi tmp, HIGH ((tonleiter1 * 2) + daten_laenge)	;vergleiche HIGH-Byte 
    			cpc ZH, tmp 
    			brne regwiederholen		;Ist Ende erreicht?
    			ldi tmp, (0<<CS02)      ;JA -> Timer0 abstellen
    	   		out TCCR0, tmp
    
    regwiederholen:
    	pop tmp
    	out SREG, tmp				;SREG wiederholen
    	pop  tmp					;tmp wiederholen
    	reti
    Fällt mir noch ein wenig schwer, so zu denken, aber ich werds denk ich noch hinbekommen.

    Mal so nebenbei, beim compilieren bringt er mir folgendes Warnung:
    warning: .cseg .db misalignment - padding zero byte
    Wenn ich die 0 hinten bei meiner DB rausnehmen, ist die Warnung weg. Soll ich die Warnung einfach ignorieren, oder wann kommt es dann zu Fehlern?

  3. #423
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Der Florian wat Euch das schon gesagt, die Anzahl der Bytes in .db muß GERADE sein
    Der Speicher ist in Worten (2 Bytes) organisiert, und wenn Du eine ungerade Zahl hast hängt er eine 0 hinter und meckert, also noch eine null hintern dran, oder wenn eh nicht erforderlich die null wegmachen.

    Klappt das jetzt ?

  4. #424
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    Axo, daher weht der Wind. Ok, danke.
    Werd jetzt versuchen, das wieder rückwärts abzuspielen, aber ohne Hilfsvariable, denn wenn du sagst, dass es auch ohne geht, dann muss es ja auch ohne gehen.

    Mal schaun *kopf anstreng*

  5. #425
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    Hmm..irgendwas stimmt da noch nicht...Er läuft wie gehabt bis zum Ende durch, dann soll er aber wieder zurück laufen, also subtrahiere ich wieder 1. Aber beim nächsten Durchlauf addiert er ja wieder 1 und wir sind wieder beim letzten Ton. Also dacht ich mir, subtrahiere ich einfach 2. Dann liest er, sobald er den letzten Ton erreicht hat, bei der nächsten Sekunde den vorletzten Ton aus (klingt gut). Aber bei der nächsten Sekunde sagt er dann wieder, dass er noch nicht am Ende ist, stimmt ja auch, weil er beim vorletzten Ton wieder ist und nicht beim letzten.
    Lange Rede, kurzer Sinn, hier mal der Code:
    Code:
    pruefSek:
    	push tmp					;tmp sichern
    	in tmp, SREG
    	push tmp					;SREG sichern
    		ldi tmp, HIGH(time1)	;Für den Timer1 (16Bit) benötigen
    		out	TCNT1H, tmp			;wir 2 Register, in denen wir den Wert
    		ldi tmp, LOW(time1)		;für die 1 Sekunde speichern ->
    		out TCNT1L, tmp			;"TCNT1H" und TCNT2L"
    			lpm                  		;Daten von tonleiter1: holen 
    		   	adiw ZL,1            		;Z um 1 erhöhen, nächstes Byte 
    		   	ldi tmp, LOW  ((tonleiter1 * 2) + daten_laenge)	;vergleiche LOW-Byte 
    		   	cp ZL, tmp 
    			ldi tmp, HIGH ((tonleiter1 * 2) + daten_laenge)	;vergleiche HIGH-Byte 
    			cpc ZH, tmp 
    			brne regwiederholen		;Ist Ende erreicht?
    			;JA -> wieder zurückzählen
    			lpm                  		;Daten von tonleiter1: holen 
    		   	sbiw ZL,2            		;Z um 2 erniedrigen, vorheriges Byte 
    		   	ldi tmp, LOW  ((tonleiter1 * 2) + daten_laenge)	;vergleiche LOW-Byte 
    		   	cp ZL, tmp
    			brne regwiederholen		;Ist Anfang erreicht?
    			ldi tmp, (0<<CS02)      ;JA -> Timer0 abstellen
    	   		out TCCR0, tmp
    
    regwiederholen:
    	pop tmp
    	out SREG, tmp				;SREG wiederholen
    	pop  tmp					;tmp wiederholen
    	reti
    Weiß nicht, ob ich überhaupt mit 2 subtrahieren muss oder ob es da eine ganz andere Möglichkeit gibt. Denn ich möcht das nun gerne ohne Hilfsvariable schaffen.

  6. #426
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    O weh Thomas,
    ich glaube da habe ich etwas zu schnell gesagt
    Du hast recht, man müßte sich irgendwie merken, ob man rauf oder runter will
    Ich habe Dich durcheinander gebracht mach Dir wirklich eine schöne Variable


  7. #427
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    Hmm...bin kurz davor, dass es geht, aber irgendwie will es noch nicht. Teste die ganze Zeit im Simulator. Er macht aber nie den Timer aus, also er springt nie da rein, wo er den Timer0 abestellen soll.
    Code:
    pruefSek:
    	push tmp					;tmp sichern
    	in tmp, SREG
    	push tmp					;SREG sichern
    		ldi tmp, HIGH(time1)	;Für den Timer1 (16Bit) benötigen
    		out	TCNT1H, tmp			;wir 2 Register, in denen wir den Wert
    		ldi tmp, LOW(time1)		;für die 1 Sekunde speichern ->
    		out TCNT1L, tmp			;"TCNT1H" und TCNT2L"
    			lpm                  		;Daten von tonleiter1: holen 
    			sbrc tonleiterEnde, 0	;Ist tonleiterEnde = 0?
    			rjmp subtrahiereZ	;Wenn tonleiter = 1, dann subtrahiere Z um 1
    
    addiereZ:
    	adiw ZL, 1            		;Z um 1 erhöhen
    	rjmp pruefSek2				;zu "pruefSek2:" springen
    
    subtrahiereZ:
    	sbiw ZL, 1 					;Z um 1 erniedrigen
    
    pruefSek2:
    	ldi tmp, LOW  ((tonleiter1 * 2) + daten_laenge)	;vergleiche LOW-Byte 
       	cp ZL, tmp 
    	ldi tmp, HIGH ((tonleiter1 * 2) + daten_laenge)	;vergleiche HIGH-Byte 
    	cpc ZH, tmp 
    	brne pruefTonaus								;zu "pruefTonaus:" springen
    	sbr tonleiterEnde, 1							;Hilfsvariable.1 auf 1 setzen
    	
    pruefTonaus:
    	cp ZL, tmp										;Ist Anfang erreicht?
    	brne regwiederholen
    	ldi tmp, (0<<CS02)      						;JA -> Timer0 abstellen
    	out TCCR0, tmp
    
    regwiederholen:
    	pop tmp
    	out SREG, tmp				;SREG wiederholen
    	pop  tmp					;tmp wiederholen
    	reti
    Er müsste aber eigentlich reinspringen, denn irgendwann ist doch ZL wieder auf 0, oder?

  8. #428
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    naja , der Ansatz ist schon ok, ABER
    schau da

    pruefTonaus:
    cp ZL,tmp

    was wird da Verglichen?
    welchen Wert has tmp? vielleicht HIGH((tonleiter1 * 2) + daten_laenge)

    Du Vergleichst Äpfel mit Birnen !

    1. Dieser Gespann cp cpc müßte da auch hin.
    2. Du müßtest eigentlich mit (tonleiter1 * 2) vergleichen weil Du Dich wieder nach vorne Bewegt hast, oder sehe ich das falch ?

  9. #429
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    Äpfel mit Birnen ist nicht gut
    Hmm...nu hab ich dieses Label so:
    Code:
    pruefTonaus:										;Ist Anfang erreicht?
    	ldi tmp, LOW  ((tonleiter1 * 2) + daten_laenge)	;vergleiche LOW-Byte 
       	cp ZL, tmp 
    	breq regwiederholen
    	ldi tmp, (0<<CS02)      						;JA -> Timer0 abstellen
    	out TCCR0, tmp
    Aber dann spielt er nur den ersten Ton ab und dann ist Schluss.
    Das "HIGHT-Byte" interessiert mich doch zu dem Zeitpunkt gar nicht mehr, oder?

  10. #430
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Das "HIGHT-Byte" interessiert mich doch zu dem Zeitpunkt gar nicht mehr, oder?
    wie kommst Du darauf ?
    Stell Dir mal vor wir hätten so ein 2 Bytes gespann:
    High 11000111 Low 00000000
    was passiert , wenn ich jetzt sbiw benutze ?
    wie sehen die Bytes aus ?

    ich wiederhole mich :
    Du müßtest eigentlich mit (tonleiter1 * 2) vergleichen weil Du Dich wieder nach vorne Bewegt hast, oder sehe ich das falch ? Think

Seite 43 von 53 ErsteErste ... 334142434445 ... LetzteLetzte

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress