Статистика
Время:
Зарегистрированных: 85219
Последним зарегистрирован: grub4
Рекорд посещаемости: 12585
Групп пользователей: 4
 Группы:
[Admin] [Cоучастник] [Автор] [Модератор]
 Сейчас на сайте
 Всего: 289
 Гостей: 256
 Анонимных: 2
 Пользователей: 31
 Зарегистрированные:
Dik mikesmv Gennadiy Tsukur Vodkin derba Konstantin z okzdp grub4 mihael Dukalis Rnog feliks delta1963 romal76 VZH_79 vladlen ded Толик89 михмих starikan74 unmoved Geo78 man_200 rx3apf Werewolf ut4uro vbifvbif kc2010 sapog svante cam

> Радиомаяки, трассеры. -> Мини лиса. док 3
Мини лиса. док 3
Die Peilung mit dem Simpel-Empfänger

Hochgezüchtete Peilempfänger von Funkamateuren haben Feldstärkemeßinstrumente und Dämpfungsregler am Antenneneingang. Das können und wollen wir uns beim Simpel-Empfänger nicht leisten, denn es geht auch so.

Bei unserer Peilung wird das Verhältnis des Fuchs-Signals zum UKW-Hintergrundrauschen einfach nach Gehör bestimmt. Mit der richtigen Peiltechnik geht das sehr gut.

Zeigt die Stabantenne genau zum Fuchs, dann ist der
Empfang am schwächsten und das Hintergrundrauschen
Fuchs Minimumpeilung wird stärker (Minimumpeilung). Zeigt die Antenne quer
zum Fuchs, dann ist der Empfang am besten und das


Rauschen am geringsten (Maximumpeilung).
In beiden Fällen steht die Richtung zum Fuchs erst nach
Maximumpeilung der Kreuzpeilung fest - es seie denn, man kann den
eigenen Körper als schattenbildendes Objekt einsetzen
;-)

image
Bei der Maximumpeilung zeigt der Reflektor (daran zu erkennen, daß er länger ist als der Dipol) vom Fuchs weg. Die Zeichnung zeigt, wie die Antenne ausgerichtet werden muß. Die Richtung stellt man fest, indem man in beide Richtungen peilt. Die Richtung mit dem besseren Empfang zeigt zum Fuchs.

Bei der Minimumpeilung, die quer zum Fuchs durchgeführt wird, ist die Richtung zum Fuchs nicht


Minimumpeilung rückwärts
Peilung bei Dipol mit Reflektor


bestimmbar. Im Fuchs-Nahfeld kann sie trotzdem nützlich sein und kann durch eine Rückwärtspeilung ergänzt werden.


Maximumpeilungen macht man, solange man noch weit vom Fuchs entfernt ist, denn dort ist der Fuchs bei Minimumpeilung oft gar nicht mehr zu empfangen. Man schwenkt die Antenne am besten rhytmisch um die Richtung mit dem besten Empfang (geringstes Rauschen) und verkleinert allmählich dabei den Schwenkwinkel bis man die genaue Richtung hat.

So bald wie möglich setzt man die Minimumpeilung ein, weil sich die Richtung damit viel besser bestimmen läßt. In unmittelbarer Nähe zum Fuchs bringt die Maximumpeilung ohnehin keine eindeutigen Ergebnisse mehr (die Richtung läßt sich höchstens noch durch Rückwärtspeilung feststellen).

Sobald das Fuchs-Signal sehr sehr kräftig wird (weniger als 3 Meter Entfernung zum Fuchs), wird auch die Minimumpeilung schwierig. In diesem Fall hilft aber noch die AGC (Automatic Gain Control, automatische Verstärkungsregelung) des Empfängers. Diese vermindert automatisch die Empfänger-Empfindlichkeit, sobald der Sender gut empfangen wird. Es kann ausgenutzt werden, daß die Regelung mit einer festen Zeit arbeitet. Zwischen den Morsezeichen regelt der Empfänger seine Empfindlichkeit wieder hoch und es ist ein Rauschen zwischen den Morsezeichen zu hören. Die Dauer der Rauschabschnitte ist um so größer, je schwächer der Fuchs empfangen wird. Das kann auch in unmittelbarer Nähe zum Fuchs zur Beurteilung herangezogen werden.

