www.mikrocontroller.net

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


Autor: Silver69 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zum TWI debuggen könnte ein Sniffer nützlich sein:

Beitrag "I2C (TWI) Sniffer mit AVR"


Peter

Autor: Silver69 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:

rjmp TWIStart

TWIAction:  ;R16 => Das Kommando 
      ori r16, (1 << TWINT)
      sts TWCR,r16

wait1:    lds r16,TWCR

      Rcall USARTSent ;R16 'debuggen'

      sbrs r16,TWINT
      rjmp wait1
      lds r16, TWSR
ret

TWIStart:    
    
      ldi r16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
      rcall TWIAction
      cpi r16, 0x08
      brne error

....

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.

Autor: Silver69 (Gast)
Datum:

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

Autor: micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Silver69 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Danke für die Antwort, habe mal einige Codes angeguckt. Mit dem 
Ergebniss, dass es alle etwa so machen wie auch ich:
      ldi r16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
      STS TWCR,r16          ;In den Besipielen steht hier OUT

twistart1:  clr r16


      lds r16, (1<<twint)        
      Rcall USARTSent         ;R16 'debuggen' = R16 = TWINT = 0
      
      LDS r16,TWCR          ;In den Besispielen steht hier IN      
      Rcall USARTSent         ;R16 'debuggen'  = R16 = TWCR = 36| 0x24 | 0b100100
    
      sbrs r16, TWINT
      rjmp twistart1          ;und hier ist die Endlosschleife perfekt!!
      


loop33:
      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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.