PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt gesteuertes auslesen der Odometriedaten



Robotik84
17.10.2006, 10:13
Servus leutz,

also wie ihr im titel schon lese konntet, hab i mir eine tolle aufgabe gestellt.

Nur leider habe i keine ahnung wie bei den Atmega8 einen Timer-Interrupt ausglöst wird.
Ich möchte die Odometriedaten mit 1kHz abfragen und in den Speicher schreiben um diese dann auf den PC zu übertragen und auszuwerten.

Ich weiss aber nicht welche Register dafür nötig sind geschweige denn wie ich die 1kHz einstelle.

Ich lese grad das Datenblatt des Atmega8, aber i werd da nicht schlau.

vielleicht könnt ihr mir ja weiterhelfen?

Gruß Jens

m.a.r.v.i.n
17.10.2006, 10:46
Hallo Jens,

wie man für den AVR Timer benutzt und einstellt findet man hier z.B.:

https://www.roboternetz.de/wissen/index.php/Avr#Timer.2FCounter

Beim Asuro wird Timer2 für die Trägerfrequenz der IR Sendediode verwendet. Timer1 wird dagegen nicht benutzt.

Gruß m.a.r.v.i.n

Robotik84
17.10.2006, 11:00
also schon mal danke...aber nu muss i das mit den A/D-Wandler irgendwie machen...
muss mich da ma reinlesen...
bei fragen werd i auf euch zurück kommen...

Robotik84
17.10.2006, 16:25
so nu mir ne wichtige frage gekommen:

wie kann i dem Prozessor sagen, dass er ,z.b. jede ms eine A/D-Wandlung durchführen soll?
hab da irgendwie nix im datenblatt des ATMEGA 8 gefunden.

kann mir einer weiterhelfen?

stochri
17.10.2006, 18:54
In der Sourceforge-Lib werden die Odometriedaten bereits durch eine Interruptroutine erfasst. Die Aufgabe ist also in soweit schon gelöst.

Robotik84
17.10.2006, 19:41
und wo finde i die sourceforge-Lib???

stochri
17.10.2006, 20:26
schau einfach einen Thread weiter, da hat nämlich jemand die selbe Frage gestellt.

Sternthaler
17.10.2006, 22:11
Hallo Robotik84,
erst einmal herzlich willkommen im Forum.

Du hast ja schon einige Tips bekommen. Deshalb von mir hier nur ein kleiner Hinweis zu deiner Datenmenge, die du ja zum PC senden möchtest.
Wenn du jede ms einen Messwert bekommen willst, ist es tatsächlich sinnvoll die Daten zwischenzuspeichern, da die Sendefunktion ja nur mit 2400 Baud arbeitet und du so höchstens nur 240 Byte in der Sekunde übertragen kannst, und eben nicht die 1000 Byte, die du pro Sekunde bekommst.
Als erstes bieten sich dann natürlich die 1000 Byte Speicher im Asuro an um die Messdaten zu sammeln. HIER ABER VORSICHT: Jeder Funktionsaufruf und natürlich die anderen benutzen Variablen benötigen Speicher (Stichwort Stack für Funktions- und Interruptaufrufe bekannt?). Sei an dieser Stelle lieber etwas zurückhaltend.

Ich hoffe du hast Erfolg.
Berichte und/oder Frage weiterhin.

damaltor
18.10.2006, 09:10
vielleicht solltest du dich damit begnügen, alle 10 oder 20 millisekunden einen messwert zu holen, das ist schon relativ genau... die kannst du dann auch flüssig zum pc senden lassen, vorrausgesetzt du bist schnell genug mit dem transceiver hinter deinem asuro hinterherzurennen und das kabel ist lang genbug =)

und wenn nicht: wenn du alle 10 ms einen wert speicherst, dann kannst du logischerweise 10x soviele werte speichern, bevor der speicher überläuft... und diese dann zB auf tastendruck zum Pc schicken.

selbstverständlich ist die anzahl der speicherbaren werte die gleiche, aber es dauert halt 10x so lange bis der speicher voll ist =)

Sternthaler
18.10.2006, 19:26
@damaltor
Hallo damaltor, ich glaube, dass Robotik84 die Hell-/Dunkel-Flächen der Odometrie verwuseln möchte. Da wird es etwas knapp, wenn nur alle 10 ms gemessen wird. Allerdings ist dein Vorschlag auf alle Fälle für ASURO-Starter (bist du doch Robotik84?) sehr gut zum üben geeignet.


Hier noch ein kleiner Nachschlag zu dem Speichervolumen.
Ich hatte von unter 1000 Byte Messwerten geschrieben. Dies gilt NUR dann, wenn die ADC-Messung als Byte abgelegt wird. Da die ADC-Wandler aber auch 10 Bit wandeln können, müsstest du schon int-Variablen nehmen und dann wären es nur noch unter 500 Messwerte.
Und jetzt kommt noch rechts und links ins Spiel, also nur noch unter 250 Messwerte.
Wenn dir ein 8-Bit-Ergebnis reicht, kannst du eben die doppelte Datenmenge sammeln.
Als kleine Hilfe ist da z.B. folgendes angegeben:


#define MAX_MESSWERTE 400
/* Das merkwürdige volatile ist extrem wichtig für Interruptfunktionen! */
volatile unsigned char messdaten [2][MAX_MESSWERTE]; /* 8-Bit */
volatile unsigned int i; /* Zähler für max. Messwerte */
volatile unsigned char fertig; /* Kann im Hauptprogramm zum prüfen
und dann senden benutzt werden */

/* i und fertig sollten irgendwo im Hauptprogramm vor dem Start des Timers
initialisiert werden */
i = 0;
fertig = 0;

Interrupt-Funktion-vom-Timer
{
if (i < MAX_MESSWERTE)
{
Hole ODOmetrie-Messwert [links und rechts]
/* casten (umwandeln) des 16-Bit Messwertes auf 8 bit mit dem
(unsigned char) */
messdaten [0][i] = (unsigned char) ADC-Wert von der ODOmetrie[links]
messdaten [1][i] = (unsigned char) ADC-Wert von der ODOmetrie[rechts]
i++;
}
else
{
fertig = 1;
}
}

Hoffentlich hilft dir das.