PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : US-Sensor, Pinbelegung und Ansteuerung über ATMega8



karmek
14.08.2007, 12:56
Hallo leute,
zunächst vornweg, ich bin leider (noch) kein Asuro besitzer.
Derzeit versuche ich mich einfach an der Messdatenauswertung eines Ultraschallsensors über einen ATMega8 Microcontroller. Diese soll er dann auf einem LCD ausgeben. Das LCD funktioniert bereits.

Nun habe ich nach der Anleitung von Arexx dieses hübsche Ultraschallmodul gelötet. Dummerweise ist mir erst im Nachhinein aufgefallen, dass ich mit der Pinbelegung nicht viel anfangen kann.

Könnte mir jemand das Prinzip dahinter erklären? Ich werde daraus nciht schlau - zumal ich keine Plände für den Asuro habe...

Soweit bin ich:
CON 1 geht beim Mega8 auf OC2 also PIN17
CON 2 geht beim Mega8 auf INT0 also PIN 4

was ist mit den anderen Anschlüssen? Ich bin absolut unsicher wo ich zum Beispiel den Strom draufgeben muss... Nach stöberei in euren Wikis bin ich der Meinung, dass Out+ und Out- sich auf die Ausgänge des Asuro beziehen und daher tatsächlich für die US Anlage der Eingang ist. Also habe ich da Vcc (5V) und Masse meines AVR angelötet.

Wie verfahre ich mit den anderen pins? Voher waren ja Dioden im Asuro eingesetzt, also ist es wahrscheinlich unzweckmäßig, wenn an den Verbindungen überall Steuerleitungen zum mega8 anliegen. Ich schätze das bei den pins noch irgendwo masse und VCC anliegen muss, bin aber unsicher.

Aus dem Schaltplan geht auch hervor, dass V+1 und V+2 auf dem Ultraschallmodul verbunden sind. Was verbrigt sich tatsächlich dahinter? Ist das nochmal eine 5V Versorgungsspannung oder sind es Datenleitungen zum avr?

Interessant wäre auch, gibt es einen Unterschied zwischen V+ und Vcc? Oder kann ich da einfach 5V anlegen?

Vielleicht mag mir einer von euch helfen.

Grüße
Karmek

damaltor
14.08.2007, 17:04
out+ und out- ist ein direkter anschluss an die batterie. vcc ist also fein.

welche pins brauchst du noch? vorher war nur eine diode eingesetzt, die beiden anderen teile sind fototransistoren.

die beiden anderen V+... sind über einen widerstand mit vcc vernunden. man könte hier eine spannungsversorgung nehmen, oder ein pullup signal abgreifen.

auch vcc anzuschliessen sollte jedoch möglich sein.

karmek
14.08.2007, 17:28
Hi, ich habe nun folgendes gemacht:

Out+ and 5V
Out- auf Masse
V+1 nicht angeschlossen
V+2 nicht angeschlossen
ADC3 an freien ADC3 Eingang des mega8
INT0 nicht angeschlossen
PD6 an freien Port PB4 des mega8 (Port D ist koplett für mein LCD Display belegt)
RGND nicht angeschlossen, da Masse bereits über Out- vorhanden
OC2 an freien OC2 (PB3) eingang des mega8
ADC2 nicht angeschlossen

Meinst du, dass könnte so funktionieren?
Die jeweils nicht angeschlossenen Kontakte decken sich (aus meiner Sicht) mit den Schaltplänen, wäre aber gut wenn das nochmal jemand kontrollieren könnte. Ich hab jedenfalls nirgendwo Abgriffe an der Platine sehen können.

Mein nächstes Problem ist nun eine entsprechende lib anzupassen. Habe mir hier aus dem Forum eine Version von dopez gezogen:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=10907&start=66

Sah eigentlich erstmal gar nicht so schlecht aus. Habe mir aus den Programmdateien die Schnipsel der Funktionen zur Initialisierung und zur Abstandsmessung in mein Programm kopiert.
Bei der Initialisierung habe ich folgende Zeile

DDRD &= ~(1 << 6); // Port D Pin 6 als Eingang schalten (AIN0)
in diese verändert:

DDRB &= ~(1 << 4);
damit entsprechend mein gnutzter Pin als Eingang verwendet wird.

