Forum: Mikrocontroller und Digitale Elektronik Ein- & Ausgänge spielen verrückt ATmega128


von Kay (Gast)


Angehängte Dateien:

Lesenswert?

Guten Abend!

Hab ein Problemm mit dem ATmega 128 als fertiges Board mit 16Mhz 
Quarz(siehe Anhang). Programmierung in C über AVRstudio und einen 
USB-ISP Compiler.

Wenn ich im die Ausgänge definiere (mit DDRA=0xff; und dann noch 
DDRE0=ff;) und ihm dann ganz einfach einen Port schalte 
(PORTE=(1<<PE0);) und das einfach mal herein lade, läuft alles erstmal 
so wie es soll.

An den Ausgängen A ist kein Signal und an den ganzen Eingängen wird kein 
Signal angelegt und liegt auch keins an. Man kann dann auch schön seine 
fast 5V am Port E0 messen. Also alles soweit okay.

Wenn ich jetzt jedoch ein Umfangreicheres Programm mit Eingangsabfragen 
über if und while mache bekomme ich im nicht beschalteten Zustand (nicht 
angeschlossen, die nackten Pins) richtig komische Zustände. Ausgänge um 
die 2,5V und Eingange um die 1,7V. Die Pull-Widerstände sind nicht 
deaktiviert worden oder des gleichen.

Liegt das evtl. an einer Compilereinstellung oder sollte ich die Ein- & 
Ausgänge besser anders definieren und wenn wie (vielleicht ein kleines 
Beispiel).

Danke schon mal für die Hilfe

von Otto (Gast)


Lesenswert?

Wie fragst Du denn die Eingänge genau ab?

Poste das Programm

Gruss Otto

von Kay (Gast)


Lesenswert?

hier mal Auszüge:

#define F_CPU 16000000

#include <avr/io.h>
#include <util/delay.h>

// Übung mit Probeplatine !!!

int main (void)
{
    // Ausgänge-Eingänge definieren !!!

    DDRA=0xff;
    DDRB=0x00;
    DDRC=0x03;
    DDRD=0x00;
    DDRE=0x0f;
    DDRF=0xff;
    DDRG=0x00;



    while(1)     // Endlosschleife damit das Programm nicht stoppt
    {


        if((PORTC&0x40) && (PORTD&0x80))
        {
            PORTF~=(1<<PF3);
            PORTE~=(1<<PE1);
            PORTF=(1<<PF2);
            PORTE=(1<<PE0);
        }

usw.

Ich hoffe der kleine Auszug reicht um dir ein Bild machen zu können. Das 
Programm ist zwar größer aber immer nach diesem Muster aufgebaut. 
Einzige besonderheit das auch mal ein delay kommt aber sonst ganz 
schlicht mit if und while.
Die Eingänge sind teilweise Taster oder auch Schaltkontakte(z.B. 
Endlagenschalter) die dann ein Signal auf den Eingang bringen.

von Otto (Gast)


Lesenswert?


von avr (Gast)


Lesenswert?

Wenn deine Ausgänge nicht wirklich VCC bzw. GND anliegen haben,
z.B. nur ein Taster nach GND, fehlt ein PullUp.

Die Pins werden mit PINA, PINB... abgefragt.

Dafur gibt es

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Zugriff_auf_IO-Ports

gruß avr

von Walter (Gast)


Lesenswert?

soll das vielleicht
            PORTF |= (1<<PF2);
            PORTE |= (1<<PE0);
heißen?

von Kay (Gast)


Lesenswert?

DANKE !!!

Tja, manchmal sieht man den Wald vor lauter Bäumen nicht. Ist in 
Tutorials ja auch extra rot markiert. Kann mir mein Fehler mit PORT und 
PIN schon erklären, hab halt Befehlzeilen (um die Arbeit zu erleichtern 
kopiert) und dann nur die Zahlen jeweils geändert und garnicht auf das 
geachtet, einfach glaubig überlesen.

Aber kann das dann schon das spinnen der Ein und Ausgänge beheben oder 
ist da evtl. noch etwas anderes im argen???

von Otto (Gast)


Lesenswert?

Schreibe Dein Programm so, wie es im Tutorium steht.

Wenn Du z. B. Ausgänge auf "1" setzt, deren DDR auf Eingang steht, 
schaltest Du nur den internen Pull-up.

Otto

von spess53 (Gast)


Lesenswert?

Hi

Noch wichtig: Um PortF zu benutzen muss JTAG abgeschaltet werden.

MfG Spess

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.