ATmega8 langes Signal auf dem Augang

Gast #1140086
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
Gast #1140305
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.

...
Gast #1141193
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?
#1141206
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...
Gast #1141260
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren