PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATMega8 <<-- Eingänge/Ausgänge



seitenmaster
24.08.2004, 09:01
Hi, endlich habe ich nach Tagen mein Board einigermaßen sauber aufbauen und den Controller zum laufen bringen können. Jetzt wurschtel ich mich gerade so durch meine ersten Experimente :)
Hier habe ich auch schon die erste Frage:

-Ist es normal, das die angeschlossenen LEDs am Ausgang(von mir festgelegt) leuchten, wenn ich den jeweiligen Ausgang auf logischg null setze?

Außerdem:

-Wie schalte ich nen Eingang? Also im Simulator setze ich ein Bit(per Mausklick) und kann dann darauf mit dem Programm reagieren, dies habe ich in der Praxis noch nicht hinbekommen. Wie müsste das schaltplantechnisch aussehen, wenn ich beispielsweise nen Taster anschließen möchte. Ist das am Eingang dann auch alles verdreht? Also wenn ich Spannung drauf gebe ist er auf logisch null und wenn nicht auf 1??

x-ryder
24.08.2004, 09:45
Hi

Du musst erstmal den Port initialisieren!

Beispiel 1:

$regfile=""
$crystal=

config portx=output

portx=1

end

Beispiel 2:

$regfile=""
$crystal=

config portx=input
portx=63 bzw 255 (63 = Portc, 255 = Portb, Portd)

if portx=1 then ...

end

Im zweiten Beispiel muss man die internen Pullup-Wiederstände des Atmega erst ausschalten, dies macht man wenn man den Port als Input definiert hat mit Portx=Zahl.
Ausschalten=0
Einschalten=siehe oben

+5V -> Taster -> 250 R -> ATMEGA8

Martin

seitenmaster
24.08.2004, 10:04
hmm ja das ist ok danke, aber das war jetzt in Basic oder so was??
Das sagt mir leider nicht sehr viel, C/C++ oder Assembler würde mir mehr sagen.

seitenmaster
24.08.2004, 10:15
Nagut nein, das braucht ihr jetzt nicht übersetzen oder so.
Ich es mittlerweile größten Teils verstanden was ich oben gefragt habe, nur eine Sache, und zwar das mit dem verdrehten Port also wenn ich logisch eins setze dann ist es aus, müsste ich noch wissen.

x-ryder
24.08.2004, 10:18
In Asm und in C/C++ isses das gleiche.

Für Asm: DDRB (Portb), DDRC (Portc) oder DDRD (Portd)

Und dann: DDRx = ...

Und ich weiß nicht, wie man in C/C++ was ausgibt aufm Port aber ich denke da kannste die Methode ausm Asm nehmen.

Martin

seitenmaster
24.08.2004, 10:40
Was meinst du ... mal so ganz dumm gefragt??
Was ist das gleiche? Und wie ist das mit den verdrehten Bits ? Ist das richtig so? Wie kann man es ändern?

Volker-01
24.08.2004, 10:42
@seitenmaster:

Zu deiner "Portdreher - Frage": Es kommt nur auf deine Art an, wie du die LED's angeschlossen hast. Kleines Beispiel:

Wenn du eine LED mit einem Vorwiderstand zwischen deinen Port und 5V bzw. deinen Port und Masse anschliest( Angehängtes Bild oben/unten). So wird die Erste Variante bei LOW am Portausgang und die zweite bei High am Portausgang leuchten. Hoffe jetzt ist es dir etwas klarer geworden.

MfG Volker

seitenmaster
24.08.2004, 10:47
Achso, ja klar danke!!
Sorry wegen meiner dummen Fragerei, aber ich muss ja erstmal die Grundlagen verstehen, bevor ich mir mehr ausdenken kann ;-)

Wie aktiviere ich die Pull-Up-Widerstände eines Ports bzw. einzelner Bits?

24.08.2004, 10:53
DDRX = 0x00; //gesamter Port als Eingang
DDRX = ~_BV(PX1) & ~_BV(PX2); //nur PX1 und PX2 zwei als Eingänge
DDRX &= ~_BV(PX5); //nur PX5 als Eingang

analog das Aktivieren der Pull-Ups:
PINX = 0x00;
PINX = ~_BV(PX1) & ~_BV(PX2);
usw.

Ich empfehle dir das durcharbeiten der Links auf dieser Seite, sie verweisen auf einige nützliche Tutorials.

Gruß, Alex

24.08.2004, 10:56
Sorry, bei den Pull-Ups muß es so aussehen:
PINX = 0xFF;
PINX = _BV(PX1) | _BV(PX2);
PINX |= _BV(PX5);

Die oben angeführte Variante würde sie deaktivieren.

Gruß, Alex

seitenmaster
24.08.2004, 11:03
Hmm,ok.
Also momentan tendiere ich eher mal mit C/C++ weiter zu machen, aber bin da leider nicht sicher. Ich werde mal die Links/Tutorials für die C-Programmierung am ATMega8 verfolgen.

24.08.2004, 20:27
Würde ich dir auch raten. Meiner Meinung nach ist C der beste Kompromiss zwischen Hardwarenähe und Hochsprache. Ausserdem ist der erzeugte Code relativ gut optimiert.

Gruss, Alex