- fchao-Sinus-Wechselrichter AliExpress         
Seite 2 von 9 ErsteErste 1234 ... LetzteLetzte
Ergebnis 11 bis 20 von 89

Thema: 1 Servo mit 2 Tasten ansteuer, aber wie :-(

  1. #11
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.693

    Re: 1 Servo mit 2 Tasten ansteuer, aber wie :-(

    Anzeige

    Praxistest und DIY Projekte
    Zitat Zitat von SimLock
    Hi @ll, ... 2 Taster, 1 Servo.
    Taster 1 drehe Servo nach rechts solange taster gedrückt ist. Bei Max Servo Stop (nicht weiter nach rechts drehen!). ... Das gleiche umgekehrt mit Taster 2 Servo drehe links bis min.
    Hi, SimLock,

    also ich hatte das auch mal versucht (aber nicht mega8 und nicht C, sondern tiny13 und Assembler - hatte daher auch bisher nix beigetragen) - und fand das total unpraktisch. Das für mich Praktischste war ein Poti (25k lin) zum ADC und damit den Servo steuern. Dann habe ich Richtung, Anschlag und Drehgeschwindigkeit im Griff. Geht natürlich auch zwei Potis für zwei Servos.
    Ciao sagt der JoeamBerg

  2. #12
    Benutzer Stammmitglied
    Registriert seit
    11.10.2007
    Beiträge
    77
    Servo dreht sich nicht

    musst noch unsigned char i; dazu schreiben, hattest du vergessen oder? <-- Weiß nicht ob die Zeile auch ok ist...
    Beim Compilieren ist kein Fehler gewesen.
    Servo ist mit gleicher masse verbunden.
    Servo steuersignal ist auf PB1
    Taster ist auf PD2

    Mein aktueller Code:

    Code:
    #include <avr/io.h>          
    #include <stdbool.h>
    #include <stdlib.h>
    #include <avr/io.h>
    #include <AVR/iom8.h>
    #include <inttypes.h> 
    #include <util/delay.h>
    
    #define F_CPU 12000000    // clock 
    
    // Timer1 initialisieren 
    
    void timer1_init(void) 
    { 
     TCCR1A |= (1<<WGM11)|(1<<COM1A1)|(1<<COM1A0); // initalize mega8 Timer1 with 9Bit, inverted, Prescaler 256 
     TCCR1B = (1<<CS12); // this gives us a signal with 21.76ms at 12MHz 
    
     OCR1A = 476; // pulse of 1.5ms 512- 1500*(F_CPU/256/1000000)/2 
                 // Hier wieder der PWM auf mittelstellung gebracht oder? 
    } 
    
     int main (void)
         { 
    
         unsigned char i;      /* Variable i */
    
         DDRB = ( 1 << PB1 );           /* Pin PB0 als Ausgang für Servo */ 
    	 
         DDRD  &= ~ (1<<PD2);          /* Pin D2 als Eingang */ 
         PORTD |= (1<<PD2);            /* Pull Up von PIN D2 aktivieren */ 
    
    	
    while(1){ 
       if (!( PIND & (1<<PIND2)))      /* mache was wenn PinD2 low ist */ 
       { 
          if(OCR1A > 452){ 
            OCR1A--;      /* Pulsbreite verkürzen */ 
          } 
       } else { 
          OCR1A = 476; 
       } 
       for(i=0;i<50;i++) 
          _delay_ms(10); 
    } 
    }

  3. #13
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.09.2005
    Ort
    Osnabrücker Land
    Alter
    63
    Beiträge
    534
    ... öhm wo in main() rufst DU denn die Funktion timer1_init() auf ?

    Oder anders ausgedrückt, eine Funktion INIT() dient als separate Funktion nur der Übersicht und ist Bestandteil von main() bevor dieses sich in eine Endlosschleife begibt ....

    Sauber geschrieben sollte das so aussehen - ich hab nur den Code etwas lesbarer gemacht und INIT() plaziert ... ich empfehlen "meine Ebenenstruktur" zu nutzen - also deutlich Einrücken und Leerzeichen zw. Anweisungen plazieren --- Funktional habe ich den Code nicht geprüf!:

    Code:
    #include <avr/io.h>         
    #include <stdbool.h>
    #include <stdlib.h>
    #include <avr/io.h>
    #include <AVR/iom8.h>
    #include <inttypes.h>
    #include <util/delay.h>
    
    #define F_CPU 12000000    // clock
    
    // Timer1 initialisieren
    
    
    void INIT(void)
    {
       // Portdefinitionen
       DDRB = 0 | ( 1 << PB1 );   // Pin PB0 als Ausgang für Servo
       DDRD  &=~ (1<<PD2);   // Pin D2 als Eingang
       PORTD = 0 | (1<<PD2);       // Pull Up von PIN D2 aktivieren
    
       // timer1
       // initalize mega8 Timer1 with 9Bit, inverted, Prescaler 256
       TCCR1A |= (1 << WGM11 ) | ( 1 << COM1A1 ) | ( 1 << COM1A0 ); 
       // this gives us a signal with 21.76ms at 12MHz
       TCCR1B = (1 << CS12);
       // pulse of 1.5ms 512- 1500*(F_CPU/256/1000000)/2
       OCR1A = 476;
       // Hier wieder der PWM auf mittelstellung gebracht oder? <= wie meinen
    
    
    }
    
    int main(void)
    {
       INIT();
    
       unsigned char i;      // Variable i [echt :-) ]
    
       for(;;)
       {
          // mache was wenn PinD2 low ist
          if (!( PIND & (1<<PIND2)))
          {
             if(OCR1A > 452)
             {
                 OCR1A--;   //Pulsbreite verkürzen
             }
          }
          else
          {
             OCR1A = 476;
          }
          for(i = 0; i < 50; i++)
             _delay_ms(10); // bei 16 MHz maximal 16 ms möglich !
       }
    }
    Ich kann mir keine Signatur leisten - bin selbständig!

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

    danke! Aber Funktioniert trotzdem nicht
    Bei compilieren bekomme ich keine Fehlermeldung siehe Anhang:

    • -------- begin --------
      avr-gcc (GCC) 4.1.2 (WinAVR 20070525)
      Copyright (C) 2006 Free Software Foundation, Inc.
      This is free software; see the source for copying conditions. There is NO
      warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


      Size before:
      main.elf :
      section size addr
      .text 196 0
      .stab 888 0
      .stabstr 113 0
      .debug_aranges 32 0
      .debug_pubnames 43 0
      .debug_info 330 0
      .debug_abbrev 233 0
      .debug_line 397 0
      .debug_frame 48 0
      .debug_str 196 0
      .debug_loc 70 0
      Total 2546




      Compiling: main.c
      avr-gcc -c -mmcu=atmega8 -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.lst -std=gnu99 -DF_OSC=12000000 -MD -MP -MF .dep/main.o.d main.c -o main.o

      Linking: main.elf
      avr-gcc -mmcu=atmega8 -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.o -std=gnu99 -DF_OSC=12000000 -MD -MP -MF .dep/main.elf.d main.o --output main.elf -Wl,-Map=main.map,--cref -lm

      Creating load file for Flash: main.hex
      avr-objcopy -O ihex -R .eeprom main.elf main.hex

      Creating load file for EEPROM: main.eep
      avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
      --change-section-lma .eeprom=0 -O ihex main.elf main.eep
      c:\WinAVR-20070525\bin\avr-objcopy.exe: there are no sections to be copied!
      c:\WinAVR-20070525\bin\avr-objcopy.exe: --change-section-lma .eeprom=0x00000000 never used
      make.exe: [main.eep] Error 1 (ignored)

      Creating Extended Listing: main.lss
      avr-objdump -h -S main.elf > main.lss

      Creating Symbol Table: main.sym
      avr-nm -n main.elf > main.sym

      Size after:
      main.elf :
      section size addr
      .text 180 0
      .stab 888 0
      .stabstr 113 0
      .debug_aranges 32 0
      .debug_pubnames 36 0
      .debug_info 309 0
      .debug_abbrev 209 0
      .debug_line 381 0
      .debug_frame 48 0
      .debug_str 189 0
      .debug_loc 70 0
      Total 2455



      Errors: none
      -------- end --------


      > Process Exit Code: 0
      > Time Taken: 00:04


    Servo dreht sich nicht, ich stecke Pin PB1 rein raus... dann etwas
    Sonst kann man glaube leicht hören, wie der Servo klick klick macht

  5. #15
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Ich habe das mal auf meinem Testboard probiert, mit dem timer1 init, der ja gefehlt hat, funktioniert das bei mir einwandfrei. Taste gedrückt, Servo läuft nach links, Taste aus, Servo läuft in die Mitte.
    Hubert

  6. #16
    Benutzer Stammmitglied
    Registriert seit
    11.10.2007
    Beiträge
    77
    Also mein Servo dreht sich nicht (nur wenn ich + pol rote leitung von servo an + pol "reibe")
    Ist meine Mhz auch ok mit 12Mhz?
    Wenn ich an PB1 eine LED anschliese blickt die LED. <-- das ist doch schon mal was.
    Aber wenn ich Taster drücke, sieht man keine veränderung des blicken (wenn man das überhaubt sehen könnte.

  7. #17
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Dann stimmt mit deinem Servo etwas nicht. Oder du hast immer noch einen falschen Code.
    Code:
    #include <avr/io.h>         
    #include <stdbool.h>
    #include <stdlib.h>
    #include <avr/io.h>
    #include <AVR/iom8.h>
    #include <inttypes.h>
    #include <util/delay.h>
    
    #define F_CPU 12000000    // clock
    
    // Timer1 initialisieren
    
    void timer1_init(void)
    {
     TCCR1A |= (1<<WGM11)|(1<<COM1A1)|(1<<COM1A0); // initalize mega8 Timer1 with 9Bit, inverted, Prescaler 256
     TCCR1B = (1<<CS12); // this gives us a signal with 21.76ms at 12MHz
    
     OCR1A = 476; // pulse of 1.5ms 512- 1500*(F_CPU/256/1000000)/2
                 // Hier wieder der PWM auf mittelstellung gebracht oder?
    }
    
     int main (void)
         {
    timer1_init();
        unsigned char i;      /* Variable i */
    
         DDRB = ( 1 << PB1 );           /* Pin PB0 als Ausgang für Servo */
       
         DDRD  &= (~ (1<<PD2)|(1<<PD3));          /* Pin D2 als Eingang */
         PORTD |= (1<<PD2)|(1<<PD3);            /* Pull Up von PIN D2 aktivieren */
    
       
    while(1){
       if (!( PIND & (1<<PIND2)))      /* mache was wenn PinD2 low ist */
       {
          if(OCR1A > 452){
            OCR1A--;      /* Pulsbreite verkürzen */
          }
       } 
       if (!( PIND & (1<<PIND3)))      /* mache was wenn PinD3 low ist */
       {
          if(OCR1A < 499){
            OCR1A++;      /* Pulsbreite verlängern */
          }
       } 
       
       if (( PIND & (1<<PIND2))&&(PIND & (1<<PIND3))) {  /* Mitte wenn keine Taste */
        OCR1A = 476;
       }
       for(i=0;i<50;i++)
          _delay_ms(10); 
    }
    }
    Probiers mal damit, eine Taste für links- eine für rechstlauf.

  8. #18
    Benutzer Stammmitglied
    Registriert seit
    11.10.2007
    Beiträge
    77
    Hallo,

    Danke erstmal für deinen Code!!!
    Aber leider dreht sich bei mir kein Servo. Ich habe schon 4 verschiedene Servos angeschlossen!
    Hier mal ein paar angaben zu meine Servos und Aufbau:


    Servotyp: Standartservo von Conrad Carson 13375

    http://images.google.com/imgres?imgu...en-US%26sa%3DN

    Bord ist von MYAVR:

    http://www.myavr.de/shop/article.php?artDataID=4 + Atmega8 µC

    Angeschlossen:

    Wie man in Link sehen kann, sieht man an Board, das dort unten die Steckleisten von PortD-B-C. Auf PortD 2 und 3 sind 2 Taster angeschlossen. An PortB1 habe ich die Steuerleitung von Servo angeschlossen. Die + - Anschlüsse von Servo habe ich sowie parallel als auch extern an einer Spannungsquelle angeschlossen. (Masse immer verbunden)
    Der servo dreht nur etwas, wenn ich die Steuerleitung ab und wieder drauf lege an PB1!

    Spannungswerte an den Port´s

    Spannung gegen Masse gemessen!

    PortD
    D2 und D3 haben 5V (das liegt, weil ich die in Code auf „Low“ abfrage,
    wenn ich Taster drücke, dann 0V)
    Rest 0,7V

    PortB
    B1 wechseln ca. 1,7V zu 0V (schätzwerte, leider kein OZ.)
    Rest 0,7V

    PortC
    Alle haben 0,8V

    Wie gesagt, wenn ich eine LED an B1 anschließe, blinkt die LED!
    Also gehe ich davon aus, dass das Board OK ist oder?
    Wo könnte noch der Fehler liegen?

    Bin schon am verzeifeln....

    Edit1:
    Der Servo dreht immer einen Tacken nach den anderen sehr langsam nach links.

    Edit2:
    Hab mal was rumprobiert und umprogrammiert (Pulsimpulse verändert), der Servo läßt sich jetzt drehen! Zwar jetzt Taste1 eine festen werd und Taste2 einen Festen wert. (Zum Test erstmal) Mit den alten Code von H. funktionert es leider nicht trozt umprogrammieren der Zeitimpulse.
    Wie mache ich das jetzt, das der nur schrittweiße sich dreht und nicht auf eine feste position?

  9. #19
    Benutzer Stammmitglied
    Registriert seit
    11.10.2007
    Beiträge
    77
    Edit3:
    Jetzt Läuft es, es war noch Fehler in deinen Programm bei for schleife.
    Danke an alle!

  10. #20
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Die for Schleife sollte doch ein langsames drehen bewirken, wenn du das rausnimmst dann dreht es gleich nach der max. Stellung. Das war von Anfang an drinnen und dachte daher es ist so gewollt.
    Wenn du das nicht willst kannst du gleich nach if (!( PIND & (1<<PIND2))) OCRA==452; schreiben, da ersparst du dir die if-Schleife.

Seite 2 von 9 ErsteErste 1234 ... LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test