- fchao-Sinus-Wechselrichter AliExpress         
Seite 50 von 53 ErsteErste ... 404849505152 ... LetzteLetzte
Ergebnis 491 bis 500 von 524

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

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

    LiFePo4 Akku selber bauen - Video
    Klar, brauch ja dann zweimal den Befehl lpm

    Ich denke gelban:
    adiw ZL, 1
    wird falsch sein , damit landest Du "dazwischen" und jetzt kommt alles durcheinander,
    verstehst Du wie ich das meine ?
    Zwischen was genau? Zwischen einem LOW und einem HIGH-Byte?

    Nehmen wir mal dein Bsp:
    10,20,30,40

    10 und 20 sind jeweils mein LOW- und HIGH Byte meiner langen Zeit und 30 40 die meiner kurzen Zeit, ok?

    Wenn grün an ist, dann zeigt der Zeiger doch auf 20, oder? Wenn er nun die Interruptroutine aufruft und auf gelb springen will, muss er doch nur 1 addieren, damit Z auf 30 zeigt. Dann lpm - einlesen und nochmal adiw ZL, 1 und wieder lpm - einlesen.

    Also ich denk das das adiw ZL, 1 bei gelban: richtig ist. Kannst mich ja noch vom Gegenteil überzeugen
    Hab auch beides getestet. Problem ist: Rot bleibt richtig an, dann macht er rot und gelb an und das bleibt nochmal genauso lange an, obwohl er da schon die kurze Zeit nehmen müsste. Ich kann addieren oder subtrahieren oder umstellen wie ich will, kommt nie die richtige Zeit dabei raus...komisch...

    So hab ich das nun:
    Code:
    zeitum:
    	push tmp						;tmp auf Stack sichern
    	in tmp, SREG
    	push tmp						;SREG auf Stack sichern
    		cpi statusAmpel, 0b00000010	;Ist rot an?
    		breq rotgelban				;JA -> gelb dazuschalten
    		cpi statusAmpel, 0b00000110	;Ist rot UND gelb an?
    		breq gruenan				;JA -> grün anmachen
    		cpi statusAmpel, 0b00001000	;Ist grün an?
    		breq gelban					;JA -> gelb anmachen
    
    ;Wenn alle drei Rechnungen != 0 ergeben, dann ist gelb an
    rotan:
    	sbiw ZL, 3
    	ldi statusAmpel, 0b00000010		;rot an
    	rjmp ende
    
    rotgelban:
    	adiw ZL, 2
    	ldi statusAmpel, 0b00000110		;rot und gelb an
    	rjmp ende
    
    gruenan:
    	sbiw ZL, 3
    	ldi statusAmpel, 0b00001000		;grün an
    	rjmp ende
    
    gelban:
    	adiw ZL, 1
    	ldi statusAmpel, 0b00000100		;gelb an
    		
    ende:
    	;TIMER1 wird neu geladen
    	lpm								;Wert aus der dw in r0 schreiben
    	mov tmp, lpm_reg
    	out	TCNT1L, tmp
    	adiw ZL, 1
    	lpm								;Wert aus der dw in r0 schreiben
    	mov tmp, lpm_reg
    	out TCNT1H, tmp
    
    	out PORTB, statusAmpel			;Ampel richtig umschalten
    	pop tmp							;SREG vom Stack holen
    	out SREG, tmp
    	pop tmp							;tmp vom Stack holen
    	reti							;spring dahin zurück, wo du hergekommen bist
    
    timerwerte:
    	.dw 65536-7200, 65536-1800

  2. #492
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.09.2004
    Ort
    In der Nähe von Esslingen am Neckar
    Beiträge
    706
    Hallo Zusammen,
    jetzt bin ich auf dem aktuellen Stand von euch!! *freu* hab alle Beiträge hier gelesen! Ich freu mich das ihr jetzt ein Lauflicht proggt! Denn die Sachen mit dem Summer konnte ich nicht mitmachen denn ich habe gerade keinen Summer da! Ich musste alles also theoretisch behandeln was nicht wirklich toll ist! Werde die ganzen Sachen aber nachholen! Jetzt zu ner anderen Fragen: Izaseba hat mich vor einigen Beiträgen gefragt was ich für Boards habe! Also ich drei Boards:
    1.Board -Atmega16
    -8 LEDs
    -8 Taster

    2.Board -Atmega16
    -Steckplätze für GP2D12s
    -RS232 Kommunikation
    -4 LEDs
    -2 Taster
    -TWI Master

    3.Board -Atmega16
    -LCD Anschluss
    -Servoanschluss
    -2 LEDs
    -TWI Slave

    Auf allen Boards ist ne eigene Spannungsversorgung mit LED (die anzeigt ob Strom da ist oder nicht!) Auf allen Boards sind 16Mhz Quarze! Ich hoffe das ich das alles später mit Assembler hinbekomme! Bin da ganz zuversichtlich!
    Gruß Michi

  3. #493
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    Darf man nachfragen, wieso du so viele Boards hast, obwohl du erst anfängst? Oder sind die "vom Laster gefallen"?

  4. #494
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.09.2004
    Ort
    In der Nähe von Esslingen am Neckar
    Beiträge
    706
    Hallo,
    die Boards hab ich scho länger da ich zuerst mit C geproggt hab! C gefällt mir irgendwie net so isch halt eine Mischung auf Assembler und Basic!
    Gruß Michi

  5. #495
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    He, der Michi ist gut ausgestattet !

    Es hat sich ein Fehler eingeschlichen (ich geb es zu es war meine Schuld) in Sachen 16 Bit Zahlen beschreiben und auslesen,
    Ich habe es eine Seite zurück berichtigt Nochmal, falls es übersehen worden ist

    16 Bit schreiben, zuerst HIGH übertragen dann LOW
    16 Bit lesen, zuerst LOW dann HIGH

    (das ist auch der Fehler beim Thomas Programm sehe Neubelegung des Timers
    , zum Teil schon berichtigt)

    Gruß Sebastian

  6. #496
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.09.2004
    Ort
    In der Nähe von Esslingen am Neckar
    Beiträge
    706
    Hi,
    warum das?
    Gruß Michi

  7. #497
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.09.2004
    Ort
    In der Nähe von Esslingen am Neckar
    Beiträge
    706
    Hallo,
    nochmal zu meinen Boards hab ich alle selber geätzt! Halbes Euroformat!
    Was mich aufregt das die 2 Taster des 2.Boards nicht funktionieren da ich sie falsch angeschlossen habe! Bald mach ich mir aner ein neues großes Board mit allen Sachen drauf! Am Samstag geht's erstmal in den Urlaub! So ein Mist dann kann ich gar nich mehr das Tutorial verfolgen!!!!! *ärger*
    Gruß Michi

  8. #498
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Hi,
    warum das?
    Dann lese Seite 77 im Datenblatt von M8 bei M16 müßte das auch stehen...

    Was mich aufregt das die 2 Taster des 2.Boards nicht funktionieren da ich sie falsch angeschlossen habe!
    Deswegen habe ich auch ein Board mit kaum was drauf, aber dafür alle Pins ausgeführt, der Rest wird auf Steckboard gemacht, fertig.

    P.S. Wobei eine schön geätzte Platine, mit allem drauf wäre auch toll....

    Gruß Sebastian

  9. #499
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    So, hier ist nun die funktionierende Version einer Ampel.
    Vielen Dank hier auch nochmal an Sebastian, der hier mitgetüftelt hat.
    Code:
    ;Dieses Programm zeigt eine Ampel auf drei LEDs.
    ;Es wird mit dem Timer1 realisiert und im Flash sind die Timerwerte gespeichert.
    ;Je nachdem, welcher Wert gebraucht wird, wird aus "timerwerte:" gelesen
    .include "m8def.inc"
    
    .equ time1 = 65536-7200			;Damit wird der Timer1 vorgeladen, für die 2 Sekunden
    
    .def tmp = r16					;Mein Universallregister
    .def statusAmpel = r17			;Hier wird gespeichert, welche Lampen grad leuchten
    .def lpm_reg = r0				;Mein lpm-Register
    
    .org 0x000
    	rjmp reset					;Interruptvektor "reset:"
    
    .org OVF1addr
    	rjmp zeitum					;Interruptvektor für Timer1 Überlauf, hier springt
    								;das Programm hin, wenn der Timer überläuft
    
    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
    
    	ldi tmp, 0b11111111
    	out DDRB, tmp					;PortB als Ausgang
    	ldi statusAmpel, 0b00000010
    	out PORTB, statusAmpel			;Am Anfang LEDrot an
    
    	;Timer Register für halbe Sekunde werden belegt, hier Timer1
    	ldi tmp, (1<<CS12) | (1<<CS10)	;Prescaler ist 1024
    	out TCCR1B, tmp
    	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/2 speichern ->
    	out TCNT1L, tmp					;"TCNT1H" und TCNT2L"
    	ldi tmp, (1<<TOIE1)				;Hier werden Interrupts nach Timer1 Überlauf eingeschaltet
    	out TIMSK, tmp					;Register TIMSK ist dafür zuständig
    
    	;Z-Register mit DB "timerwerte" füllen
       	ldi ZH, HIGH(timerwerte * 2)
       	ldi ZL, LOW(timerwerte * 2)
    
    	sei								;Interrupts zulassen
    
    main:
    	rjmp main						;Immer wieder die main durchlaufen
    
    zeitum:
    	push tmp						;tmp auf Stack sichern
    	in tmp, SREG
    	push tmp						;SREG auf Stack sichern
    		cpi statusAmpel, 0b00000010	;Ist rot an?
    		breq rotgelban				;JA -> gelb dazuschalten
    		cpi statusAmpel, 0b00000110	;Ist rot UND gelb an?
    		breq gruenan				;JA -> grün anmachen
    		cpi statusAmpel, 0b00001000	;Ist grün an?
    		breq gelban					;JA -> gelb anmachen
    
    ;Wenn alle drei Rechnungen != 0 ergeben, dann ist gelb an
    rotan:
    	ldi statusAmpel, 0b00000010		;rot an
    	rjmp ende
    
    rotgelban:
    	adiw ZL, 2
    	ldi statusAmpel, 0b00000110		;rot und gelb an
    	rjmp ende
    
    gruenan:
    	ldi statusAmpel, 0b00001000		;grün an
    	rjmp ende
    
    gelban:
    	adiw ZL, 2
    	ldi statusAmpel, 0b00000100		;gelb an
    		
    ende:
    	;TIMER1 wird neu geladen
    	lpm								;Wert aus dw in r0 schreiben
    	mov tmp, r0
    	push tmp						;LOW-Byte speichern
    	adiw ZL, 1
    	lpm
    	mov tmp, r0
    	out TCNT1H, tmp					;HIGH-Byte in Timer1 laden
    	pop tmp							;LOW-Byte wiederholen
    	out TCNT1L, tmp					;LOW-Byte in Timer1 laden
    
    	ldi ZH, HIGH(timerwerte * 2)	;Zeiger wieder auf den ersten Wert setzen
       	ldi ZL, LOW(timerwerte * 2)
    
    	out PORTB, statusAmpel			;Ampel richtig umschalten
    	pop tmp							;SREG vom Stack holen
    	out SREG, tmp
    	pop tmp							;tmp vom Stack holen
    	reti							;spring dahin zurück, wo du hergekommen bist
    
    timerwerte:
    	.dw 65536-7200, 65536-1800
    Wer Fragen zum Code hat, kann sie natürlich jederzeit stellen. Am besten vielleicht per PN, damit der Thread hier übersichtlicht bleibt. Dies gilt natürlich auch für die ganzen anderen Codes, die wir hier reingestellt haben.

    Gruß
    Thomas

  10. #500
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Die Aufgabe mit der Ampel schien am Anfang leicht, aber es ist nicht so, zuerst hatten wir Probleme mit laden der Werte in den Timer.
    Also an dieser Stelle merken High zuerst, Low zum Schluß leider kommt beim lesen
    aus .dw das LOW Byte zuerst, deswegen muß man sich den erstmal zwischenspeichern,
    dazu haben wir den Stack benutzt. danach gab es Probleme mit dem Z-Pointer, der nach
    einer Ampelperiode irgendwo in den Flash gewandert ist und die Ampel hat sich
    wirklich seltsam verhalten, gut daß Sie an keiner Kreuzung stand...


    Gruß Sebastian

Seite 50 von 53 ErsteErste ... 404849505152 ... LetzteLetzte

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress