PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : pull up wiederstaende aktivieren ?!?!?!



exile
26.11.2004, 00:53
Hallo,

ich bin recht neu dabei und verstehe nicht warum ich keine internen pull up Wiederstaede aktivieren kann. Ich habe 2 Programme geschieben eins in C und das andere in Basic. Meines Erachtens gleichen sie sich, aber sie tuen nicht dasselbe.

Ziel:
portb pin0 = ausgang (LED) (HIGH = AN)
portb pin1 = eingang (Schalter) (HIGH = Schalter - offen)

Mein Basic Programm funktioniert (LED flakert nicht, pull up aktiv),
alles wunderbar.



Ddrb = &B00000001
Portb = &B00000010

Do
If Pinb.1 = 0 Then
Portb.0 = 1
Else
Portb.0 = 0
End If
Loop
End


Aber mein C Programm aktiviert sie einfach nicht!



#include <avr/io.h>
int main (void) {
DDRB = 0x01;
PORTB = 0x02; // GEHT NET =(

while (1) {
if ( (PINB & 0x02) == 0x00 )
PORTB = 0x01;
else
PORTB = 0x00;
}
}


Kann sich das einer erklaeren? Ich nicht! :-k :-k :-k
Uebrigens ist das Basic Programm auf XP uebersetzt worden (Bascom), wobei ich C unter Linux benutze (avr-gcc, avrdude).

Danke im Voraus.

mfg
martin

PicNick
26.11.2004, 12:31
Hi, schau mal, wie PINB definiert ist, da hat's wahrscheinlich was.
Probier einfach was anderes:
if (PORTB & 0x02) // is im PortB das Bit 2^^1 gesetzt ?
PORTB = 0x00; // ja --> ganzes port auf Null
else PORTB = 0x01; // nö --- > ganzes port auf 1

mfg

exile
26.11.2004, 16:35
Das waere ja nur umgekehrte Logik. Funktioniert ebenso nicht =(,
aber danke fuer die Antwort.

Ich glaube der hacken ist hier: PORTB = 0x02;
diese Zeile aktiviert doch den internen pull up Wiederstand, wenn ich das alles richtig verstanden habe. Damit der Pin (hier der 2te) keine undefinierten Pegel bekommt.
Wenn ich ein 10 kOhm Wiederstand zwischen + und den 2ten Pin lege, funktioniert alles wie es soll, das waere jetzt ein externen oder nicht und wenn es so ware sollte man den internen ausschalten, hab ich gelesen. Also nicht beide zur selben Zeit benutzen.

Daraus folgere ich jetzt mal frech O:) , dass der obrige code richtig ist, oder irre ich mich?

mfg
martin

26.11.2004, 17:14
Hallo


while (1) {
if ( (PINB & 0x02) == 0x00 )
PORTB = 0x01; Hier wid der Pullup doch wieder ausgeschaltet
else
PORTB = 0x00; und hier auch
}
}

Bei BASCOM schreibst du den Port ja mit Bitzugriffen, in C schreibst du den ganzen Port neu.

MFG
Dieter

26.11.2004, 20:41
http://mc-project.de/Pages/AVR/avrgcc/programmierung.html

exile
27.11.2004, 16:58
Achso, ups, habs jetzt endlich verstanden, =).
Funktioniert jetzt alles wie es soll, werde mich jetzt an eine delay funktion machen.

Vielen dank fuer eure Beitraege.

mfg
martin