Hallo, ich habe ein verstaendnis problem: ich schreibe eine library fuer das CAN interface des a90can128 in C. Ich moechte ein register auf null zuruecksetzen, dabei ist mir aufgefallen, das die register nicht mit null beschrieben werden sondern mit einem anderen wert. Ich habe mir den assembler output angesehen, und festgestellt, dass der wert des registers R1 in das CANSTMOB register geschrieben wird. Dieser ist zu diesem zeitpunkt jedoch nicht 0x00 sonder hat in meinem fall 0xDD. Also wird das CANSTMOB register ein nicht gewuenschter wert geschrieben. Ich hab die sourcen mal mit der option -O0 und -Os compiliert. Beide mal wird jedoch der wert von R1 genommen. 342: CANSTMOB = 0; // cancel pending operation +000007F0: EEEE LDI R30,0xEE Load immediate +000007F1: E0F0 LDI R31,0x00 Load immediate +000007F2: 8210 STD Z+0,R1 Store indirect with displacement 342: CANSTMOB = 0; // cancel pending operation +00000446: 921000EE STS 0x00EE,R1 Store direct to data space so dann habe ich noch einwenig weiter probiert, wenn ich jedoch einen wert != 0 schreibe wird der wert in diesem fall in R24 geschrieben und danach nach CANSTMOB geschoben, was in meinen augen richtig ist. Im anschluss versuche ich dann ein anderes register mit 0 zu beschreiben, und wieder wird der inhalt von R1 verwendet. 342: CANSTMOB = 0x01; // cancel pending operation +00000446: E081 LDI R24,0x01 Load immediate +00000447: 938000EE STS 0x00EE,R24 Store direct to data space 343: CANCDMOB = 0x00; +00000449: 921000EF STS 0x00EF,R1 Store direct to data space Ich habe das ganze in der simulation von AVRStudio laufen lassen, da es mir im moment an der HW mangelt. Ist das jetzt ein fehler meinerseits oder macht gcc hier etwas falsch gruesse markus
Im Registermodell von GCC/AVR enthält R1 stets den Wert 0. Daher solltest du herausfinden, warum das hier nicht der Fall ist.
Sind irgendwelche in Assembler geschriebenen Routinen beteiligt? Oder Interrupt-Routinen? Èin RTOS?
A.K. danke fuer deine schnelle hilfe. Es war der richtige denkanstoss, bei einer initialisierung eines pointers auf eine structur habe ich einen boessen fehler gemacht! Das war der ausloeser des problems. Ausserdem hatte ich nicht gewusst, dass das R1 register immer null ist im AVR... und wieder was gelernt! gruss markus
'tschuldigung: OT hallo markus, da ich ebenfalls für den gleichen controller mit CAN rumfrickel .. was kann deine lib oder was ist beabsichtigt, wenn ich mal so unverblümt fragen darf? hab nur keine lust, jeden tag das rad neu zu erfinden, vll kann man sich gedanklich einmal austauschen, wer weiß. thx, bye kosmo
@ markus >Ausserdem hatte ich nicht gewusst, dass das R1 register immer null ist >im AVR... und wieder was gelernt! Das ist es nicht. Der GCC lädt es mit Null und verwendet es als Null-Register. In Assembler ist es frei verwendbar wie jedes andere Register. Wie programmierst du denn nun wirklich? In C oder ASM? Oder gemischt? Letzeres ist bisweilen problematisch. MFG Falk
Falk, danke fuer die antwort, im moment verwende ich nur C; Kann ich irgendwo nachlesen wie der gcc dir register verwendet bzw. welche besonderheiten es noch zu beachten gibt beim avr. gruss markus
@ markus >danke fuer die antwort, im moment verwende ich nur C; Kann ich irgendwo >nachlesen wie der gcc dir register verwendet bzw. welche besonderheiten >es noch zu beachten gibt beim avr. Wenn du nur in C programmierst dann sind dir die Register des Prozessors egal. Du "siehst" sie nicht. Du hast nur deine Variablen, welche ganz normal verwendet werden. Mit den Registern musst du dich nur rumschlagen, wenn du innerhalb von C noch mit Inline Assembler arbeiten willst. Das ist aber nur was für Fortgeschrittene, die sowohl C als auch Assembler gut beherrschen. Details dazu stehen in der Doku der libc. MFG Falk
im Manual?! ...von der avr-libc und dem GCC, natürlich, wenn du WinAVR nutzt hast du beides auf der Festplatte
Kosmo, die lib wird wohl so ein gemisch aus verschieden can libs die ich so im netz gefunden habe und die ideen bzw. umsetzung gut gefallen haben. Im moment bin ich noch am debuggen, aber ohne HW. Je nach freizeit und wetter hoffe ich bis ende des monats fertig zu werden. Sobald sie vorzeigbar ist werde ich sie natuerlich hier rein stellen. Ansonsten kannst du hier mal suchen bzw. bei AVRFreaks oder auch bei Atmel selbst nach sehen. Dort gibt es einige brauchbare libs. gruss markus
hallo markus, ja, das von atmel kenne ich. alles ganz toll, wenn man polling will, aber hm, nicht mein anspruch, irq's sind schon was anders. avrfreaks habe ich noch nicht geschaut, werde ich mal machen, danke. achja, register usage des avr-gcc http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_reg_usage bye kosmo
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.