- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: warum läuft der motor nur in der "for-schleife"

  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941

    warum läuft der motor nur in der "for-schleife"

    Anzeige

    Praxistest und DIY Projekte
    hallo woran liegt das?
    wenn ich direkt mit "OCR1A = ii,OCR1B = ii" beschreibe geht der motor nicht ("ii=254")
    in der endlosschleife. wo das bild ist steht for(2xsemicolon){ usw.....
    ich habe es mit "volatile" und "const" ausprobiert.

    Code:
    #include <stdint.h>
    #include <avr/io.h>
    #include <pwm_init.c>
    #include <simple_delayroutinen.c>
    
    int main(void) {
    
    	DDRC=0xff;
    	cbi (PORTC,PC0); 
    	sbi (PORTC,PC1); 
    	sbi (PORTC,PC2); 
    	cbi (PORTC,PC3); 
    	
    	uint8_t ii = 254;
    
    	pwm_init ();
    		
    	for (;;) {
    		
    	OCR1A = ii;
            OCR1B = ii;
    		
    	}
    
    }


    wenn die innere schleife steht, läuft der motor wie er soll, endlos.

    Code:
    int main(void) {
    
    	DDRC=0xff;
    	cbi (PORTC,PC0); 
    	sbi (PORTC,PC1); 
    	sbi (PORTC,PC2); 
    	cbi (PORTC,PC3); 
    	
            uint8_t i = 0;
    	pwm_init ();
    		
    	for (;;) {
    		
    	  for (i=254; i<254; i++) {
    	     OCR1A = i;
    	     OCR1B = i;
    	     }
    	}
    
    }
    mfg pebisoft

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.05.2004
    Ort
    Untersöchering(Bayern,Alpenvorland)
    Alter
    37
    Beiträge
    215
    Ich denke es geht nicht da er die ganze Zeit sofrt wieder ii in OCR1X schreibt und ihm nie Zeit bleibt das dann auch auszufüren. Er schreibt ja sofort wieder nen neuen Wert in OCR1X, nur das der Wert der gleiche wie der alte ist. Probier mal in dein erstes Beispiel eine Delay Funktion einzubauen die nach OCR1B=11; vielleicht 1Sekunde wartet.
    So ähnlich wie hier: (von mc-projekt)
    Code:
    #include <avr/io.h>
    #include <pwm_init.c>
    #include <simple_delayroutinen.c>
    
    int main(void) {
    	
        unsigned char i = 0;
    	pwm_init ();
    	
        for (;;) {
    		
    		for (i=0; i<254; i++) {
    			OCR1A = i;
    			OCR1B = i;
    			delay_us (10000);
    		}
    	}
    }
    Wenn du das Beispiel sowieso von da hast? Wieso hast du dann die delay Funktion rausgenommen?
    Gruß Muraad

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941
    hallo, in der 2.schleife mit 254 laufen die motorn ja gleich mit der vorgegebenen geschwindigkeit gut ohne delay. die delay war nur als dimmer für dioden gedacht die er eingebaut hatte.
    neues thema:
    ich habe jetzt deine pwm ausprobiert, wunderbar. läuft ohne for-schleife auch. eine frage, wie kann ich jetzt dimmen, das die motoren von 0 bis 255 gestellt werden können. ich habe mal die zahlen von 0 bis 100 ausprobiert, die motoren laufen immer gleich schnell, der einzige unterschied ist, wenn die zahlen verschieden sind, das sie dann zeitversetzt anlaufen.
    :
    Code:
    #include "pwm.h"
    
    
    int main(void) {
    
        PWMchannel_init;
        PWM8bit_init;
        PWM1upcounting;
    	PWM2upcounting; 
        Timer2_prescaler_256;
    	PWMdisable;
    	//Timer2_stop;
    	
    	DDRC=0xff;
    	clbit (PORTC,PC0); 
    	sebit (PORTC,PC1); 
    	sebit (PORTC,PC2); 
    	clbit (PORTC,PC3); 
    	
    	pwm8bit(25.0,0);
    	pwm8bit(25.0,1);
    		
    }
    mfg pebisoft

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.05.2004
    Ort
    Untersöchering(Bayern,Alpenvorland)
    Alter
    37
    Beiträge
    215
    Was meinst du mit zeitversetzt anlaufen?
    Ich versteh in deim Code nicht wieso du nach der ganzen initialisierungs Phase bis Timer2_prescaler_256; danach schon PWMdisable; aufrufst und dann aber die pwm8bit() Funktion verwendest (PWM ist ja mit PWMdisable wieder aus). Lass das PWMdisable einfach weg und füg nach pwm8bit(25.0,1); vielleicht noch ne Endlosschleife for( ; ; ) ein.
    Gruß Muraad

    EDIT: ohne die Leerzeichen in der for Schleife mach er nen Smily draus

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941
    hallo, endloschleife kann ich nicht machen, weil das programm noch weiterarbeiten soll nachdem die motoren laufen und daten über den adc auswerten muss.
    wenn ich "PWMdisable;" rausnehme, läuft nur noch ein motor.
    wenn ich das "PWMdisable" reinnehme, laufen beide motoren wieder.
    zeitversetzt heisst: 1. motor läuft , nach ca 1,5sec fängt der 2. motor
    an zu laufen.
    mfg pebisoft

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.05.2004
    Ort
    Untersöchering(Bayern,Alpenvorland)
    Alter
    37
    Beiträge
    215
    Sorry Pepisoft ich verstehs grad garnicht. PWMdisable mach nichts anderes als TCCR1A = ~(1<<WGM10) & ~(1<<WGM11); dann dürfte PWM garnicht mehr gehen.
    Und was machst du da:
    DDRC=0xff;
    clbit (PORTC,PC0);
    sebit (PORTC,PC1);
    sebit (PORTC,PC2);
    clbit (PORTC,PC3);

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941
    hallo, clbit (clearbit)und sebit(setbit) sind zum setzen der bits in portc bestimmt, habe ich aus einem forum, weil es im neuem winavr diese nicht mehr gibt. am l293d liegt der portc mit 4 leitungen an. diese bestimmen am l293d die laufrichtung der motoren, haben keinen einfluss auf den ocr1a und ocr1b. je motor 2 pinc, 1 für vorwärts und 1 für rückwärts.
    "PWMdisable" hat aber einfluss auf den 2. motor, wenn ich es rausnehme, läuft er nicht. komisch...
    mf gpebisoft

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.05.2004
    Ort
    Untersöchering(Bayern,Alpenvorland)
    Alter
    37
    Beiträge
    215
    Ich hab jetzt nochmal im Datenblatt nach den WGM´s Bits geschaut. Weist du was der Unterschied zwischen "Phase Correct PWM" also und "Fast PWM" ist?
    Mit meinen Defines ist auf Phase Correct PWM eingestellt, ich weis aber nicht obs daran liegt.
    Und clbit() und sebit sind doch nur die abgeänderten Defines von
    #define SETBIT(ADDRESS,BIT) (ADDRESS |= (1<<BIT)) // Setzt bit im gewünschten Register
    #define CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT)) // Löscht bit in ADDRESS
    #define CHECKBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT)) // Prüfft ob bit gesetzt ist
    oder sind die jetzt offiziell in WinAVR?
    Gruß Muraad
    Alle sind unzufrieden - und alle machen weiter wie bisher.

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941
    sind selbst erstellt, weil die es in winavr nicht mehr gibt.
    warum ändert sich aber die spannung nicht, wenn ich von 0-100 gehe.
    FASTPWM ist eine ander einstellung, hat mit deiner nichts zu tun.
    mfg pebisoft

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    28.04.2004
    Ort
    Nähe Köln
    Alter
    58
    Beiträge
    247
    Hallo pebisoft

    Poste doch mal deine pwm.h und die pwm.c , wenn eine vorhanden.

    So kann kann man ja gar nicht genau sehen, was du machst.

    MFG
    Dieter

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

12V Akku bauen