PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Analogeingang am ATmega32 programmieren



Skynet
05.07.2009, 22:53
Hallo! Probiere und suche schon den ganzen Abend.
Wie muss ein Programm für BASCOM aus sehen um an einem Analogeingang (PA0 bis PA7) einen Wert ein zu lesen und zu verarbeiten.

Ich habe auch schon nach Beispielprogrammen gesucht aber nichts nichtiges gefunden.

Danke für jede Hilfe

for_ro
05.07.2009, 22:56
Suche mal nach Getadc. Das ist die Funktion zum Einlesen des analogen Wertes.

Gruß

Rolf

Skynet
05.07.2009, 23:36
Config Adc = Single , Prescaler = Auto
Config Porta = Output

Start Adc

Das verstehe ich nicht ganz, ist der ganze Port die PINs auf AD gestellt?
Und warum wirde der Port dann als output configuriert?

Danke für die schnelle Antwort

Besserwessi
05.07.2009, 23:57
Den ganzen Port als Output zu definieren ist fast immer falsch. Die Pins die man als analogen Eingang nutzen will sollte man schon als Eingang definieren. Mit der Configuration wird nur der takt und die Referenzspannung festgelegt. Den Eingang legt man beim Aufruf von GetADC(KanalNr) fest.

Skynet
07.07.2009, 23:27
Hallo! Bin immer noch am probieren auf mein Steckbrett und dem BASCOM.
Hab am mega32 ein Poti an Pin PA0 angesteckt und eine LED an PIN PC0.
Die LED soll leuchten wenn das Poti über die hälfte gedreht wurde, aber es passiert nichts!!!

$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Portc.0 = Output

Dim Analogwert_0 As Word

Start Adc

Do
If Analogwert_0 > 125 Then
Portc.0 = 1
Else
Portc.0 = 0
End If
Loop

Stop Adc

End

Könnte mir jemand erklären wo der fehler liegt.
Währe sehr dankbar.

Sauerbruch
08.07.2009, 00:14
Könnte mir jemand erklären wo der fehler liegt.

Na klar!


Exakt zwischen "Do"
und "If Analogwert_0 > 125 Then"
:-)

Woher soll der µC den wissen, welchen Wert die Variable Analogwert hat?

Skynet
08.07.2009, 00:20
Ich dacht mit Analogwert_0 fragt der chip den Port PA0 ab.

Wie müsste das Programm denn aus sehen damit es so funktioniert wie ich es gerne hätte?

Vitis
08.07.2009, 00:30
seit wann kann bascom deutsch?¿

Analogwert_0 = getadc(0)

Skynet
08.07.2009, 00:44
Das kam mir auch komisch vor, aber ich fange auch gerade erst mit
BASCOM an hab zuvor C-Control gehabt da war das etwas einfacher

Nur wie wende ich "getadc(0)" an habe schon viele varianten gefunden nur alle in verbindung mit ein LCD.

Wie bringe ich eine LED dazu darauf anzusprechen?

Danke!
geh jetzt aber penn, gute nacht

Sauerbruch
08.07.2009, 07:00
Nur wie wende ich "getadc(0)" an

Genau so, wie Vitis es geschrieben hat:

Analogwert_0 = getadc(0)

Mit dieser Syntax wird einer X-beliebigen Variablen der Analogwert am Eingang ADC0 zugewiesen. Wie du diese Variable nennst und was du dann mit dieser Variablen machst, bleibt dir überlassen: Sie auf einem LCD ausgeben, mit einem Vergleichswert vergleichen und dementsprechend eine LED schalten, oder, oder, oder.

In Bascom gibt´s eine sehr gute Hilfe-Funktion (bin bei vielen anderen Programmen nicht sooo der Fan von so etwas, bei Bascom ist sie aber wirklich genial). Dort findest du zu jedem Befehl nicht nur die korrekte Syntax, sondern auch noch echte Code-Beispiele. Kann ich nur empfehlen!!

Skynet
08.07.2009, 09:16
Hallo! Nun habe ich das programm etwas verändert und es geht immer noch nicht.


$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Portc.0 = Output
Dim Analogwert_0 As Byte
Analogwert_0 = Getadc(0)

Start Adc

Do
If Analogwert_0 > 125 Then
Portc.0 = 1
Else
Portc.0 = 0
End If
Loop

Stop Adc

End

ich kann das poti drehen wie ich will aber die led zeigt nichts an, bei compilieren ist auch kein erreo aufgetreten, es müsste doch eigentlich gehen

BlaueLed
08.07.2009, 11:31
Hi,

pack das "Analogwert_0 = Getadc(0)" in die Do ... Loop schleife und lösch das "Stop ADC" aus der Schleife. Dann funktioniert es. Aber jetzt mal ganz ehrlich. In der Hilfe von Bascom steht das alles so schon drin.

Gruß Blaue Led

Sauerbruch
08.07.2009, 12:45
Nur so zum Verständnis:

Der Befehl "Analogwert_0=Getadc(0)" führt zu einer einzigen AD-Wandlung! Wenn sich danach die Spannung am Eingang ändert, bleibt die Variable Analogwert_0 so lange unverändert, bis der Controller das nächste mal den Getadc-Befehl ausführt.
Und genau deshalb muss dieser Befehl in die Do-Loop-Schleife, wie Blaue LED ja schon geschrieben hat.

Jetzt klarer?

Skynet
08.07.2009, 21:23
OK. So weit habe ich nicht gedacht, ist im nachhinein ganz logisch, das der
Befehl in die Schleife muss. Jetzt gehts. DANKE

Wenn ich die Variable Analogwert_0 nicht als "Word" sondern als "Byte" deklariere passiert etwas komisches: wenn ich das poti drehe egal in welche richtung geht die LED mal AN mal AUS wieder AN und wieder AUS (beim drehen)


Vielen Dank!

BlaueLed
08.07.2009, 21:42
Du liest einen Wert ein, der von 0 - 1023 geht. Das passt halt nicht mehr in ein Byte ( 0 - 255 ). Wenn Du nur 255 Werte haben willst, dann musst Du den Analog Wert explizit mit nur 8 Bit einlesen. Standardmäßig ist der 10 Bit.

Gruß Blaue Led