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


von C. Lechner (Gast)


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);
}

von Mike (Gast)


Lesenswert?

http://mc-project.de/Pages/AVR/Software/adc.c

Eine while-Schleife zuviel :-)

von C. Lechner (Gast)


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

von A.K. (Gast)


Lesenswert?

ADC-Takt innerhalb von 50-200KHz?

von C. Lechner (Gast)


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);
}

von Christian B. (Gast)


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

von Walter Scheidt (Gast)


Lesenswert?

also ich würde das so machen:

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

Grüße
Walter

von C. Lechner (Gast)


Lesenswert?

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

von Christian B. (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.