Lieber Besucher, herzlich willkommen bei: RCLine Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

Donnerstag, 23. Oktober 2008, 17:00

2 Kanal Fahrtregler mit VMixer

Hallo,
ich versuch da grad mal was einfaches für so ein kleines Boot mit 2 Motoren zu basteln.

Jetzt sitz ich hier an der Programmierung, und filleicht kann mir ja noch wer ein paar Tipps geben!!
Den Empfangsteil hoffe ich soweit fertig zu haben, fehlt noch der Mischer und die PWM-Ausgabe:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
/*****************************************************

2-Kanal Fahrtregler mit integriertem v(delta)-Mischer
@2008 skru

CodeVisionAVR
ATtiny2313
8,000000 MHz

Pinnkonfiguration:
PD0       : Setup-Taster
PD1       : vmixer aktiv Jumper
PD2 (int0): Eingang Ch1 Beschleunigung (alt. Antrieb 1)
PD3 (int1): Eingang Ch2 Lenkung        (alt. Antrieb 2)
PD5       : Power-LED
PD6       : Setup-LED
PB0       : PWM Antrieb 1 (rechts)
PB1       : rechtslauf Antrieb 1
PB2       : linkslauf Antrieb 1
PB3       : PWM Antrieb 2 (links)
PB4       : rechtslauf Antrieb 2
PB6       : linkslauf Antrieb 2

(PD4 Schalter Reserve)
(PB5,7 I2C Reserve)

*****************************************************/

#include <tiny2313.h>

typedef unsigned char  u8;
typedef unsigned short u16;

eeprom u16 ch1min=1000;
eeprom u16 ch1max=2000;
eeprom u16 ch2min=1000;
eeprom u16 ch2max=2000;
#define ch1faktor ((ch1max-ch1min)/255)
#define ch2faktor ((ch2max-ch2min)/255)

bit ch1flag=0;
bit ch2flag=0;
u16 ch1time=0;
u16 ch2time=0;

u8 fahrstufe_a1=0;
u8 fahrstufe_a2=0;

bit setupflag=0;


// Setupmodus
void setup()
{
  bit ende=0;
  
  setupflag=1;
  PORTD.6=1; //SetupLED ON 
  while (!PIND.0); //warte bis Taste wieder losgelassen
  
  //Defaultwerte etwas runtergestuft für Setupmessung
  ch1min=1200;
  ch1max=1800;
  ch2min=1200;
  ch2max=1800;
  
  while (!ende)    //Schleife für Setupmode
  {
    if (!PIND.0) ende=1; //Setupmode ende
  }

  PORTD.6=0; //SetupLED OFF   
}

// berechnung der Fahrstufe aus der gemessenen Zeit
void berechne_fahrstufe_a1(u16 time)
{
  //time=wert in µs
  if (time>ch1min && time<ch1max)
  {
    fahrstufe_a1=(time-ch1min)/ch1faktor;
  }
  if (setupflag)
  {
    if (time>800 && time<ch1min) ch1min=time;
    if (time<2200 && time>ch1max) ch1max=time;
  }
}

// berechnung der Fahrstufe aus der gemessenen Zeit
void berechne_fahrstufe_a2(u16 time)
{
  //time=wert in µs
  if (time>ch2min && time<ch2max)
  {
    fahrstufe_a2=(time-ch2min)/ch2faktor;
  }
  if (setupflag)
  {
    if (time>800 && time<ch2min) ch2min=time;
    if (time<2200 && time>ch2max) ch2max=time;
  }  
}

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
  u16 time=0;

  //ch1
  if (PIND.2) //starte Zeitmessung
  {
    ch1flag=1;
    if (!ch2flag) TCNT0=0;
    ch1time=TCNT0;
  }
  else //ende Zeitmessung, Berechnung der Werte
  {
    time=TCNT0;
    ch1flag=0;
    if (time>ch1time)
    {
      ch1time=time-ch1time;
      berechne_fahrstufe_a1(ch1time);
    }
  }
}

// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
  u16 time=0;

  //ch2
  if (PIND.3) //starte Zeitmessung
  {
    ch2flag=1;
    if (!ch1flag) TCNT0=0;
    ch2time=TCNT0;
  }
  else //ende Zeitmessung, Berechnung der Werte
  {
    time=TCNT0;
    ch2flag=0;
    if (time>ch2time)
    {
      ch2time=time-ch2time;
      berechne_fahrstufe_a2(ch2time);
    }
  }
}

interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
  if (ch1flag || ch2flag) //Fehler, Werte zurücksetzten
  {
    ch1flag=0;
    ch2flag=0;
    ch1time=0;
    ch2time=0;
    fahrstufe_a1=0;
    fahrstufe_a2=0;
  }
}


// Declare your global variables here

void main(void)