Forum: Mikrocontroller und Digitale Elektronik Mega88: Serielles EEprom, TWI und debuggen


von Silver69 (Gast)


Lesenswert?

Hallo!

Irgendwann muss ich mich mal ranwagen, das serielle EEprom mittels TWI 
mit den Mega88 zu füttern...

Da dies ja nun etwas kompliziert ist, habe ich eine Frage zum debuggen:

Kann ich meinen Assembler Code in den Mega88 debuggen? Also 
Programmiergerät benutze ich ein selbstgebautes, das man an den 
Parallelport des PC anschließt. Als Entwicklungssoftware benutze ich AVR 
Studio 4.

Habe schon irgendwo, wahrscheinlich hier, gelesen, dass jemand durch das 
debuggen seinen Mega 88 "kaputt gemacht" hat. Deswegen frage ich lieber 
erst mal nach ;-)

von micha (Gast)


Lesenswert?

Wahrscheinlich geht das so wie Du es dir vorstellst mit deinem 
Programmer nicht. IMHO hat der Mega88 ein Debug-Wire interface. Das 
läuft dann mit dem AVR-Dragon, ein "freies" DebugWire-Geräte kenne ich 
nicht.
Alternativ kannst Du das ja evetuell auch im Simulator vom AVR Studio 
debuggen. Dabei wird dann der Mega88 simuliert. Oder du baust 
Debug-Ausgaben ein, die du typischer Weise über den UART (oder TWI/SPI) 
ausgibst.

Schau mal hier --> http://www.mikrocontroller.net/articles/DebugWIRE

von Peter D. (peda)


Lesenswert?

Zum TWI debuggen könnte ein Sniffer nützlich sein:

Beitrag "I2C (TWI) Sniffer mit AVR"


Peter

von Silver69 (Gast)


Lesenswert?

Schade, dass das mit dem debuggen nicht einfach so funktioniert.
Aber wie ich gerade merke, würde mir das eh nicht weiterhelfen.

Ich habe im Inet einen C-Code gefunden, den ich dann auf Assembler 
umgestrickt habe (obwohl ich kein C kann... das möchte ich betonen).
Hier nun die ersten Zeilen des Codes:
1
rjmp TWIStart
2
3
TWIAction:  ;R16 => Das Kommando 
4
      ori r16, (1 << TWINT)
5
      sts TWCR,r16
6
7
wait1:    lds r16,TWCR
8
9
      Rcall USARTSent ;R16 'debuggen'
10
11
      sbrs r16,TWINT
12
      rjmp wait1
13
      lds r16, TWSR
14
ret
15
16
TWIStart:    
17
    
18
      ldi r16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
19
      rcall TWIAction
20
      cpi r16, 0x08
21
      brne error
22
23
....

So: die Code Abarbeitung bleibt in der WAIT1 Schleife hängen. Bin schon 
enttäuscht, dass gar nicht passiert....
Nun zu der Hauptfrage: "Wieso wird die Bedienung nicht erfüllt", noch 2 
Andere:

Was bedeutet das :"(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)" und zwar die "<<" 
und die "|". ist das "|" eine ODER-Verknüpfung? Wollte ich schon immer 
wissen, hab mich aber noch nie zu fragen gewagt.
Dann der Befehl "sbrs r16,TWINT": Prüft ob das Bit "TWINT" im R16 
gesetzt ist und führt dann den nächsten Befehl nicht aus? Diesen Befehl 
hab ich direkt aus dem Datenblatt vom Mega88 genommen. Nur ein Problem 
damit: TWINT hat den Wert 15? 15 Bits hat das Register doch gar nicht, 
wenn ich mich nicht verzählt habe...Ach ja der Wert in R16, das geprüft 
wird, ist 36.

von Silver69 (Gast)


Lesenswert?

Hätte die Frage wohl nicht mitten in der Nacht stellen sollen? :-)

von micha (Gast)


Lesenswert?

Hallo Silver!

"|" ist eine oder-Verknüpfung. "<<" ist ein Shift-Operator, in diesem 
fall wird nach links geschoben (">>" entsprechend nach rechts). (1 << 
TWINT) bedeutet also das Bitmuster "00000001" um TWINT Stellen nach 
links verschoben wird. wäre TWINT==3 also "00001000". Dies ist eine 
einfache Möglichkeit Bitmasken zu erstellen bzw. ein Bit mit der 
entsprechenden Wertigkeit zu setzen.

Eventuell hilft die ja die Codesammlung --> 
http://www.mikrocontroller.net/forum/codesammlung?filter=TWI weiter, 
dort sind ein paar TWI Beispiele schon in ASM :-)

von Silver69 (Gast)


Lesenswert?

Hallo!

Danke für die Antwort, habe mal einige Codes angeguckt. Mit dem 
Ergebniss, dass es alle etwa so machen wie auch ich:
1
      ldi r16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
2
      STS TWCR,r16          ;In den Besipielen steht hier OUT
3
4
twistart1:  clr r16
5
6
7
      lds r16, (1<<twint)        
8
      Rcall USARTSent         ;R16 'debuggen' = R16 = TWINT = 0
9
      
10
      LDS r16,TWCR          ;In den Besispielen steht hier IN      
11
      Rcall USARTSent         ;R16 'debuggen'  = R16 = TWCR = 36| 0x24 | 0b100100
12
    
13
      sbrs r16, TWINT
14
      rjmp twistart1          ;und hier ist die Endlosschleife perfekt!!
15
      
16
17
18
loop33:
19
      rjmp loop33



Habe keine Ahnung, warum das nicht geht, sitze, und vergleiche schon 
seit Stunden (Tagen??) über diese 3 Codezeilen, und weiß wirklich nicht 
mehr weiter.

Bin für jede Hilfe dankbar!

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.