www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega8 langes Signal auf dem Augang


Autor: KeDaiv (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Ich habe vor kurzem ein kleines Programmierboard geschenkt bekommen. Auf 
diesem ist ein ATmega8 verbaut. Ich habe nun mal ein bisschen rum 
probiert und mich versucht dort einzuarbeiten. Jedoch bin ich gleich mal 
auf ein Problem gestoßen.
Ich prüfe, ob auf einem Eingang ein Signal ist. Wenn ja, dann lass ich 
auf einem Ausgang ein Signal raus. Komisch finde ich nun, das sobald das 
Signal weg ist, bleibt auf dem Ausgang noch ca 1,5 Sekunden ein Signal. 
Obwohl es weg sei sollte. Kann es vlt daran liegen, dass entweder meine 
Main-Loop nicht so schnell durchlaufen wird, was ich nicht denke, oder 
das vlt Register nicht zurück gesetzt werden? Zu der Geschwindigkeit mal 
was, ich hab ein Quarz drauf, der mit 3,6864 MHz tickt. ^^
Auch möchte ich euch den wenigen code, den ich hab nicht vorenthalten.
http://np.triagony.net/index.php?id=8468ceb698

Ich wäre euch dankbar, wenn ihr mich ein wenig erleuchten könntet. ^^

mfg
KeDaiv

Autor: Ralli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Liegt denn nach dem Entfernen des Testsignals ein definierter Pegel an?

Ansonsten schwimmt das Eingangspotential irgendwohin...

Autor: KeDaiv (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider gottes habe ich nichts zu messen hier. Sondern nur ein Demoboard. 
An den Ausgängen habe ich zwei LED's dran. Und diese leuchten halt 
immernoch, wenn ich den Taster schon lange los gelassen habe.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
liegt das Problem an?

PinX <> PortX , böse Falle, wenn man wo anders herkommt!

Gruß Klaus

Autor: KeDaiv (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiß nicht so genau. Wie schon gesagt habe ich mich gerade erst 
angefangen einzulesen. Anhand des AVR-GCC-Tutorial. Und laut diesem 
Tutorial sind auf PINx die Eingangssignale und auf PORTx die 
Ausgangssignale. AVR-GCC-Tutorial: Zugriff auf IO-Ports Und ich 
denke, das ich die als solche nutze, oder nicht?

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau neben dem Tutorial auch mal ins Datenblatt des Mega8, da sind die 
I/O-Register und ihre Bits recht genau erklärt. Ich vermute (ohne Dein 
Programm angesehen zu haben, ich kann kein C, kenne aber den Mega8), Du 
hast vergessen, den internen PullUp einzuschalten.

...

Autor: KeDaiv (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Ich hab mir mal das Datenblatt besorgt. Habe da mal nach Pull-Up 
gesucht, gefunden und dort das PUD - Bit mit
SFIOR |= ( 1 << 2 );
 gesetzt. Ich habe es gleich am Anfang des Programmes gesetzt und auch 
gelöscht. Hatte alles nichts gebracht. Was gibt es dort noch für 
Möglichkeiten?

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
KeDaiv wrote:
> Hallo,
> Ich hab mir mal das Datenblatt besorgt. Habe da mal nach Pull-Up
> gesucht, gefunden und dort das PUD - Bit mit
SFIOR |= ( 1 << 2 );
> gesetzt.

das dient aber afaik nur um alle internen Pullups global zu 
DEaktivieren, zum Aktivieren muss man sie explizit setzen...

Autor: KeDaiv (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich nun richtig gelesen habe, setzt man im Register PORTB das Bit 
auf High, für welches man Pull-Up aktivieren möchte. Natürlich auf dem 
Eingang.
/*
 * program.c
 *
 *  Created on: 31.01.2009
 *      Author: kedaiv
 */

#include <avr/io.h>

int main( void ) {

  DDRB = 0xFF; //Port D als Ausgang
  DDRD = 0x00; //Port B als Eingang
  PORTB = 0x00; //Alle Bits an Port B low
  PORTD |= ( 1 << 2 ); //Pull-Up für PIN 2 auf Port D setzen
  PORTD |= ( 1 << 3 ); //Pull-Up für PIN 3 auf Port D setzen

  /** Anfang Mainloop ********************************/
  while( 1 ) {

    if( ! ( PIND & ( 1 << 2 ) ) ) { //Wenn an PIN 2 Signal
      PORTB |= ( 1 << 0 ); //PIN 0 auf high
      PORTB |= ( 1 << 2 ); //PIN 2 auf high
    }
    else { //Ansonsten
      PORTB &= ~ ( 1 << 0 ); //PIN 0 auf low
      PORTB &= ~ ( 1 << 2 ); //PIN 2 auf low
    }

    if( ! ( PIND & ( 1 << 3 ) ) ) { //Wenn an PIN 3 Signal
      PORTB |= ( 1 << 1 ); //PIN 1 auf high
    }
    else { //Ansonsten
      PORTB &= ~ ( 1 << 1 ); //PIN 1 auf low
    }

    /** Ende Mainloop **********************************/
  }

  return 0;
}

Und jetzt funktioniert es! ;)
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.