Forum: Mikrocontroller und Digitale Elektronik Servo-Signal auslesen mit Atmega 8 - wo liegt der Fehler?


von nub (Gast)


Lesenswert?

Hallo allseits,

ich habe vorher nur PC-Programme in verschiedenen Basic-Varianten und 
Webdesignsprachen geschrieben, dies ist mein erstes Projekt mit dem 
Mikrocontroller. Ich möchte die restlichen Kanäle einer Fernsteuerung 
mit dem Atmega 8 auslesen und dadurch die Lichter eines Modell-Lkws 
steuern.
Das Prinzip habe ich auch schon verstanden und habe daraus folgenden 
Code fabriziert:
1
'Definition für Mega 8
2
$regfile "m8def.dat"
3
4
'Angabe der Taktfrequenz (8Mhz)
5
$crystal = 8000000
6
7
'======================================================
8
'Konfigurationen
9
'======================================================
10
11
'Konfiguration der I/O-Ports´s
12
Config Portc = Output
13
Config Portb = Input
14
15
'======================================================
16
'Deklarationen
17
'======================================================
18
19
Dim Rc_value As Integer
20
Dim 1timer As Integer
21
22
'======================================================
23
'Initialisierungen
24
'======================================================
25
26
'Ports initialisieren
27
Portc = &B11111111
28
29
'======================================================
30
'Hauptprogramm-Schleife
31
'======================================================
32
33
Do
34
35
If Portb.0 = 1 Then
36
1timer = 1timer + 1
37
End If
38
39
If Portb.0 = 0 Then
40
Rc_value = 1timer
41
1timer = 0
42
End If
43
44
   If Rc_value > 32767 Then
45
   Portc.5 = 1
46
   Else
47
   Portc.5 = 0
48
   End If
49
50
Loop
51
52
End
53
Return

Fragt bitte nicht, wieso ich den Timer nachgebaut habe, ich habe 
ursprünglich den Systemeigenen verwendet, doch beim Durchprobieren bin 
ich bei dieser Variante gelandet.

Ich habe den Grenzwert für Rc_value in vielen Versuchen herausgefunden, 
doch mein Problem ist, dass dieser Wert sowohl bei minimaler als auch 
bei maximaler Knüppelstellung PORTC.5 einschaltet, bei einem um 1 
höheren Rc_value geht bei keiner Knüppelstellung mehr der Port an.

Meines Wissens hat ein Servosignal in den zwei Endstellungen einen 
Unterschied von ~1 Mhz, deswegen kann die Veränderung des Rc_value um 1 
eigentlich nicht das ganze Knüppelspektrum abdecken.

Könnt ihr mir vielleicht sagen, ob ich einen generellen Fehler gemacht 
habe, oder wodurch ich mein Problem lösen kann?

Vielen Dank im Vorraus,
nub

von STK500-Besitzer (Gast)


Lesenswert?

Du benutzt eine sehr genaue Zeitquelle

von Hannes L. (hannes)


Lesenswert?

Ein paar Beispiele in Bascom findest Du hier, da ist auch was mit 
Einlesen von Servoimpulsen dabei:

Beitrag "Re: BASCOM AVR - Problem mit den Outputs (ATMega 8 und STK500)"

...

von nub (Gast)


Lesenswert?

danke für die schnellen Antworten,
@ STK-500 Besitzer:
Was bedeutet das für mich?

@Hannes
Anhand solcher und ähnlicher Beispiele habe ich mir das Prinzip 
erarbeitet.
Auch dort ist kein grundlegend anderer Ansatz zu finden.

von STK500-Besitzer (Gast)


Lesenswert?

nub schrieb:
> danke für die schnellen Antworten,
> @ STK-500 Besitzer:
> Was bedeutet das für mich?
>
> @Hannes
> Anhand solcher und ähnlicher Beispiele habe ich mir das Prinzip
> erarbeitet.
> Auch dort ist kein grundlegend anderer Ansatz zu finden.

Doch. Es wird ein Timer verwendet, was zu einer genauen Zeitbasis 
fuehrt.

von Karl H. (kbuchegg)


Lesenswert?

Und um auf deine Frage zurückzukommen

Dim Rc_value As Integer

Integer hat 16 Bit. Also 15 Bit plus Vorzeichen.
Und mit 15 Bit kann man zählen bis ...... +32767

(Der genaue Wertebereich eines 16 Bit Integer mit Vorzeichen
 ist -32768 ... +32767)

von Hannes L. (hannes)


Lesenswert?

nub schrieb:
> @Hannes
> Anhand solcher und ähnlicher Beispiele habe ich mir das Prinzip
> erarbeitet.
> Auch dort ist kein grundlegend anderer Ansatz zu finden.

Dann schau doch mal hier:
http://www.hanneslux.de/avr/mobau/index.html
Die Programme sind zwar schon recht betagt, sollten Dir aber ein paar 
andere Ansätze zeigen.

Und noch was, das einfache Benutzen von Bascom mit dem Vorwissen von 
Basic auf dem PC bringt Dich nicht wirklich weiter. Du musst viel 
hardwarenäher denken als beim PC. Und dazu musst Du viel im Datenblatt 
des Controllers nachschlagen.

...

von Norbert S. (norberts)


Lesenswert?

Ach du elend, das ist mal wieder ein schönes Beispiel, warum Bascom so 
einen schlechten Ruf hat.

Das ist von vorne bis hinten totaler Bockmist. Nicht bloß schlecht 
sondern total abwegig.

nub schrieb:
> Ich habe den Grenzwert für Rc_value in vielen Versuchen herausgefunden,
> doch mein Problem ist, dass dieser Wert sowohl bei minimaler als auch
> bei maximaler Knüppelstellung PORTC.5 einschaltet, bei einem um 1
> höheren Rc_value geht bei keiner Knüppelstellung mehr der Port an.

Kann nicht sein, denn grösser als 32767 kann ein Integer nicht werden.
Das If Then kann nie eintreffen.

nub schrieb:
> Meines Wissens hat ein Servosignal in den zwei Endstellungen einen
> Unterschied von ~1 Mhz

1ms meinst Du. Das Signal ist 1-2ms lang.

Was glaubst Du wie lange der µC für die Schleife braucht?
Ach was, das ist alles so daneben, da sollte man nix zu sagen.

Eigentlich ist es ganz einfach:
1
Config Timer1 = Timer , Prescale = 8
2
Do
3
   If Portb.0 = 1 Then
4
      Timer1 = 0
5
      Start Timer1
6
      Do
7
      Loop Until Portb.0 = 0
8
      Stop Timer1
9
   End If
10
   If Timer 1 > 1500 Then Portc.5 = 1 Else Port C.5 = 0
11
Loop
Das ist extrem quick'n'dirty aber soll Dir nur das Prinzip aufzeigen.

Gruß,
Norbert

von H.Joachim S. (crazyhorse)


Lesenswert?

Hi Nobby :-)

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.