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
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...
Schau mal in das Wiki dieser Seite bzw. auch mal auf www.mc-project.de Dort findest du Erklärungen/Anleitungen.
----- 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...
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.
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.
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...
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.
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!
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.