PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Auswertung Fernsteuerimpuls



drucker
10.04.2006, 16:54
Neueinsteiger in die Programmierung mit zwei Problemen
1. Ein High Impuls an irgend einem Pin sol einen Timer starten der beim Überlauf in einen Interupt springt. Klartext; Ein variabler Impuls von 1,0 bis 2.0 ms liegt etwa alle 20 ms an einen Pin an. Mit L-H startet der Timer der nach etwa 1,8 ms seinen Überlauf erreicht hat und nur beim überlauf in einen Interrupt springt. Ist der Impuls kürzer als 1,8 ms sol der Timer resetet werden.
Es kommt mir nur auf die Konfiguration des Timers an also im Programm ganz oben, nicht im Hauptprogramm. Das dürften nur zwei Zeilen sein aber wie ?
2. gibt es eine Möglichkeit soetwas wie Merker oder besser Schritmerker zu schreiben, ich denke soweit ich überhaupt noch denken kann das diese Merker die Grundlage für eine art schieberegister sind. Mit dem internen EEPROM wird das nichts bei der Geschwindigkeit.
mein Hauptproblem dürfte mangelnde Englischkenntnisse sein, also als Anhang, Datasheet für mega8 und tyni2313 in Deutsch such ich noch.
wen ich hier so lese was ansonsten abgeht werden bei meinen Problemen einiege grinsen.
also ich bin dankbar für jede Hilfe die ich kriegen kann.

Rainerd
10.04.2006, 22:32
Hallo drucker,

wenn ich Dich richtig verstanden habe, dann willst Du einen RC-Kanal abfragen und bei einer Pulsbreite von <1,8 ms den Timer neu starten, bei >=1,8 ms immer in die Interruptroutine springen ... ja ?

Ist soweit kein größerer Akt, aber dazu müsste man wissen, welche Taktfrequenz und welchen Timer Du dafür verwenden willst. Dann kann ich Dir auch die genauen Werte geben.

Gruß.
Rainer


Wenn Du Dir selber helfen willst, dann lade Dir mal das Tool hier runter. Das nimmt Dir die Berechnung des Timers komfortabel ab.
https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=169

drucker
11.04.2006, 07:22
Toll Wahnsin endlich mal jemand der mir auf die Sprünge hilft.
Also das tol ist sehr bequem sofil hab ich nicht erwartet. fur mich ist aber wichtieger wie ich dem Timer beibringen kann das er nur mit L-H anläuft mein Quarztakt ist 3,6864 MHz ich hab vor den Quarz wegzulassen fals der interne R-C Generator mit seiner stabilität reicht. aber dazu kann ich mich immer noch später entscheiden. Sin und zweck des ganzen ist letztendlich ein freier Kanal mit dem
1. schrit Positionslampen ein und Hecklampe blinkt, Toplampe ein
2. schrit Wegerechtslampe ein
3. schrit Deckstraler ein
4. schrit Blitzer an
und den rest der schritte dan eins nach dem anderen wieder ausschalten
eben wie ein schieberegister.
Ich erwarte auf keinen fall das mir jemand das programm schreibt ich brauche nur! die eins oder zwei zeilen für die timerkonfiguration
mit TCCR leg ich den prescaler fest
und irgendwie in TIMSK den rest, denk ich jedenfals
und für jeden schrit setze ich sowas wie einen schritmerker. wie das mit dem eeprom geht ist klar, writeeeprom und readeeprom da muß es aber noch andere speicher geben.
ok
danke drucker

Rainerd
11.04.2006, 15:04
Hi drucker,

ich glaube, Du musst das anders anpacken.
Entweder Du nimmst einen "Pin change" als Interrupt,


'Interrupt bei jedem Flankenwechsel (0->1 und 1->0)
Config Int0 = Change

oder Du arbeitest mit dem Befehl "PULSEIN" von Bascom, der genug Auflösung für Schaltaufgaben bietet.
Hier mal ein kleines Beispielprogramm von mir für einen ATTiny13-Positionslampenblinker (für einen Helikopter), der auf Schalterstellungen der Fernsteuerung reagiert .. nicht unbedingt elegant, aber funktioniert. Wenn man beim Einschalten die Fernsteuerung auf "100%" schaltet, kann man die Blinkfrequenz programmieren, die er dann in's EEProm schreibt. Vielleicht hilft's Dir ja was. ACHTUNG: Die "PULSEIN"-Werte sind von der Taktfrequenz abhängig !


