PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM Signal auslesen



Baby2b
27.10.2006, 12:46
Hallo,

ich möchte gerne ein PWM Signal aus einem Fernsteuerungsempfänger auslesen. Mit Bascom und RN-Control. Hab aber keine Idee wie ich das machen soll. Vermute irgendwie mit Timer und Counter. Hab viel probiert aber nichts hat funktioniert. Hat von Euch jemand sowas schon mal gemacht und kann mir auf die Sprünge helfen??

Gruß

Andreas

hütti
30.10.2006, 12:59
hi

guckst du hier :

http://www.rclineforum.de/forum/board.php?boardid=94

ciao

hütti

Baby2b
30.10.2006, 13:57
Hi Hütti,

danke für den Tipp. Kannte ich noch gar nicht dieses Forum.

Gruß

Andreas

hütti
30.10.2006, 20:54
fast vergessen, da es ein nachtrag ist :

http://www.rclineforum.de/forum/thread.php?threadid=106272&sid=d8bcfdeb3efebef3b18e819d4195838f

Baby2b
08.11.2006, 14:11
Hi,
ich beschäftige mich immer noch mit dem Problem ein die Kanäle eines RC-Empfängers auszulesen. Hab jetzt (dank Hüttis Tipp) im RC-Line Forum einen hübschen kleinen Programmschnipsel gefunden (dank an den Autor Werner...der damit aber auch noch seine Probleme hat). Damit läst sich über INT0 schön ein Empfängerkanal auswerten. Jetzt habe ich versucht mit ebenfalls mit TIMER1 und über INT1 einen zweitren Kanal auszuwerten. Das Klapp gar nicht. Ich geb hier mal Werners Programmschnipsel zum besten. Hat jemand ne Idee wie man hier noch einen Zweiten Kanal auslesen kann???

Gruß

Andreas


*** Programm-Anfang ***
'D2 == Int0
'D3 == Int1

$regfile = "m32def.dat"
$crystal = 16000000
$lib "lcd4.lbx"


Dim Switch As Bit
Dim A As Long
Dim B As Long

On Int0 Abfrage
Config Int0 = Rising
Config Timer1 = Counter , Prescale = 1

Enable Int0
Enable Interrupts

do
Cls
Lcd "Timer0:" ; A

Lowerline
Lcd "Puls" ; B
Waitms 5
loop
End

'Interrupt-----------------------
Abfrage:

If Switch = 0 Then Goto Alf Else Goto Otto


Alf:

Timer1 = 0
Start Timer1
Config Int0 = Falling
Switch = 1
Goto Ende

Otto:

Stop Timer1
A = Timer1
Config Int0 = Rising
Switch = 0
Timer1 = 0

Ende:
Return
*** Programm-Ende ***

hütti
08.11.2006, 16:07
hi
in deinem prog sehe ich nur INT0 keinen INT1?
dann sehe ich noch timer 0 ?? bei variable A ???
und wo wird der wert des timers in variable B eingetragen ??

ciao

hütti

Baby2b
11.11.2006, 21:19
..wie gesagt , ist nicht mein Programm, ist von Werner aus dem RC-Line Forum. Ist noch nicht ganz fertig..... Das mit Timer 0 und B kannst Du vergessen. Timer1 , Int0 und A gehören zusammen und funktionieren auch zusammen gut. Das ganze geht auch mit Timer1 und Int1, aber nicht mit Timer1 und Int0 und Int1 (wär schön, weil dann könnte ich zwei Servokanäle auslesen). Hierfür suche ich ne Lösung. Einen Kanal kann ich mit Werners Programm gut auslesen, Zwei geht gar nicht!

Hütti has Du ne Idee wie man so was macht??

Gruß
Andreas

hütti
11.11.2006, 22:00
meinst du 2 kanäle aus einem impulstelegramm, wo z.b.
8 kanäle hintereinander ausgegeben werden, sprich das was
aus einem fernsteuersender kommt?
oder 2 eingänge, wo 2 getrennte signale ankommen ?

Baby2b
13.11.2006, 16:11
2 Eingänge wo 2 getrennte Signale ankommen

Gruß

Andreas

