Forum: Mikrocontroller und Digitale Elektronik Anfängerfrage zu Variablen und Timer


von Bernd Maier (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

Erst mal ein Lob an die Seite und die Forumsteilnehmer. Ist erste
Klasse hier! Ich hab seit ein paar Tagen ein STK500 mit einem at90s8515
und bin eifrig am experimentieren.

Also, meine Fragen. Ich möchte 2 Variablen vertauschen. Gibt es da
einen Befehl der wie SWAP arbeitet aber nur halt mit Variablen?
Momentan behelfe ich mit mit dem Konstrukt:

cpi loops,loops1 ;vergleiche wert loops mir loops1
brne else1 ;ist loops != loops1 springe zu else1
ldi loops,loops2 ;schreibe wert von loops2 in loops
rjmp endif1 ;springe zum ende der if-konstruktion
else1:
ldi loops,loops1 ;schreibe wert von loops1 in loops
endif1:

Das nächste ist der MOV Befehl. Movt der wirklich oder macht der ein
Copy? Also wenn ich mov r16,r17 mache, steht dann in beiden Registern
das selbe oder ist r17 nach dem mov-befehl leer?

Dann eine generelle Frage. Ich will schlußendlich mit meinem at90s8515
ein Servos steuern können. Um das zu erreichen brauch ich ja ein
PWM-Signal. Dieses Signal setze ich mit dem Timer und dem
Timer-Interrupt zusammen. Momentan ist mein Testprogramm soweit, dass
ich ein LED asyncron blinken lassen kann. Also 1 Sekunde an, 2 Sekunden
aus. Im Prinzip ist dass ja schon das PWM-Signal. Ok...das funktioniert
auch. Nur...wenn ich 2 Servos ansteuern will....wie geh ich denn dann
vor? Der Timer ist ja schon belegt für das 1. Servo bzw LED in meinem
Testprogramm. MAch ich da einen Denkfehler?

Mein Testprogramm hab ich mal mit angehängt....vielleicht hat ja jemand
die Muse es sich mal anzusehen und Tipps bzgl. eines 2. Servos/LEDs.

danke vorab an alle...

so long, Bernd

von Bernd Maier (Gast)


Lesenswert?

sorry....jetzt noch ne Frage :-)

in einem Timer-Beispiel hab ich gelesen, dass beim 4433 das
Zählregister TCNT0 vorbelegt ist mit 256-244 (also 12). Das bedeutet
doch, dass der Timer nur 244 mal durchläuft bis ein Interrupt ausgelöst
wird. Ok....nun verwende ich einen at90s8515. Ist bei dem das TCNT0
Registe auch irgend wie vorbelegt? Oder macht der tatsächlich 256
Zyklen bis zum überlauf?

so long, Bernd

von Mario (Gast)


Lesenswert?

SWAP:
was du machst ist EINE Variable abwechselnd mit 2 verschiedenen
Konstanten zu laden. Einen SWAP Befehl gibts beim AVR nicht.

MOV:
schreibt den Wert des einen Registers in das andere Register.
Leere Register gibts nich - 0x00 ist auch eine Information!

2 PWMs:
Die neueren ATMEGAs haben mehr als eine PWM - sieh dir die mal an.
Ansonsten mach die PWM per Software - der AVR sollte eigentlich schnell
genug sein für ne Motorsteuerung.

Servos:
Sind Servos nicht intelligente Module mit eigener Steuerung welche die
Signale vom Empfäger bekommen? Ok- das ist auch PWM, aber ist das nicht
im 20ms-Takt (also schnarchlahm) oder ist mein R/C-Background etwas
angestaubt?

vorbelegt:
Verlaß dich nie auf sowas! wir sind hier nicht bei der 64k
Demo-Competition ;)

von Uwe (Gast)


Lesenswert?

Hi!
-vorbelegt:OVR= Wertänderung von 255->0, also 1x rum sind 256
Countertakte (aber nur bei 8 Bit Timer)
>TCNT0 vorbelegt ist mit 256-244 (also 12). Das bedeutet
>doch, dass der Timer nur 244 mal durchläuft

Nein! Das Timerreg. wird mit dem Wert 244 geladen, dann kommen 12
Countertakte und TCNT0 geht von 255->0, was einen Überlauf erzeugt.
Überlauf setzt Flag und Flag kann Int. auslösen.

Ich hoffe du hast verstanden wie ich das meine.

MFG Uwe

von Jens Renner (Gast)


Lesenswert?

Die Inhalte zweier Register kannst Du via XOR wie folgt swappen:

EOR r16, r17
EOR r17, r16
EOR r16, r17

Ist genau so schnell wie mit MOV, spart aber das Hilfsregister.

von Bernd Maier (Gast)


Lesenswert?

Hi zusammen,

vielen Dank für die schnellen Antworten.

@Mario: Jep, Servos haben normalerweise einen 20ms Takt. Schade wenn
der PWM Ausgang für Servos zu schnell ist. Werds dann so wie du sagst
(versuchen) per software zu handeln.

@Uwe und Jens: Danke für die Tips. Gerade für Anfänger sind solche
Hinweise Gold wert denn das spart einem langes Fehlersuchen weil man
mit falschen Annahmen an die Sache ran geht.

so long, Bernd

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.