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


von KeDaiv (Gast)


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

von Ralli (Gast)


Lesenswert?

Liegt denn nach dem Entfernen des Testsignals ein definierter Pegel an?

Ansonsten schwimmt das Eingangspotential irgendwohin...

von KeDaiv (Gast)


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.

von Klaus (Gast)


Lesenswert?

liegt das Problem an?

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

Gruß Klaus

von KeDaiv (Gast)


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?

von Hannes Lux (Gast)


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.

...

von KeDaiv (Gast)


Lesenswert?

Hallo,
Ich hab mir mal das Datenblatt besorgt. Habe da mal nach Pull-Up 
gesucht, gefunden und dort das PUD - Bit mit
1
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?

von Justus S. (jussa)


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
1
SFIOR |= ( 1 << 2 );
> gesetzt.

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

von KeDaiv (Gast)


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.
1
/*
2
 * program.c
3
 *
4
 *  Created on: 31.01.2009
5
 *      Author: kedaiv
6
 */
7
8
#include <avr/io.h>
9
10
int main( void ) {
11
12
  DDRB = 0xFF; //Port D als Ausgang
13
  DDRD = 0x00; //Port B als Eingang
14
  PORTB = 0x00; //Alle Bits an Port B low
15
  PORTD |= ( 1 << 2 ); //Pull-Up für PIN 2 auf Port D setzen
16
  PORTD |= ( 1 << 3 ); //Pull-Up für PIN 3 auf Port D setzen
17
18
  /** Anfang Mainloop ********************************/
19
  while( 1 ) {
20
21
    if( ! ( PIND & ( 1 << 2 ) ) ) { //Wenn an PIN 2 Signal
22
      PORTB |= ( 1 << 0 ); //PIN 0 auf high
23
      PORTB |= ( 1 << 2 ); //PIN 2 auf high
24
    }
25
    else { //Ansonsten
26
      PORTB &= ~ ( 1 << 0 ); //PIN 0 auf low
27
      PORTB &= ~ ( 1 << 2 ); //PIN 2 auf low
28
    }
29
30
    if( ! ( PIND & ( 1 << 3 ) ) ) { //Wenn an PIN 3 Signal
31
      PORTB |= ( 1 << 1 ); //PIN 1 auf high
32
    }
33
    else { //Ansonsten
34
      PORTB &= ~ ( 1 << 1 ); //PIN 1 auf low
35
    }
36
37
    /** Ende Mainloop **********************************/
38
  }
39
40
  return 0;
41
}
Und jetzt funktioniert es! ;)
Danke!

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.