hütti
13.11.2006, 16:44
du willst mit einem timer und 2 interrupts 2 getrennte signale
auslesen ? das geht nicht, pro timer ein signal.
der timer wird gestartet wenn das signal auf H geht und gestoppt wenn
es auf L geht . der timer-wert ist dann dein gewünschtes ergebnis.
bei 2 signalen würde das stoppen und starten durcheinander gehen
wenn die impulse gleichzeitig kommen.
wenn jedoch garantiert ist das die impulse nie gleichzeitig anliegen,
und immer puls A als erstes kommt, zeitlich danach der puls B,
dann geht es, musst aber das programm umschreiben, das nacheinander
int0 und int1 abgefragt werden.

ciao

hütti

Baby2b
13.11.2006, 19:15
Ja, habs auch mit Timer 1 und Timer0 probiert. Geht nicht. Die Timer haben unterschiedliche Eigenschaften und mit Timer0 krieg ichs nicht hin. Int1 und Int0 , beide auf Timer1 legen klappt nicht wie du gerade gesagt hast,. Die Impules kommen parallel, nicht seriell! Hab mir jetzt einen ausweg gesucht und lese die Signale einzelnd ein, auf zwei verschiedenen Controllern. Anschließend schick ich ein Ergebniss per Software-Uart zum andern rüber. Ging ganz gut, bis ich den Befehl "Servo Config..." in das Programm des empfangenden Controllers eingebaut habe. Danach funktionierte mein Software-Uart nicht mehr........ zu dem Problem habe ich gesondert im Forum nach Hilfe gefragt.

Hütti, dank Dir für Deine Anteilnahme an meinen Problemen.

Gruß
Andreas

jeffrey
13.11.2006, 20:24
hi,
noch ne möglichkeit mehrere signale mit einem timer auszulesen wäre einen timerinterrupt zu verwenden, und dann alle pins abfragen, an denen die signale anliegen abfragen, dann ist der controller damit aber ziemlich ausgelastet.
mfg jeffrey

hütti
13.11.2006, 20:25
config servos benutzt den timer 0 !
der befehl taugt nichts, wirst von problemen lesen, wenn du
im forum suchst.
die timer 0 und 2 sind gleich, sprich 8 bit
der timer 1 hat 10bit
also int0 auf timer 0 und int1 auf timer2 legen
die software ist im prinzip jedes mal die gleiche, nur
auf die int/timer/variablen von kanal 1 und 2 angepasst.
das muss gehen!
mit einem mega8 lese ich mit timer1 einen servokanal aus
und gebe die pulse direkt per timer0 wieder an ein servo aus.
gleichzeitig wird mit timer2 eine PWM erzeugt.
das geht einwandfrei.

Baby2b
13.11.2006, 21:02
hmmm, werds mal probieren. Aber im Moment klappt es nur mit Timer1. Timer0 funktioniert auch garnicht. Timer 2 hab ich noch nicht probiert. Also werds gleich mal mit Timer2 probieren....wird ne lange Nacht

Baby2b
14.11.2006, 13:14
....no Way!! ich kriegs nicht hin. Es geht nur ein Servokanal einzulesen.
Hütti,
kannst Du mal zeigen wie Du einen Kanal einliest und wieder rausgibst. Da kann ich bestimmt was über Timer lernen.

Gruß

Andreas

Guy
15.11.2006, 10:59
Du kannst zum Beispiel den Timer einfach durchlaufen lassen ohne ihn zu stoppen. Und dann anstelle von Start und Stop die währte auslesen. Das selbe machst du mit dem zweiten Kanal, aber mit dem gleichen Timer.

Mit freundlichen Grüßen
Guy

Baby2b
15.11.2006, 17:22
Hallo Guy,

werd ich auch mal probieren, aber erst mal habe ich das Problem gelöst. Lag daran das ich mit Timer 0 und Timer1 gearbeitet habe. Haben beide unterschiedliche Auflösungen. Ich habe den Prescaler für Timer0 auf 256 hochgezogen und schon sind sinnvolle und weiterverarbeitbare Werte rausgekommen.
Euch allen Danke für die Tipps!

Gruß

Andreas

Baby2b
15.11.2006, 17:40
Hallo Guy,

