mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Servo per variable stellen


Autor: Elias B. (bouni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Ich probier grad mit nem RS2 Servo vom großen C rum (am Atmega 8515).
#include <avr/io.h>
 
int main()
{
  DDRB = (1 << PD5 ); 
  TCCR1A = (1<<COM1A1) | (1<<WGM11);
  TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS01);
  ICR1 = 0x1200; 
  OCR1A = 0x0295; 
  while( 1 )
    ;  
}


Des funktioniert auch gut soweit

wenn ich aber OCR1A aus einer anderen Funktion heraus ändern möchte 
fährt der servo an den Anschlag im Uhrzeigersinn.
#include <avr/io.h>

uint16_t servostellung;

void servopos()
{
servostellung = 0x046C;
}

int main()
{
  DDRB = (1 << PD5 ); 
  TCCR1A = (1<<COM1A1) | (1<<WGM11);
  TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS01);
  ICR1 = 0x1200; 
  OCR1A = servostellung; 
  while( 1 )
  {
    servopos();  
  }
}


Woran liegt das bzw. was ist mein Fehler?

Bouni

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Elias B. wrote:
 #include <avr/io.h>
 
 uint16_t servostellung;
 
 void servopos()
 {
 servostellung = 0x046C;
 }
 
 int main()
 {
   DDRB = (1 << PD5 );
   TCCR1A = (1<<COM1A1) | (1<<WGM11);
   TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS01);
   ICR1 = 0x1200;
/* servostellung ist hier mit Null initialisiert ---> Anschlag */
   OCR1A = servostellung;
/* PWM verändert, Servo fährt los */
   while( 1 )
   {
     servopos();
/* Verändere die Variable, aber nicht OCR1A. Servo steht. */
   }
 }
 

Autor: ozo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ähm, du änderst zwar "servostellung" aber doch nie OCR1A.
Und nur dieses interessiert die PWM erzeugende Hardware.

Autor: Elias B. (bouni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Morgen
#include <avr/io.h>
 
 uint16_t servostellung;
 
 void servopos()
 {
 servostellung = 0x046C;
 }
 
 int main()
 {
   DDRB = (1 << PD5 );
   TCCR1A = (1<<COM1A1) | (1<<WGM11);
   TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS01);
   ICR1 = 0x1200;
   while( 1 )
   {
     servopos();
     OCR1A = servostellung;
   }
 }

Ist so besser ??

Ich kanns grad nicht probieren da ich mein STK und den Servo nicht hiere 
hab.

Bouni

Autor: Elias B. (bouni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das mit der Variable hab ich hinbekommen, aber das serielle empfangen 
eines Prozent wertes als stellwert macht mir noch Probleme :(
#include <avr/io.h>
#include <inttypes.h>

#ifndef F_CPU
#define F_CPU 3686400UL    
#endif

#define BAUD 9600UL 
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)
         
    UCSRB |= (1<<TXEN) | (1<<RXEN);    // UART RX und TX einschalten
    UCSRC |= (1<<URSEL)|(3<<UCSZ0);    // Asynchron 8N1 
 
    UBRRH = UBRR_VAL >> 8;
    UBRRL = UBRR_VAL & 0xFF;

 uint8_t uart_getc(void)
 {
    while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
        ;
    return UDR;
 }
 
 int main()
 {
   DDRB = (1 << PD5 );
   TCCR1A = (1<<COM1A1) | (1<<WGM11);
   TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS01);
   ICR1 = 0x1200;
   uint16_t servopos;
   uint8_t uart_percent; // Empfangene Zahl von 0 bis 100
   while( 1 )
   {
     uart_percent = uart_getc();
     servopos = 0x0127 + (uart_percent * 8); // 0x0127 = 0% 0x447 = 100% -
                                             // differenz ist 800
                                             //deswegen empfangene 
                                             //prozent * 8
     OCR1A = servopos;
   }
 }

Hat wer ne Idee woran es liegen könnte?


Bouni

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>servopos = 0x0127 + (uart_percent * 8);

Du multiplizierst eine 8Bit-Variable mit 8 bei 100% käme da 800 heraus.
Du mußt uart_percent auf u_int16 casten.

Autor: Elias B. (bouni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Morgen,

also so:
servopos = 0x0127 + ( (uint16_t) uart_percent * 8);

?

Bouni

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier es aus!

Autor: Bouni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bin grad auf Arbeit :)

Aber werd ich heut Abend tun!

Dank für den Tip mit dem Type Cast !!

Bouni

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.