Forum: Mikrocontroller und Digitale Elektronik TWI mit AVR Studio


von avusgalaxy (Gast)


Lesenswert?

Nabend.

Wollte fragen, ob jemand Erfahrungen mit TWI und dem ARV Studio hat.
Mein problem ist, wenn ich das TWI initialisiere, dann schicke ich zwar
auf das twcr Register bei twint eine eins, doch es bleibt auf null. In
der main Schleife angekommen, kann ich dann Tage warten, bis das TWI
einen Interrupt auslöst. Ist das Problem bei dem AVR Studio, oder hab
ich da einen Fehler in der Init...

Könnt ihr bitte mal einen Blick drauf werfen...

Danke

Gruß Avus


.include "m8def.inc"

.def temp = r16

.equ clock = 8000000
.equ twi_bit_rate = 32
.equ SCL_FREQ = clock/(16 + (2*twi_bit_rate*(4^0)))

rjmp Init

.org 0x011
rjmp twi_interrupt

Init:

ldi temp,low(ramend)
out spl,temp

ldi temp,high(ramend)
out sph,temp

ldi temp,(1<<twint)|(1<<twea)|(1<<twen)|(1<<twie)
out twcr, temp

ldi temp,twi_bit_rate
out TWBR,temp

ldi temp,(0<<twps0)|(0<<twps1)
out twsr,temp

ldi temp, $d0
out twar, temp

 sei

main:
rjmp main

von Wolle (Gast)


Lesenswert?

Es gibt einen netten,kleinen Servicepunkt.
Nennt sich Stimuli.
Dort kannst du für/bei einem bestimmten Programmschritt eine Reaktion
des Simulators auslösen, z.B. einen Ausgang und/oder einen Eingang
setzen oder löschen.

von avusgalaxy (Gast)


Lesenswert?

Hi Wolle, klingt interresant, das mit dem Stimuli, aber du hast leider
meine Frage nicht beantwortet.

Gruß Avus

von dave (Gast)


Lesenswert?

Werden Flaggen nicht durch ne 1 gelöscht ? ;) (Gefährliches Halbwissen)

dave

PS: das hat bei mir funktioniert: (nach ner Stop irgendwie warten,
sonst wird das ganze als wiederholte Startsequenz gewertet)

twi_transmission:
  out TWDR, temp1
  ldi temp1, (1<<TWINT)|(1<<TWEN)
  out TWCR, temp1

  rjmp twi_wait


twi_read:
  ldi temp1, (1<<TWINT)|(1<<TWEN)
  out twcr, temp1

  rjmp twi_wait


twi_start:
  ldi temp1, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
  out TWCR, temp1

  rjmp twi_wait


twi_stop:
  ldi temp1, (1<<TWINT)|(1<<TWSTO)|(1<<TWEN)
  out TWCR, temp1
  ret

von avusgalaxy (Gast)


Lesenswert?

@Dave

hi, du hattest recht. Ich habs im Datenblatt gefunden, daß das I Flag
mit einer 1 gelöscht wird.

Du hast mir ja geschrieben, das Programm bei Dir ausschaut, aber wie
siehts mit der Init von mir aus. Ist die in Ordnung?


Gruß Avus

von dave (Gast)


Lesenswert?

ldi temp1, 32
  out twbr, temp1

Das wars bei mir ;)

Aber im Datenblatt ist eh alles ganz genau beschrieben, einfach nochmal
durchlesen (extra Code dabei, am Ende von "Using TWI")

dave

von avusgalaxy (Gast)


Lesenswert?

ja, aber wo ist der Unterschied ob ich jetzt

ldi temp1, 32
  out twbr, temp1


oder

.equ twi_bit_rate = 32


ldi temp,twi_bit_rate
out twbr,temp

mache?

Gruß Avus

von dave (Gast)


Lesenswert?

Ich hab ja nix gesagt, hab dir nur gesagt, wies bei mir aussieht ;)

Bau die Hardware zusammen... davor kann man eh fast nix sagen bzw.
macht sich viel zu viel Arbeit, was nacher nur 10sek dauert.

dave

von avusgalaxy (Gast)


Lesenswert?

>>Bau die Hardware zusammen<<

Na ja. Ich bin erst beim Master Transmitter...

Wie der Code dann beim Slave Receiver ausschauen sollte, davon habe ich
momentan noch 0 Plan.

Deshalb möchte ich mal sicher gehen, daß der Code beim Master
Transmitter einwandfrei funktioniert, da sonst die Fehlersuche nicht 10
Sekunden sondern Tage dauern kann.

Gruß Avus

von avusgalaxy (Gast)


Lesenswert?

So, ich hab es jetzt mit einer Led probiert,das sie angeht, sobalt der
TWI Interrupt ausgelöst wird. Aber es tut sich nichts...

Hab auch versucht das twsta flag in der Init auf eine 1 zu schreiben.
Doch es tut sich nichts.

Wann muß das twsta flag gesetzt werden=? in der Init oder erst im
Interrupt.

Danke für jede Antwort

Gruß Avus

von dave (Gast)


Lesenswert?

Bist du beim Receiver?

STA = START Condition.
Darf der Master dann, wenn er anfängt was zu schreiben.

Bau noch ne Timeout ein.

dave

von avusgalaxy (Gast)


Angehängte Dateien:

Lesenswert?

Hi Dave...

Ich bin noch beim Transmitter... das flag twsta hab ich gesetzt, doch
es tut sich nichts, im AVR Studio und im Atmega 8 auch nichts...

Wo soll ich ein Timeout einbauen???

Ich poste mal das ganze programm, vielleicht hat mal wer kurz Zeit, um
zu schauen, warum mein Interrupt nicht kommt.

Den Interrupt habe ich mit einschalten einer Led verbunden.

Danke im voraus

Gruß Avus

von dave (Gast)


Lesenswert?

Du weißt schon, dass du mit
ldi temp,(1<<twsta)
out twcr,temp
Die anderen Bits im Register löscht?

dave

von avusgalaxy (Gast)


Lesenswert?

Ach ja... das ist nicht gut...

Dann gehört es wohl eher am Anfang in die Interruptschleife...

Aber das funktioniert leider auch nicht... Irgendein Flag fehlt mir
noch, um den Interrupt auszulösen...

Hast du sonst noch was gesehen?

Gruß Avus

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.