Der Fuchs-Sender

Beim Mini-Fuchs-Sender muß beachtet werden, daß er zwei Hauptabstrahlrichtungen hat. Die Strahlungsrichtung läßt sich am besten anhand einiger Zeichnungen erklären. Stellen wir uns dazu vor, wir hätten einige Fotos von einem Fuchsjäger beim Peilen gemacht:


image
Sender
Sender
Der Sender strahlt nicht zum Der Sender strahlt in
Fuchsjäger, sondern zum
Richtung Himmel und
Bildbetrachter hin.
Erde.


Es dürfte klar sein, daß man den Sender immer senkrecht (nicht liegend) betreiben sollte. Man muß aber damit leben, daß der Sender auch in senkrechter Lage in die falsche Richtung strahlen kann (wie im mittleren Bild).

image
120° 90° 60° Das Bild links zeigt die Abstrahlcharakteristik des Mini-Fuchs-Senders

in der Draufsicht. Die Funkwellen werden in Form von großen Kugeln

150° 30° abgestrahlt. Im grünen Bereich der Grafik ist der Sender optimal zu
empfangen, der Rest (quer zum Fuchs) ist "tote Zone", in denen der
180° 0° Sender nicht oder nur schwach zu empfangen ist. Das ist nicht gar so
dramatisch, aber man sollte die Existenz der zwei toten Zonen im

210° 330° Hinterkopf behalten. Deshalb hier noch einmal der Tip: Im Laufen
peilen! - Vielleicht ist der Fuchs schon nach wenigen Metern toter

240° 270° 300° Zone wieder gut zu empfangen...


Beim Verstecken des Fuchses muß außerdem beachtet werden, daß Funkwellen von allem abgeschirmt werden können, was elektrischen Strom leitet - und dazu gehört zum Beispiel auch nasses Gesträuch und Erde. Man meide also Stahlbeton und Gartenzäune, durchnäßte Mauern, Erdlöcher und Baumhöhlen (es seie denn der Baum ist trocken).

Zusammenfassung für den Fuchs:

• Ist die Batterie frisch? Funktioniert der Sender tadellos und mit voller Leistung?

• Der Fuchs darf nicht liegend betrieben werden, weil er dann in den Himmel strahlt.
• Gute Fuchs-Orte sind etwas erhöht und in ihrer Umgebung frei von schirmenden Gegenständen. Beispielsweise sind (erreichbare!) Baumzweige ein guter Ort für den Fuchs.
• Ein gutes Fuchsjagdgelände hat kein zu nasses Unterholz und keine Gebäude - es seie denn, man legt es genau darauf an.
• Nach dem Verstecken der Füchse prüft man stets den Empfang. Der Ort könnte schlecht sein, der Sender nicht in Ordnung oder die Kennung falsch.

Zusammenfassung für den Jäger:

• Ist die Batterie frisch? Funktioniert der Empfänger tadellos? Rauschen im Hörer reicht nicht, weil das Rauschen auch noch bei einer fast toten Batterie zu hören ist. Der Fuchs muß zu hören sein!
• Erst die Übung, danach der Wettkampf. Beim Üben kann man ruhig auch mal "Blinde Kuh" spielen, während der Fuchs für alle anderen gut zu sehen ist.

•Ist wirklich klar, in welcher Richtung die Antenne maximal empfängt und in welcher minimal?
• Gute Empfangsorte werden ermittelt, indem man im Gehen peilt. Erst dann stehenbleiben, wenn man einen guten Empfangsort hat.

Ergänzungen und FAQ

Lebensdauer der Batterie:

Die drei LR44-Knopfzellen sollen den Fuchs vor allem klein halten, ansonsten bin ich bei der Wahl dieser Zellen davon ausgegangen, daß man nicht jeden Tag eine Fuchsjagd macht. Falls doch (wirklich?), dann genau überlegen, was preiswerter ist: Ein Doppelpack (2 Zellen) LR44-Alkali kostet z.B. bei Conrad 50 Cent (3 Zellen also insgesamt 75 Cent). Alternativ kostet ein NiMH-Vierfach-Akku mit 4,8V zwischen 5 und 6 Euro. Das könnte sich lohnen, wenn man tatsächlich öfter eine Fuchsjagd vorhat - zumindest für die Fuchs-Sender. Außerdem hätte man den Vorteil, daß der Akku gelötet werden könnte. Beim Simpel-Empfänger halte ich Akkus aber für unrentabel.

Der Fuchs ist mit dem Simpel-Empfänger nur extrem schwach zu empfangen:

Batterie wechseln - und das ganze ist auch keine sogenannte dumme Frage:
Der Simpel-Empfänger arbeitet bei etwa 3,9 Volt noch korrekt, aber ab 3,8 Volt abwärts verliert er extrem an Empfindlichkeit. Das nach wie vor noch zu hörende UKW-Rauschen kann vortäuschen, daß der Empfänger noch korrekt arbeitet. Dieses Problem kann umgangen werden, indem man den Empfänger u.U. mit 4 LR44-Zellen betreibt (aber nicht mehr!).

Der Sender arbeitet bei Spannungen bis herunter zu etwa 3,6 Volt korrekt und verliert dann drastisch an Leistung. Bei etwa 3 bis 3,1 Volt findet man noch ein kleines "Hoch" und bei etwa 2,6 Volt ist auch dann nichts mehr zu hören, wenn man die Empfangsantenne direkt an den Fuchs hält.

Gibt es Sender und Empfänger auch fertig aufgebaut zu kaufen?

Neu: Da sich kein kommerzieller Hersteller finden wollte, habe ich die Fertigung in die eigene Hand genommen. Beide Geräte können in einer weiterentwickelten Form unter www.rowalt.de/mc/ im Bereich ”Shop” bestellt werden.

Muß man unbedingt WinAVR zum Brennen des AVRs nehmen?

Nein, wer einen anderen Programmer installiert hat, kann natürlich auch diesen nehmen. Die einzige Bedingung ist, daß man einen InSystem-Programmer verwendet (also einer, der den AVRs in der Zielschaltung brennen kann). Beispielsweise ist auch PonyProg (www.lancos.com) verwendbar oder das Atmel-STK500.

Wie sind die genauen Abmessungen der PCB-Antenne für den Fuchs-Sender?
Hier sind sie. Ich habe sie einer Micrel-ApplicationNote entnommen und dann von Inch in Millimeter umgerechnet.

(Inch * 25,4 = Millimeter)
Bei meinem Leiterplatten-Design in Sprint-Layout hatte ich die Originalzeichnung (!) von Micrel einfach als Bitmap hinterlegt und die Antenne darüber mit Leiterzügen nachgebildet. Da das bei meinen Füchsen gute Ergebnisse brachte, denke ich, daß die Abmessungen nicht ultrakritisch sind.

image
Optional: Eine LR44-Zelle Ich habe mir eine Batteriehalterung wie links
im Bild selbst gebaut. Wenn man ein recht-
Lage Klebeband- +so lang wie
eckiges Loch entsprechender Größe in die
Platine möglich!
Platine sägt, ergibt das eine sehr stabile
Halterung. Die Kupferstreifen kann man aus
Elektronik-Schrott gewinnen. Man sollte nicht
Kupferblech Kupferstreifen mit Lötzinn sparen. Besonders beim gebo-
genen Streifen sollte man darauf achten, daß


sich auch Zinn zwischen Platine und Kupfer-
streifen befindet. Das Lötzinn darf ruhig von der Platine auf die Kupferstreifen-Oberseite überlappen. Da die LR44-Knopfzellen je nach Hersteller leider nicht exakt gleich hoch sind, sollte man von vorn-herein etwas Toleranz einplanen. Das Löten der Kontaktbleche macht man am bequemsten, indem man die Kontakte zwischen einem Stapel alter LR44-Zellen einklemmt.

Ich habe noch nie mit SMD-Bauteilen gearbeitet...

Bei unserem Sender und Empfänger ist das kein Problem, weil alle Bauteile noch groß genug sind. Folgendes muß man wissen:

Beim Kauf: Bei den Widerständen und Keramik-Kondensatoren die Baugröße 0805 verlangen (der Händler weiß dann schon...). Diese Baugröße läßt sich noch sehr gut verarbeiten. Die kleinere Baugröße 0603 ist schon recht "fummelig". Bei den Elkos einfach die kleinsten nehmen, die es gibt. Das wird hier im Normalfall die Baugröße 1206 sein.
image
Werkzeug: Es wird nur eine Kreuzklemmpinzette und feiner Lötdraht benötigt. Der normale Lötkolben reicht, wenn er stets mit einem feuchten Schwamm von Zunder freigehalten wird.

Passive Bauteile löten: Erst ein Lötpad verzinnen, dann Bauteil einseitig anlöten, dann ggf. Lage noch einmal korrigieren und zum Schluß die andere Seite anlöten.

ICs löten: Ein Eck-Lötpad verzinnen, dann den zugehörigen Eck-Pin des ICs anlöten und danach ggf. noch einmal die Lage korrigieren. Dann wird der diagonal gegenüberliegende Pin gelötet. Die restlichen Pins werden zum Schluß der Reihe nach gelötet.

Das ist alles und überhaupt nicht schwierig. Wirklich!

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

;* Fox amateur radio transmitter with MICRF102 *
;* Roland Walter, DL7UNO, Mai 2002, www.rowalt.de *
;* Last update: 29.11.2002 *
;* Compiler: Atmel AVR Assembler *
;******************************************************************************* ;History:
;29.11.2002:

- Comparator switched out. By default the comparator is switched on and

consumes about 0.5mA so that we can save about 20%
;
;This program works well with both AT90S2343 and ATtiny12.
;ATiny12 is better: It's more cheap and has a MUCH more stabile RC oscillator. ;The best sub-types are ATtiny12L-4 (2,7...5,5V - 4MHz) and
;ATtiny12V-1 (1,8...5.5V - 1,2MHz).
;If You want to use the AT90x2343 You should take the AT90LS2343 because it has ;a better voltage range (2,7...6,0V instead of 4,0...6,0V).
;
;The AVR runs with the internal 1MHz RC oscillator. The program is based on ;this frequency.

;The AVR outputs Morse calls with a frequency of about 1KHz. The user can set ;the following parameters using three buttons:
1.) Morse call sign: MOE, MOI, MOS, MOH, MO5 or MO
These are the call signs allowed in Gernmany (regulation AFuV, 23.12.1997)

2.) The number of calls between longer pauses (3,4,5,6,7 or 8 calls)

3.) The length of the pause (0/30sec/1min/2min/5min/10min)

;The selection is done by repeated button pushing. The current settings are ;stored in EEPROM so that the selection is hold also without power supply. ;Above this as hidden feature it's possible to set extended values by ;manipulating the EEPROM content:

1.) The call sign is stored in EEPROM address 1. A value of 0 generates

the call sign MOE, a 1 generates MOI, a 2 generates MOS and so on up to

value 5 which generates MO. Setting a value of 254 (0xFE) results a

permanent tone of about 1KHz, setting a value of 255 (0xFF) results

sending without any modulation. The last two settings are intended for

measurement only because they are not allowed for Fox hunting.
Values between 6...253 are not defined.
2.) At EEPROM address 2 the number of calls is stored. Setting this byte

to the value 0 generates 3 repeated calls, setting 1 results 4 calls,

setting 2 results 5 calls and so on. The maximum possible number of

calls is 255+3=258
3.) At EEPROM address 3 the pause length is stored. The first 6 addresses

(0...5) are IDs with the following meaning:
0=Off, 1=30sec, 2=1min, 3=2min, 4=5min, 5=10min
Values between 6...255 are interpreted as timing factor for the pause

length. The formula is: Value*10=PauseLength (in seconds). For example

a value of 10 results a pause of 10*10=100sec (1:40min) and a value of

51 results 42*10=420sec (4:00 minutes). Note that the pause length is

not very precise because it's based on a RC oscillator. The exact value

depends on the tempreature and power supply voltage. The values are

designated for 4,5 volts and 20°C. In a practical with 20°C and 4,5V

I got for the value 70 (700sec) a real pause of 694sec (20°C, 4,5V) using

the ATtiny12.
;
;The program is not optimized for elegance or what else but for simlicity so ;that also beginners get a chance to make changes. For example I haven't used ;any interrupt and the button states are determined by simple polling.

;By the way: Polling of button pins gives more flexibility for the I/O pin ;assignement.
;
;Further AVR hints:
;AT90S2343 and ATtiny12 you can see as to be pin compatible for our case. ;But an important difference between these devices is that the ATtiny12 has no
;SRAM but a 3-level-deep hardware stack only. Also the AT90S2343 has more flash ;and EEPROM memory. So if You want to rewrite the program in a high-level ;languge such as Bascom it's better not to use the ATtiny12.

;When burning be carefull with the Fuse bits. Normally the Fuse bits factory ;settings must not be changed. If You need some Fuse changes keep in mind that ;for example the SPIEN bit disables further programming and the RSTDISBL Fuse ;bit (ATtiny12) disables the reset pin which also disables further programming.

;
;MICRF102 hints:
;The MICRF102 is controlled by to wires:
; 1.) ASK data output: 1=Transmit, 0=NotTransmit
; 2.) Standby output: 1=ActiveMode, 0=StandbyMode (<0.04uA only)
;
;Power supply:
;I have used three LR44 alkaline cells which give 4,5 Volts together. The RC ;oscillator timing is based on this voltage. The LR44 cells have a capacity ;of about 120mAh (SR44 is more expensive but hase 165mAh).

;The absolute minimum voltage is 3,8 volts. Below there is no stabile operation ;possible. The maximum voltage (factory datasheet) is 6 volts. I have made a ;10 minutes "crashtest" using 8 volts without damages so it should also be ;possible to use a single 4LR44 battery as power supply which gives 6 volts

;(105mAh). Note that the external power resistors of the MICRF102 are optimized
;for use with 4,5V. For 6 volts operation You can save a bit current when You
;use other resistor values.
;*******************************************************************************
;Choose the right AVR here:
.include "tn12def.inc" ;Device: ATtiny12
;.include "2343def.inc" ;Device: AT90S2343
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;Constant settings:
;
;I/O pin assignment:
;Roland's old PCB layout:
;.equ MORSE_PIN = 0 ;PB0: ASK data (Morse) output to MICRF102
;.equ CALLSIGN_PIN = 4 ;PB4: Call sign button (MO,MOE,MOI,MOS,MOH,MO5)
;.equ STANDBY_PIN = 1 ;PB1: Standby output to MICRF102
;.equ NUMCALLS_PIN = 3 ;PB3: Number of calls between pauses (3,4,5,6,7,8)
;.equ PAUSE_PIN = 2 ;PB2: Pause between a group of calls (0/30sec/1min/2min/5min/10min)
;
.equ MORSE_PIN = 4 ;PB4: ASK data (Morse) output to MICRF102
.equ STANDBY_PIN = 3 ;PB3: Standby output to MICRF102
.equ CALLSIGN_PIN = 0 ;PB0: Call sign button (MO,MOE,MOI,MOS,MOH,MO5)
.equ NUMCALLS_PIN = 1 ;PB1: Number of calls between pauses (3,4,5,6,7,8)
.equ PAUSE_PIN = 2 ;PB2: Pause between a group of calls (0/30sec/1min/2min/5min/10min)
;
;
;Taste and habit depending settings:
.equ TONE_FREQU = 160 ;Morse tone frequency (recommended: 160)
.equ LENGTH_DIT = 80 ;Length of a Morse "Dit" (recommended: 100)
.equ LENGTH_DA = 240 ;Length of a Morse "Da" (must be 3 times of "Dit")
;
;IDs for the variable FoxCallsign:
.equ CALL_MOE = 0 ;Send Fox call sign "MOE"
.equ CALL_MOI = 1 ;Send Fox call sign "MOI"
.equ CALL_MOS = 2 ;Send Fox call sign "MOS"
.equ CALL_MOH = 3 ;Send Fox call sign "MOH"
.equ CALL_MO5 = 4 ;Send Fox call sign "MO5"
.equ CALL_MO = 5 ;Send Fox call sign "MO"
.equ CALL_TONE = 254 ;Send 1KHz tone only (hidden mode)
.equ CALL_CARRIER = 255 ;Send carrier only without modulation (hidden mode)
;
;IDs for the variable NumCalls:
.equ NCALLS_3 = 0 ;Send Fox call sign 3 times between longer pauses
.equ NCALLS_4 = 1 ;Send Fox call sign 4 times between longer pauses
.equ NCALLS_5 = 2 ;Send Fox call sign 5 times between longer pauses
.equ NCALLS_6 = 3 ;Send Fox call sign 6 times between longer pauses
.equ NCALLS_7 = 4 ;Send Fox call sign 7 times between longer pauses
.equ NCALLS_8 = 5 ;Send Fox call sign 8 times between longer pauses
;
;IDs for the variable LenSilence:
.equ SILENCE_NO = 0 ;No silence period
.equ SILENCE_30SEC = 1 ;Silence period of 30 seconds
.equ SILENCE_1MIN = 2 ;Silence period of 1 minute
.equ SILENCE_2MIN = 3 ;Silence period of 2 minutes
.equ SILENCE_5MIN = 4 ;Silence period of 5 minutes
.equ SILENCE_10MIN = 5 ;Silence period of 10 minutes
;
;EEPROM addresses (where the user settings are stored):
.equ EEADR_CALL = 1 ;Address of the Fox call sign ID (a CALL_... value)
.equ EEADR_NCALLS = 2 ;Number of calls between pauses (0...5==>3...8 calls)
.equ EEADR_LENSILENCE = 3 ;Length of the pause, see variable LenSilence
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;Declare the variables:
.def Temp = r16 ;For general use
.def TempCount1 = r17 ;For delay loops
.def TempCount2 = r18 ;For delay loops
.def TempCount3 = r19 ;For delay loops
.def TempCount4 = r20 ;For delay loops
.def FoxCallsign = r21 ;Holds current used Morse code (0=MOE, 1=MOI and so on)
.def NumCalls = r22 ;Holds the number of calls between the silence periods
.def TempNumCalls = r23 ;Holds the number of calls just done in a period
.def LenSilence = r24 ;Holds the length of the silence periods
.def RespFrequ = r25 ;Receives the tone frequency for the routine ResponseDit
.def CurrentID = r26 ;Receives the current ID (Call sign, Pause, nCalls)
;*******************************************************************************
.cseg ;Begin of Code segment
.org 0 ;Address 0 is the Reset vector
rjmp Reset
.org 3 ;Skip the interrupt vectors (not really necessary but we do it)
;*******************************************************************************
Reset:
;The next two instructions are for AT90S2343 only, comment out for ATtiny12:
;Initialize stack pointer:
;ldi Temp,RAMEND ;RAMEND: Not with ATtiny12, because it has no SRAM
;out SPL,Temp ;SP: Not with ATtiny12, which has hardware stack only

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

;
sbi ACSR,ACD ;Switch out comparator; saves about 0.5mA (20% !!!)

;
;Load the user settings from EEPROM now:
;
;The second byte of the EEPROM (address 1) contains the FoxCallsign ID

ldi Temp,EEADR_CALL ;Load EEPROM address of FoxCallsign value
out EEAR,Temp ;Copy address into EEPROM address register

sbi EECR,EERE ;Set EEPROM Control Register to read access

in FoxCallsign,EEDR ;Read EEPROM byte into the FoxCallsign variable

;
;The third byte of the EEPROM (address 2) contains the number of calls

;which are to send immediately repeated. After a period of silence follows.

ldi Temp,EEADR_NCALLS ;Load EEPROM address of NumCalls value
out EEAR,Temp ;Copy address into EEPROM address register

sbi EECR,EERE ;Set EEPROM Control Register to read access

in NumCalls,EEDR ;Read EEPROM byte into the NumCalls variable

;
;Now we set the length of the silence period between the set number of ;immediately sent Fox calls. The Silence routine contains a detailed ;description of the value.
ldi Temp,EEADR_LENSILENCE ;Load EEPROM address of LenSilence value
out EEAR,Temp ;Copy address into EEPROM address register
sbi EECR,EERE ;Set EEPROM Control Register to read access
in LenSilence,EEDR ;Read EEPROM byte into the NumCalls variable
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;Pin usage configuration:
;Set the button pins to input (0), all other output (1)
ldi Temp,0b11111111 ;First we set all pins to output (1)
out DDRB,Temp ;Load the value into the DataDirectionRegisterB
cbi DDRB,CALLSIGN_PIN ;Set the Call sign selection pin to input (0)
cbi DDRB,NUMCALLS_PIN ;Set the NumberOfCalls selection pin to input (0)
cbi DDRB,PAUSE_PIN ;Set the Pause selection pin to input (0)
;
;Now activate PullUp for button input pins and set all other pins to 0:
ldi Temp,0b00000000 ;Reset all pins to 0
out PORTB,Temp ;Load the value into the PORTB register
sbi PORTB,CALLSIGN_PIN ;Set Call sign input pin to 1 (activate PullUp)

sbi PORTB,NUMCALLS_PIN ;Set NumberOfCalls input pin to 1 (activate PullUp) sbi PORTB,PAUSE_PIN ;Set Pause input pin to 1 (activate PullUp)

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

;Configure the the sleep mode:
;ldi Temp,0b00000000 ;No sleep mode

;out MCUCR,Temp ;Set the value to the MCU Control Register MCUCR ;******************************************************************************* ;Before we go into Main loop we check whether the variable FoxCallsign is set ;for one of the hidden special modes. If so we don't enter the main loop and ;execute a special code:
cpi FoxCallsign,254
brlo MainLoop ;<254: No hidden mode selected, execute main loop rjmp HiddenModes

;******************************************************************************* MainLoop:
;

ldi TempNumCalls,3 ;The number of calls is 3,4,5,6,7 or 8

add TempNumCalls,NumCalls ;(Re)set the number of calls to make in a period MainLoopPeriod:

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

;Generate Morse character "M": Da Da rcall Da

rcall DitSilence rcall Da
;
rcall DaSilence
;
;Generate Morse character "O": Da Da Da rcall Da

rcall DitSilence rcall Da
rcall DitSilence rcall Da
;
rcall DaSilence
;
;The last Morse character depends on the user settings.
;
cpi FoxCallsign,CALL_MO ;FoxCallsign MO ==> no more tones, skip rest breq GenerateMO

cpi FoxCallsign,CALL_MOE ;FoxCallsign MOE ==> Rest: Dit breq GenerateMOE

cpi FoxCallsign,CALL_MOI ;FoxCallsign MOI ==> Rest: Dit Dit breq GenerateMOI

cpi FoxCallsign,CALL_MOS ;FoxCallsign MOS ==> Rest: Dit Dit Dit

breq GenerateMOS

cpi FoxCallsign,CALL_MOH ;FoxCallsign MOH ==> Rest: Dit Dit Dit Dit
breq GenerateMOH

