- 12V Akku mit 280 Ah bauen         
Seite 52 von 53 ErsteErste ... 24250515253 LetzteLetzte
Ergebnis 511 bis 520 von 524

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

  1. #511
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.09.2004
    Ort
    In der Nähe von Esslingen am Neckar
    Beiträge
    706
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hi Sebastian,
    ich lern erstmal die ganzen Standartbefehle von Assembler mit dem pdf-tutorial von avr-asm-tutorial.net! Und dann mach ich mal das mit dem UART und ADC! Ich find's echt toll dass man von euch soviel Unterstützung bekommt! Was das wichtigste ist dass ich jetzt mal selber Assemblercode schreibe und nicht die hier geposteten nur in den atmega progg und mich freu dass es funktioniert!
    Gruß Michi
    [EDIT] Ich hoff mal dass in dem PDF alle Befehle aufgeführt sind! Aber ich glaube das das pdf synchron der website ist! [/EDIT]

  2. #512
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    Um den Thread hier mal wieder aktuell zu halten, habe ich hier wieder einen Code. Ich stelle erstmal die Aufgabe, müsst ihr dann wissen, ob ihr es erstmal selber versuchen wollt oder nicht. Selber versuchen bringt auf jeden Fall mehr

    Aufgabe: Erstelle ein Lauflicht, bei jeder LED ertönt ein andere Ton aus dem Summer. Wenn das Lauflicht wieder vorne angekommen ist, wiederholen sich die Töne natürlich. Löst diese Aufgabe am besten, indem ihr mit dem Speicher arbeitet, also die Werte mit .db oder .dw (je nachdem, was man braucht) speichert.

    Die Aufgaben sind alle speziell für das myAVRBoard 1.4 von myavr.de ausgelegt, können aber auch mit anderen Boards gelöst werden.

    Hier nun die Lösung, bitte nicht schummeln :P
    Code:
    ;Dieses Programm produziert ein Lauflicht. Bei jedem LED-Wechsel kommt ein kurzer Sound.
    .include "m8def.inc"
    
    .equ time1 = 65536-1800			;Damit wird der Timer1 vorgeladen, für die halbe Sekunde
    .equ time0 = 256-57				;Damit wird der Timer0 vorgeladen, für den Sumer
    
    .equ Summer = PB5				;Summer an B.5
    
    .def lpm_reg = r0				;Register, wo Werte von r0 gespeichert werden
    .def tmp = r16					;Mein Universallregister
    .def statusLED = r17			;In diesem Register wird gespeichert, welche LED gerade leuchtet
    
    .org 0x000
    	rjmp reset					;Interruptvektor "reset:"
    
    .org OVF1addr
    	rjmp hSekEnde				;Interruptvektor für Timer1 Überlauf, hier springt
    								;das Programm hin, wenn der Timer überläuft
    
    .org OVF0addr
    	rjmp tonloop				;Interruptverktor für Timer0 Ü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 statusLED, 0b00000010
    	out PORTB, statusLED			;Am Anfang soll LED1 leuchten
    
    	;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"
    
    	;Timer Register für Ton werden belegt, hier Timer 0
    	ldi tmp, (1<<CS02)			;Prescaler ist 256
    	out TCCR0, tmp				;Register TCCR0 ist für den Prescaller zuständig
    	ldi tmp, time0				;Hier wird der Timer vorgeladen
    	out TCNT0, tmp
    
    	ldi tmp, (1<<TOIE1) | (1<<TOIE0);Hier werden Interrupts eingeschaltet
    	out TIMSK, tmp					;Register TIMSK ist dafür zuständig
    
    	;Z-Register mit DB "tonwerte" füllen
       	ldi ZH, HIGH(tonwerte * 2)
       	ldi ZL, LOW(tonwerte * 2)
    
    	sei								;Interrupts zulassen
    
    main:
    	rjmp main						;Immer wieder die main durchlaufen
    
    ;********************INTERRUPT-TIMER1********************;
    ;Jede halbe Sekunde wird geprüft, welche LED an ist und dementsprechen die
    ;nächste LED angemacht. Die aktuelle wird dabei natürlich ausgeschaltet
    hSekEnde:
    	push tmp						;tmp-Register auf Stack sichern
    	in tmp, SREG
    	push tmp						;SREG auf Stack sichern
    
    	;TIMER1 wird neu geladen
    	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"
    		cpi statusLED, 0b00001000	;Leuchtet die 3. LED?
    		breq wiederholen			;Wenn JA...
    
    		;Wenn NEIN....
    		adiw ZL, 1					;Zeiger auf nächstes Byte in "tonwerte"
    		lsl statusLED				;Register "statusLED" mit 2 multiplizieren
    									;dadurch verschieben sich alle Bits um 1 nach link ->
    									;nächste LED blinkt
    		rjmp endehSek
    
    wiederholen:
    	sbiw ZL, 2
    	ldi statusLED, 0b00000010		;Wieder erste LED leuchten lassen
    
    endehSek:
    	out PORTB, statusLED			;nächste LED leuchtet
    	pop tmp
    	out SREG, tmp					;SREG wiederherstellen
    	pop tmp							;tmp wiederherstellen
    	reti							;springe wieder dahin, wo du hergekommen bist
    
    ;********************INTERRUPT-TIMER0********************;
    tonloop:
    	push tmp						;tmp-Register auf Stack sichern
    	in tmp, SREG
    	push tmp
    
    		sbis PINB, Summer			;Ist B.5 = 1?
    		rjmp umschalten				;NEIN -> auf 1 setzen
    		cbi PORTB, Summer			;JA -> auf 0 setzen
    		rjmp endeTon
    
    umschalten:
    	sbi PORTB, Summer
    
    endeTon:
    	;Timer neu laden
    	lpm								;Werte von "tonwerte" in r0 schreiben
    	mov tmp, lpm_reg
    	out TCNT0, tmp
    
    	pop tmp
    	out SREG, tmp					;SREG wiederherstellen
    	pop tmp							;tmp wiederherstellen
    	reti
    
    ;Das sind die Werte, womit der Timer0 (Sound-Timer) vorgeladen wird
    ;Anzahl der Wert muss GERADE sein
    tonwerte:
    	.db 256-57, 256-14, 256-3, 0
    Man hätte es auch mit nur einem Timer lösen können, aber wollte hier mal die Variante mit 2 Timern vorstellen.

    Bei Fragen fragen \/

    Gruß
    Thomas

  3. #513
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    Und hier auch gleich die nächste Aufgabe:

    Hier könnt ihr das Lauflicht von der Aufgabe davor nehmen. Das Lauflicht läuft natürlich in einer Endlosschleife durch. Beim Drücken eines Tasters soll sich die Laufrichtung aber ändern. Beim nochmaligem Drücken desselben Tasters soll sich die Laufrichtung wieder ändern.

    Kleiner Tip: Ihr müsst den Taster entprellen.

    Hier nun die Lösung und auch hier gilt: Bitte nicht schummeln
    Code:
    ;Dieses Programm produziert ein Lauflicht. Jede halbe Sekunde geht die
    ;nächste LED an. Drückt man den Taster, ändert sich die Richtung des Lauflichtes
    ;Das Programm läuft in einer Endlosschleife durch.
    ;Problem des Prellens soll hier nicht mehr auftreten.
    .include "m8def.inc"
    
    .equ time1 = 65536-369				;Damit wird der Timer1 vorgeladen, für 100ms
    .equ Taster = PD2					;Taster an D.2
    .equ sperre = 7						;Taster sperren (Hilfsvariable)
    .equ laufrichtung = 0
    
    .def tmp = r16						;Mein Universallregister
    .def statusLED = r17				;In diesem Register wird gespeichert, welche LED gerade leuchtet
    .def statusTaster = r18				;Statusregister, wo die Sperre gespeichert ist
    .def zaehler = r19					;Mein Zählregister, hier zähl ich hoch,
    									;damit ich auf eine halbe Sekunde komme
    
    .org 0x000
    	rjmp reset						;Interruptvektor "reset:"
    
    .org OVF1addr
    	rjmp zeitum						;Interruptvektor für Timer1 Überlauf
    
    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
    
    	cbi DDRD, Taster				;D.2 als Eingang
    	sbi PORTD, Taster				;D.2 Pullups aktivieren	
    
    	ldi statusLED, 0b00000100
    	out PORTB, statusLED			;Am Anfang soll erste LED leuchten
    
    	ldi zaehler, 0b00000000			;Zähler auf 0 stellen
    
    	;Timer Register für 100ms 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)
    	out TIMSK, tmp
    
    	sei								;Interrupts zulassen
    
    main:
    	cpi zaehler, 0b00000101			;Ist zaehler = 5?
    	breq lauflicht					;JA -> springe zu lauflich
    	rjmp main						;NEIN -> springe zu main
    
    lauflicht:
    	clr zaehler						;zaehler auf 0 setzen
    	sbrs statusTaster, laufrichtung	;Ist Bit0 = 1?
    	rjmp pruefRechts				;NEIN -> laufe rechtsrum
    									;JA -> lauf linksrum
    pruefLinks:
    	cpi statusLED, 0b00000100		;Leuchtet 3. LED?
    	breq wiederholenLinks			;Wenn JA, spring zu "wiederholen"
    	lsl statusLED					;Wenn NEIN´, Bit nach links verschieben -> nächste LED
    	rjmp ende						;spring zu ende
    
    pruefRechts:
    	cpi statusLED, 0b00000001		;Leuchtet 1. LED?
    	breq wiederholenRechts			;Wenn JA, spring zu "wiederholen"
    	lsr statusLED					;Wenn NEIN, Bit nach rechts verschieben -> vorherige LED
    	rjmp ende						;spring zu ende
    
    wiederholenLinks:
    	ldi statusLED, 0b00000001
    	rjmp ende
    
    wiederholenRechts:
    	ldi statusLED, 0b00000100
    
    ende:
    	out PORTB, statusLED			;nächste LED leuchtet
    	rjmp main						;springe wieder zur main
    
    ;*****************INTERRUPTROUTINE FÜR TIMER1***************************
    zeitum:
       	push tmp                  		;Rette Universallregister
       	out SREG,  tmp               	;Rette Statusregister
       	push tmp
    	inc zaehler						;Zähler erhöhen
    
       	sbis PIND, Taster           	;Ist Taste gedrückt?
       	rjmp zeitum1               		;NEIN -> springe zu zeitum1
    
    zeitum0:                     		;JA -> hier weiter machen
       	sbrs statusTaster, sperre	 	;Ist Sperre gesetzte?
       	rjmp zeitum2               		;NEIN -> springe zu zeitum1
       	rjmp zeitum3               		;JA -> springe zu zeitum2
    
    zeitum1:
       	cbr statusTaster, (1<<sperre)	;Sperre löschen
       	rjmp zeitum3
    
    zeitum2:
    	sbr statusTaster, (1<<sperre)      	;Sperre setzen
    
       	;Aktion durchführen die beim Drücken des Tasters passieren soll
    	sbrs statusTaster, laufrichtung	;Ist Bit0 = 1?
    	rjmp setzeBitLauf				;NEIN -> auf 1 setzen
    	cbr statusTaster, (1<<laufrichtung);JA -> auf 0 setzen
    	rjmp zeitum3					;Ende der Routine
    
    setzeBitLauf:
    	sbr statusTaster, (1<<laufrichtung)
    
    zeitum3:
    	;Timer1 neu laden
    	ldi tmp, HIGH(time1)
    	out	TCNT1H, tmp
    	ldi tmp, LOW(time1)
    	out TCNT1L, tmp
    
        pop tmp                       	;stelle SREG wieder her
        out SREG, tmp
        pop tmp                       	;stelle Universalregister wieder her
        reti                          	;die Interrupt-Routine wird verlassen
                                     	;und es wird weiter im Hauptprogramm gearbeitet
    Diesmal wurde nur mit einem Timer gearbeitet, dafür ist dann eben eine zusätzliche Abfrage nötig.

    Bei Fragen wieder fragen

    Gruß
    Thomas

    Achja, alle Timer-Werte, die ich hier poste, sind auf 3,6864 MHz ausgelegt. Müsst ihr dann evlt. dementsprechend anpassen.

  4. #514
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Hallo Thomas, schön daß Du solche Programme schreibst, ist gut um wirklich mit Assembler
    vertraut zu werden....

    Kleine Anmerkung...
    man bräuchte doch den R17 bzw. Statusled nicht, oder ?
    man kann doch genauso PINB abfragen und PORTB verändern, oder ?
    Jetzt seh das nicht als Fehler, sondern als Tip, daß es auch anders geht, am sonsten
    finde ich Deine Programme gut, weiter so!

  5. #515
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    Hallo Sebastian,

    ja, das stimmt So würde man noch ein Register sparen

    Danke für den Tip.
    Gruß
    Thomas

  6. #516
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2005
    Ort
    Berlin
    Alter
    40
    Beiträge
    289
    So, hier mal wieder eine Aufgabe:

    Lauflicht, mal wieder. Also das Lauflicht soll 2x schnell laufen und 1x kurz. Bei dem 1x kurz soll aber wieder Ton pro LED abgespielt werden. Und das dann bitte in einer Endlosschleife

    Bevor ihr die Aufgaben nicht versteht, fragen

    Hier die Lösung und mal wieder nicht schummeln
    Code:
    .include "m8def.inc"
    
    .equ Summer = PC5
    .equ time0 = 256-57
    
    ;Adressen im RAM, wo die Tonwerte stehen
    .equ ton1 = 0x60
    .equ ton2 = 0x61
    .equ ton3 = 0x62
    
    .def lpm_reg = r0				;Hier werden die Werte von db/dw gespeichert
    .def tmp = r17					;Universallregister
    .def zaehler = r18				;Zaehlregister
    
    .org 0x000
    	rjmp reset					;Am Anfang des Programms erstmal zu "reset:" springen
    
    .org OVF1addr
    	rjmp zeitumLauf				;Läuft Timer1 über, dann spring zu "zeitumLauf:"
    
    .org OVF0addr
    	rjmp timerSummer			;Läuft Timer0 über, dann spring zu "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
    
    	ldi tmp, 0b11111111
    	out DDRB, tmp					;PortB als Ausgang
    	sbi DDRC, Summer				;C.5 als Ausgang
    	ldi tmp, 0b00000001
    	out PORTB, tmp					;Am Anfang soll erste LED leuchten
    
    	clr zaehler						;Zaehlregister auf 0 setzen
    
    	;Tonwerte in den RAM schreiben
    
    	;Z-Register mit DW "zeitwerte" füllen
       	ldi ZH, HIGH(zeitwerte * 2)
       	ldi ZL, LOW(zeitwerte * 2)
    
    	;X-Zeiger zeigt nun auf 0x60
    	ldi XH,HIGH(ton1)
    	ldi XL,LOW(ton1)
    
    	;Tonwerte in RAM schreiben, da wo X hinzeigt
    	ldi tmp, 256-57
    	st X+, tmp
    	ldi tmp, 256-14
    	st X+, tmp
    	ldi tmp, 256-3
    	st X, tmp
    
    	;Timer Register für die Abstände im Lauflicht werden belegt, hier Timer1
    	ldi tmp, (1<<CS12) | (1<<CS10)	;Prescaler ist 1024
    	out TCCR1B, tmp
    
    	lpm								;Wert von "zeitwerte" in r0 schreiben
    	mov tmp, lpm_reg				;Wert von r0 in tmp schreiben
    	push tmp						;LOW-Byte sichern
    	adiw ZL, 1						;Z um 1 erhöhen -> zeigt nun auf das HIGH-Byte
    	lpm
    	mov tmp, lpm_reg
    	out	TCNT1H, tmp					;HIGH-Byte in TCNT1H schreiben
    	pop tmp							;gesichertes LOW-Byte wiederholen
    	out TCNT1L, tmp					;LOW-Byte in TCNT1L	 schreiben
    
    	ldi tmp, (1<<TOIE1) | (1<<TOIE0);Hier werden Interrupts nach Timer1 Überlauf eingeschaltet
    	out TIMSK, tmp					;Register TIMSK ist dafür zuständig
    
    	sei								;Interrupts zulassen
    
    main:
    	rjmp main						;immer wieder zur "main:" springen
    
    ;***************ROUTINE FÜR TIMER1-INTERRUPT***************;
    ;Z-Zeiger wird auf das erste Element von "zeitwerte" gesetzt
    ;Wenn zaehler größer oder gleich 6 ist, wird der Zeitwert der
    ;langsamen zeit geladen
    zeitumLauf:
    	push tmp						;tmp sichern
    	in tmp, SREG
    	push tmp						;SREG sichern
    
    	inc zaehler						;zaehler um 1 erhöhen
    
    	;Z-Register auf den 1. Wert zeigen lassen
    	ldi ZH, HIGH(zeitwerte * 2)
       	ldi ZL, LOW(zeitwerte * 2)
    
    	cpi zaehler, 0b00000110			;Ist zaehler >= 6?
    	brsh langzeit					;JA -> langsamen Zeit laden
    	rjmp LEDpruefen					;NEIN -> spring direkt zu "LEDpruefen:"
    
    ;Hier wird nur hingesprungen, wenn das Lauflicht schon 2x schnell
    ;durchlaufen ist.
    ;Wenn zaehler =  8 ist, wird wieder der Zeitwert der schnellen
    ;Zeit geladen und der zaehler wieder auf 0 zurückgesetzt
    langzeit:
    	;Timer0 aktivieren
    	ldi tmp, (1<<CS02)
    	out TCCR0, tmp
    
    	cpi zaehler, 0b00001001			;Ist zaehler = 9?
    	breq clrzaehler					;JA -> springe zu "clrzaehler:"
    	adiw ZL, 2						;Z um 2 erhöhen -> zeigt auf das LOW-Byte der
    									;langsamen Zeit
    	
    	cpi zaehler, 0b00000110			;Ist zaehler = 6?
    	breq ton01						;1. Tonwert laden
    	cpi zaehler, 0b00000111			;Ist zaehler = 7?
    	breq ton02						;2. Tonwert laden
    	cpi zaehler, 0b00001000			;Ist zaehler = 8?
    	breq ton03						;3. Tonwert laden
    
    ton01:
    	sbiw XL, 2						;X-Zeiger um 2 vermindern -> auf ton1 zeigen
    	ld tmp, X
    	out TCNT0, tmp
    	rjmp LEDpruefen					;zu "LEDpruefen:" springen
    
    ton02:
    	adiw XL, 1						;X-Zeiger um 1 erhöhen -> auf ton2 zeigen
    	ld tmp, X
    	out TCNT0, tmp
    	rjmp LEDpruefen					;zu "LEDpruefen:" springen
    
    ton03:
    	adiw XL, 1						;X-Zeiger um 1 erhöhen -> auf ton3 zeigen
    	ld tmp, X
    	out TCNT0, tmp
    	rjmp LEDpruefen					;zu "LEDpruefen:" springen
    
    clrzaehler:
    	;Timer0 abstellen
    	ldi tmp, (0<<CS02)
    	out TCCR0, tmp
    
    	clr zaehler						;zaehler wieder auf 0 setzen
    
    ;Prüfen, ob letzte LED an ist, wenn das der Fall ist, dann wieder
    ;die erste LED an machen, sonst um 1 nach links rücken
    LEDpruefen:
    	in tmp, PINB
    	cpi tmp, 0b00000100				;Ist letzte LED an?
    	breq ersteLED					;JA -> spring zu "ersteLED:"
    	lsl tmp							;tmp mit 2 multiplizieren -> jedes Bit verschiebt
    									;sich um 1 nach links
    	rjmp zeitumEnde					;zum Ende der Routine springen
    
    ersteLED:
    	ldi tmp, 0b00000001				;wieder erste LED anmachen
    
    zeitumEnde:
    	out PORTB, tmp					;den aktuellen LED-Status an PORTB ausgeben
    
    	;Timer1 neu laden
    	lpm								;Wert von "zeitwerte" in r0 schreiben
    	mov tmp, lpm_reg				;Wert von r0 in tmp schreiben
    	push tmp						;LOW-Byte sichern
    	adiw ZL, 1						;Z um 1 erhöhen -> zeigt nun auf das HIGH-Byte
    	lpm
    	mov tmp, lpm_reg
    	out	TCNT1H, tmp					;HIGH-Byte in TCNT1H schreiben
    	pop tmp							;gesichertes LOW-Byte wiederholen
    	out TCNT1L, tmp					;LOW-Byte in TCNT1L	 schreiben
    
    	pop tmp
    	out SREG, tmp					;SREG wiederholen
    	pop tmp							;tmp wiederholen
    
    	reti							;Gehe wieder dahin, wo du hergekommen bist
    
    timerSummer:
    	push tmp						;tmp sichern
    	in tmp, SREG
    	push tmp						;SREG sichern
    		sbis PORTC, Summer			;Ist C.5 = 1?
    		rjmp umschalten				;NEIN -> auf 1 setzen
    		cbi PORTC, Summer			;JA -> auf 0 setzen
    		rjmp summerEnde				;zum Ende der Routine springen
    
    umschalten:
    		sbi PORTC, Summer
    
    summerEnde:
    	;Timer0 neu laden
    	ld tmp, X
    	out TCNT0, tmp
    
    	pop tmp
    	out SREG, tmp					;SREG wiederholen
    	pop tmp							;tmp wiederholen
    
    	reti							;Gehe wieder dahin, wo du hergekommen bist
    
    ;Das sind die Werte, womit der Timer1 (Lauflicht-Timer) vorgeladen wird
    ;Anzahl der Werte muss GERADE sein
    zeitwerte:
    	.dw 65536-1000, 65536-3600

  7. #517
    Neuer Benutzer Öfters hier
    Registriert seit
    22.02.2007
    Ort
    Hofheim a.TS
    Alter
    49
    Beiträge
    16
    Hi an euch ich habe den Alten Tread gefunden, ich hoffe es anwortet mir noch jemand drauf. Ich Suche die ganze Zeit schon eine Routine für PWM
    um einen Servo anzusteuern, ich habe auch erst in Assembler angefangen zu coden, muss aber sagen ich habe vor 15 Jahren auf dem Brotkasten (c64) in Assembler Programmiert und die Befehle sind fast identischt bis auf ausnahmen. Das mit den Intterups habe ich jetzt auch einigermasen gerafft. Nur das mit dem PWM verstehe ich nicht ganz muss auch sagen es ist echt mühsam das Englische Manuel von Atmega16/32 durchzulesen.
    Zum entwickeln hab ich ein Dragon und ein StK500 und noch ein Selbstgebautes Board.

    Danke schon mal für die Hilfe.

    PS. Hab die Tread von vorne bis zum Letzten Durchgelesen.
    AVR Develop Kit STK 500 - AVR Dragon mit Atmega16 / 32 / Atmega 8515
    Muss aber noch viel lehrnen.

  8. #518
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    18.12.2006
    Ort
    Oderberg
    Alter
    33
    Beiträge
    870
    Ich habs auch durchgelesen und einiges draus gelernt.
    Das Tutorial von izaseba find ich auch gut gelungen, wirklich estrem leicht geschrieben. http://www.izaseba.roboterbastler.de/
    MfG Christopher
    MfG Christopher \/


  9. #519
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Hallo Ihr beiden,
    Das Tutorial von izaseba find ich auch gut gelungen, wirklich estrem leicht geschrieben.
    Danke, leider habeich zur Zeit keine Zeit weiter zu schreiben, weil ich voll im Umzug bin

    @cmc,
    was verstehst Du an PWM nicht ?
    Zugegeben, es gibt viele Möglichkeiten PWM zu erzeugen.
    Fang am besten mit Timer 2 an.
    Der ist ja nur 8 Bit breit und hat eine direkte Pinanbindung.
    Stell den Prescaller ein, damit er einfach vor sich hin läuft.

    Mit den Bits COM20 und Com21 erreichst Du, daß der OC2 Pin bei Timerwert 0 auf low geht und bei Compare Match auf High.
    Jetzt nur noch in OCR2 Register Deinen Wert bei dem Comparematch auftreten soll (0x80 gibt z.B 50 % Duty Cycle) , fertig
    OCR2 kannst Du dir dann verändern, wie Du willst.
    Mehr mußt Du nicht machen, der Timer läuft ohne Dein zutun, auf OC2 kriegst Du schön Dein PWM Signal, nur vergiß nicht den als Ausgang zu konfigurieren !
    Wenn Du noch fragen hast, oder es doch nicht klappt, schicke ich Dir gerne ein Beispielprogramchen.

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  10. #520
    Neuer Benutzer Öfters hier
    Registriert seit
    22.02.2007
    Ort
    Hofheim a.TS
    Alter
    49
    Beiträge
    16
    Danke für die Antwort werde mich heute mal drann machen.
    AVR Develop Kit STK 500 - AVR Dragon mit Atmega16 / 32 / Atmega 8515
    Muss aber noch viel lehrnen.

Seite 52 von 53 ErsteErste ... 24250515253 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress