Servo-Signal auslesen mit Atmega 8 - wo liegt der Fehler?

Gast #2482335
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
Gast #2482475
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.
Gast #2482519
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.
#2482534
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.

...
#2482564
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren