PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ortungspieper mit ATtiny13 für Modell-Elektrosegler



hegewald
07.09.2011, 08:33
Hallo an alle Modellflieger,
habe mit Pic 12Cxxx etwa 10 Stück von den Ortungspiepern erstellt. Nun dachte ich, dieses Thema
mit einem 8 poligen tiny13 aufzubauen. Bin noch Anfänger und sags gleich vorraus "meine Englischkenntnisse=0".
Bitte nicht mit dem Hinweis "ins Datenblatt schauen"! habe mir Bücher in Deutsch zugelegt.
Angefangen mit den AVR hats mit einem Lernpacket vom Franzis-Verlag, hinzugekommen ist eine
Programmiereinheit von myAVR, die ich über die ISP Schnittstelle erweitert habe.
Über die Funktionsweise des Ortungspiepers (OP) werde ich später berichten, es würde jetzt zu weit führen.

Als ersten Test habe ich mit Bascom eine IF / ELSE / ENDIF Routiene aufgebaut und komme hier nicht weiter.
Sofort nach Zugeben der Versorgung blinkt die LED an PortB.0 obwohl keine Taste betätigt ist.
Ich meinte zu wissen, das:
wenn keine Taste gedrückt, wird zwischen Else und Endif abgearbeitet, (Input=High / Pullupp aktiviert)
wenn Taste gedrückt, wird zwischen If und Else abgearbeitet.
Rein vom logischen dürfte die LED doch nicht blinken, wo hab ich nur einen Denkfehler!

'Datei-Name: tinypieper00.bas

'Datum: 03.09.2011

'Zielsetzung:Ortungspieper für 20/30/40 Minuten

'Taste "Test" für Testbetrieb an PB3 Pin 2
'Schalter "Sw1" für 20 Min. an PB4 Pin 3
'Schalter "Sw2" für 30 Min. an PB1 Pin 6
'Schalter "Sw3" für 40 Min. an PB2 Pin 7
'Ausgang an PB0 Pin 5

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

'Angabe der Taktfrequenz
$crystal = 1000000


'Konfiguration Ausgang / Eingänge:
'================================================= =====
'PORTB.0 als Output
Piep Alias Portb.0
Config Piep = Output


Test Alias Pinb.3
Config Test = Input
Portb.3 = 1


Sw1 Alias Pinb.4
Config Sw1 = Input
Portb.4 = 1

Sw2 Alias Pinb.1
Config Sw2 = Input
Portb.1 = 1

Sw3 Alias Pinb.2
Config Sw3 = Input
Portb.2 = 1

'Hauptprogramm-Schleife

Do
Abfrage:
If Test = 0 Then
Goto Piepen
Else
Goto Zeit1
End If

Zeit1:
If Sw1 = 0 Then
Goto Piepen
Else
Goto Zeit2
End If

Zeit2:
If Sw2 = 0 Then
Goto Piepen
Else
Goto Zeit3
End If

Zeit3:
If Sw3 = 0 Then
Goto Piepen
Else
Goto Abfrage
End If

Loop

Piepen:
Piep = 1
Wait 1
Piep = 0
Wait 1
Goto Piepen

Grüße

Rolf

Sauerbruch
07.09.2011, 09:51
Moin Rolf,

vom reinen Code her würde ich auf den ersten Blick auch sagen, dass das Programm eigentlich in der "Piepen"-Schleife landen müsste, wenn keiner der vier Taster geschlossen wird. Auch wenn man den Code hier & da noch etwas verschlanken könnte - aber darum geht´s im Moment ja (noch) nicht :-)

Ich hatte einmal ein ähnliches Problem, als ganz am Anfang des Programms (noch vor der Do-Loop-Schleife) ein komplettes Byte mittels DIP-Schalter eingestellt und eingelesen werden sollte. Dabei kamen auch ganz andere Werte heraus, als mit dem Schalter eingestellt wurden.

Das Problem ließ sich beheben, indem ich nach der Aktivierung der PullUp-Widerstände eine kurze Wartezeit programmiert habe (waitms 50). Irgendwie scheinen sich diese High-Pegel nicht unmittelbar sofort einzustellen, warum weiß ich auch nicht genau, denn die Zeitkonstante aus dem PullUp-Widerstand und der Eingangskapazität ist schon sehr kurz. Aber nach dieser kleinen initialen Pause ging´s einwandfrei: Taster offen = 1, Taster geschlossen = 0.

Versuch´s einfach mal!


Gruß,

Daniel

hegewald
07.09.2011, 10:24
Hallo Daniel,
danke für Deine Antwort!

Habe Waitms 50 hinzu gefügt, leider nichts...es blinkt und blinkt.
Das Ganze sieht jetzt in der Konfiguration der Eingänge so aus:

Test Alias Pinb.3
Config Test = Input
Portb.3 = 1
Waitms 50

Sw1 Alias Pinb.4
Config Sw1 = Input
Portb.4 = 1
Waitms 50

Sw2 Alias Pinb.1
Config Sw2 = Input
Portb.1 = 1
Waitms 50

Sw3 Alias Pinb.2
Config Sw3 = Input
Portb.2 = 1
Waitms 50

Grüße

Rolf

Sauerbruch
07.09.2011, 11:00
Wie seltsam... dann hilft es wohl nur noch, das Problem etwas systematischer "einzukreisen".

Dazu würde ich mal als erstes überprüfen, ob das Zusammenspiel zwischen Tastern und Eingangspegeln auch ordentlich funktioniert:



$regfile "attiny13.dat"
$crystal = 1000000

Piep Alias Portb.0
Config Piep = Output

Test Alias Pinb.3
Config Test = Input
Portb.3 = 1

Do
Piep = Test
Loop



Das ganze prüft natürlich nur einen Eingang, müsste also ggf. noch mit den anderen 3 Eingängen wiederholt werden. Aber dann weißt Du schon mal ob´s gleich schon an den Eingängen scheitert, oder doch noch ein Problem im Code steckt (das ich aber nach wie vor nicht sehe).

hegewald
07.09.2011, 11:44
Hallo Daniel,
hab mich gleich ran gemacht und die Pegel an den Eingängen gemessen.
Siehe da, Deine Vermutung lag richtig!
an Portb.1 (definiert als Sw2) lagen etwa 1,xx Volt!
Der Grund ist nicht der Taster noch der Pin-Eingang...sondern:
Hier muß ich nochmal zurück greifen, um das Ganze zu verstehen.
Ich legte mir eine myAVR zu. Der Sockel ist aber nur gedacht für Atmega8 (28 pol.)
da sich hier eine 10 pol. ISP Schnittstelle befand, habe ich auf einer Lochrasterkarte
einen Sockel für tiny13 aufgelötet und die Steuerleitungen (MISO/MOSI/SCK mit Vers.) rüber geführt.
Damit haute die Programm. hin. Im Betrieb dann aber das Kabel von der myAVR dran gelassen. Hier muß
mir die myAVR das High-Signal runter gezogen haben.
Das kabel abgenommen und der Pegel lag sauber bei 5 Volt.
Aber jetzt geht es erst richtig ins Eingemachte, denn ich benötige 3 Zeiten (20/30/40 Minuten)
Und die sollte ich mit Timer 0 und Interrupt realisieren.
Bevor es aber weiter geht, werde ich den Ortungspieper näher erklären.

Danke nochmal

Grüße
Rolf

Sauerbruch
07.09.2011, 11:53
Na, das ist doch schon mal ein guter Anfang!
Dann bin ich mal gespannt auf Details zum Ortungspiepser - aber die genannten Aufgaben müssten sich mit einem Tiny13 problemlos realisieren lassen!

hegewald
12.09.2011, 12:35
Hallo Daniel,
vorab gezielte Frage, bevor ich ins Eingemachte gehe.

"Kennst Du Dich mit Timer vom ATmega8 aus?"

Wenn ja komme ich drauf zurück.

Grüße

Rolf

peterfido
12.09.2011, 14:58
Bei 4 MHZ (Mega32) reichen bei meiner Multiplextastatur 3 NOPS aus, damit sie zuverlässig läuft.



reset portb.3
config portb.3=output
nop
nop
nop

if pinb.4=0 then 'Taste gedrückt
endif

if pinb.5=0 then 'Taste gedrückt
endif

config portb.3 = input
set portb.3
... mit nächsten Pin von vorn...

Läuft zuverlässig. Ohne die Nops werden die ersten Tasten nicht zuverlässig erkannt

Timer sind sehr gut in der Hilfe erklärt. Ich nutze gern einen 1ms oder für längere Zeiträume 10ms Timerdurchläufe. Diese dann einfach zählen und so die Zeitdifferenz ermitteln. Englischkenntnisse sind klar von Vorteil.

Ich habe grad leider kein Bascom für Codeschnipsel hier.... Wenn Du die Bascom internen Uhrroutinen nutzt, kannst Du mit Sectic=... eine Sub angeben, welche jede Sekunde aufgerufen wird.

mat-sche
12.09.2011, 17:04
Hi,

schau mal im Forum und in der Hilfe nach dem Befehl: debounce nach. Dieser Befehl ist sehr gut zum Tastendruck mit Entprellung gedacht.

Gruß MAT

hegewald
13.09.2011, 09:05
Hallo an alle Modellflieger,
bevor ich das Thema "Timer" anspreche ein paar Worte zum Ortungspieper.
Seit Jahren haben wir auf dem Platz immer wieder Abstürze, wo Modelle in Maisfelder, im Wald, oder auf Bäumen
hängen bleiben. Letztere sind oft schwer auszumachen, da man sie in Bäumen schwer findet.
Die Käuflichen Pieper arbeiten nach dem Prinziep "Sender ausstellen, es ertönt ein Ton im Intervall.
(Mit PCM-Empfängern geht das schon garnicht, mit 2,4 GHz Anlage auch nicht). Es kommt oft vor, daß trotz
Sender ausmachen von dem Ton nichts zu hören ist, das Modell ist weit weg vom Standort gelandet, es liegt
also ausserhalb der Tonreichweite. Man fährt gefrustet nach Hause.
Das brachte mich vor 3 Jahren auf die Idee, das Prinziep "Sender ausmachen" anders zu gestalten.
Mit einem Controller PIC der 12 Reihe baute ich eine neue Gangart auf.
Auf der Lochrasterkarte befindet sich eine Taste "Reset" / eine Taste "Test" / 3 Dip-Schalter / der PIC
und diverse SMD-Bauteile. Der Pieper wird an der Aussenwand des Modells montiert.
Die Funktion im einzelnen:
alle 3 DIP-Schalter stehen zu Beginn auf OPEN...
das Modul wird an einen freien Empfängerkanal angesteckt, um mit ca. 5 Volt versorgt zu werden....
Modell scharf machen....der Piper bleibt ruhig....
Nur einmalig die Taste "Test" betätigen, der Intervallton beginnt zu piepen, d.h. alles ist ok, Taste "Reset"
der Ton erlischt. (Dieser Ablauf wird nur getätigt, um alles zu kontrollieren).
Modell wieder entschärfen....
Jetzt kommt die Wahl des DIP-Schalters Sw1 oder Sw2 oder Sw3
Sw1 ist gedacht für 20 Minuten (zu empfehlen für Hotliner oder auch Motormodelle).
Sw2 ist gedacht für 30 Minuten (zu empfehlen für Segler mittlere Spannweite).
Sw3 ist gedacht für 40 Minuten (für Segler größerer Spannweite).
2 St. habe ich für Leute an der Wasserkuppe erstellt mit 60 Minuten.
Also, d.h. man entscheitet sich, welcher Swx auf ON gestellt wird.
Modell scharf machen und jetzt läuft die gewählte Zeit x ab, danach beginnt der Pieper im Intervall.
Ich habe Modelle nach 14 Tagen wieder bekommen, da Pilzsammler oder Reiter dem Ton nachgegangen
sind und das Telefon klingelte.
Ist der Absturz so stark, daß die Batt. zerstört wird, dann hilft natürlich kein Pieper mehr.
Aber wie ich schon schrieb, haben wir oder andere Leute in Bäumen das Modell gefunden.
Nun wollte ich das Ganze mit einem Tiny13 aufbauen. Das Proplem sind die Zeiten 20, 30, 40 Minuten
Bzw. besitzt der Tiny13 einen Timer1 oder würdet Ihr lieber einen anderen 8 Beiner nehmen.
Mein Englisch ist Null und habe jetzt mit über 70 Jahren keine Lust mehr zum lernen.

Ich hoffe, ich hab es verständlich geschildert

Viele Grüße

Rolf

Hallo Daniel, meine Frage an Dich hätte ich mir sparen können, wenn ich sehe welche Hilfe Du
anderen anbietest!

Richard
13.09.2011, 14:44
Schon einmal an so etwas gedacht? http://zft.de/peil1.htm ein Modell kann ja recht teuer sein..in diesem Link ist die Reichweite nicht optimal, aber der normale Flieger wird ja in etwas die Richtung kennen wo das Modell "abhanden" gekommen ist?

Gruß Richard

Arkon
13.09.2011, 15:08
Der Tiny13 hat einen 8-bit Timer. Den TIMER0. Ich kenne mich jetzt in Bascom gar nicht, und in C nur ein wenig, aus, aber die Programmierung sollte eigentlich keine große Aufgabe sein.

Ich würde den Timer mit dem höchst möglichen Prescaler initialisieren. Bei jedem Überlauf einen Zähler inkrementieren und bei Bedarf den Pieper starten.

So lange der Controller nen Timer hat dürfte es egal sein, welchen Typ du genau verwendest. Denn die Aufgaben die du bisher beschrieben hast dürften Alle ohne Probleme lösen können.

oberallgeier
13.09.2011, 17:16
Hallo Rolf,

was für ein pfiffiges Projekt *ggg*
... Das Proplem sind die Zeiten 20, 30, 40 Minuten ...Der Tiny13 hat, im Unterschied zu den meisten anderen Controllern, drei interne Oszillatoren. Der langsamste schwingt mit 128 kHz. Bei dieser Frequenz kannst Du den herunter bis 1,8 Volt betreiben, dabei frisst der Kleine (NUR der Controller) im aktiven Modus 240 µA. Den Watchdog kannst Du so programmieren (Clock/1024), dass der Controller fast ne halbe Sekunde verschläft und dann überlegt, ob die 40 Minuten vergangen sind *ggg* - sprich: im Aktivmodus von rund 5000 runterzählen (40 min * 60 sec/min * 2 Aktivzeiten/sec => 4800) und er hat die 40 Minuten. In den Pausen schläft er (Sleep Modus) und frisst dabei (NUR der Controller) weniger als 0,1 µA bei 1,8 V. Fazit: Aufgabe machbar, mit Sleep Modus wird Energie gespart - da müssen die Modelle nur noch gegen frühzeitigen Käferbefall oder Fäulnis gesichert werden *ggg*.

Viel Erfolg mit dem Projekt!

Für den Fall, dass Du für den Tiny13 doch noch das Datenblatt suchst (Lektüre ist dringend zu empfehlen - leider) dann hier klicken. (http://www.atmel.com/dyn/resources/prod_documents/doc2535.pdf)

Offtopic: das nächste Mal werde ich beim Gleitschirmfliegen auf der Wasserkuppe mein Vario ausschalten - vielleicht hör ich es dann im Wald piepsen. Offtopic zu Ende

hegewald
13.09.2011, 18:41
Hallo Richard,
das größte Problem sind die Bäume!
Selbst wenn Du weist, in welcher Richtung er runter gekommen ist,
Dir tut dann bald der Nacken weh...nach oben suchen zu wollen.

Danke für die Antworten!

Grüße

Rolf

Sauerbruch
13.09.2011, 21:18
Hallo Rolf,

umzugsbedingt war ich ein paar Tage offline - ich lebe zwar immer noch mit, aus und in Kartons, aber der Internet-Zugang geht wenigstens schon mal :-)

