- Labornetzteil AliExpress         
Seite 36 von 53 ErsteErste ... 26343536373846 ... LetzteLetzte
Ergebnis 351 bis 360 von 524

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

  1. #351
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    36
    Beiträge
    2.624
    Anzeige

    E-Bike
    Wie programmierst Du dann deine Programme?
    Du armer Programmierer! *lol*
    Ich finde den Simulator sehr hilfreich, aber hauptsächlich bei großen, vielverzweigten Programmen!

    Normalerweise habe ich bei der Größe der Codes, wie hier, keine Probleme, aber irgendwie will mein Gehirn nicht! ;o)

  2. #352
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    36
    Beiträge
    2.624
    .equ time0 = 256-255 ;Timer0 für die Tonleiter
    .equ time2 = 256-90 ;Damit wird der Timer2 vorgeladen, für die Sekunde
    Muss das nicht normalerweise von 255 abgezogen werden? *irgendwie klappts heute mit meiner Rechenleistung nicht mehr*

  3. #353
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Thomas, jetzt ganz langsam,
    Du hast ein chaos im Deinem Programm, da blikt wirklich kein Mensch meh durch....

    z.B. hier:

    pruefTonleiter:
    clr zaehlerSek ;Zähler auf 0 setzen
    rjmp ladeTon ;nächsten Ton laden
    rjmp main ;sonst wieder zurück zu "main:"

    wozu springst Du nach ladeTon,könnte das nicht direkt drunter ?
    und rjmp main
    Da kommt er wohl nie hin , oder ?

    oder das :

    TonAus:
    sbiw ZL,1 ;Z um 1 erniedrigen
    ldi tmp, 0 ;Timer mit 0 laden, damit er nicht mehr abspielt
    out TCNT0, tmp
    rjmp main ;wieder zurück zu "main:"

    wozu Zl -1 ?
    bist Du Dir sicher daß 0 den Timer wirklich abschaltet?

    @Florian, wie gesagt, ich klage nicht, es gibt andere Wege Programme wirksam zu debuggen!
    Und es gibt echt geile Editoren , z.B. Emacs geht in der Konsole, und ist das Schweizer Taschenmesser unter den Editoren.

  4. #354
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    Von Seite 5:
    Zitat Zitat von SprinterSB
    Zitat Zitat von izaseba

    bedenke Der Zähler läuft von dem Wert was Du vorlädst bis 255 dann kommt der Überlauf.

    mithin

    .equ time = 255 - 90

    255 bleibt immer gleich weil das ja die Schwelle ist wo er überläuft.....

    Gruß Sebastian
    Sicher?
    Der Zähler Interrupt kommt doch erst in dem Moment, wenn der Zähler überläuft. Das Interrupt-Flag ist ja so was wie ein neuntes Bit, das allerdings nur gesetzt wird.
    Da der Interrupt ausgelöst wird, wenn der Zähler auf 0 springt, muss es doch heissen.

    .equ timer = 256 - 90

    Gruß, Georg-Johann

  5. #355
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Nein, 256 ist schon richtig, der Sprinter hat das irgendwo 10 Seiten zurück mal gesagt,

    es geht sich ja um den Punkt, wo der Timer überläuft, und nicht, wo er
    seinen höchsten Wert erreicht hat.

    Edit: Danke Thomas, sehr aufmerksam
    Angehängte Dateien Angehängte Dateien

  6. #356
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    Zitat Zitat von izaseba
    Thomas, jetzt ganz langsam,
    Du hast ein chaos im Deinem Programm, da blikt wirklich kein Mensch meh durch....
    Sorry

    pruefTonleiter:
    clr zaehlerSek ;Zähler auf 0 setzen
    rjmp ladeTon ;nächsten Ton laden
    rjmp main ;sonst wieder zurück zu "main:"

    wozu springst Du nach ladeTon,könnte das nicht direkt drunter ?
    und rjmp main
    Da kommt er wohl nie hin , oder ?
    Ja, hast recht, hab ich grad verbessert. Aber ich denk, die Hauptsache ist doch erstmal dass es funktioniert und dann kann man an der Übersicht arbeiten, oder?
    In C++ hatte ich nie Probleme mit der Übersicht, versteh ich nicht...

    TonAus:
    sbiw ZL,1 ;Z um 1 erniedrigen
    ldi tmp, 0 ;Timer mit 0 laden, damit er nicht mehr abspielt
    out TCNT0, tmp
    rjmp main ;wieder zurück zu "main:"

    wozu Zl -1 ?
    bist Du Dir sicher daß 0 den Timer wirklich abschaltet?
    Das ZL-1 hab ich gemacht, damit er beim nächsten mal keinen Müll mehr einliest, sondern immer wieder die 0 aus der DB tonleiter.

    Und das 0 den Timer abschaltet, dacht ich, jo, denn was soll er denn noch hochzählen, wenn ich den Timer mit 256-256 vorlade? Hmm...

    [edit]
    Das hier stoppt den Timer.
    Code:
    ldi tmp, 0b00000000			;Timer stoppen
    	out TCCR0, tmp
    Datenblatt Seite 70 hilft.

  7. #357
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    Hier nochmal der ganze Code, habs mal auf 2 Sekunden geändert, aber der spielt total verrückt
    Code:
    ;Programm
    ;CDurTonleiter rauf und runter spielen
    .include "m8def.inc"
    
    .def tmp = r16               	;Mein Universallregister
    .def zaehlerSek = r17			;Mein Zählregister
    .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 = 3			;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, 0b01010000	;wenn ZählerSek != 80 ist
    	brne main					;dann immer wieder zu "main:" springen
    
    ;Wenn eine Sekunde um ist, dann springe hier rein
    ;und setze zaehlerSek wieder zurück auf 0 und
    ;lade den nächsten Ton
    pruefTonleiter:
    	clr zaehlerSek				;Zähler auf 0 setzen
    
    ;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:
    	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:
    	cpi zaehlerSek, 0b01010000	;wenn ZählerSek = 80 ist
    	breq TonAus					;springe zu Tonaus
    	rjmp main					;wieder zurück zu "main:"
    
    TonAus:
    	ldi tmp, (1<<CS02)			;Timer stoppen
    	out TCCR0, tmp
    	rjmp main					;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
    
    ;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 256-117, 256-16, 256-2, 0	;Werte zum Vorladen des Timers für die Töne
    									;c', a' und c''
    Weiß echt nicht, was ich da noch machen soll

  8. #358
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    In C++ hatte ich nie Probleme mit der Übersicht, versteh ich nicht...
    Ich habe Dir gesagt, Du darfst nicht in Kategorien der Hochsprachen denken.

    Sorry Sad
    Wieso wieder Traurig,
    Es war nicht böse gemeint, sondern die springerei hin und her trägt nicht gerade der Übersicht bei.
    Ja, hast recht, hab ich grad verbessert. Aber ich denk, die Hauptsache ist doch erstmal dass es funktioniert und dann kann man an der Übersicht arbeiten, oder?
    Hmmmm, ich glaube eher weniger, wer rührt schon ein funktionierendes Programm an?

    P.S. Warst Du das mit dem Edit:

  9. #359
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    Ja, das war ich, aber ich hab den Code geändert, aber beides stoppt leider nicht den Timer.

    Ich weiß ja, dass du es nicht böse meinst, aber man ist nunmal traurig bzw. mehr enttäuscht, wenn man einfach nicht mehr weiß, was man verkehrt macht und es trotzdem nicht funktioniert und dann hat man doch die Angst, dass man es nimmer zum laufen bringt.

  10. #360
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    36
    Beiträge
    2.624
    wie sag ichs meinem avr.pdf
    Das habe ich vor 10 Seiten schonmal angesprochen, das ist sehr gut!
    Das ist dann aber schon die zweite Version, die erste Version ist auch sehr interessant!
    Angehängte Dateien Angehängte Dateien

Seite 36 von 53 ErsteErste ... 26343536373846 ... LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test