Im folgenden viel mir auf, dass ich dadurch, dass ich keine libasuro verwende, auch nicht die Variable count36khz besitze. Daher meckert nun der Compiler :(

Jemand eine Idee? Könnt Ihr mir verraten wie ich die Variable initialisieren muss, damit das ganze funktioniert?

Grüße und danke schonmal

Karmek

damaltor
14.08.2007, 17:53
diese variable wird von einem timer-interrupt 36000 mal pro sekunde um 1 erhöht. du musst also eine interruptroutine erstellen, die mit dieser geschwindigkeit die GLOBALE variable erhöht.

karmek
14.08.2007, 18:09
Okay das ist doch schonmal was.
Könntest du mir da vielleicht die Vorlage vom asuro posten oder per pm schicken? Ich bin nicht sicher wie sowas asuzusehen hat.
Verstehe ich das richtig, dass dieser "Zähler" dann permanent im Hintergrund laufen muss?

damaltor
14.08.2007, 21:19
der zähler ist in der hardware des prozessors integriert. er zählt automatisch, unabhängig vom laufenden programm, mit einer bestimmten, vom systemtakt abhängigen eigenen takt bis zu einem bestimmten wert, und löst immer wenn der wert erreicht wurde, einen interrupt aus. in der programmierung muss bei jedem interrupt des zählers die variable um 1 erhöht wird. wie du die counter ansprichst, musst du in deinem datenblatt zum prozessor herausfinden.

karmek
15.08.2007, 03:53
Danke für die Information!
Ich habe mich eben ein wenig eingelesen und habe nun den Grundgedanken verstanden.
Mein Quarz arbeitet mit 3.6864 MHz, das ermöglicht meinem avr also 3686400 Taktzyklen in der Sekunde. Wenn ich also jedes mal den Zähler incrementiere, habe ich 3686400/256=14400 Overflows pro Sekunde.
Mit entsprechenden Vorteilern (zB. 1024) lässt sich dann das ganze weiter anpassen, sodass ich über Interrupts dann bei jedem Overflow einen speziellen Programmcode ausführen könnte.

Stimmen diese Überlegungen so?

Da es mittlerweile recht spät ist, werde ich mir da evtl mal morgen weiter Gedanken machen.

Grüße
Karmek

karmek
15.08.2007, 12:46
Ok, habe mir grade nochmal den Titel meines Posts durchgelesen und das passt ja mittlerweile gar nicht mehr. Ich werde u.U. einen seperaten Post dafür aufmachen. Danke für die Hilfe :)

Um mal zum Thema zurückzukommen, eine abschließende Frage habe ich da noch:
Welcher Pin am US-Modul dient als eingang und welcher als Ausgang?
Achja und wofür ist dann der 3. Pin?

Grüße
Karmek

damaltor
15.08.2007, 15:50
ändere lieber den titel...

dazu musst du deinen ersten beitrag editieren.

leider habe ich kein US-modul, und kann deshalb auch nicht weiterhelfen.

mit den timern ist soweit alles richtig, der vorteiler 1024 jedoch erzeugt ein problem:

3686400 / 1024 = 3.600

also 3,6 khz und NICHT 36 khz. also schön aufpassen...
evtl könnte man, auf kosten der genauigkeit, die variable mit 3,6 hz um 10 erhöhen. allerdings gibt es ein risiko: bei bestimmten werten könnte es durch einen überlauf der vriable zu endlosshleife kommen.

karmek
15.08.2007, 19:23
Hast du bei deiner Berechnung nicht das Fassungsvolumen der Register vergessen?
Ich habe das so verstanden, dass ich zB. 3686400 / 1024 = 3.600 errechne und anschließend das Ergebnis durch 256 teile. Das Ergebnis sollten dann die Register- Overflows pro Sekunde sein, in dem Fall also 14,0625. Bei einem Overflow würde ich doch jetzt den Zähler incrementieren, oder wird das direkt bei jedem Systemtakt getan?

Unter http://www.arexx.com/downloads/asuro/us_bauplan.zip findet man die Bauanleitung für den US-Sensor nach der ich vorgegangen bin. Vielleicht kann ja jemand mit etwas mehr Erfahrung als ich den Sinn und Zweck der Anschlüsse aus dem Schaltplan entnehmen.
Einen anderen Schaltplan findet man im asurowiki unter http://www.asurowiki.de/pmwiki/pmwiki.php/Main/UltraschallEntfernungsmesser

Grüße
Dennis

EDIT:
Anscheinend wird der Zähler tatsächlich synchron zum Systemtakt incrementiert. Die Anzahl der Overflows pro Sekunde ist wohl nur wichtig, wenn man bei einem Overflow zB. einen Interrupt auslößt um darüber zB. Ports auf Hi oder Lo zu schalten. Korrigiert mich, falls ich mich irre.

damaltor
26.08.2007, 15:03
kommt schon hin... der counter wird erhöht mit dem takt (SYSTEMTAKT / PRESCALER). wenn der prescaler also 256 ist, wird bei jedem 256. takt der counter um 1 erhöht. bei einem overflow wird ein interrupt auslöst.