PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Was macht mein Controller wirklich?



full_metall_bunny
27.08.2005, 19:54
Hallo Leute.

Ich habe einen Mega8 mit Hilfe von Bascom und dem STK500 programmiert.
Ich bin nicht sicher ob ein Datenregister das emfängt was es soll.
Wie kann ich im laufenden Betrieb eines Controllers dessen Registerinhalte lesen? Geht das mit Bascom selber oder mit dem AVR Studio?
So wie es bei dem BASCOM-Simulator dieses Fenster mit sämtlichen Registern und deren Inhalten gibt. Nur eben für den realen Betrieb.

wäre schön, wenn mir jemand helfen kann

tobimc
27.08.2005, 19:57
Hi!

Also, wenn du sowas wie On-Chip-Debugging machen willst, sodann geht das mit dem JTAG-ICE von Atmel.

Aber ich würde mir einfach die 'spinnenden' Register auslesen und via UART auf den PC senden lassen.

VLG Tobi

SprinterSB
27.08.2005, 20:30
Das der Mega8 JTAG SChnittstelle hat ist mir neu.
Der Mega88 hat jedoch nen Debug-Wire Schnittstelle, aber keine Ahnung was das genau ist und wie stark die ist.
Ansonsten kann man zum 'Debuggen' ne Status-LED benutzen, das ist minimalinvasiv.

full_metall_bunny
27.08.2005, 20:39
Also geht On-Chip-Debugging alleine mit dem STK500 nicht?

Dann gleich mal eine Frage: Wie lese ich ein Register aus?
doch eigentlich nur:
Hilfsvariable=Registername oder?
Sind die Registernamen dieselben wie im AVR Datenblatt?
Meine Controller senden nämlich, aber der Minimalinvasive Test mit den LEDs scheiterte bisher, weil ich entweder die Datenregister falsh auslese oder sie nicht den richtigen Wert empfangen.

tobimc
27.08.2005, 20:54
Hi!

OOoopppsss... Sorry, da war ich beim Mega16...
Der M8 unterstützt kein On-Chip-Debugging.

>>Hilfsvariable=Registername
Genau.
Und dann

Print Hilfsvariable

Um welche Register handelt's sich denn??
Alle R-Register (R0-R...) werden von Bascom eh gesetzt und entsetzt ( ;) ) wie Bascom gerade will.

VLG Tobi

full_metall_bunny
27.08.2005, 21:29
es handelt sich um das Datenregister der SPI schnittstelle.
Ich hab das so gemacht:
Hilf=_ssspdr

sowas in der Art hatte ich in der Bascom_Hilfe gefunden
geht das so?

tobimc
28.08.2005, 09:45
Hi!

Das Register heist doch TWDR, meines Wissens!

ALso

Hilf = SPDR
print hilf

oder
print SPDR

Was möchtest du denn machen?

VLG Tobi

full_metall_bunny
28.08.2005, 10:24
Hallo Tobi, das Register was Du meinst ist für den I2C-Bus *denk*
Ich will zwei Controller über SPI kommunizieren lassen.
Dazu schickt der Master ein Byte an den Slave. Erkennt dieser das Byte, soll eine LED auf meinem Board blinken. Das senden klappt (mit Oszi gemessen)
Die LED blinkt aber nicht. Also stimmt irendwas mit dem Code nicht.
Habe das Thema unter folgendem Link schonmal genauer beschrieben. Mit Quellcode.

https://www.roboternetz.de/phpBB2/viewtopic.php?t=12052

tobimc
28.08.2005, 11:02
HI!

ARGH. Bin ja nicht gut drauf... :D

Aber weiter unten hab ich das richtige Register.
Print SPDR

Mit SPI ken ich mich nicht so aus. Bin eher I²C und UART Freak.

VLG Tobi

full_metall_bunny
28.08.2005, 11:08
Na mit dem I2C hatte ich dieselben Probleme. Habe was geschickt, Master sendet auch aber ankommen tut nix. Zumindest werden wieder nicht die richtigen LEDs eingeschalten.
Hast Du vielleicht ein kleines Beispielprogramm für einen Master und einen Slave das sicher funzt?
Dann könnte ich das mal auf meine beiden M8 laden und sehen ob es an der Hardware, oder doch an mir liegt.

