PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : roboter mit atmega32



Che Guevara
11.05.2008, 10:41
hallo leute,

ich bin gerade dabei, mir einen roboter zu bauen.
dieser soll immer geradeausfahren, nur wenn ein gegenstand im weg ist, soll er solange einen kreis drehen (wie ein panzer, links und rechts antrieb), bis er wieder ungehindert weiterfahren kann.
jetzt zu meinem problem:

ich benutze einen tsop1136 und eine ir-led zur objekterkennung, die ir-led will/muss/soll ich mit ungefähr 36kHz betreiben. am anfag wollte ich die 36 kHz (samt unterbrechung, für rc5) mit dem atmega32 realisieren, aber dieser gibt mir eine ganz andere frequenz aus?? ich hatte eine loop-schleife geschrieben, mit

do
waitms 20
ir-led = 1
waitus 13.89
ir-led = 0
waitus 13.89
loop

allerdings waren die high/low zeiten viel länger?!?!?!?!

jetzt habe ich das ganze mit einem ne555 realisiert, aber ich brauche ja (für rc5) immer nach 10 impulsen(?) eine unterbrechung, ....... deshalb habe ich mir gedacht, ich schließe einen bc548(reicht dieser für ca. 1kHz)
mit dem collector an die anode (-) der ir-led und den emiter an - der spannungsquelle, basis schließe ich an den ausgangspin des atmega32 an und die kathode der ir-led an den ausgangspin des ne555...

das funktioniert auch wunderbar, nur ich weiß nicht, wie ich zwei do-loop schleifen gleichzeitig betreiben kann?!?!?!?!?!

gruß
chris

P.S.: ich weiß, dass ein atmega32 dafür überdimensioniert ist, ich habe aber nur diesen.

Vitis
12.05.2008, 06:27
übersetzt käm dann das dabei raus:

do

waitms 33.89
ir-led=1
waitms 13,89
ir-led=0

loop

sind dann irgendwas um 48 ms und das gibt 20,9 Hz

Che Guevara
12.05.2008, 08:22
seit wann ergibt den 20ms + 13,89µs = 33,89ms ???????????

Michael
12.05.2008, 10:30
Hallo CheGuevara,

Die Werte hinter Waitms und Waitus müssen ganze Zahlen zwischen 1 und 65535 sein.


das funktioniert auch wunderbar, nur ich weiß nicht, wie ich zwei do-loop schleifen gleichzeitig betreiben kann?!?!?!?!?!
Wie soll das gehen? Der Sprung geht immer vom erstbesten Loop zum letzten Do.

Gruß, Michael

Che Guevara
12.05.2008, 12:28
hallo michael,

danke für die infos.
ich habe jetzt statt waitus 13.89 waitus 14 eingegeben, und es funzt!

ich habe jetzt nur noch ein (für dich/euch) vielleicht leichtes problem:

ich benutzte im moment zwei atmega32, der eine sendet mit folgendem code:

$regfile = "m32def.dat"
$crystal = 16000000

Config Portd.0 = Output

Ou Alias Portd.0

Do
Ou = 1
Waitus 14
Ou = 0
Waitus 14
Ou = 1
Waitus 14
Ou = 0
Waitus 14
Ou = 1
Waitus 14
Ou = 0
Waitus 14
Ou = 1
Waitus 14
Ou = 0
Waitus 14
Ou = 1
Waitus 14
Ou = 0
Waitus 14
Ou = 1
Waitus 14
Ou = 0
Waitus 14
Ou = 1
Waitus 14
Ou = 0
Waitus 14
Waitms 20
Loop



und der andere empfängt dies und steuert die motoren (einer links, einer rechts) mit folgendem code:

$regfile = "m32def.dat"
$crystal = 16000000

Config Porta.0 = Input
Config Portd.1 = Output
Config Porta.1 = Output
Config Porta.2 = Output
Config Portc.6 = Output
Config Portc.7 = Output
Config Portb.0 = Output
Config Portb.1 = Output
Config Portd.0 = Output
Config Adc = Single , Prescaler = Auto

Config Portc.0 = Output
Config Portc.1 = Output

Ml1 Alias Portc.6
Ml2 Alias Portc.7
Mr1 Alias Portb.0
Mr2 Alias Portb.1
Vs Alias Porta.1
Gnd Alias Porta.2
Ine Alias Porta.0
Ou Alias Portd.0
Ou2 Alias Portd.1

Vs = 1
Gnd = 0
Ou2 = 0

Enable Interrupts

Dim X As Word

Do
Start Adc
X = Getadc(0)
If X > 500 Then
Ml1 = 1
Ml2 = 0
Mr1 = 1
Mr2 = 0
Elseif X < 500 Then
Ml1 = 0
Ml2 = 1
Mr1 = 0
Mr2 = 0
Waitms 500
End If
Loop


diese beiden codes sollte man doch auf einen atmega laden können, aber ich bin zu blöd dafür?!!!!!!
vielleicht könnte mir ja jemand tipps geben/helfen?!!!!

mfg
chris

Dirk
12.05.2008, 12:42
@Che Guevara:
Am Empfänger sitzt ein TSOP1136???

Den kann man nicht analog einlesen oder was ist an Adc(0) angeschlossen?

Gruß Dirk

Michael
12.05.2008, 12:45
Hallo CheGuevara,


diese beiden codes sollte man doch auf einen atmega laden können, aber ich bin zu blöd dafür?!!!!!!
vielleicht könnte mir ja jemand tipps geben/helfen?!!!!
du mußt den Code erst compilieren und dann einen passenden Programmieradapter verwenden.
Beantwortet das deine Frage?

Gruß, Michael

Che Guevara
12.05.2008, 12:52
hallo dirk,

ja, empfänger ist ein tsop1136 und ... ja, man kann ihn analog einlesen, es funktioniert!! er ist an adc(0) angeschlossen.

@michael

ich glaube, du verstehst mich nicht?!!!!

ich möchte diese beiden codes im rechner (pc) zu einem zusammenfassen und dann diesen EINEN auf nur einen atmega draufladen?!!!!

mfg
chris

Michael
12.05.2008, 13:08
Hallo CheGuevara,


und dann diesen EINEN auf nur einen atmega draufladen
das ist neu, oben schreibst du nämlich:

ich benutzte im moment zwei atmega32, der eine sendet mit folgendem code:
und der andere empfängt dies

Zur Abstandsmessung hat Waste mal einen Beitrag geschrieben:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=11114
Die prinzipielle Vorgehensweise erkennst du beim Lesen. Du mußt es nue noch auf Bascom portieren.

Gruß, Michael

Che Guevara
12.05.2008, 13:17
sorry, war`n bisschen unverständlich...

warum kann ich den nicht einfach diese beiden loop schleifen aus meinen zwei codes hintereinander schreiben??
wenn ich das mache, funzt meistens nur eine und die andere wird überhaupt nicht beachtet?!!!!!

mfg
chris

Che Guevara
12.05.2008, 15:29
ich habe jetzt nochmal überlegt und das ganze auf einen code für einen µC zusammengefasst, allerdings tut sich gar nichts?!?!?!?!
hier mal der vollständige code, vielleicht erkennt ja jemand von euch den fehler?!?!?!?

$regfile = "m32def.dat"
$crystal = 16000000

Declare Sub Send1()
Declare Sub Empfang1()

Config Portd.0 = Output
Config Porta.0 = Input
Config Portd.1 = Output
Config Porta.1 = Output
Config Porta.2 = Output
Config Portc.6 = Output
Config Portc.7 = Output
Config Portb.0 = Output
Config Portb.1 = Output
Config Adc = Single , Prescaler = Auto

Ml1 Alias Portc.6
Ml2 Alias Portc.7
Mr1 Alias Portb.0
Mr2 Alias Portb.1
Vs Alias Porta.1
Gnd Alias Porta.2
Ine Alias Porta.0
Ou Alias Portd.0

Vs = 1
Gnd = 0

Enable Interrupts

Dim X As Word

Sub Send1()
Do
Ou = 1
Waitus 14
Ou = 0
Waitus 14
Ou = 1
Waitus 14
Ou = 0
Waitus 14
Ou = 1
Waitus 14
Ou = 0
Waitus 14
Ou = 1
Waitus 14
Ou = 0
Waitus 14
Ou = 1
Waitus 14
Ou = 0
Waitus 14
Ou = 1
Waitus 14
Ou = 0
Waitus 14
Ou = 1
Waitus 14
Ou = 0
Waitus 14
Waitms 20
Loop
End Sub

Sub Empfang1()
Do
Start Adc
X = Getadc(0)
If X > 500 Then
Ml1 = 1
Ml2 = 0
Mr1 = 1
Mr2 = 0
Elseif X < 500 Then
Ml1 = 0
Ml2 = 1
Mr1 = 0
Mr2 = 0
Waitms 500
End If
Loop
End Sub


Do
Call Empfang1()
Call Send1()
Loop

End


mfg
chris

Michael
12.05.2008, 15:43
Hallo CheGuevara,

Eine Do-Loop Schleife ist endlos. Wenn das Programm einmal drin ist, kommt es nicht mehr heraus, ohne einen extra Unterbrechungs-Befehl.
Obendrein habe ich die Vermutung, du glaubst, die Lichtgeschwindigkeit austricksen zu können, indem du nach dem Senden deiner Lichtimpulse gemütlich den ACD anwerfen kannst.
BTW: Hast du den Link auf Wastes Beitrag schon gelesen?
Was hast du daran nicht verstanden?

Gruß, Michael

Che Guevara
12.05.2008, 15:47
ja, habe den link gelesen, aber kenne mich null komma null mit c aus .....

Michael
12.05.2008, 16:06
Hallo CheGuevara,
ich kenne mich auch nicht gut mit C aus.
Waste hatte aber die Vorgehensweise beschrieben.
Ich fasse sie mal mit meinen Worten zusammen:
Die 36kHz werden von OC2 an PortB.3 bereitgestellt. Die Pulsweite bestimmt die Empfindlichkeit bzw. Entfernung und wird mit dem OCR2-Register eingestellt. Ein schrittweises Verbreitern der Impulse läßt die Sende-LED immer stärker leuchten, bis der TSOP anspricht. Dieser Punkt ist zur Entfernung proportional.

Gruß, Michael

Che Guevara
12.05.2008, 16:17
hallo michael,

ich möchte aber nicht die entfernung messen, sondern lediglich bei einer best. entfernung den roboter eine best. aktion machen lassen.... das ich auch gar nicht das problem, sondern mein problem ist, dass ich nicht weiß, wie ich EINEN µC dazu kriege, senden und empfangen gleichzeitig auszuführen?!?!?!

mfg
chris

Michael
12.05.2008, 16:42
Hallo CheGuevara,

es spielt doch keine Rolle, ob du die Entfernung mißt. Du kannst ja den Grenzwert der Erkennung (fast) beliebig festlegen.


sondern mein problem ist, dass ich nicht weiß, wie ich EINEN µC dazu kriege, senden und empfangen gleichzeitig auszuführen?!?!?!
dir wird nichts anderes übrig bleiben, als Wastes Vorgehen nachzuprogrammieren, da deine Hardware im Prinzip die gleiche ist.
Da der Tsop normalerweise nicht zur Entfernungsmessung geeignet ist, finde ich Wastes Vorgehen ziemlich trickreich.
Ich hatte es dir ja bereits in meinem letzten Post beschrieben.
Senden und erkennen wird von einem einzigen µC erledigt.
Was genau hast du nicht verstanden?

Gruß, Michael

Che Guevara
12.05.2008, 16:51
ich verstehe nicht, warum ich nicht senden und empfangen in einer loop schleife schreiben kann?!?!?!?!

mfg
chris

Dirk
12.05.2008, 16:55
hallo dirk, ja, empfänger ist ein tsop1136 und ... ja, man kann ihn analog einlesen, es funktioniert!! er ist an adc(0) angeschlossen.
Das Einlesen über einen ADC ist sinnlos, weil die TSOPs eine interne Verstärkungsregelung haben, so dass man aus dem Wert > 500 oder < 500 nicht sicher schließen kann, wie weit der Sender entfernt ist oder wie hell eine Sendediode strahlt.
Ohnehin bewirkt dein Test auf >500 und <500 letztlich nur eine "digitale" Auswertung (High/low), die du viel schneller und sicherer mit einem digitalen Eingang machen kannst.

Gruß Dirk

Michael
12.05.2008, 17:18
Hallo CheGuevara,

ich denke, du hast ein wenig Angst vor den Registern des AVR?
Senden und Empfangen in einer Schleife bringt keine konstante Frequenz zustande, du hast ja noch mehr zu erledigen.
Vermutlich schafft der AVR die Schleife garnicht mit 36kHz, wenn gleichzeitig ein Pin abgefragt und darauf reagiert werden soll.

Ich könnte mir höchstens noch vorstellen, einen Burst von vielleicht 20 Impulsen zu senden und gleich danach abzufragen, ob der TSOP empfängt. Quasi die Verzögerung des TSOP ausnutzen. Er geht ja nicht gleich nach dem letzten Puls wieder auf High.
Das kriegt man dann in eine einzige Schleife.
Vielleicht kann man mit der Anzahl der Impulse ein wenig an der Empfindlichkeit drehen.

Gruß, Michael

Furtion
12.05.2008, 17:19
Hi,

vill sollte man noch hinzufügen, dass ein Atmega32 bzw. die ganze serie
keine 2 Loop Schleifen liefern kann, ich glaube das ist so ein Punkt in der
Basic Programierung wo jeder durch muss, und merken muss das ein
Atmega nicht almächtig ist. Wäre aber schön, muss man schon sagen.

Also wenn du ein Signal losschickst, dann ist es dann auch sofort da
(Lichtgeschwindichkeit liegt bei 300.000km/s oder so und im gegensatz
dazu ist das Programm ein bisschen langsam. Du musst es also so wie
in der Variante von Michaels Link machen. Vill ist es sogar sinnvoler
eine IR/Ultraschall Modul zu benuntzen, da kommt dann am Ende nur
noch die Entfernung ber I²C oder Analog raus und du kanst es dann ohne
diesee ganze Sende Empfangs Gedöns realisieren.

Schmarn Michael war 1 minute schneller :(^^

Che Guevara
12.05.2008, 17:31
und wie kann ich das dann (anstatt 2 loop schleifen) realisieren??

ultraschall etc. kommt nicht in frage, da ich kein geld für andere bauteile habe...

mfg
chris

Furtion
12.05.2008, 17:38
Hi,

so wie in dem Link von Michael:

Also du dimmst die IR Led an einem PWM Ausgang (da kanst du mit einem
einfachen Befehl sagen, wie hell die LEd ist. So dann schaust du ob an
einem Empfänger was ankommt, dabei solltest du vill nicht umbedingt
auf dem TSOP zurückgreifen, weil der ein modliertes Signal will (glaube
ich). Wenn bei dem Epfänger nichts ankommt, dann musst du die LED
heller machen, bis irgendwann etwas ankommt. Das musst du
experimentell ermitteln. Wenn du das gemacht hast kannst du den Wert
festlegen.

Wenn du nun dein Programm startest, startest du den PWM (arbeitet ohne
Do loop. DAnn kanst du in einer DO loop waren, bis der Empfänger was
bekommt, das ist der Weg, bei dem dann deine Aktion ausgelöst wird.

sechsrad
12.05.2008, 17:47
ultraschall etc. kommt nicht in frage, da ich kein geld für andere bauteile habe...


also , das roboterhobby wir einige euros verlangen.
man sollte vorher überlegen, welches hobby man eingeht und welche finanziellen folgen daraus enstehen.

du wirst sehen, das es bei nur eine diode keinen spass macht einen roboter zu steuern. schau hier im forum: rs232funk, ultraschall irsenden und empfangen, funk-cam usw.

wahrscheinlich popelst du noch mit der bascom-freeware-version rum.
bei nachher intensiven projekten kommst du um den kauf von bascom nicht herum.