Ehrlich gesagt, würde ich das Problem auch nach der "Sender-Aus"-Methode lösen... Was die Servo-Impulse anbetrifft dürfte es doch nicht den geringsten Unterschied machen, ob eine Anlage auf 35 MHz, 2,4 GHz oder welcher Frequenz auch immer sendet, und ob sie AM ( :-) ), FM oder PCM als Modulationsverfahren verwendet - ALLE Servos dieser Welt brauchen Rechteckimpulse mit einer Impulslänge zwischen 1 und 2 ms, und die muss JEDER Empfänger liefern. Und genau da würde ich den Hebel ansetzen: Kommt für eine bestimmte Zeit (z.B. 10 Sekunden) dieser Impuls nicht mehr, wird der Pieper aktiviert. Das einzige wirkliche Hindernis könnten vielleicht solche hypermodernen Empfänger sein, die auch nach Verlust des Sendersignals die letzte korrekt empfangene Impulsfolge weiter an die Servos ausgeben. Aber so etwas ist glaube ich noch keineswegs der Standard.

Und wenn gekaufte Schaltungen diese (einfache!) Aufgabe nicht zuverlässig lösen können, würde mich das nur anspornen, einen besseren Code zu schreiben :-)

Aber das nur am Rande. Die Sache mit den vorgesehenen Zeiten lässt sich sicher lösen!

Bei der ja bereits erwähnten stromsparenden Taktfrequenz von 128 kHz läuft der 8bit-Timer alle 2ms über. Du könntest also z.B. im Timer-Interrupt eine Word-Variable um 1 hochzählen lassen. In der Hauptschleife wird diese Variable abgefragt; wenn sie 30.000 erreicht hat ist eine Minute rum, und eine entsprechende zweite Minuten-Variable wird um 1 inkrementiert. Dann muss nur noch überprüft werden, ob die vorgewählte Anzahl an Minuten schon erreicht ist, und gegebenenfalls der Pieper aktiviert werden.

Als bekennendes Spielkalb kommen mir aber gerade noch ein paar Ideen, wie man das Ding noch komfortabler machen könnte. Wie wär´s denn mit frei einstellbaren Zeitspannen (z.B. in 10-Minuten-Schritten) und einem einzigen Taster zur Bedienung? Nach dem Einschalten könnte man mit kurzen Tastendrücken die Zeit um jeweils 10 Minuten erhöhen (z.B. 4 Drücke = 40 Minuten), und durch einen langen Tastendruck dem Controller sagen, dass man fertig ist und er diesen Wert speichern soll.

Mit was hast Du denn die kleinen PICs programmiert?

Grüße,

Daniel

Arkon
13.09.2011, 22:19
ALLE Servos dieser Welt brauchen Rechteckimpulse mit einer Impulslänge zwischen 1 und 2 ms, und die muss JEDER Empfänger liefern. Und genau da würde ich den Hebel ansetzen: Kommt für eine bestimmte Zeit (z.B. 10 Sekunden) dieser Impuls nicht mehr, wird der Pieper aktiviert. Das einzige wirkliche Hindernis könnten vielleicht solche hypermodernen Empfänger sein, die auch nach Verlust des Sendersignals die letzte korrekt empfangene Impulsfolge weiter an die Servos ausgeben. Aber so etwas ist glaube ich noch keineswegs der Standard.

