- Akku Tests und Balkonkraftwerk Speicher         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 24

Thema: Assembler Motorsteuerung

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

    Powerstation Test
    Wie kommst du eigentlich dazu, dass jetzt zu programmieren?
    ???
    Wie ich dazu komme ?
    Indem ich auf
    Erklärst du mir das mal alles
    ^^das da antworte und mit hilfe von STRG/c und STRG/v aus dem Programm, das in dem Link vorgestellt wurde, ein paar Zeilen kopiere, die für das Fahren zuständig sind.
    Und das macht besonders Spaß, wenn man nicht alles weiß ...
    Ja gut, dann lass ich Dich damit dann alleine, sonst weißt Du zu viel
    Software is like s e x: its better when its free.
    Linus Torvald

  2. #12
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    168
    Vielen Dank ... xD
    Ich wollte eigentlich nur kurz und knapp wissen wie ich nun das PWM benutze ...
    Würdest du mir da trotzdem helfen wollen?

  3. #13
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Ich wollte eigentlich nur kurz und knapp wissen wie ich nun das PWM benutze ...
    Wenn jemand Hilfe braucht, und ich ev. die Antwort weiß, helfe ich natürlich,

    Nur ich habe schon alles gesagt, was man zu PWM sagen konnte ^ da oben
    ober was möchtest Du noch wissen ?
    Software is like s e x: its better when its free.
    Linus Torvald

  4. #14
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    168
    Wie wende ich das an?
    Ganz einfach ...

    Bei folgendem Code:
    Code:
    		 sbi	  DDRB,   DDB1
    		 sbi	  PORTB,   PORTB1
    		 
    		 sbi	  DDRB,   DDB2
    		 sbi	  PORTB,   PORTB2
    sbi	  DDRB,   DDB4
    sbi	  DDRD,   DDD4

  5. #15
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.067
    bei diesem code.. gar nicht. damit werden nämlich die pins der motoren dauerhaft auf high und low gesetzt, und das willst du ja nicht mehr. dein code wird duch den pwm code ersetzt.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  6. #16
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    168
    Und der lautet?! ...

    @izaseba:

    Dein Code ist so nicht funktionstüchtig, da mir ein paar Funktionen fehlen ...
    Vielleicht kannst du ja mal einen kleine Version davon schreiben ...
    Nur für das Vorwärtsfahren ...

  7. #17
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.067
    der lautet... so wie du ihn oben bekommen hast...
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  8. #18
    Benutzer Stammmitglied
    Registriert seit
    05.07.2007
    Beiträge
    44
    Hallo H3IIGhost.

    Ich habe das so Verstanden.
    Die PWM Funktion im ASURO wird von dem Timer 1 des ATmega8 übernnommen. Er wird so Programmiert, dass an den H - Brücken eine Frequenz von ca zwei KHz anliegt. Durch die Werte in den beiden Registern OCR1AL bzw. OCR1BL wird der high Anteil einer Periode festgelegt. je höher dieser Wert 0 - 255 desto schneller fährt der ASURO.
    Lese dazu auch die Beschreibung des PWM - Modus im Datenblatt des ATmega8. Und Versuche die Funktion der H - Brücken im ASURO zu Verstehen.
    Ansonsten sieh dir mal dieses Programm an.

    MfG
    A.Hoffmann

    Code:
    .include "m8def.inc"
    
    .def		temp		=	r16			; Arbeitsregister
    
    
    .cseg
    
    .org 0x000
    		    rjmp	Prog_Initial		;	Interruptvektoren überspringen
    			reti				  		;	INT0addr - Externer Interrupt 0
    			reti						;	INT1addr - Externer Interrupt 1
    			reti		  				;	OC2addr  - Output Compare2
    			reti						;	OVF2addr - Overflow2
    			reti						;	ICP1addr - Input Capture1
    			reti						;	OC1Aaddr - Output Compare1A
    			reti						;	OC1Baddr - Output Compare1B
    			reti						;	OVF1addr - Overflow1
    			reti						;	OVF0addr - Overflow0
    			reti						;	SPIaddr  - SPI
    			reti	    				;	URXCaddr - USART Receive Complete
    			reti						;	UDREaddr - USART Data Register Empty
    			reti						;	UTXCaddr - USART Transmit Complete
    			reti						;	ADCCaddr - Analog Digital wandler
    			reti						;	ERDYaddr - EEPROM 
    			reti						;	ACIaddr  - Analog Comparator
    			reti						;	TWIaddr  - Two - Wire Interface
    			reti						;	SPMaddr  - SPM complete
    
    
    Prog_Initial:
    
    ;******************************************************************************
    ;                               Stack Pointer setzen                          *
    ;******************************************************************************
    
    			ldi		temp,	LOW(RAMEND)		; Stack Pointer low
    			out		SPL,	temp			; setzen
    			ldi		temp,	HIGH(RAMEND)	; Stack Pointer high
    			out		SPH,	temp 			; setzen
    
    
    ;******************************************************************************			
    ;*       Init_Timer1 8 Bit PWM an den Output Compare Pins OC1A und OC1B       *
    ;******************************************************************************
    					
      ; Compare Output Mode
      ; Clear OC1A / OC1B on Compare Match when up - counting. 
      ; Set OC1A / OC1B on Compare Match when downcounting
      ; Waveform Generation Mode
      ; PWM , Phase Correct, 8 Bit
      ; Prescaler Divisions Factor = 8
      ; PWM Frequenz = 1,953 Khz
     
     
    			ldi		temp,	(1 << WGM10) | (1 << COM1A1) | (1 << COM1B1)
    			out		TCCR1A,	temp
    			ldi		temp,	(1 << CS11)
    			out		TCCR1B,	temp
    
    
    ;******************************************************************************
    ;*                             Init_Motor_Rechts:                             *
    ;******************************************************************************
    
    			sbi		DDRB,	DDB2		; PWM Ausgang
    			sbi		DDRB,	DDB4		; Richtungs und 
    			sbi		DDRB,	DDB5		; Funktions Steuerung
    			sbi		PORTB,	PORTB4		; Motor im
    			sbi		PORTB,	PORTB5		; Leerlauf
    			ldi		temp,	0x00
    			out		OCR1BH,	temp
    			out		OCR1BL,	temp
    
    ;******************************************************************************
    ;*                            Init_Motor_Links:                               *
    ;******************************************************************************
    
    			sbi		DDRB,	DDB1		; PWM Ausgang
    			sbi		DDRD,	DDD4		; Richtungs und
    			sbi		DDRD,	DDD5		; Funktions Steuerung
    			sbi		PORTD,	PORTD4		; Motor im
    			sbi		PORTD,	PORTD5		; Leerlauf
    			ldi		temp,	0x00
    			out		OCR1AH,	temp
    			out		OCR1AL,	temp
    
    
    ;******************************************************************************
    ;*                           Init LEDs                                        *
    ;******************************************************************************
    
    			sbi		DDRB,	DDB0		; Duo LED grün
    			sbi		DDRD,	DDD2		; Duo LED rot
    			cbi		PORTB,	PORTB0		; aus
    			cbi		PORTD,	PORTD2		; schalten
    			sbi		DDRD,	DDD6		; Front LED
    			cbi		PORTD,	PORTD6		; aus
    			sbi		DDRD,	DDD7		; Back LEDs
    			cbi		PORTD,	PORTD7		
    			sbi		DDRC,	DDC0
    			sbi		DDRC,	DDC1
    			cbi		PORTC,	PORTC1
    			cbi		PORTC,	PORTC1		; ausschalten
    
    ;**********************  Interrupts erlauben   ******************************
    			sei							
    			
    
    
    ;****************   Ende Init  **********************************************	
    				  						
    Prog_Run:
    			rcall	planlos
    loop:
    			rjmp	loop
    
    
    ;*****************************************************************************
    ;*                     planlos    herumfahren                                *
    ;*****************************************************************************
    
    planlos:
    
    
    			rcall	M_L_Leerlauf			; Motoren in
    			rcall	M_R_Leerlauf			; Leerlauf schalten
    			ldi		temp,150				; Wert für PWM 0 - 255
    			out		OCR1AL,	temp			; für den linken Motor
    			out		OCR1BL,	temp			; und für den rechten Motor
    			rcall	M_L_Vorwaerts			; beide Motoren 
    			rcall	M_R_Vorwaerts			; Vorwärts
    
    ;oder Rückwärts 			
    			;rcall	M_L_Rueckwaerts
    			;rcall	M_R_Rueckwaerts
    
    ;oder im Kreis
    			;rcall	M_L_Rueckwaerts
    			;rcall	M_R_Vorwaerts
    			ret
    
    
    ;******************************************************************************
    ;*                      Motor rechts Rückwärts                                *
    ;******************************************************************************
    M_R_Rueckwaerts:
    			cbi		PORTB,	PORTB4		; PB4 = 0
    			sbi		PORTB,	PORTB5		; PB5 = 1
    			ret
    
    ;******************************************************************************
    ;*                      Motor rechts Vorwärts                                 *
    ;******************************************************************************
    M_R_Vorwaerts:
    			sbi		PORTB,	PORTB4		; PB4 = 1
    			cbi		PORTB,	PORTB5		; PB5 = 0
    			ret
    
    ;******************************************************************************
    ;*                      Motor rechts Leerlauf                                 *
    ;******************************************************************************
    M_R_Leerlauf:
    			sbi		PORTB,	PORTB4		; PB4 = 1
    			sbi		PORTB,	PORTB5		; PB5 = 1
    			ret
    
    ;******************************************************************************
    ;*                       Motor rechts Bremsen                                 *
    ;******************************************************************************
    M_R_Bremsen:
    			cbi		PORTB,	PORTB4		; PB4 = 0
    			cbi		PORTB,	PORTB5		; PB5 = 0
    			ret
    
    ;******************************************************************************
    ;*                       Motor links Rückwärts                                *
    ;******************************************************************************
    M_L_Rueckwaerts:
    			cbi		PORTD,	PORTD4		; PD4 = 0
    			sbi		PORTD,	PORTD5		; PD5 = 1
    			ret
    			
    ;******************************************************************************
    ;*                       Motor links Vorwärts                                 *
    ;******************************************************************************
    M_L_Vorwaerts:
    			sbi		PORTD,	PORTD4		; PD4 = 1
    			cbi		PORTD,	PORTD5		; PD5 = 0
    			ret
    
    ;******************************************************************************
    ;*                        Motor links Leerlauf                                *
    ;******************************************************************************
    M_L_Leerlauf:
    			sbi		PORTD,	PORTD4		; PD4 = 1
    			sbi		PORTD,	PORTD5		; PD5 = 1
    			ret
    
    ;*****************************************************************************
    ;*                         Motor links Bremsen                               *
    ;*****************************************************************************
    M_L_Bremsen:
    			cbi		PORTD,	PORTD4		; PD4 = 0
    			cbi		PORTD,	PORTD5		; PD5 = 0
    			ret

  9. #19
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Beiträge
    168
    Danke erstmal für das Programm.
    Nur würden mich ein paar Funktionen interessieren.

    Warum werden OCR1AH, OCR1AL, OCR1BH und OCR1BL auf 0 gesetzt?

    Und was wird hier gemacht?
    Code:
             ldi      temp,   (1 << WGM10) | (1 << COM1A1) | (1 << COM1B1)
             out      TCCR1A,   temp
             ldi      temp,   (1 << CS11)
             out      TCCR1B,   temp

  10. #20
    Benutzer Stammmitglied
    Registriert seit
    05.07.2007
    Beiträge
    44
    Guten Tag.

    Das zurücksetzten der Register an dieser Stelle ist nicht unbedingt notwendig. Wenn diese Register aber auf NULL gesetzt sind, bleiben die Motoren immer stehen. Egal ob die Motorbrücken in den Leerlauf oder den Bremsmodus geschaltetet sind.
    Und was wird hier gemacht ?
    Der Timer 1 des Atmega8 unterstützt direkt die Puls Weiten Modulation. Damit werden dann die Motorbrücken angesteuert und die Motoren in ihrer Leistung reguliert.
    Dafür muß er aber erst in den gewünschten Betiebsmodus geschaltet werden. Un genau das macht dieser Programmteil. In welchen Betriebsmodus der Timer geschaltet wird, steht über dem Programmteil. Die Register TCCR1A und TCCR1B können nicht über sbi Anweisungen angesprochen werden, sie liegen außerhalb des Adressbereichs der mit diesn Anweisungen erreicht werden kann. Deswegen weden sie über eine out Anweisung Adresiert.

    MfG
    A.Hoffmann

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test