Wäre Supi.

tobimc
28.08.2005, 13:46
Hi!

SPI oder I²C?

Hast du den I²C mit den Registern programmiert?
Da kann ich dir leider nix geben, aber Florian hat da mal was gemacht...

VLG Tobi

28.08.2005, 15:06
Ne, ich habe es mit den BASCOM-Befehlen gemacht

tobimc
28.08.2005, 15:18
Hi!

Die I²C sache.

Der Trick ist, dass man die Pins als Eingang definiert.
Bin ich auch lange drauf reingefallen. Aber anders gehts wohl nicht...

VLG Tobi

full_metall_bunny
28.08.2005, 16:11
Hallo tobmic,

danke erstmal für Deine Gedulg mit mir *g* und deine vielen Tips!

Zum I2C:

Ich häng mal meinen Code-Schnipsel vom Slave dran. An den entsprechenden Stellen habe ich eine Frage geschrieben....weil du den Tip mit den Pins als Eingangs gebracht hast. Das wird ja für den Slave gelten.



'-----------------i2c_slave_stk500.bas
'mit i2c_master_radbaugruppe.bas verwenden
'
'----------------------------------------------
'Deklarationen + Initialisationen:
$regfile = "m8def.dat"
$crystal = 8000000
$baud = 9600
$lib "i2c_twi.lbx" 'das war die spezielle Library von MCS-Elektronics, weil die orginal nicht gefunzt hat bei I2C

Config Portb = Output 'für LEDs als Kontrolle
Config Sda = Portc.4 'Muss ich diese Pins trotzdem so deklarieren?
Config Scl = Portc.5
'und hier jetzt noch "Config Portc = Input" '?

'festlegen der Slaveadresse -> stimmt das mit dem festlegen der Slave-Adresse? da war ich mir nie sicher
Twar = &B1010_1110 'TWAR=&HAE=Slaveadresse

Dim A As Byte
Dim Hilf As Byte

'I2C initialisieren
I2cinit 'setzt Port und DDR-Bit auf 0 zurück
Portb = &H00 'lässt PortB leuchten
A = 90 'vom Master gesendetes Byte -> entspricht &B0101_1010

Do
Hilf = Twdr 'Datenregister auslesen
If Hilf = A Then
Portb = Not Portb 'alle LEDs blinken wenn Byte empfangen
Waitms 200
Else
Portb.4 = Not Portb.4 'ansonsten blinkt nur LED4
Waitms 200
End If

Loop

End

'end program

tobimc
28.08.2005, 17:39
Hi!

Ich glaube, du stellst es dir ein bisschen einfacher vor, als es ist... :D
Du musst noch ein paar dinge machen:
- TWI-Bitrate einstellen
- TWI-Prescaler einstellen siehe 1
- In TWCR einstellen, dass er slave sein soll

Und dann ncoh ein paar lustige Abfragen machen. Aber frag mcih nciht, ich habe das ncoh nie gemacht.
Vielleich kan dir Florian einen Auszug aus seinem Assembler-code zukommen lassen (fragen).

zu 1: Das kannst du mit nem kleinen Tool von mir machen, TwiBitrate
das bekommst du auf meiner Homepage unter (anderes ->) Computer

VLG Tobi

full_metall_bunny
28.08.2005, 18:04
Bitrate und Prescaler habe ich beim Master eingestellt.
Obiger Code ist vom Slave.
Dessen Adresse habe ich auch in TWAR festgelegt (ein paar Zeilen nach den config-Befehlen)

gruß
christian

tobimc
28.08.2005, 18:31
Hi!

OH was schreibe ich in diesem Thread auch schon für Müll zusammen!
SORRY. Natürlich passt sicher der Slave dem Master an.

Siehe dazu auch das Datenblatt ab Seite 160, besonders das Diagramm auf Seite 166 ist interessant.

Vielleicht hilft es auch, wenn man gemäß Abschnitt "Adress Match Unit" auf Seite 167 TWGCE auf 1 setzt. Und das ist Bit0 in TWAR, wie man auf ende Seite 170 anfang 171 sieht.

statt
Twar = &B1010_1110
muss es
Twar = &B10101111
heißen. Oder?

:D