Robbe/Futabe bewerben grade stark ihr Bus-System. Dies ist zwar hautpsächlich für große Modelle mit vielen Funktionen gedacht aber kann auch in kleinen Maschinen eingesetzt werden. Diese arbeiten mit "Digital-Servos" mit anderen Zeiten für HIGH- und LOW-Pegel arbeiten. Diese sind aber noch recht neu.

Die Funktion, dass der Empfänger auch bei Abbruch der Funkverbindung zum Sender noch Signale an die Servos sendet, nennt sich FailSave und ist bei halbwegs modernen Sender/Empfänger standart.

Man könnte aber z.B. einen Kanal überwachen, welcher im Flug "viel" benutzt wird, z.B. Querruder. Auf diesem Kanal überprüft man eine bestimmte Zeit lang ob sich das Signal ändert. Wenn jetzt z.B. 15 Sekunden lang keine Änderung auf dem Kanal auftritt wird der Pieper ausgelöst, weil man davon ausgehen kann, dass das Model den Kampf mit der Schwerkraft verloren hat.

hegewald
14.09.2011, 08:21
Eure Ideen haben gewiss Vorteile und Nachteile:
zu Daniel....vor mir liegt ein PCM-Empfänger von Graupner "smc16 scan 35"
mit nen Skop waren auf allen Kanälen feine Nadelimpulse im ySec. Bereich sichtbar, obwohl Sender aus und
Fail Save nicht aktiv war.
Bei PPM Empfängern ist nichts zu sehen. Bei Jeti 2,4 GHz bin ich mir nicht so sicher.
Die käuflichen Pieper reagieren nicht, wenn der Sender aus ist.
Zum anderen verschwindet das Modul im Rumpf und man kümmert sich nicht mehr darum. Oftmals käme man
nicht so eben mal ran, um eine Taste zu drücken.
Ich würde sagen, daß mit den 3 Zeiten hat sich schon bewährt.
so war es mit den PIC:

#include<p12f675.inc>

__config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_ON

radix dec ;alle nicht defin. Werte, z.B HIGH 1300 dezimal
;Configurationsergebnis =

;************************************************* **********************************

;Variable Definition (nach Anwendung anpassen)


CBLOCK 0x20 ;erste RAM Adresse = 20h anwählen
SEKUNDEN_HIGH ;20h Variablen auf Spalte 1 setzen (Col 1)
SEKUNDEN_LOW ;21h
LOOP1 ;22h
LOOP2 ;23h
LOOP3 ;24h
ENDC ;mit ENDC unbedingt abschließen
;************************************************* **********************************


org 0x00 ;Reset ab Adresse 0

;Vorbereitung:

movlw 0x3F ;B'0011 1111'
movwf CMCON ;GP0-GP5 = digital (Bank0)
bsf STATUS,RP0 ;Bank 1
errorlevel -302
movlw B'111011' ;GP0/1/3/4/5 = Input=1
;GP2 = Output=0
movwf TRISIO ;Register in Bank1
movlw B'110011' ;GP-Eingänge mit Pull-Up Widerst.=1
movwf WPU ;Register in Bank1
bcf OPTION_REG,7 ;GPPU-Bit 7 auf Null setzen
call 0x3FF ;springe zur Adresse 3FFh und hole ins W-Reg.
;da liegt der Inhalt vom Hersteller und
;Rückkehrbefehl retlw
movwf OSCCAL ;Inhalt vom W-Register ins Register OSCCAL
;interner Oszillator wird kalibriert.
bcf STATUS,RP0 ;Bank 0
errorlevel +302
clrf GPIO ;Wichtig, Register definitiv auf Null setzen!

;Adresse Befehl Operand Kommentar

begin goto abfrage

abfrage btfss GPIO,1 ;Taste "Test",springe wenn Test offen(GP1=High)
goto blinken
btfss GPIO,4 ;Taste "S1",springe wenn S1 offen(GP4=High)
goto vorber1
btfss GPIO,0 ;Taste "S2",springe wenn S2 offen(GP0=High)
goto vorber2
btfss GPIO,5 ;Taste "S3",springe wenn S3 offen(GP5=High)
goto vorber3
goto abfrage