'************************************************* *****
'Projekt: Blinker
'
'Prozessor: ATTiny13
'Bascom-Version: 1.11.8.2
'
'Programm : Positionslichter
'
'Hardware:
'RC-Input an Port B.0
'LED an Port B.1 Positionslichter (2) rot+grün statisch (max. 1A)
'LED an Port B.3 Flasher weiß alle 3 Zyklen (max. 1A)
'LED an Port B.4 Positionslichter (2) rot + grün blinkend jeder Zyklus (max. 1A)
'Schaltkanal an Port B.2 statisch (max. 1A)
'Alle Ausgänge auf Schalttransistoren
'
' (c) Rainer Distler, 15.02.2006
'
'************************************************* *****

'================================================= =====
'System-Einstellungen
'================================================= =====
'Definition für Tiny13
$regfile "attiny13.dat"

'Angabe der Taktfrequenz (1,2 Mhz) Gegenüber 9,6 MHz weniger Stromverbrauch
$crystal = 1200000
'Hardware-Stack verkleinern
$hwstack = 16

'================================================= =====
'Konfigurationen
'================================================= =====
Config Portb.0 = Input
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output
Config Portb.4 = Output
Config Portb.5 = Output



'================================================= =====
'Deklarationen
'================================================= =====
'
Dim Rc As Word
Dim Dummy As Byte
Dim Frequenz As Eram Word
Dim Frequenzmem As Word
Dim Timedummy As Word
Declare Sub Stufe2

'================================================= =====
'Initialisierungen
'================================================= =====
Const An = 1
Const Aus = 0
Led1 Alias Portb.1
Led3 Alias Portb.3
Led4 Alias Portb.4
Ausgang Alias Portb.2

'================================================= =====
'Hauptprogramm-Schleife
'================================================= =====
Waitms 3000
'Nach Anschluss der Versorgungsspannung 3 Sekunden warten. Wenn in dieser Zeit
'der RC-Kanal auf 100% geschalten wird, gelangt man in den Programmiermodus

Pulsein Rc , Pinb , 0 , 1
If Rc > 120 Then Goto Setfrequenz
Do

Pulsein Rc , Pinb , 0 , 1 'Messung Zeit zwischen 1 und 0 Pegel
If Rc <= 100 Then
Led1 = Aus
Led3 = Aus
Led4 = Aus
Ausgang = Aus
End If
If Rc > 100 And Rc < 110 Then
Led1 = An
Ausgang = Aus
End If
If Rc >= 110 And Rc <= 120 Then
Ausgang = Aus
Stufe2
End If
If Rc >= 120 Then
Ausgang = An
Stufe2
End If

Loop
'
'Programmende
End

Setfrequenz:
Frequenz = 80
Frequenzmem = 80
Do
Led1 = An 'Blinkende LED zeigt Frequenz an
Timedummy = Frequenz * 10
Waitms 50
Led1 = Aus
Waitms Timedummy
Pulsein Rc , Pinb , 0 , 1
If Rc < 100 Then Frequenzmem = 80 'Schaltkanal auf 0%
If Rc > 100 And Rc < 110 Then Frequenzmem = 100 'Schaltkanal auf 40%
If Rc > 110 And Rc < 120 Then Frequenzmem = 120 'Schaltkanal auf 80%
'Verhindern, das EEProm ständig neu beschrieben wird
If Frequenz <> Frequenzmem Then
Frequenz = Frequenzmem
End If
Loop

Sub Stufe2
Led1 = An
Incr Dummy
If Dummy = 3 Then
'Flasher alle 3 Zyklen
Dummy = 0
Led3 = An
Waitms 50
Led3 = Aus
Else
'Positionslichter doppelblinken jeden Zyklus
Led4 = An
Waitms 60
Led4 = Aus
Waitms 80
Led4 = An
Waitms 60
Led4 = Aus
End If
Timedummy = Frequenz * 10
Waitms Timedummy
End Sub


Gruß.
Rainer

drucker
11.04.2006, 20:02
von deinem programm versteh ich nicht mal die hälfte da werd ich wol noch lange brauchen um dahin zu kommen ich glaube ich sollte erst mal nur einfach spielen mit der materie die summe meiner arbeit siehst du hier'von 0 auf ein bischen funktionieren ? und alles irgendwo zusammengebraut.