werd ich auch mal probieren, aber erst mal habe ich das Problem gelöst. Lag daran das ich mit Timer 0 und Timer1 gearbeitet habe. Haben beide unterschiedliche Auflösungen. Ich habe den Prescaler für Timer0 auf 256 hochgezogen und schon sind sinnvolle und weiterverarbeitbare Werte rausgekommen.
Euch allen Danke für die Tipps!

Gruß

Andreas

hütti
15.11.2006, 19:32
prima das es noch geklappt hat. weiter oben hatte ich aber schon
geschrieben das es 8 und 10bit timer gibt.

viel spass !!!

hütti


ps.
wenn man einen timer durchlaufen lässt und dann nur die werte
von einander abzieht, geht es . was aber passiert wenn der timer
"innerhalb" des impulses überläuft? bei 8 bit ist dann z.b. der
timerwert bei steigender impulsflanke 220 und bei fallender 4.
das gäbe dann ne schöne fehlmessung.
die dann per soft "ausblenden" oder gibt es da nen besseren trick ?

jeffrey
16.11.2006, 00:45
hi,
ne intelligentere methode wählen, als nur abziehen, indem sich z.b. nen merker setzt, der wird bei beginn der messung auf 0 gesetzt, bei nem überlauf auf 1, dann kann man das bei der berechnung berrücksichtigen, und anstatt 4 mit 260 rechnen, und schon stimmt das ergebnis wieder.
mfg jeffrey

Baby2b
16.11.2006, 15:54
hmm, hört sich schön an, ich wüßte aber nicht wie ich das im Programm machen sollte, bin halt noch ziemlicher Neuling auf dem Gebiet. Ein kleines Programmbeispiel wär toll, dann sieht man wie sowas gemacht wird und kann draus lernen.

Gruß

Andreas

jeffrey
16.11.2006, 16:54
hi,
du machst für jeden servo einen merker. der wird wenn der wert des des timers beim start des impulses gespeicher wird auf 0 gesetzt. bei einem timer overflow lässt du einen interrupt auslösen, in der isr werden dann alle merker auf 1 gesetzt. wird nun bei fallender flanke der neue timerwert ausgelesen, wird überprüft, ob der entsprechnde merker 1 ist, ist das der fall, weißt du, dass während des impulses ein timerüberlauf stattgefunden hat.
mfg jeffrey

Baby2b
18.11.2006, 19:42
.....toll, aber wie gesagt ich bin "Neuling" und hab echt nicht viel Ahnung von der Thematik (bisher)
Wie mache ich eine Merker?
Wie lasse ich einen Interrupt auslösen ?
Was ist ISR ( Männlich , weiblich...oder kann man das essen?)
Kleine praktische programmbeispiele sind für mich am besten zum lernen. Füttert mich mit sowas und ich werde es begierig verschlingen.

Gruß

Andreas

jeffrey
18.11.2006, 23:21
hi,
ein merker ist einfach eine hilfsvariable. isr: interrup service routine
bei bascom sind im orner samples viele programmbeispie dabei, hier der ausschnitt zum timer interrupt:


'when the timer overflows, a flag named TOV0 in register TIFR is set
'You can use this to execute an ISR
'To reset the flag manual in non ISR mode you must write a 1 to the bit position
'in TIFR:
Set Tifr.1



'The following code shows how to use the TIMER0 in interrupt mode
'The code is block remarked with '( en ')

'(

'Configute the timer to use the clock divided by 1024
Config Timer0 = Timer , Prescale = 1024

'Define the ISR handler
On Ovf0 Tim0_isr
'you may also use TIMER0 for OVF0, it is the same

Enable Timer0 ' enable the timer interrupt
Enable Interrupts 'allow interrupts to occur
Do
'your program goes here
Loop

'the following code is executed when the timer rolls over
Tim0_isr:
Print "*";
Return

')


mfg jeffrey

Baby2b
20.11.2006, 12:03
Hey Jeffrey,

danke, ich werd mich damit beschäftigen.

Gruß

Andreas

hütti
20.11.2006, 17:46
du solltest dir erstmal hier im roboternetz.de im bereich wissen die
beispielprogramme/code für bascom durchlesen, dann haben sich
die meisten fragen erledigt, auch für anfänger. guckst du :

https://www.roboternetz.de/wissen/index.php/Bascom_und_Timer