Forum: Mikrocontroller und Digitale Elektronik Servo und VirtualWire inkompatibel


von Jan M. (pietus3)


Lesenswert?

Hey

Danke schonmal das ihr das hier lest. Zu erst als Information. Ich 
benutzte die Arduino IDE deshalb sieht der Code leicht anders aus. Als 
weitere Informationen. Ich benutzte einen AtMega328p mit 16MHz. Mein 
Problem ist das Ich in der Schule mit meinen Freunden ein R/C Auto 
entickel. Wir haben es nun geschafft einen Motor per FErnbedienung zu 
steuern. Dafür verwenden wir die Bibliothek VirtualWire. Nun möchten wir 
auch natürlich unser Fahrzeug lenken. Dies ist aber unser Kern Problem. 
Zunächst wollten wir einfach noch die ServoBilbiothek benutzen diese 
schneidet sich aber mit der anderen Bibliothek. Also haben wir nun unser 
eigenes Servo Programmm geschrieben per Interrupts um den Servo zu 
steuern dieses funktioniert auch alleine wieder. Doch wenn wir nun 
wieder die Bibliothek hinzufügen wird nichts mehr gesendet. In dem 
Quelltext soll wieder der Motor per Funk angesteuert werden und der 
Servo soll einfach die Position einnehmen die wir ihm vorher sagen. Ich 
hoffe ihr könnt uns weiter helfen. Ich danke euch jetzt schon mal für 
eure Beiträge. Hier unser Code.
1
#include <VirtualWire.h>
2
3
const int receive_pin = 11;
4
String Ergebnis ;
5
long int Ergebnis2;
6
volatile int ServoPos;
7
volatile int timeCount;
8
9
ISR( TIMER2_COMPA_vect)                // Interruptbehandlungsroutine
10
{
11
  timeCount++;
12
  if( timeCount == 2000 ){
13
    timeCount = 0;
14
    PORTB |= ( 1 << PORTB5 );
15
  }
16
  
17
  else if( timeCount == 150){
18
    PORTB &= ~( 1 << PORTB5 );
19
  }    
20
}
21
22
void setup() {
23
  Serial.begin(9600);
24
  Serial.println("setup");
25
  vw_set_rx_pin(receive_pin);
26
  vw_setup(2000);
27
  vw_rx_start();
28
  pinMode(4,OUTPUT);
29
  pinMode(5,OUTPUT);
30
  pinMode(2,OUTPUT);
31
  pinMode(13,OUTPUT);
32
33
  digitalWrite(4,LOW);
34
  digitalWrite(5,HIGH);
35
  analogWrite(2,0);
36
  
37
  //Servo
38
  
39
  TCCR2A |= (1<<WGM21);        // CTC-Mode
40
  TCCR2A &= ~(1<<WGM20);
41
  TCCR2B &= ~(1<<WGM22);      // CTC-Mode
42
   TCCR2B |= (1 << CS20);
43
   TCCR2B &= ~(1 << CS22);
44
   TCCR2B &= ~(1<< CS21);
45
  TIMSK2  |= (1<<OCIE2A);      // Timer-Compare Interrupt an
46
  OCR2A = 159;                         // Neutralposition ((2500-2312)*0.008ms)=1,5ms)
47
 
48
  sei();                                // Interrupts global an
49
  timeCount = 0;
50
}
51
52
void loop() {
53
  int i;
54
  uint8_t buf[VW_MAX_MESSAGE_LEN];
55
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
56
  vw_get_message(buf,&buflen); 
57
  Ergebnis=String(buf[0]-48)+String(buf[1]-48)+String(buf[2]-48)+String(buf[3]-48);
58
  Ergebnis2 = Ergebnis.toInt();
59
  Serial.println(Ergebnis2);
60
 Ergebnis2 = map(Ergebnis2,0,1024,100,200);
61
 Serial.println(Ergebnis2);
62
 analogWrite(2,Ergebnis2);
63
64
65
 
66
  vw_wait_rx();
67
  
68
}

MFG
Jan-Peter Meyer

von Jan M. (pietus3)


Lesenswert?

push

von Jan M. (pietus3)


Lesenswert?

Ich habe die Vermutung dass sich beide Interrupts überschneiden. Oder 
hat jemand eine andere Idee?

von Karl H. (kbuchegg)


Lesenswert?

Sieh halt mal in den Code für Virtual Wire rein!

Sorry. Aber wenn du programmieren willst, wirst du nicht drum herum 
kommen, dir die Dinge anzusehen, die du als Building Blocks einsetzen 
willst.


Ich hab mir eine Version dieses Virtual Wire angesehen. Ob es die ist, 
die du benutzt, kann ich nicht sagen. Du hast ja keinen Link zu dieser 
Version angegeben oder deinen Code dazu gezeigt.
Aber eines hab ich gesehen: Ja, dieses Virtual Wire benutzt selber einen 
Timer und es ist konfigurierbar, welchen Timer es benutzen soll. Wenn 
das der gleiche Timer ist, den dein Servo Code auch benutzt, dann ist 
Ärger vorprogrammiert.

Aber eines ist sicher: Du wirst nicht drum herum kommen, dir 
Codebausteine anzusehen. Solange die anderen für euch mitgedacht haben 
und die Bausteine so gestaltet haben, dass sie miteinander können, 
solange ist eh alles paletti und man muss nicht viel können um die Dinge 
einfach nur als fertige Bausteine zu benutzen. Aber wenn dem nicht so 
ist, dann muss man eben selber ran!
Ja, so ist das nun mal in der Programmierung. Wenn es nicht funktioniert 
trennt sich dann eben der Spreu vom Weizen und man kommt drauf, dass 
'Ich will' dann eben doch nicht gut genug ist.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.