Hi, ich versuche gerade im Studio 6 den USI im ATtiny45 zu debuggen. An einer Stelle im Code wird das USISR abgefragt mit IN, allerdings stehen danach im Register NICHT die Werte, die mir der Simulator für das USISR anzeigt... (siehe Screenshot) Speziell das Bit 6 USIOIF ist gesetzt, obwohl es eigentlich nicht gesetzt sein sollte (siehe Screenshot). Kann mir das jmd. erklären? Danke & Gruß Markus
Hallo! Meine persönlichen Erfahrungen mit den Simulatoren sind eher vernichtend. Ich würde auch manches gern vorher simulieren, was mit der Hardware des AVR's zusammenhängt, um zu schauen, ob ich denn das Datenblatt richtig verstanden habe. Hat bis jetzt sehr selten funktioniert. Klemm noch ein oder zwei LED mit an den Attiny, die du einfach leuchten lässt, wenn ein Ereignis eingetreten ist. So kannst du in Hardware debuggen. Wenns läuft, kannst du die LED ja wieder verschwinden lassen. MfG Dennis
Hmmm... leider ist das in diesem Fall mit dem Debuggen per LED eher schlecht. Das Debuggen mit dem Debugwire funktioniert auch nicht so, wie ich mir das vorstelle. Ist denn dieser Codeschnipsel OK? Er soll nacheinander mehrer Bytes deren Adresse er in r24 bekommt und deren Anzahl in r22 auf dem SPI ausgeben: Initialisierung (in C): Also clock für den USI soll der compare match vom timer 0 genommen werden. Dieser läuft direkt mit dem Systemtakt (prescaler=0). // Enable output on PORTB1/DO DDRB = 1<<DDB1; // SETUP USI USICR = 1<<USIWM0|1<<USICS0; USIDR = 0; // Setup Timer 0 OCR0A = 6; TCCR0A = 1<<WGM01; TCCR0B = 1<<CS00; Ausgabe (in ASM): MyLoop: movw r26, r24 sts TCNT0, r1 // Clear timer rjmp MyLoop1 MyLoop2: ld r0, X+ // Put next byte into USIDR out USIDR, r0 ldi r25, 1<<USIOIF|0x08 // Clear USIOIF and load USI timer out USISR, r25 MyLoop3: in r25, USISR // Wait for 8 Bits shifted out sbrs r25, USIOIF rjmp MyLoop3 MyLoop1: dec r22 // More bytes to output? brne MyLoop2 (ja, man löscht lt. Datenblatt das USIOIF indem man eine "1" schreibt). Habe ich da irgendwo einen Denkfehler? Danke & Gruß Markus
OK, ich habs gefunden... Die Definitionen für die Registeroffsets sind offenbar "falsch", bzw. haben immer noch 0x20 draufgerechnet. Gibt es einen fertigen Assemblermakro, der das berücksichtigt bzw. was muss ich #define(n), damit die Offsets stimmen? Danke & Gruß Markus
Hab ich jetzt ebenfalls gefunden, man muss wohl _SFR_IO_ADDR(<REGISTERDEFINITION>) veerwenden. Also z.B. _SFR_IO_ADDR(TCNT0) Oder man nimmt gleich einen Makro der für die höheren I/O-Adressen auf STS/LDS umschaltet: .macro STORE addr,reg .if \addr < 0x60 out \addr - 0x20,\reg .else sts \addr,\reg .endif .endm .macro LOAD reg,addr .if \addr < 0x60 in \reg,\addr - 0x20 .else lds \reg,\addr .endif .endm Eigentlich Anfängerwissen :-) Grüße Markus
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.