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
Liegt denn nach dem Entfernen des Testsignals ein definierter Pegel an? Ansonsten schwimmt das Eingangspotential irgendwohin...
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.
liegt das Problem an? PinX <> PortX , böse Falle, wenn man wo anders herkommt! Gruß Klaus
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?
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. ...
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?
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.