drucker
11.04.2006, 20:09
ich blamier mich jetzt zwar egal, kann mir mal jemand erklären wie ihr das mit dem geschriebenen programm in dem fenster hingekriegt hab

Rainerd
11.04.2006, 20:36
von deinem programm versteh ich nicht mal die hälfte da werd ich wol noch lange brauchen um dahin zu kommen ich glaube ich sollte erst mal nur einfach spielen mit der materie die summe meiner arbeit siehst du hier'von 0 auf ein bischen funktionieren ? und alles irgendwo zusammengebraut.

Hmm .. schade. Dachte eigentlich, das Programm wäre genug Auskommentiert. Noch mehr wäre "overkill".
Gut, probieren wir es anders. So schnell geben wir nicht auf ;)

Der einzige Befehl, der eigentlich relevant ist, ist "Pulsein Rc , Pinb , 0 , 1"
Dieser Befehl sagt Bascom, daß Du einen Puls auf Port B, Pin 0, bei steigender Flanke messen willst (in meinem Beispiel) und diesen Wert dann der Variablen "RC" übergibt.
Bascom wartet nun auf einen Puls, misst den und gibt der Variablen "Rc" den gemessenen Wert.
Je nach Wert von Rc kannst Du jetzt bequem verzweigen.
Wie sich der Wert zusammensetzt kannst Du in der Bascom-Hilfe lesen.
Warum Du unbedingt einen Timer dafür "verschleudern" willst ist mir zwar ein Rätsel, aber kannst Du natürlich auch machen:


Pulsein Rc , Pinb , 0 , 1
If Rc<100 then ' Angenommen, der Wert 100 sind 1,8 ms Pulsdauer
Start Timer0
End If


Die andere Möglichkeit wäre:


Config Timer1 = Counter , Edge = Rising , Capture Edge = Rising , Prescale = 1024

Damit "verschenkst" Du aber den wertvollen 16-Bit-Timer für so eine einfache Anwendung und bist auf einen bestimmten Pin des AVR's angewiesen. Habe ich aber selbst noch nie benutzt, da noch nie gebraucht.
Man sollte Sachen nicht unnötig kompliziert machen.

Gruß.
Rainer

Rainerd
11.04.2006, 20:38
ich blamier mich jetzt zwar egal, kann mir mal jemand erklären wie ihr das mit dem geschriebenen programm in dem fenster hingekriegt hab

Einfach vor dem Programmtext "[ code]" und am Ende des Programmtextes "[ /code]" (ohne Anführungsstriche und Leerstelle)

drucker
11.04.2006, 21:15
Also aufgeben tu ich ganz bestimmt nicht ich brauche glaube ich erst mal ein polster von Grundlagen was mir fehlt. was das verschleudern von Timern anbelangt im moment egal aber nur im moment son avr bietet möglichkeiten die ich warscheinlich nie ausschöpfen werde.
zu deiner 1. lösung puls ein RC an welcher stelle im progrmm muß das rein? und ist mein lösungsweg soweit nutzbar oder prinzipiel mist?

Rainerd
11.04.2006, 22:18
Der "PULSEIN"-Befehl gehört in die Hauptschleife ... sollte ja relativ oft abgefragt werden, da man sonst die Signale der Fernsteuerung nicht mitkriegt.
Habe mir Dein Programm mal angesehen. Sieht unnötig kompliziert aus .. hab' eine Weile gebraucht bis ich den Zusammenang der ganzen "Merker" einigermaßen verstanden hatte. Nebenbei wirst Du wohl, wenn Du diesen Programmierstil beibehältst, dezente Probleme mit dem Speicherplatz auf dem 2313 kriegen.
Als erstes solltest Du Dich von der Vorstellung verabschieden, ein Schieberegister "nachbauen" zu wollen. Damit bleibst Du weit unter den Möglichkeiten und ist bei Deinem Projekt auch nicht zweckdienlich.
Dein Projekt ist direkt prädestiniert für klare Strukturen.
Mal ein paar Zeilen "Pseudocode" um das Prinzip zu erklären:


'in dieser Schleife bleiben wir bis die Hölle einfriert (oder Batterie leer ^^)
Do
Lese Wert vom RC-Kanalpin ein (RC)
'Zahl .. ist jetzt egal bei diesem Beispiel
If RC < 100 Then 'Wenn RC kleiner 100
Alle Lampen aus
End IF
If RC >=100 And RC < 110 THEN 'RC zwischen 100 und 109
Lampe 1 An
Lampe 2 Aus
Lampe 3 Aus
End If
If RC >=110 And RC < 120 Then 'RC zwischen 110 und 119
Lampe 1 An
Lampe 2 An
Lampe 3 Aus
End If
If RC >=120 Then 'RC größer oder gleich 120
Lampe 1 An
Lampe 2 An
Lampe 3 An
End If
Loop


Das wars auch schon. Gibt zwar bedeutend elegantere Lösungen, aber die würden Dich jetzt wohl nur verwirren.
Der Vorteil, das immer alle Lampen ein/ausgeschalten werden in jeder "If/Then"-Verzweigung ist (auch wenns nach verschwendung aussieht), daß Du Dich nicht mehr darum kümmern musst, die Lampen noch irgendwie auszuschalten. Du bewegst einfach Deinen Schalter, Regler, was weis ich an der FS und bei jedem Wert wird die richtige Kombination ein bzw. ausgeschalten .. also nichts mit "wenn alles an ist schalte ich alles wieder rückwärts aus".

drucker
12.04.2006, 19:33
Mein lieber lieber reinerd warum einfach wens kompliziert auch geht oder umgedreht ? wen ich das richtieg verstehe läuft deine lösung so ab , vorraussetzung Timer stimmt

1. grundstellung 1,5 ms es passiert nichts
2. bei irgendwo 1.3 ms alles aus
3. bei irgendwo 1,7 ms erster schrit ein (lampe eins an rest aus oder blinken) ganz wies beliebt
4. bei irgendwo 1,7 ms zweiter schrit ein (lampe eins und zwei an)rest aus
5. und so weiter. ist auch ne lösung wen ich sie richtieg verstanden hab und ich werde sie nutzen auf jedenfall bring ich das auf dieser basis zum spielen. da brauch ich dann auf jeden fall quarzgenauigkeit.
meine version kann ich mit capture T1 lösen,hab ich jedenfals rausbekommen, krieg ich auch noch irgendwie in den griff und wen ich dafür einen mega 128 nehmen muß, ich bin eben ein bastler und wils wissen. ich brauch nur etwas länger, bin ja noch in der grundausbildung mit meinen 48 jahren. jedenfals hab ich die letzten tage mehr gelernt als die ganzen wochen vorher. Das forum ist top und du ( ihr )seit spitze und ich werde euch oft besuchen.
irgendwan kann ich dann helfen. jetzt noch schnell nen serwotester frimeln
( mit CD 4093 ) und dann fummeln. ich meld mich wen alles spielt.
danke und frohe ostern.
drucker

Rainerd
13.04.2006, 01:44
Hallo drucker .. nur ran an den Speck .. sieht alles komplizierter aus als es ist.
Wenn ich das hier darf (sagt bescheid wenn nicht), dann habe ich hier mal einen Link für Dich. Habe da vor ein paar Wochen mit einem Einsteigerkurs für ATMEL's angefangen, der stark Modellbaulastig ist (da Modellbauforum). Was ich da in kürzester Zeit gelernt habe ist schon nicht mehr normal. Wir haben da z.B. ultragenaue und sehr schnelle Routinen zur Servoansteuerung erarbeitet (war ein Tal der Tränen, glaub's mir) usw.
Da wirst Du Dich als Elektroniker erst mal wohlfühlen (alles da .. Oszi-Diagramme, Logikanalyzer-Auswertungen, usw.).
Klar gibts hier in diesem Forum die totalen Freaks, die Dir JEDE Frage beantworten können .. aber oft kennt man die Frage ja schon gar nicht ;)
Guck' einfach mal rein .. ist ein netter Haufen dort.
http://www.rclineforum.de/forum/board.php?boardid=92&sid=
Wie gesagt .. ein reiner Anfängerkurs, wo sich Leute sogar darüber freuen können, wenn sie eine LED zum blinken gebracht haben (inkl. mir)

Gruß.
Rainer

drucker
13.04.2006, 16:37
Ich weis was ATMEL-sucht ist , das ist wen Ostern und weihnachten auf ein wochenende fällt. Danke für den link. das wird ja immer schlimmer. warum nur hat der tag nur 24 Stunden ok die pausen mach ich durch dann sinds mindestens 25 stunden.

drucker
24.04.2006, 17:30
Also das ist das erste Ergebnis eurer geduld mit mir, insbesondere der gedult von rainerd.
es darf gemeckert werden oder was auch immer.

Gruß
Drucker