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
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.
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
@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
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
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
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
>>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
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
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
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
Eine eigene Frage?
Dieser Thread ist über 21 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.