Forum: Mikrocontroller und Digitale Elektronik AVR für Anfänger


von tex kerstan (Gast)


Lesenswert?

Ich versuche von den 8031 µCs auf AVR zu wechseln. Dazu habe ich mir
einen Butterfly besorgt und tausende von Einsteiger-Büchern aber ich
komme mit den Zeug nicht klar. Es scheitert an Basisfragen.
so banale Dinge wie

P2.1 = 1

oder

if(P2.1 == 1)
funktionieren nicht. Aber warum nicht?
Inzwischen habe ich

while(!(PINB & (1<<PORTB6)) )

gefunden.

while(!   verstehe ich ja noch, aber was passiert bei
(PINB & (1<<PORTB6))   ?!?

Warum geht    if(PORTB6 == 0)  nicht?

tex

von ...HanneS... (Gast)


Lesenswert?

Vielleicht passen ja Bücher und Compiler nicht zusammen?
Mit AVR-Studio, Assembler und dem Befehlssatz aus dem jeweiligen
Datenblatt dürfte es weniger Missverständnisse geben. Allerdings bleibt
das Display dann auch vorerst dunkel...

von Mike (Gast)


Lesenswert?

Schau mal in das Wiki dieser Seite bzw. auch mal auf
www.mc-project.de
Dort findest du Erklärungen/Anleitungen.

von ...HanneS... (Gast)


Lesenswert?

----- Original Message -----
From: tex <tex@looneytex.de>
To: <hannes.lux@gmx.de>
Sent: Tuesday, November 16, 2004 12:54 PM
Subject: Re: Antwort auf "AVR für Anfänger"


> ???

Hallo Tex...

> Sorry. Ich verstehe nicht ganz. Welches Display?

Na hat der AVR-Butterfly kein LCD-Display?
Oder reden wir von verschiedenen Dingen?

> Und was hat das Buch
> mit dem Compiler zu tun? Macht es vom Befehlssatz einen Unterschied,

> welcher Compiler im Spiel ist, wenn wir mal davon ausgehen, dass ich

> schon weiss, dass ich einen Pascal-Code nicht mit einem C-Compiler
> vergewaltigen kann?

Der AVR kann nur Maschinencode. Zu jedem Maschinencode gibt es exakt
einen Assemblerbefehl. Und nur diese Befehle sind für die Hardware
verbindlich.

Jede Hochsprache und jeder Dialekt davon hat ihre/seine eigene
Befehlsliste und Syntax. Mir nützt also ein Buch über M$-QBASIC nix,
wenn ich in BASCOM-AVR oder FAST-AVR programmieren möchte, denn die
Grundanweisungen heißen zwar gleich, haben aber unterschiedliche
Syntax. Mal vom unterschiedlichen Befehlsvorrat abgesehen.

> Der Tipp mit dem Assembler ist ok, aber das ist nun wirklich nicht
mein
> Ding.

Die Frage ist, ob ASM nicht dein Ding ist, oder ob du nicht bereit
bist, dich mit der Architektur des AVR vertraut zu machen. Und das geht
eigentlich nicht ohne ASM.

> Wie sollte ich    Alpha = atan((cos((L + 0.00256 * cos((125.04 -
> 1934.136 * T)/180.0*pi))* pi / 180.0 )*sin(M * pi / 180.0)) /cos(M *
pi
> / 180.0)) * 180.0 / pi - 180.0;
> oder  L = (280.46061837 + 360.98564736629 * (JD-2451545)
+0.000387933 *
> T * T -(( T  T  T) / 37810000))  -(signed long)((280.46061837 +
> 360.98564736629 * (JD-2451545)     +0.000387933  T  T -(( T * T *
T) /
> 37810000))/360.0)*360.0;
> in Assembler schreiben. Klar geht es, der Compiler macht ja nix
anderes,
> aber ich bekomme das nicht hin.

Ich bekomme das auch nicht hin. Aber meine Anwendungen kommen ohne
solche Arithmetik aus.

> Das ist auch nicht die Frage. Ich verrecke bei dem Versuch, einen
Port
> abzufragen oder zu setzten.
> Das kann doch nicht mehr am Compiler liegen, oder?

Es wird daran liegen, dass der Compiler eine andere Syntax erwartet als
du gewohnt bist. Da wirst du dich wohl mal mit der Dokumentation dieses
Compilers auseinandersetzen müssen.

> tex

Viel Erfolg...
...HanneS...

von tex (Gast)


Lesenswert?

ok! Wenn ich nun info Mike und info hanes verknüpfe, kommt dabei raus,
das P1.1 = 1 nicht geht, weil der Compiler es nicht versteht.
Was ich nicht verstehe ist, warum ich Bits nur über UND und ODER
Befehle ansprechen kann. Wenn es über UND und ODER geht, müsste es doch
zumindest auch über sbi und cbi gehen. Und warum mir PORTB1 == 1 keine
Ergebnis liefert, weiss ich auch noch nicht.
Es muss doch so etwas wie ein Verzeichnis der Funktionen oder sowas
geben. Mein letzter Compiler hatte ein Syntax-Buch in dem man die
Befehle und deren Syntax nachlesen konnte.

von Mike (Gast)


Lesenswert?

Probiers doch mal mit der WinAVR-Doku!
Warum man einzelne Bits mit avr-gcc nicht ansprechen kann, weiß ich
auch nicht, akzeptiere es einfach. Wäre auch eher eine Frage für Jörg
Wunsch.

von ...HanneS... (Gast)


Lesenswert?

Hi...

@Mike: Nix C, PASCAL...

@Tex: Das verbindliche Befehlsverzeichnis findest du im Datenblatt
deines Controllers. Allerdings sind nur ASM-Befehle verbindlich.

Setzt du einen Compiler ein, dann gibt es sicherlich auch eine
verbindliche Befehlsliste beim Hersteller des Compilers...

...HanneS...

von Christof Krüger (Gast)


Lesenswert?

Einmal das Datenblatt komplett durchlesen würde da schon helfen. Der
AVR-GCC gibt dir Zugriff auf alle möglichen Ports und Register,
allerdings war es das auch schon. Der AVR ist ein 8-Bit µC, der nur in
Ausnahmefällen direkt auf Bits arbeitet (sbi, cbi etc.). Das ist dann
aber schon sehr hardwarenah und eine Hochsprache wie C abstrahiert da
schon etwas weiter, so dass man sich auf Byte-Ebene befindet. Mit
einfachen Bitoperationen kann man also durchaus auf bestimmte Bits
testen und Bits setzen u.ä. Einen guten Einstieg gibt das
AVR-GCC-Tutorial hier im Wiki:
http://www.mikrocontroller.net/wiki/AVR-GCC-Tutorial#Allgemeiner_Zugriff_auf_Register

Wichtig ist hierbei, dass die Schnittstelle zwischen Hard- und Software
hier auf Registerebene geschieht. Und diese sind eben 8-Bit breit.
Ob der Compiler dann nachher doch mit cbi und sbi arbeitet, ist im
selbst und seinen Optimierungskünsten überlassen.

von Christof Krüger (Gast)


Lesenswert?

Achja, auch wichtig: Die Sprache C ist standardisiert, da sollte man
möglichst wenig dran rütteln. Es ist also gut, dass AVR-GCC nicht
irgendwelche ominösen Bitmanipulations-Erweiterungen eingebaut hat!
Wie gesagt: Es gibt die spezifischen Register des Mikrocontrollers als
Schnittstelle und alles darüber ist Standard-C, und das ist auch gut
so!

von ...HanneS... (Gast)


Lesenswert?

Er will doch aber kein C oder ASM, sondern PASCAL... ;-)

von tex (Gast)


Lesenswert?

nein nein, C ist schon OK. Ich werd mich dran gewöhnen. Pascall war wohl
eh ein Schuss in den Ofen
Die Erklärung von Christof ist schon einleuchtend. Ich bin von meinem
80537 wohl zu verwöhnt. Einfach P6.1==1 und schon hat man was man
braucht war wohl zu einfach, oder lags doch am Compiler? Keine Ahnung.
Jedenfalls bin ich jetzt schon mal ein Stück schlauer. Vielen Dank an
alle Beteiligten. Ich habe übrigens ein offenes Ohr für alle weitere
Tipps und Ratschläge. und sollte das Thema nicht mehr genug hergeben:
- wie bekomme ich eine CAN Schnittstelle an den MEGA128?
- gibts schon eine RTC die nicht sekunden und minuten zu stunden und
tagen zusammenaddiert sondern das Julianische Datum benutzt?
- hat jemand eine coole Idee, wie ich die eine magere Serielle
Schnittstelle des mega128 auf 3 Kommunikationspartner verteile?

von Klaus (Gast)


Lesenswert?

Bei welcher deiner Fragen konnte dir die Forensuche denn nicht helfen?

von Tobi (Gast)


Lesenswert?

überigens hat der m128 2 serielle schnittstellen

von tex (Gast)


Lesenswert?

zu klaus
Ich habe jetzt einen ganzen Haufen Antworten. Jetzt darf ich mir erst
mal Gedanken machen über diese (für meine Begriffe) absurde und
irrsinnnig komplizieret Register- und Portabfrage / Veränderung.



Zu Tobi
Wer lesen kann ist klar im Vorteil. Danke! Jetzt hat mein Mega128 auch
2 serielle Schnittstellen! Ist aber immer noch eine zu wenig.

von Christof Krüger (Gast)


Lesenswert?

Wie gesagt: irrsinnig ist es nicht. Es folgt einem nachvollziehbaren,
logischen und standardiesierten Muster. Wenn es dir zu kompliziert ist,
steht es dir frei, dir Preprozessor-Makros zu schreiben, die das ganze
etwas leserlicher machen.

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.