I2C Ansteuerung Atmel

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 25 11 2024  21:53:28      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte


Autor
I2C Ansteuerung Atmel
Suche nach: i2c (581)

    







BID = 534881

BGWH

Neu hier



Beiträge: 48
 

  


Hallo!

Ich soll eine I2C Interface zwischen einem PIC (dsPIC30f6014A) als Master und einem ATMEL als Slave (ATMega128) herstellen. Ich habe auch soweit die Software fertig und auch das Signal des PIC ist soweit in Ordnung, nur leider reagiert der TWI Interrupt am Atmel nicht!!

Hier das Ausgangssignal des PIC: Gesendet wird zuerst 0xC4 (0x62 Slave-Adresse und als LSB 0, da es win Writezyklus ist:





Nun zum Atmel, der irgendwie nichts mit dem Signal anfangen kann bzw. nicht reagiert.
Das ist mein Assembler Code für den Atmel-Slave:



Code :



#include <stdio.h>
#include <avr/io.h>
#include <avr/wdt.h>
#include <util/delay.h>
#include <math.h>
#include <avr/pgmspace.h>

#include <util/twi.h> //enthält z.B. die Bezeichnungen für die Statuscodes in TWSR
#include <avr/interrupt.h> //dient zur behandlung der Interrupts
#include <stdint.h> //definiert den Datentyp uint8_t

#define SLAVE_ADRESSE 0x62

#define SIG_2WIRE_SERIAL _VECTOR(34) // Interrupt Vektor für TWI

void init_twi_slave (uint8_t adr);
void delay_ms(unsigned int period);

extern const prog_uint8_t Font1[], Font2[];
uint8_t data=0;
uint8_t contr=0;

int main(void)
{
LCD_Init();
delay_ms(1000);
init_twi_slave(SLAVE_ADRESSE);

Orientation = Landscape;
LCD_Cls(yellow);
delay_ms(1000);

while(1)
{
if(data != 0)
{
switch(data)
{
case '1':
...
break;

case '2':
...
break;

case '3':
...
break;

default:
...
}
data = 0;
}
}
return 0;

}

void init_twi_slave (uint8_t adr)
{
TWAR = 0xC4; //Slave-Addr.: 0x62 (Bit1-Bit7)
//General Call deaktivieren (Bit0)

TWCR &= ~((1<<TWSTA)|(1<<TWSTO)); // TWSTA und TWSTO auf 0 setzen
//TWEA...TWI Enable Acknowledge Bit
//TWEN...TWI Enable
//TWIE...TWI Interrupt Anforderung erlauben
TWCR |= (0<<TWEA)|(1<<TWEN)|(1<<TWIE);

sei(); //enable global interrupts
}


//TWI ISR
SIGNAL(SIG_2WIRE_SERIAL)
{
LCD_Cls(green);
delay_ms(1000);

...
}




Hoffe es hat jemand einen Tipp warum die Übertragung nicht funktioniert. Bin schon leicht verzweifelt, wäre also über jede Art von Hilfe dankbar!!
Vielleicht hat auch schon jemand einen ATMega als Slave verwendet und könnte mir da ein paar Tipps geben.

Schoene Grueße
Bernhard


[ Diese Nachricht wurde ge&auml;ndert von: BGWH am 16 Jul 2008 16:13 ]

[ Diese Nachricht wurde ge&auml;ndert von: BGWH am 16 Jul 2008 16:21 ]

edit: Bild an die richtige Stelle gerückt, Link auf eine lokale Datei des Posters entfernt.

[ Diese Nachricht wurde geändert von: psiefke am 16 Jul 2008 16:29 ]

BID = 534921

photonic

Schreibmaschine



Beiträge: 1301
Wohnort: Zürich, Schweiz

 

  

Das sieht mir aber sehr nach C aus statt Assembler

Dein Fehler liegt wahrscheinlich am falschen Interruptvektor, SIG_2WIRE_SERIAL liegt (in C) auf der 33, nicht 34 wie du definiert hast. Aus irgendeinem Grund muss man bei den Interruptvektoren im Datenblatt eins abziehen um die richtige C-Definition hinzubekommen. Warum das so ist weiss ich auch nicht...


Zitat :
#define SIG_2WIRE_SERIAL _VECTOR(34) // Interrupt Vektor für TWI


könntest du dir eigentlich sparen wenn der Compiler richtig konfiguriert ist und selber merkt dass er die iom128.h einbinden soll wo das schon richtig vordefiniert drinsteht. In der io.h wird/würde diese geladen.


[ Diese Nachricht wurde geändert von: photonic am 16 Jul 2008 20:23 ]

BID = 534927

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Der Fehler liegt hier:

TWCR |= (0<<TWEA)|(1<<TWEN)|(1<<TWIE);

Das Bit TWEA muss gesetzt sein, damit beim Adressieren die TWI-Hardware mit ACK
bestätigt.

Weiterhin solltest du statt SIGNAL(...) ISR(...) nehmen, oder für den Fall, dass du SIGNAL() nimmt, avr/signal.h einbinden!

Dann schauste mal in die iom128.h rein, und guckst, wie dort der Signalname deklariert wurde - nur der zählt! SIGNAL() hat keine Probleme damit, einen Vektor zuzuordnen, der nicht existent ist. Er springt dann intern zum Label bad_vector_ oder so ähnlich. Schau dir doch mal das Kompilat an. Oder besser die Ausgabe von

avr-objdump -d "programmname" > disassembler

Dort sollte dann das SIG_TWI_etc. durch vect_n ersetzt worden sein.

Edit:
und das hier

Zitat :

void init_twi_slave (uint8_t adr)

{

TWAR = 0xC4; //Slave-Addr.: 0x62 (Bit1-Bit7)

...
[/quote]
Macht ja auch wenig Sinn, wenn man das Argument adr nicht ins Register schreibt .
Du kannst aber dennoch das hier

Zitat :

init_twi_slave(SLAVE_ADRESSE);

verwenden, wenn du den Teil oben etwas erweiterst:

TWAR = adr*2;
oder
TWAR = adr<<1;

Damit wird automatisch das LSB 0 und die Adresse kommt trotzdem aus adr .

Edit2:
@Photonic:

Zitat :

Dein Fehler liegt wahrscheinlich am falschen Interruptvektor, SIG_2WIRE_SERIAL liegt (in C) auf der 33, nicht 34 wie du definiert hast. Aus irgendeinem Grund muss man bei den Interruptvektoren im Datenblatt eins abziehen um die richtige C-Definition hinzubekommen. Warum das so ist weiss ich auch nicht...

Ne, das hat nichts mit C zu tun. Die Interruptvektoren unterschiedlicher AVRs unterscheiden sich oft - das ist aber im Header des jeweiligen Prozessors schon korrekt übernommen. Man muss aber zwingend das richtige Makro dafür benutzen! Es gibt ein paar Header, die sich in der Nomenklatur diesbezüglich unterscheiden: SIG_TIMER1_COMPA oder SIG_COMP1A meinen das gleiche, sind aber vom Header des Prozessors abhängig. Davon hat man aber mit dem ISR() Abschied genommen. Sonst muss man vorher immer in den Header schauen und sich die wirklich korrekte Vektorbezeichnung rausschreiben. Das entfällt mit ISR() und dort meckert der Compiler auch entsprechend.
.


_________________


[ Diese Nachricht wurde ge&auml;ndert von: DonComi am 16 Jul 2008 20:52 ]

[ Diese Nachricht wurde ge&auml;ndert von: DonComi am 16 Jul 2008 20:56 ]

[ Diese Nachricht wurde geändert von: DonComi am 16 Jul 2008 21:01 ]

BID = 534939

photonic

Schreibmaschine



Beiträge: 1301
Wohnort: Zürich, Schweiz


Zitat :
Die Interruptvektoren unterschiedlicher AVRs unterscheiden sich oft - das ist aber im Header des jeweiligen Prozessors schon korrekt übernommen. Man muss aber zwingend das richtige Makro dafür benutzen!


Das stimmt schon, aber die Werte Weichen bei allen Controllern bei denen ich nachgeschaut habe im headerfile um eins ab, gegenüber dem Datenblatt:

In der iom128.h steht das hier:

(...)
/* USART1, Tx Complete */
#define USART1_TX_vect _VECTOR(32)
#define SIG_USART1_TRANS _VECTOR(32)
#define SIG_UART1_TRANS _VECTOR(32)

/* 2-wire Serial Interface */
#define TWI_vect _VECTOR(33)
#define SIG_2WIRE_SERIAL _VECTOR(33)

/* Store Program Memory Read */
#define SPM_READY_vect _VECTOR(34)
#define SIG_SPM_READY _VECTOR(34)
(...)

während das Datenblatt des Mega128 meint:

32 $003E(3) USART1, UDRE USART1 Data Register Empty
33 $0040(3) USART1, TX USART1, Tx Complete
34 $0042(3) TWI Two-wire Serial Interface
35 $0044(3) SPM READY Store Program Memory Ready

Und selbst wenn BGWH den compiler richtig konfiguriert hat, hätte seine fehlerhafte Definition dann den korrekten Wert übschschrieben.

BID = 535028

BGWH

Neu hier



Beiträge: 48


Danke schön alle zusammen!!

Die Verbindung funktioniert jetzt wunderbar!!

Der Fehler war wohl, dass das TWEA Bit nicht gesetzt war!!


Danke!

Schoene Grueße
Bernhard

BID = 535032

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika



@photonic:
Ist merkwürdig mit den Vektoren, da stimm' ich dir zu .
Nichts für ungut, sollte nicht Oberlehrerhaft rüberkommen.


_________________


Zurück zur Seite 0 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 20 Beiträge im Durchschnitt pro Tag       heute wurden bisher 12 Beiträge verfasst
© x sparkkelsputz        Besucher : 182399742   Heute : 6940    Gestern : 7548    Online : 806        25.11.2024    21:53
2 Besucher in den letzten 60 Sekunden        alle 30.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0283889770508