cpi FoxCallsign,CALL_MO5 ;FoxCallsign MO5 ==> Rest: Dit Dit Dit Dit Dit
brsh GenerateMO5
GenerateMO5:
rcall Dit
rcall DitSilence
GenerateMOH:
rcall Dit
rcall DitSilence
GenerateMOS:
rcall Dit
rcall DitSilence
GenerateMOI:
rcall Dit
rcall DitSilence
GenerateMOE:
rcall Dit
GenerateMO:
;
rcall StandbyMode
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

;Now check wheter we have done the number of calls per period or not:
dec TempNumCalls
brne MainLoopPeriod ;Number of calls per period is not done, next call
;The group of calls is finished if we reach this position
rcall Silence ;Generate a silence period
;
rjmp MainLoop
;*******************************************************************************
;Button handler routine; changes the EEPROM content and performs reset
CheckButtons:
sbis PINB,CALLSIGN_PIN ;Is the "Call sign" button pushed?
rjmp CheckButtonCallsign ;Jump to the CheckButtonCallsign routine
sbis PINB,NUMCALLS_PIN ;Is the "Number of calls" button pushed?
rjmp CheckButtonNumCalls ;Jump to the CheckButtonNumCalls routine
sbis PINB,PAUSE_PIN ;Is the "Pause length" button pushed?
rjmp CheckButtonPause ;Jump to the CheckButtonPause routine
rjmp DoneCheckButtons ;No button pushed, leave the routine
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CheckButtonCallsign: ;Routine for the "CAll sign" button
inc FoxCallsign
cpi FoxCallsign,6 ;FoxCallsign must be 0...5
brlo DoneCallsignCorr ;Skip next line if FoxCallsign is <6
ldi FoxCallsign,0 ;Reset callsign ID to 0
DoneCallsignCorr:
;
;Write the new FoxCallsign ID into EEPROM:
ldi Temp,EEADR_CALL ;Load EEPROM address for the Fox call sign ID
out EEAR,Temp ;Copy address into EEPROM address register
out EEDR,FoxCallsign ;Load the FoxCallsign content into EEPROM data buffer
sbi EECR,EEMWE ;Enable EEPROM write access
sbi EECR,EEWE ;Write the loaded byte into EEPROM
;
mov CurrentID,FoxCallsign ;The response tone below needs ID in variable CurrentID
rjmp CheckButtonsEnd ;Job done, give response tone and let restart the AVR
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CheckButtonNumCalls: ;Routine for the "Number of calls" button
inc NumCalls
cpi NumCalls,6 ;NumCalls must be 0...5 (results 3...8 calls)
brlo DoneNumCallsCorr ;Skip next line if NumCalls is <6
ldi NumCalls,0 ;Reset number of calls ID to 0
DoneNumCallsCorr:
;
;Write the new number of calls ID value into EEPROM:
ldi Temp,EEADR_NCALLS ;Load EEPROM address for the number of calls
out EEAR,Temp ;Copy address into EEPROM address register
out EEDR,NumCalls ;Load the NumCalls content into EEPROM data buffer
sbi EECR,EEMWE ;Enable EEPROM write access
sbi EECR,EEWE ;Write the loaded byte into EEPROM
;
mov CurrentID,NumCalls ;The response tone below needs ID in variable CurrentID
rjmp CheckButtonsEnd ;Job done, give response tone and let restart the AVR
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CheckButtonPause: ;Routine for the "Length of pause" button
inc LenSilence
cpi LenSilence,6 ;LenSilence must be 0...5
brlo DoneLenSilenceCorr ;Skip next line if LenSilence is <6
ldi LenSilence,0 ;Reset length of pause ID to 0
DoneLenSilenceCorr:
;
;Write the new number of calls ID value into EEPROM:
ldi Temp,EEADR_LENSILENCE ;Load EEPROM address for the pause length








    РадиоКОТ - популярно об электронике. Авторские схемы, новые разработки. Обучение по электронике, микроконтроллерам, ПЛИС. Форум   banner DIPTRACE - САМЫЙ ЛУЧШИЙ ТАКСИРОВЩИК ПЕЧАТНЫХ ПЛАТ
Portal-X