mikrocontroller.net

Forum: Compiler & IDEs Analog Digitalwandler ATmega8535


Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich es kann mir jemand helfen.
Ich würde gerne bei meine ATmega8535 den Analogeingang verwenden.
Ich hab einen WiederstandsSchalter, welcher auf PA0 die Spannungen 3,7, 
2,5 , 1,2 und 0 V gibt. Leider kann ich diese Spannungen mit 
eigesteckten AVR nicht messen. Ich messe ständig 5V. Hat vieleicht 
jemand ein Beispielprogramm, oder funktion, welche den AD Wandler 
acktiviert, ausliest, und mir eine Variable zurückgibt, die sagt in 
welcher stellung der Schalter steht.Ach ja , die schalterstellung 0 V 
verursacht bei eingestecken AVR einen Kurzschluss, warscheinlich mache 
ich schon bei der Portzuweisung was falsch.

Hier mein Progrtamm auszug.
#include <avr/io.h>

#include <stdint.h>

#include <avr/interrupt.h>

#include <avr/signal.h>

#include <avr/delay.h>

#ifndef F_CPU

#define F_CPU 4000000UL

#endif



int Port_a;

int Port_c;

int Port_d;

int temp;

int x;/*x = Wartezeit in ms*/

int y;

int m;

int s;

int zeit;

int blasen;

int blas_zeit;

int result;

// Beginn Hauptprogramm

int main(void)

{

blasen = 0;

m = 0;

//Parameter:

zeit = 10; // Überwachungszeit in Minuten

blas_zeit = 1;//nach dieser Zeit wird gereinigt. In Minuten

/*Analogwandler einstellen.*/

ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS0);//ADC acktivieren 
Frequnzteiler setzen

ADMUX &= ~(1<<MUX0); //AD Kanal an PA0

ADMUX &= ~(1<<MUX1); //AD Kanal an PA0

ADMUX &= ~(1<<MUX2); //AD Kanal an PA0

ADMUX &= ~(1<<MUX3); //AD Kanal an PA0

ADMUX &= ~(1<<MUX4); //AD Kanal an PA0
ADCSRA |= (1<<ADSC);

while(!(ADCSRA & (1<<ADIF)));

ADCSRA = (1<<ADIF);

for(i=0;i<4;i++)

{

ADCSRA |= (1<<ADSC);

while(!(ADCSRA & (1<<ADIF)));

result += ADCW;

ADCSRA = (1<<ADIF);

result /= 4;

}



  if (result == 0)

  {

  for (;;)

  {

  set_Portc(PC1);//Lampe ein

  wait(2000);

  reset_Portc(PC1);//Lampe aus

  wait(2000);

  }

  }



}

Bin für jede Hilfe Dankbar.

Gruß Micha

Autor: unsichtbarer WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was möchtest du damit bewirken? Was sollen die Kommentare bedeuten?

ADMUX &= ~(1<<MUX0); //AD Kanal an PA0

ADMUX &= ~(1<<MUX1); //AD Kanal an PA0

ADMUX &= ~(1<<MUX2); //AD Kanal an PA0

ADMUX &= ~(1<<MUX3); //AD Kanal an PA0

ADMUX &= ~(1<<MUX4); //AD Kanal an PA0
ADCSRA |= (1<<ADSC);

Im Datenblatt ist i.d.R. ein Beispiel angegeben...

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Rahul:
Ich denke, er will damit lediglich die MUX-Bits alle auf Null setzen, um 
PA0 als ADC-Eingang auszuwählen. Ist so direkt nix gegen einzuwenden, 
nur ein bisschen arg unübersichtlich geschrieben. Geht auch in einer 
Zeile...

@Micha:
PORTC.1, an dem anscheinend eine Lampe hängt, wird nirgends als Ausgang 
konfiguriert. Das kann so nix werden.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja, wenn Du eine Mittelwertbildung über 4 Messungen machen willst, 
dann darfst Du die Division durch 4 erst nach der letzten (vierten) 
Messung machen. So wie es da steht, kommt sicher Müll raus.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und noch was: Du löschst beim Löschen des ADIF schon nach der ersten 
Messung alle anderen Bits im ADCSRA und damit auch das ADEN. Danach 
läuft der ADC nicht mehr! Das Programm hängt dann in der for-Schleife 
und macht keinen Mucks mehr, weil ADIF nie wieder gesetzt wird. Wenn 
dann muss es heißen

ADCSRA |= 1 << ADIF;

Das mit dem Oder ist in diesem Fall unproblematisch, weil ADCSRA keine 
anderen Interrupt-Flags enthält, die dadurch gelöscht werden könnten.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BTW: Wenn Du nur mit vorzeichenlosen Werten arbeitest, dann solltest Du 
Deine Integer-Variablen auch als "unsigned int" deklarieren.

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antworten.
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS0);//ADC acktivieren
ist diese Zeile so richtig ?
Denn Ausgang für die Lampe habe ich schon deffiniert, Habe das ganze 
blos vergessen in den Post zu kopieren.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn der Prescaler mit den Einstellungen eine brauchbare Taktfrequenz 
liefert, dann sollte das so funktionieren. Zur Sicherheit kann es 
sinnvoll sein, das Interrupt-Flag vor dem Start der ersten Messung zu 
löschen, nur für den Fall, dass es aus irgendwelchen Gründen schon 
gesetzt sein sollte. Sonst kommt nämlich Mist raus.

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich PortA0 als eingang für den ADC verwenden will.
Ist dann richtig wenn ich schreibe:
ADMUX = ((1<<MUX0) | (1<<Mux1) | (1<<Mux2));

Weil aus irgend einen Grund ziet der Port0 die Spannung auf 5V.
Muß ich Port0 als Eingang deklarieren ?

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst ihn als Eingang konfigurieren und (ganz wichtig!) den Pull-Up 
ausschalten (PORTA.0 = 0)

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok Danke, jetzt futzts. Danke

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.