Hallo Als Anfänger in der Programmierung von Mikrocontrollern habe ich versucht im AVR-Studio Version 4.11 einen interrupt gesteuerten Timer/Zähler zu simulieren. Okay, vielleicht mit einem für Beginner nicht gerade idealen device (Atmega48). Trotzdem folgende Frage: Damit der Overflow Interrupt für Timer0 ausgelöst wird muss ich unter anderem das im TIMSK0 Register existierende Timer Interrupt Overflow Flag (TOIE0) setzen. Dies erfolgt bei mir mit den folgenden Anweisungen: ldi r16, 0b00000001 ; out TIMSK0 ,r16 ; Timer Interrupt Maske setzen Beim Comilieren gibt mir aber das AVR-Studio folgende Meldung aus: error: Operand 1 out of range: 0x6e wobei 0x6e die Adresse des TIMSK0 Registers ist. Ich verstehe aber nicht wieso? Kann mir jemand einen Tipp geben? Was mache ich falsch?
Auszug aus der Include Datai: ; ***** I/O REGISTER DEFINITIONS ***************************************** ; NOTE: ; Definitions marked "MEMORY MAPPED"are extended I/O ports ; and cannot be used with IN/OUT instructions TIMSK0 beinhaltet die Speicherposition und nicht die I/O-Port Adresse Schau einfach im Datenblatt nach was die I/0-Port Adresse ist und verwende diese, oder rechne den Versatz aus, und ziehe den Wert von TIMSK0 ab.
Schau mal im Datenblatt unter Register Summary nach, welche I/O-Register im normalen I/O-Bereich liegen und welche im extendet-I/O-Bereich. Die Register im extendet-I/O-Bereich lassen sich nur wie SRAM ansprechen. Der Mega48 ist in dieser Beziehung besonders unvorteilhaft konstruiert. Sein Konstrukteur war dabei wohl besoffen... ...
Hallo Christof Danke für Deinen Beitrag, aber sei mir nicht böse ich verstehe nur Bahnhof. Kannst Du mir das genauer erklären? Danke für Dein Verständnis.
Hallo Hannes Nun glaube ich zu verstehen was Christof gemeint hat. Merci. Werde mich mal schlau machen und das Datenblatt genauer lesen. Danke
Hi auch ganz brauchbar ist das AVR Instruction Set, da sieht man ganz gut welchen Befehl man in welchem Adressbereich anwenden kann. Gruß MISZOU
Kleine Hilfe in Form eines Denkanstoßes: http://www.mikrocontroller.net/forum/read-1-254635.html#254673 Bit- & Bytebruch... ...HanneS...
Hallo Hannes, war mir noch gar nicht aufgefallen, der TIMSK0 ist tatsächlich über IN/OUT nicht mehr erreichbar. The ATmega48/88/168 is a complex microcontroller with more peripheral units than can be supported within the 64 locations reserved in the Opcode for the IN and OUT instructions. For the Extended I/O space from 0x60 - 0xFF in SRAM, only the ST/STS/STD and LD/LDS/LDD instructions can be used. Unser TIMSK0 liegt auf 0x6e und kann somit nur über die Befehle ST/STS/STD und LD/LDS/LDD erreicht werden.
Hi Wenn man die Macros aus der Appnote 001 benutzt ,kann man die ganzen Probleme mit der Adressierung umgegen. MfG HG
Aber nur scheinbar... (man schaut halt weg und bemerkt es nicht mehr) Denn die Zugriffe auf extendet-I/O kosten mehr Flash und mehr Rechenzeit. Das mag jetzt haarspalterisch erscheinen, kann sich aber bemerkbar machen. Das Unsinnige daran ist aber die Tatsache, dass im normalen I/O-Bereich jede Menge Adressen unbenutzt sind, die mit IN/OUT oder sogar mit CBI/SBI erreichbar sind. Ich sehe das daher als eine Einschränkung, die bei vernünftigem Design nicht nötig wäre. Es macht die Programme unnötig groß und langsam. ...
wenn man zeitkritische routinen braucht, die hier beim avr das genannte nicht erreichen sollte man einen anderen chipsatz nehmen um das ziel zu erreichen. ich glaube kaum das atmel hier bei diesen die herstellungsverfahren ändert. mfg pebisoft
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.