blinken bsf GPIO,2 ;Output GP2 = HIGH, Pieper EIN
call impuls ;Impulszeit ca. 3Sek.
bcf GPIO,2 ;Output GP2 = LOW, Pieper AUS
call pause ;Pausenzeit ca. 5 Sek.
goto blinken

impuls movlw H'FF' ;Achtung: für"'" richtige Taste(#) verwenden!
movwf LOOP1
movlw H'FF'
movwf LOOP2 ;impuls-Zeitroutiene = 0,8 Sec.
movlw H'04'
movwf LOOP3

blink decfsz LOOP1,F ;Sprung, wenn LOOP1 = 0
goto blink
decfsz LOOP2,F ;Sprung, wenn LOOP2 = 0
goto blink
decfsz LOOP3,F ;Sprung, wenn LOOP3 = 0
goto blink
retlw 0 ;CALL-Rücksprung (Impuls)

pause movlw H'FF'
movwf LOOP1
movlw H'FF'
movwf LOOP2 ;pause-Zeitroutiene = 3,2 Sec.
movlw H'10'
movwf LOOP3

gehe0 decfsz LOOP1,F ;Sprung, wenn LOOP1 = 0
goto gehe0
decfsz LOOP2,F ;Sprung, wenn LOOP2 = 0
goto gehe0
decfsz LOOP3,F ;Sprung, wenn LOOP3 = 0
goto gehe0
retlw 0 ;CALL-Rücksprung, Ende der Pausenzeit.

;************************************************* *************************

vorber1 movlw HIGH 1200 ;Zeitschleife = 20 Minuten
movwf SEKUNDEN_HIGH ;gemessen = 1201 Sec.
movlw LOW 1200
movwf SEKUNDEN_LOW
call warten
goto blinken


warten incf SEKUNDEN_LOW,F ;Inhalt+1 (Inkrementieren)
incf SEKUNDEN_HIGH,F


warten1 decfsz SEKUNDEN_LOW,F ;dekrement (-1 springe wenn 0)
goto warten2 ;Sprung zur 1 Sekunden-Schleife
decfsz SEKUNDEN_HIGH,F
goto warten2
retlw 0 ;Rückkehr zum blinken

warten2 movlw H'FF'
movwf LOOP1
movlw H'FF'
movwf LOOP2
movlw H'05'
movwf LOOP3

gehe decfsz LOOP1,F ;Sprung, wenn LOOP1 = 0
goto gehe
decfsz LOOP2,F ;Sprung, wenn LOOP2 = 0
goto gehe
decfsz LOOP3,F ;Sprung, wenn LOOP3 = 0
goto gehe
goto warten1

;************************************************* *****************************

vorber2 movlw HIGH 1800 ;Zeitschleife = 30 Minuten
movwf SEKUNDEN_HIGH ;gemessen = 1802 Sec.
movlw LOW 1800
movwf SEKUNDEN_LOW
call hallo
goto blinken


hallo incf SEKUNDEN_LOW,F ;Inhalt+1 (Inkrementieren)
incf SEKUNDEN_HIGH,F


hallo1 decfsz SEKUNDEN_LOW,F ;dekrement (-1 springe wenn 0)
goto hallo2
decfsz SEKUNDEN_HIGH,F
goto hallo2
retlw 0

hallo2 movlw H'FF'
movwf LOOP1
movlw H'FF'
movwf LOOP2
movlw H'05'
movwf LOOP3

laufe decfsz LOOP1,F ;Sprung, wenn LOOP1 = 0
goto laufe
decfsz LOOP2,F ;Sprung, wenn LOOP2 = 0
goto laufe
decfsz LOOP3,F ;Sprung, wenn LOOP3 = 0
goto laufe
goto hallo1

;************************************************* *********************************

vorber3 movlw HIGH 2400 ;Zeitschleife = 40 Minuten
movwf SEKUNDEN_HIGH ;gemessen = 2402 Sec.
movlw LOW 2400
movwf SEKUNDEN_LOW
call gisela
goto blinken


gisela incf SEKUNDEN_LOW,F ;Inhalt+1 (Inkrementieren)
incf SEKUNDEN_HIGH,F


gisela1 decfsz SEKUNDEN_LOW,F ;dekrement (-1 springe wenn 0)
goto gisela2
decfsz SEKUNDEN_HIGH,F
goto gisela2
retlw 0

gisela2 movlw H'FF'
movwf LOOP1
movlw H'FF'
movwf LOOP2
movlw H'05'
movwf LOOP3

springe decfsz LOOP1,F ;Sprung, wenn LOOP1 = 0
goto springe
decfsz LOOP2,F ;Sprung, wenn LOOP2 = 0
goto springe
decfsz LOOP3,F ;Sprung, wenn LOOP3 = 0
goto springe
goto gisela1
org 0x3FF
retlw 0x80
end

oberallgeier
14.09.2011, 08:23
... Kommt für eine bestimmte Zeit (z.B. 10 Sekunden) dieser Impuls nicht mehr, wird der Pieper aktiviert ...Das finde ich einen guten Ansatz, allerdings sind die zehn Sekunden nicht wirklich realistisch - wer sucht sein Modell schon nach zehn Sekunden? Hier ist die eingestellte Piepspause sicher ein besseres Maß. Für den Fall, dass ein Kanal für den Piepser frei ist ergibt sich ja eine ziemlich triviale Lösung: Fliegen: Signal (d.h. "Servo") Anschlag eine Seite, Verlust: Anschlag andere Seite. Ich denke für die übliche Vollbelegung der Kanäle an eine andere Lösung.

Voraussetzung ist, dass das Modell nicht aus dem Sendebereich herausfliegt - das ist heutzutage eigentlich schon zu erwarten. Dann horcht der Piepser auf - beispielsweise - das Höhenruder. Selbst bei extremen Kunstflügen dürfte eine Sequenz von "Knüppel voll ziehen - voll drücken" im Sekundentakt für, sagen wir mal, zehn Mal wirklich nicht vorkommen. Da bräuchte der Pieps-Controller nur auf diese Sequenz zu hören - und schon weiß er, wann er angesprochen ist . . . oder?

Nachtrag: Wenn die Signalanalyse der Servosignale Probleme macht, kann die zuletzt genannte Lösung auch mithilfe von zwei Mikrotastern realisiert werden, die an die Servohalterung oder sonstwie montiert sind und die Servo-Endstellung z.B. am Servohorn abfragen. Beispiel siehe Bild.

http://www.csd-electronics.de/de/groups/g_186/images/ipic_1079.jpg
Mini - Taster 3,5 x 6 mm Artikelpreis: 0.15 EUR

Sauerbruch
14.09.2011, 09:20
Okay - ich dachte, dass die Geschichte mit dem Taster vor jedem Start erfolgen soll, aber jetzt ist mir alles soweit klar. Und außerdem wirst Du Dir über die "features" der Schaltung ja auch schon gute Gedanken gemacht haben. Aber ein´ hab ich noch: Mit 3 DIP-Schaltern könnte man ja theoretisch nicht nur 3, sondern 8 Zeiten codieren...

Und mit getrennten "Test"- und "Reset"-Tastern werden die Pins knapp: Beim Tiny13 (und allen anderen 8-Beinern) kann man nur 5 Pins nutzen, weil 2 für die Versorgungsspannung und einer als Reset-Eingang reserviert sind.

Der PIC-Programmcode kam mir so vor, wie Dir wahrscheinlich Englisch :-) - trotzdem vielen Dank!

Ist den die Zuordnung von den einzelnen DIP-Schaltern, dem Taster und dem Piepser zu den Pins des Controllers fest (so wie in Deinem ersten Posting), oder wäre da noch etwas veränderbar?

Grüße,

Daniel