mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega8: AD-Wandler geht nicht


Autor: C. Lechner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

beim meinem Versuch, (auf dem ATmega16 funktionierenden) Code für den
AD-Wandler vom ATmega16 auf den ATmega8 zu übertragen, ist was
schiefgegangen.

Der untenstehende Code funktioniert für den ATmega16 kompiliert im
Simulator einwandfrei. Für den ATmega8 kompiliert hängt er sich beim
zweiten "while(ADCSRA & (1 << ADSC));" auf. Das ADSC Flag wird nicht
zurückgesetzt. Als Simulator verwende ich AVRStudio 4.10 Build 356.

Was habe ich falsch gemacht???

MfG
- cl

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <inttypes.h>

int main(void)
{
        int i;

        ADCSRA = (1 << ADEN) | 0x06;
        ADMUX = 0x00;
        for (i = 0; i < 16; i++)
        {
                while(ADCSRA & (1 << ADSC));
                ADCSRA |= (1 << ADSC);
                while(ADCSRA & (1 << ADSC));
        }

        return(0);
}

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://mc-project.de/Pages/AVR/Software/adc.c

Eine while-Schleife zuviel :-)

Autor: C. Lechner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat leider keine Veränderung gebracht. Hängt sich immer noch auf.

Durch die erste while-Schleife der ursprünglichen Version läuft er
durch und gelangt dann zur zweiten while-Schleife. Dort hängt er sich
auf.

gruebel

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ADC-Takt innerhalb von 50-200KHz?

Autor: C. Lechner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@A.K.: Der ADC-Takt war außerhalb. Teiler jetzt auf 128 geändert, geht
allerdings "genausogut" wie vorher, nämlich garnicht :-((((

In echter Hardware tut sich auch nix.

Mein Code sieht jetzt so aus:


#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <inttypes.h>

volatile uint8_t x = 0;


int main(void)
{
        uint8_t x;

        DDRD = 0xff;

        ADCSRA = (1 << ADEN) | 0x07;
        ADMUX = 0x40;
        while(1)
        {
                ADCSRA |= (1 << ADSC);
                while(ADCSRA & (1 << ADSC));

                x++;
                if (x & 0x01)
                        PORTD = 0x00;
                else
                        PORTD = 0xff;
        }

        return(0);
}

Autor: Christian B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast DDRD=0xff und somit den gesamten PORTD auf Output initialisiert.
 Die Spannung die du an den ADC von außen anlegst die er Digitalisieren
soll ist aber INPUT :)

Versuch mal den endsprechenden Pin wo du die Spannung anlegst als Input
zu initialisieren. :)

mfg Christian

Autor: Walter Scheidt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also ich würde das so machen:

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

Grüße
Walter

Autor: C. Lechner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Christian B.:
Beim ATmega8 ist aber doch IMHO der AD-Wandler auf PORTC :)

Autor: Christian B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wollte nicht das Datenblatt bemühen ^^ , war nur ein gedanke der mir
durch den Kopf ging als ich das gesehen habe :) und nu geh ich schlafen
g

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.