- Akku Tests und Balkonkraftwerk Speicher         
Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 33

Thema: Soft-PWM erstellen

  1. #11
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.07.2004
    Ort
    Südhessen
    Beiträge
    1.312
    Anzeige

    Praxistest und DIY Projekte
    Zitat Zitat von Hubert.G
    Tja, kann auch mal passieren, sieht doch gut aus
    Ja, schon krass. Hatte erst gedacht, Du zitierst aus einem anderen Thread, ohne was zu sagen.

  2. #12
    Benutzer Stammmitglied
    Registriert seit
    11.10.2007
    Beiträge
    77
    So, hab ab heute wieder Zeit...

    so ganz verstehe ich das auch noch nicht
    Auch wenn ich dein Teil Code benutze, muss ich noch 2 variable declarieren. Bekomme diese Fehlermeldung.


    main.c: In function 'main':
    main.c:54: error: static declaration of '__vector_9' follows non-static declaration
    main.c:54: error: previous declaration of '__vector_9' was here
    make.exe: *** [main.o] Error 1


    2. was bedeutet bei: PORTD^=(1<<PD3); //PortD3 toggelt 50% PWM
    das ^ ?

  3. #13
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Das ^ist ein exclusiv-oder, jedesmal wenn die Zeile angesprungen wird ändert sich der Wert von 0 auf 1 oder umgekehrt.
    Zu den Fehlern kann ich so nichts sagen, da müsste ich den ganzen Code sehen.

  4. #14
    Benutzer Stammmitglied
    Registriert seit
    11.10.2007
    Beiträge
    77
    Hi,

    das ist der aktuelle Code (funktioniert noch nicht, fehlt ja nach was bei der if PD2 abfrage, was ich noch nicht weißt):


    Code:
    #define F_CPU 8000000L                  // Systemtakt in Hz
      
    #include <stdint.h>
    #include <string.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
      
       
    int main(void) {
          
    	DDRD  &= (~ (1<<PD2));  /* Pin D2 als Eingang */ 
        PORTD |= (1<<PD2);    /* Pull Up von PIN D2 aktivieren */  
      
    	
    	volatile uint8_t takt; 
    
    ISR(TIMER0_OVF_vect){ 
    takt++; 
    } 
    
     
    TCCR0=(1<<CS00); //kein Prescaler 
    TIMSK|=(1<<TOIE0); // Overflow Interrupt en 
    DDRD=(1<<PD3);// PortD3 wird Ausgang 
    
    if(takt>=10){ //Takt bis 10 zählen 
    PORTD^=(1<<PD3); //PortD3 toggelt 50% PWM 
    } 
    
       	
    	  if (!( PIND & (1<<PIND2))) {    /* mache was wenn PinD2 low ist */
                 // Hier: der Getriebemotor an L293D soll mit 50% laufen  
           }
    
        return 0;
    }

  5. #15
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.09.2005
    Ort
    Osnabrücker Land
    Alter
    62
    Beiträge
    534
    So sollte es aussehen ...
    .. obs funktioniert hab ich nicht geprüft, nur lesbar geordnet und syntax korrigiert ...

    Code:
    #define F_CPU 8000000L                  // Systemtakt in Hz
      
    #include <stdint.h>
    #include <string.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
      
    volatile uint8_t takt = 0;  // Grundinitinalisierung nie vergessen
    
    void AVRinit(void)
    {
       // DDRD  &= (~ (1<<PD2)); // Pin D2 als Eingang -- unnötig
       // wenn schon, dann:
       DDRD = 0;
       PORTD |= (1<<PD2); // Pull Up von PIN D2 aktivieren
       DDRD  |= (1<<PD3);  // PortD3 wird Ausgang 
    
       TCCR0 = 0 | (1<<CS00); //kein Prescaler 
       TIMSK |= (1<<TOIE0); // Overflow Interrupt en 
    }
    
    SIGNAL(TIMER0_OVF_vect)
    { 
       takt++; 
    } 
    
    int main(void)
    {
       AVRinit();
    
       // wo war denn die MainLoop ?
       for(;;)
       {
          if(takt >= 10)
          { //Takt bis 10 zählen 
             PORTD ^= (1<<PD3); //PortD3 toggelt 50% PWM 
    
             // ist das absicht, hier takt nicht wieder auf 0
             // zu setzen ?
             // ohne das, ist fortan true für die restlichen 244 schritte
          }
    
          if (!( PIND & (1 << PIND2)))
          { // mache was wenn PinD2 low ist
                 // Hier: der Getriebemotor an L293D soll mit 50% laufen  
          }
       }
    
       return(0); // damit der compiler keine Warnungen ausgibt ...
    }
    Jetzt dürfte der compiler jedenfalls keinen Fehler mehr melden ...
    Ich kann mir keine Signatur leisten - bin selbständig!

  6. #16
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Code:
    #define F_CPU 8000000L                  // Systemtakt in Hz
     
    #include <stdint.h>
    #include <string.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
     
    volatile uint8_t takt;   
    
    ISR(TIMER0_OVF_vect){
    takt++;
    }
    
    int main(void) {
         
    DDRD  &= (~ (1<<PD2));  /* Pin D2 als Eingang */
    PORTD |= (1<<PD2);    /* Pull Up von PIN D2 aktivieren */ 
    DDRD=(1<<PD3);// PortD3 wird Ausgang
     
    TCCR0=(1<<CS00); //kein Prescaler
    TIMSK|=(1<<TOIE0); // Overflow Interrupt en
    
    sei();
    for(;;){
    if (!( PIND & (1<<PIND2))) {    /* mache was wenn PinD2 low ist */
                 // Hier: der Getriebemotor an L293D soll mit 50% laufen 
    	if(takt>=10){ //Takt bis 10 zählen
    		takt=0;
    		PORTD^=(1<<PD3); //PortD3 toggelt 50% PWM
    	}
    
    }
    	else{
    	PORTD|=(1<<PD3); // Motor läuft mit 100%
    	}
    }
    }
    Diese Code läuft zumindest im Simulator. takt gehört natürlich auf 0 gestellt.
    Wenn man die Endlosschleife mit for(;; ){ beginnt, dann braucht man kein return0.

  7. #17
    Benutzer Stammmitglied
    Registriert seit
    11.10.2007
    Beiträge
    77
    Danke für deinen Code +Zeit!

    Ich verstehe es nicht, wie ich deinen Code einbinden kann!
    Also beim normalen PWM kann ich durch (OCR1A) sagen;
    solange ich Taster PD2 drucke, soll der Servo sich nach einer Richtung drehen:

    Code:
       if (!( PIND & (1<<PIND2)))      // mache was wenn PinD2 low ist 
    
          { OCR1A--;
           _delay_ms(10);}     /*  Servo dreht nach rechts */ 
         	  }
    Aber wie mache ich das, mit deinen Beispiel; solange ich Taster drücke sich der Getriebemotor 50% dreht?

  8. #18
    Benutzer Stammmitglied
    Registriert seit
    11.10.2007
    Beiträge
    77
    Danke!
    Ich kann erst Montag dazu was schreiben ob es funktioniert hat oder nicht.
    Wünsches allen ein schönes WE!

  9. #19
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Das tut mein Code ja auch, oder soll Servo drehen und Motor 50% gleichzeitig sein.
    Code:
    if (!( PIND & (1<<PIND2))) {    /* mache was wenn PinD2 low ist */
                 // Hier: der Getriebemotor an L293D soll mit 50% laufen 
    	if(takt>=10){ //Takt bis 10 zählen
    		takt=0;
    		PORTD^=(1<<PD3); //PortD3 toggelt 50% PWM
                   OCR1A--;
                   _delay_ms(10);     /*  Servo dreht nach rechts */ 
    	}
    
    }
    	else{
    	PORTD|=(1<<PD3);  //Motor 100%
    	}
    Zusammengefügt würde das so aussehen, wird aber wegen dem _delay nicht richtig funktionieren. Delay und Timerinterrupt vertragen sich nicht richtig.

  10. #20
    Benutzer Stammmitglied
    Registriert seit
    11.10.2007
    Beiträge
    77
    Hi Hubert.

    Hab dein Code grade getestet und es Funktioniert!
    1000 Danke!

    Frag noch dazu:
    Kann ich denn Ausgangpin für mein Getriebemotor auch z.B Pin PC1 nehmen oder darf ich nur PD3 (wegen INT1) nehmen?

Seite 2 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress