Forum: Mikrocontroller und Digitale Elektronik ATtiny45 USI / Studio 6 Simulatorfehler?


von Markus M. (adrock)


Angehängte Dateien:

Lesenswert?

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

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

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

von Markus M. (adrock)


Lesenswert?

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

von Markus M. (adrock)


Lesenswert?

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

von Markus M. (adrock)


Lesenswert?

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
Noch kein Account? Hier anmelden.