- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 33 von 53 ErsteErste ... 23313233343543 ... LetzteLetzte
Ergebnis 321 bis 330 von 524

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

  1. #321
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hmm..aber wenn Tonwert kein Register ist, dann meckert er hier:
    mov tonwert, lpm_reg ;erstes Byte in tmp verschieben

    [edit]
    subi tonwert,255
    Es ist aber immer noch ein Register...hmm...Also muss ich den Wert von Tonwert in einer Variable bringen...
    bspw. in
    .equ vorlader = 0?

  2. #322
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Hmm..aber wenn Tonwert kein Register ist, dann meckert er hier:
    mov tonwert, lpm_reg ;erstes Byte in tmp verschieben
    klar, weil mov 2 Register als Argumente erwartet

    aber was hälst Du von dem sub Befehl?
    Du richtest Dir einen Register und belegst Ihn mit 255,
    dann machst Du folgendes:
    sub irgendein_register,tonwert
    im irgendein_register bleibt dann was über, ich frag mich was...

  3. #323
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    Ähhmm..in irgendein_register bleibt dann 255-tonwert übrig. Aber das hilft mir doch nichts
    Und dann hab ich ja beim Vorladen vom Timer immer noch ein Register

  4. #324
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Aber das hilft mir doch nichts Surprised
    Und dann hab ich ja beim Vorladen vom Timer immer noch ein Register Sad
    Thomas, lass Dich nicht hängen!

    Schau:

    ldi irgendein_register,0xFF
    sub irgendein_register,tonwert
    out TCNT0,irgendein_register

    Na, hat es Klick gemacht?

  5. #325
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    Ach, mist. Ja sicher machts Klick *g*
    Hab ja vorher immer noch in tmp und dann schön mit 255-x
    Aber klar, oje *g*
    Aber komisch anhören tut sich das. Vor allem macht er nicht immer dasselbe.
    Einmal ist nur ein hoher Ton zu hören, einmal ist der hohe Ton zu hören und wechselt dann auf niederen Ton. Komisch irgendwie.

  6. #326
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Eine andere und vielleicht auch bessere Möglichkeit, wäre es in der tonleiter1:
    nicht 28,16,14 zu schreiben, sondern 256-28 -> 228 265-16 -> 240 256-14 -> 242

    damit hast Du direkt den Wert mit dem der Timer geladen werden soll,
    fiel mir gerade so ein.

    Nu ob der Florian das so haben möchte weiß ich auch nicht

  7. #327
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    Stimmt, so spar ich mir ein Register. Florian wollt ja nur die Tonleiter haben Aber die hört sich ja wie oben gesagt, komisch an:
    Code:
    ;Programm
    ;CDurTonleiter rauf und runter spielen
    .include "m8def.inc"
    
    .def tmp = r16               	;Mein Universallregister
    .def zaehlerSek = r17			;Mein Zählregister
    .def zaehlerTon = r18			;Mein Zählregister, um zu prüfen, ob alle Töne geladen wurden
    .def tonwert = r19				;aktueller Wert für den Ton
    .def lpm_reg = r0				;Mein lpm-Register
    
    .equ Summer = PB2				;Summer an B.2
    .equ time0 = 256-255			;Timer0 für die Tonleiter
    .equ time2 = 256-90				;Damit wird der Timer2 vorgeladen, für die Sekunde
    .equ daten_laenge = 4			;Anzahl der Werte
    
    .org 0x000
       	rjmp reset					;Interruptvektor "reset:"
    
    .org OVF2addr
    	rjmp pruefSek				;Interruptvektor "pruefSek:"
    
    .org OVF0addr
    	rjmp timerSummer			;Interruptvektor "timerSummer:"
    
    reset:
       	;Stack einrichten
       	ldi tmp, HIGH(RAMEND)      	;HIGH-Byte der obersten RAM-Adresse
       	out SPH, tmp
       	ldi tmp, LOW(RAMEND)      	;Low-Byte der obersten RAM-Adresse
       	out SPL, tmp
    
    	;Timer Register für Ton werden belegt, hier Timer 0
    	ldi tmp, (1<<CS02)			;Prescaler ist 512
    	out TCCR0, tmp				;Register TCCR0 ist für den Prescaller zuständig
    	ldi tmp, time0				;Hier wird der Timer vorgeladen
    	out TCNT0, tmp
    
    	;Timer Register für Sekunde werden belegt, hier Timer 2
    	ldi tmp, (1<<CS22) | (1<<CS21) | (1<<CS20) ;Prescaler ist 1024
    	out TCCR2, tmp					;Register TCRR2 ist für den Prescaller zuständig
    
    
    	ldi tmp, (1<<TOIE0) | (1<<TOIE2);Hier werden Interrupts nach Timer0 Überlauf eingeschaltet
    	out TIMSK, tmp				;Register TIMSK ist dafür zuständig
    
    	;Z-Register mit daten1 füllen
       	ldi ZH, HIGH(tonleiter1 * 2)
       	ldi ZL, LOW(tonleiter1 * 2)
    
    	ldi zaehlerSek, 0b00000000	;ZählerSek auf 0 setzen	
    	
    	sbi DDRB, Summer				;B.2 als Ausgang
    	sbi PORTB, Summer				;B.2 auf HIGH stellen	
    
       	sei                    		;Interrupts zulassen
    
    ;Die Hauptschleife
    main:
    	cpi zaehlerSek, 0b00010100	;wenn ZählerSek != 40 ist
    	brne main					;dann immer wieder zu "main:" springen
    
    ;Wenn eine Sekunde um ist, dann springe hier rein
    ;und prüfe, ob es noch einen Wert für die Tonleiter
    ;zu laden gibt, wenn nicht, spring wieder zurück zu main
    pruefTonleiter:
    	clr zaehlerSek				;Zähler auf 0 setzen
    	cpi zaehlerTon, 0b11111111	;Wenn ZählerTon != 255 ist
    	brne ladeTon				;dann spring zu "ladeTon:"
    	rjmp main					;sonst wieder zurück zu "main:"
    
    ;Wird aufgerufen, wenn Timer2 überläuft (Timer für Sekunde)
    ;Hier wird das Zählregister für den Timer um 1 erhöht und der
    ;Timer neu geladen
    pruefSek:
    	push tmp					;tmp sichern
    	in tmp, SREG				;SREG sichern
    	push tmp
    		inc zaehlerSek			;ZählerSek um 1 erhöhen
    		ldi tmp, time2			;Hier wird der Timer vorgeladen
    		out TCNT2, tmp
    	pop tmp						;SREG wiederholen
    	out SREG, tmp
    	pop tmp						;tmp wiederholen
    	reti						;wieder dahin, wo du hergekommen bist
    
    ;Wenn 1 Sekunde vorbei ist und es noch einen Ton gibt,
    ;der noch nicht geladen ist dann springe hier hin und
    ;lade den nächsten Wert von der Datenbank "tonleiter"
    ladeton:
    	clr zaehlerSek				;Zähler wieder auf 0 setzen
    	lpm						;Daten von tonleiter1: holen
    	mov tonwert, lpm_reg	;erstes Byte in tmp verschieben
    	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
    	breq endeTon			;springe zu "endeTon:", wenn letztes Byte ausgelesen
    	rjmp main				;wieder zurück zur "main:"
    
    ;Wenn alle Töne geladen sind, dann wird das Register "zaehlerTon"
    ;auf 255 gesetzt
    endeTon:
    	ldi zaehlerTon, 0b11111111	;ZählerTon auf 255 setzen -> keine weiteren Wert
    								;mehr von "tonleiter1:" holen
    	rjmp main					;wieder zurück zu "main:"
    
    ;Wird aufgerufen, wenn Timer0 überläuft (Timer für Ton)
    ;Hier wird geprüft, ob an B.2 HIGH oder LOW anliegt
    ;und dementsprechend umgesetzt
    timerSummer:
    	push tmp					;tmp sichern
    	in tmp, SREG				;SREG sichern
    	push tmp
    		sbis PINB, Summer			;überspringe, wenn B.2 = 1 ist
    		rjmp timerSummer1			;wenn B.2 = 0 ist, dann spring zu "umschalten1:"
    		cbi PORTB, Summer			;wenn B.2 = 1 ist, dann B.2 auf 0 setzen
    		rjmp timerSummer2			;zu "timerSummer2:" springen
    
    timerSummer1:
    	sbi PORTB, Summer			;wenn B.2 = 0 ist, dann auf 1 setzen
    
    ;Hier wird Timer0 mit dem aktuellen Tonwert vorgeladen
    timerSummer2:
    	out TCNT0, tonwert			;Timer dementsprechen vorladen
    	rjmp timerSummer4			;zu "timerSummer4:" springen
    
    timerSummer4:
    	pop tmp						;SREG wiederholen
    	out SREG, tmp
    	pop tmp						;tmp wiederholen
    	reti
    
    
    ;Das sind die Werte, womit der Timer0 (Tonleiter-Timer) vorgeladen wird
    tonleiter1:
    	.db 255-28, 255-16, 255-14, 0	;Werte zum Vorladen des Timers für die Töne
    									;c', a' und c''
    Hier nochmal der aktuelle Code.

  8. #328
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Einmal ist nur ein hoher Ton zu hören, einmal ist der hohe Ton zu hören und wechselt dann auf niederen Ton. Komisch irgendwie.
    Naja,
    1. man muß 256 - tonwert nehmen, mit dem sub machen wir aber 255- tonwert,
    ich denke, es verfälscht den Ton irgendwie.
    Ich falle selber immerwieder auf 255 rein
    2. Es muß micht heißen, daß Dein Programm 100% funktioniert,

    Wie war das Du hörst nur 2 Töne?

  9. #329
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    36
    Beiträge
    2.624
    Ich hatte eigentlich daran gedacht im Programm vorher das abzuziehen, nicht von vorneherein im Datenspeicher, aber das können wir auch machen!

  10. #330
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.09.2004
    Ort
    In der Nähe von Esslingen am Neckar
    Beiträge
    706
    hey leute,
    dieses Tutorial ist der hammer!!! Gerade arbeitete ich mich durch jeden Thread durch! Und hab jetzt endlich die Timer verstanden!!
    Gruß Michi

Seite 33 von 53 ErsteErste ... 23313233343543 ... LetzteLetzte

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress