PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AtMega32 ASURO im Vollausbau



pinsel120866
31.10.2008, 08:50
Hallo,

ich wollte euch noch meinen voll ausgebauten Atmega32 - ASURO vorstellen:

- Atmega32 Erweiterung
- 3 IR-Leds zur Entfernungsmessung
- Bluetooth
- ISP Adapter
- LCD Display 1x16 Zeichen

In diesem Ausbau sind nun alle PINs des Prozessors belegt und dennoch alle Grundfunktionen des Standart-Asuros verfügbar.

P.S. Special Thanx to Mr. E-Robotix für die Unterstützung.

oberallgeier
31.10.2008, 09:32
Hallo pinsel120866,

da bist Du ja richtig flott vorangekommen. Gratulation, Glückwunsch, volles Lob. Sieht SEHR aufgeräumt aus. Allerdings sind dann noch etliche Pinne belegbar - denn der asuro hat ja auch etliche gleich doppelt belegt *gggg*. War nicht wirklich ernst gemeint, das ist ja nicht so wichtig.

Wie geht das mit dem Blauzahn? Hast Du da schon eine Kommunikation mit dem PC in Betrieb? Das würde mich interessieren.

pinsel120866
31.10.2008, 09:45
Hallo Nachbar,

danke für das Lob, was die Mehrfachbelegung der PINS angeht hast du recht, allerdings wird es dann etwas schwierig für mich mit der Programmierung wie dir ja hinlänglich bekannt ist. Die mittlere IR-Diode habe ich eingebaut weil der Abstand der anderen beiden zu groß war und der Asuro bei einem zu schmalen Hindernis (Stuhlbein) mittig dagegengeknallt ist.

Was Bluetooth angeht, schicke ich mir derzeit die Daten der IR-Dioden, Liniensensoren und die Odometriedaten auf den PC. Auch eine Fernsteuerung mit der Tastatur habe ich schon erfolgreich getestet. Leider ist "nur" eine Serielle Verbindung möglich, sonst hätte ich schon überlegt Audio- und Videodaten auf den PC zu schicken, aber dafür reicht wohl die Bandbreite nicht aus.

Prozessor flashen via Bluetooth wäre eine coole Sache, da bin ich aber nicht mal in Ansatz so weit einen Treiber zu programmieren. Derzeit muss ich, wenn ich via ISP flashe das LED abstecken (so viel zum Thema Mehrfachbenutzung der PINS ;-))

inka
31.10.2008, 10:45
hi Pinsel,
gefällt mir, habe zur zeit leider gar keine zeit für den asuro, schaue nur sporadisch mal ins forum rein :-(

wie machst du es mit der lib? Alles auf den atm32 umgestrickt?

oberallgeier
31.10.2008, 11:52
... da bin ich aber nicht mal in Ansatz so weit einen Treiber zu programmieren ...Wenn ich sehe, wie viel und wie sauber Du bisher alles hinbekommen hast, dann habe ich für den weiteren Fortschritt keinerlei Bange. Das bringt einfach die Zeit mit sich . . . .

Viel Erfolg weiterhin

pinsel120866
31.10.2008, 15:17
Hi inka,

nett dass du mal wieder reinschaust - alle Prüfungen positiv bestanden? Die Lib ist an den Atmega32 angepasst, stimmt.

inka
01.11.2008, 13:26
hi pinsel,
ja, sofern man das als bestandene prüfung betrachten kann, dass man nach 6 jahren zwangspause als konstrukteur und nach einem 4monatigem cad-lehrgang den arbeitgeber im laufe von 2 monaten von seinen qualitäten überzeugen kann, dann hast recht :-)

ich muss mal die nächsten 2 monate noch abwarten, dann möchte ich wieder hier was tun...

pinsel120866
01.11.2008, 21:43
Nun möchte ich noch den Abstand meiner mittleren IR-LED ausgeben. Die LED ist am PIN33 (PA7) des Atmega32 angehängt.

In der asuro.h habe ich folgendes eingetragen:



#define IR_RIGHT (1 << MUX1) //rechts
#define IR_LEFT ((1 << MUX0) | (1 << MUX1)) //links
#define IR_MITTE (1 << MUX2) //mittig???


In der asuro.c:



/* Funktion zum Auslesen der IR-Sensoren (links, rechts, mitte) */
void IRData(unsigned int *data)

{
// Prozessorinterne Referenz verwenden
// Multiplexer auf linken Sensor schalten
ADMUX = (1 << REFS0) | (1 << REFS1) | IR_LEFT;
// Wandlung starten
ADCSRA |= (1 << ADSC);
// Warten, bis Wandlung beendet
while (!(ADCSRA & (1 << ADIF)));
// ADCIF zurücksetzen
ADCSRA |= (1 << ADIF);
// ADC-Wert auslesen
data[0] = ADCL + (ADCH << 8);

// Prozessorinterne Referenz verwenden
// Multiplexer auf rechten Sensor schalten
ADMUX = (1 << REFS0) | (1 << REFS1) | IR_RIGHT;
// Wandlung starten
ADCSRA |= (1 << ADSC);
// Warten, bis Wandlung beendet
while (!(ADCSRA & (1 << ADIF)));
// ADCIF zurücksetzen
ADCSRA |= (1 << ADIF);
// ADC-Wert auslesen
data[1] = ADCL + (ADCH << 8);

// Prozessorinterne Referenz verwenden
// Multiplexer auf rechten Sensor schalten
ADMUX = (1 << REFS0) | (1 << REFS1) | IR_MITTE;
// Wandlung starten
ADCSRA |= (1 << ADSC);
// Warten, bis Wandlung beendet
while (!(ADCSRA & (1 << ADIF)));
// ADCIF zurücksetzen
ADCSRA |= (1 << ADIF);
// ADC-Wert auslesen
data[2] = ADCL + (ADCH << 8);
}


Die Werte der rechten und linken LED stimmen, aber die Mittlere liefert Quatsch.

Was habe ich falsch gemacht?

oberallgeier
01.11.2008, 22:09
Hallo pinsel120866,

es ist ja schon wieder mal spät und ich war wieder mal eine ganze Strecke unterwegs - bin also etwas hirnträger als sonst. Aber ich habe irgendwie im Hinterkopf, dass beim Umschalten von einem ADC-Port auf den anderen besondere Vorsicht nötig ist. Siehe dazu die Dokumentation 8155A–AVR–06/08 (http://www.atmel.com/dyn/resources/prod_documents/doc8155.pdf) auf S. 214 22.6 Changing Channel or Reference Selection. Ich glaube, da muss man ein bestimmtes Timing einhalten.

pinsel120866
02.11.2008, 11:16
OK, ich hab's gelesen und nun folgende Syntax daraus interpretiert:



#define IR_RIGHT (1 << MUX1) //rechts ADC2
#define IR_LEFT ( (1 << MUX0) |(1 << MUX1)) //links ADC3
#define IR_MITTE ( (1 << MUX0) | (1 << MUX2)) //mittig ADC5


Gibt mir folgendes aus:



Linksschwenk - Liniensensor Links:243 Mitte:662 Rechts:236
Geradeaus - Liniensensor Links:248 Mitte:661 Rechts:227
Geradeaus - Liniensensor Links:248 Mitte:705 Rechts:240
Geradeaus - Liniensensor Links:254 Mitte:704 Rechts:231
Geradeaus - Liniensensor Links:256 Mitte:706 Rechts:240
Halbrechtsschwenk - Liniensensor Links:271 Mitte: 406 Rechts:236


Hier ist das Timing (glaube ich) eingehalten, aber die Werte der Mitte stimmen nicht...

Sternthaler
03.11.2008, 19:11
Hallo zusammen.

@pinsel120866
Ja, auch ich bin begeister, was du zusammengebaut hast.

Leider bin auch ich im Moment etwas eingespannt, so dass ich aktuell auch nur lese. Nur bei solchen tollen Umbauten muss ich doch mal loben ;-)

Gruß Sternthaler