Bitte lies die mal den TWI-Abschnitt (ab S. 160) im Datasheet des M8 durch. Das wirkt manchmal Wunder...

VLG Tobi

full_metall_bunny
28.08.2005, 23:17
Hallo Tobi,
nicht ganz.
Das Bit muss gesetzt sein, wenn man einen "Generall Call" ausführen möchte.
D.h. alle Slaves am Bus dürfen empfangen was der Master sendet.
Den Prescaler habe ich auch gesetzt. (im Master).
SCL hat eine Frequenz von 0.5MHz, weil der Slave mind. 16 mal schneller abtasten soll als das SCL-Signal ankommt. Nun, und mein Slave hat ne Frequenz von 8Mhz.

Ich finds aber stark von Dir, dass Du mir soviele Hinweise, Tipps und mögliche Fehlerquellen nennst und dann noch so präzise Quellenangaben lieferst.
Findet man nicht oft in Foren.

THX@ tobmic!
Christian

tobimc
29.08.2005, 09:01
HI!

*ARGH* JETZT REICHTs!
So viele Fehler in einem Thread hab ich mir ja noch nie geleistet! :D
Es heißt ja GCE also General Call Enable...
Ich glaube, ich muss mich so langsam echt mal entschuldigen!

*denkbevorschreib*
>>Den Prescaler habe ich auch gesetzt. (im Master).
Ja, gut. Das ist aber zunächst erst mal nebensächlich, solange der Master ein gescheites I²C-Signal sendet.
(hast du das schon kontrolliert mit nem Oszi o.ä. ??)

Was mir an deinem Code noch auffällt sind 3 Dinge:
1) In deinen Slaveadressen gibt es Widersprüche
2) Du nimmst keinerlei Einstellungen in TWCR vor.
3) Man muss auf den Adress-Match Interrupt warten.

zu 1)
>>Twar = &B1010_1110 '= dez. 174
>>A = 90 'vom Master gesendetes Byte -> entspricht NICHT 174
Du musst in TWAR schon die Adresse setzen, die du auch überprüfen willst. ;)

zu 2)
Du willst im Moment einen Slave mit der Daten-Unit machen. Das geht aber viel einfacher mit der Address Match Unit. Dass dein AVR aber weis, dass er ein Slave ist, und dass er die Adress Match Unit einschalte soll usw. musst du es ihm in TWCR sagen. Lies' dir das Datenblatt an der Stelle (s.u.) durch... :D

zu 3)
Die Adress Match Unit löst einen Interrupt aus. Auf diesen gilt es zu warten, damit man die TWI-Unit über TWCR anweisen kann, ein ACK (oder Non ACK) zu senden, und so den Master überhaupt dazu bringen kann, das Datenbyte zu senden.
Dazu muss TWCR.0 auf 1 gesetzt, und SREG.7 auf 1 (äquivalent zu enable interrupts) gesetzt werden.
Jetzt musst du dich noch schlau machen (und mir dann aber auch sagen, ich weis es nämlich nicht ;) ) wie der TWI-Interrupt in Bascom heißt.
Dann halt noch
On ... TWIr
In der ISR TWIr bearbeitest du dann das Signal weiter (Sendest ACK usw.)
Daszu siehe wieder Abschnitt Adress Match Unit Auf S. 167, uns TWCR auf S. 168

So. Jetzt habe ich aber HOFFENTLICH keine Bugs drin.... ;)

>>Ich finds aber stark von Dir, dass Du mir soviele Hinweise, Tipps und mögliche Fehlerquellen nennst und dann noch so präzise Quellenangaben lieferst.
Naja, aber ich erzähle auch viel Mist gerade! :)
(Bin gerade viel mit meinem JuFo-Projekt beschäftigt...)

>>Findet man nicht oft in Foren.
Naja.

Danke für die Blumen! :D

VLG Tobi

full_metall_bunny
30.08.2005, 08:08
Hallo Tobi,

leider musste ich das Board wieder abgeben, da es nicht mein eigenes ist.
Deshalb konnte ich Deine Vorschläge nicht "live" ausprobieren.
zu 1). Twar ist das Adressregister, A=90 ist einfach nur eine gesendete Information die der Slave üernehmen soll
2) und 3) klingen aber sehr schlüssig. Das schau ich mir mal näher an.

gruß christian