Hallo Leute,
ich bin derzeit dabei einen ATmega88 als Slave am TWI des NGW100 zu
betreiben. ER arbeitet rein als TWI-Slave-Empfänger
Das Problem:
Der 88 wird mit der passenden Adresse gefunden, aber speichert keine
Byts
1 | #include <stdint.h>
|
2 | #include <io.h>
|
3 | #include <interrupt.h>
|
4 | #include <delay.h>
|
5 | #include <twi.h>
|
6 | #include <sleep.h>
|
7 |
|
8 | uint8_t DMX_senden;
|
9 | uint8_t dmxdata[512];
|
10 | uint16_t dmxbuffer_adr;
|
11 |
|
12 | #include <USART.h>
|
13 | #include <TWI_Slave.h>
|
14 | sr(TWI_vect)
|
15 | {
|
16 | switch (TW_STATUS)
|
17 | {
|
18 | case TW_SR_SLA_ACK:
|
19 |
|
20 | dmxbuffer_adr=0; //Speicheradresse zurücksetzten
|
21 | TWI_Ack;
|
22 |
|
23 |
|
24 | break;
|
25 |
|
26 | case TW_SR_DATA_ACK:
|
27 |
|
28 | dmxdata[dmxbuffer_adr]=TWDR;
|
29 | dmxbuffer_adr++;
|
30 | TWI_Ack;
|
31 |
|
32 | break;
|
33 |
|
34 | case TW_SR_STOP: // Statuswert 0xA0 - Stop wurde empfangen
|
35 |
|
36 | DMX_senden=1; // DMX-Routine freigeben
|
37 |
|
38 | break;
|
39 |
|
40 | case TW_BUS_ERROR:
|
41 |
|
42 |
|
43 |
|
44 | break;
|
45 |
|
46 | default:
|
47 |
|
48 | TWI_Reset;
|
49 |
|
50 | break;
|
51 | return 0;
|
52 | }
|
53 | }
|
54 |
|
55 | int main(int argc, char **argv)
|
56 | {
|
57 |
|
58 | DDRC |= (1<<PIN0)| (1<<PIN2); // Daten Richtungsregister genereller auf Ausgang gestellt
|
59 | PORTC = (0<<PORTC0); // Port C0 - Leitung zum Transmitter gesperrt
|
60 | Usart_Init (0); // Usart Inititalisieren mit Vorteiler 0
|
61 | TWI_Slave_Adress(0x4b); // Intialisiere I2C und setzte Adresse
|
62 | dmxbuffer_adr=0;
|
63 | sei(); //*Interrupts global aktiieren
|
64 |
|
65 | //for (uint16_t i=0;i<512;i++)
|
66 | //{
|
67 | // dmxdata[i]=255;
|
68 | //}
|
69 |
|
70 | while (1)
|
71 | {
|
72 | if(DMX_senden ==1)
|
73 | {
|
74 | cli(); // globale Interrupts sperren
|
75 | _delay_us(90); // verzögere 90µs DMX-Reset
|
76 | PORTC = (1<<PORTC0); // Leitung zum Transmitter freigegeben
|
77 | _delay_us(10); // verzögere 50µs
|
78 | USART_Transmit(0); // DMX-Gerätetype "Dimmer" - "Startbyte" übertragen
|
79 |
|
80 | for (uint16_t i=0; i<= 511;i++)
|
81 | { //DMX-Daten Kanäle 0 - 512 übertragen
|
82 | USART_Transmit(dmxdata[i]);
|
83 | }
|
84 |
|
85 | _delay_us(100); // verzögere 500µs
|
86 | PORTC = (0<<PORTC0); // sperre Leitung zum Transmitter
|
87 | DMX_senden = 0; //DMX-Routine sperren
|
88 | dmxbuffer_adr=0; //Speicheradresse zurücksetzten
|
89 | sei(); // globale Interrupts freigegeben
|
90 | }//Ende IF-Bedingung
|
91 | }//Ende While-Schleife
|
92 |
|
93 | }//Ende Main-Funktion
|
Der Usartteil funktioniert Problemlos. Nur die Datenanliefrung scheit
nicht zu funktioniern.Irgentwie scheint die ISR nicht aufgerufen zu
werden.
Hier mal die Treiber-datei dazu :
1 | void TWI_Slave_Adress(uint8_t slave_adress)
|
2 | {
|
3 | //TWI aktivieren und Adresseinstellung
|
4 |
|
5 | //-Programm Code-----------------------------------
|
6 | //-------------------------------------------------
|
7 | TWCR |= (1<<TWIE) | (1<<TWEN) | (1<<TWEA);
|
8 | TWCR &= ~(1<<TWSTA) | (1<<TWSTO);
|
9 | TWAR = (slave_adress<<1) | (0<<0);
|
10 | //-------------------------------------------------
|
11 | //-------------------------------------------------
|
12 |
|
13 | //---Erläuterung-----------------------------------
|
14 | //TWEN = Enable TWI
|
15 | //TWEA = Enable Acknowledge Bit
|
16 | //TWIE = Enable Interrupt
|
17 | //TWAR = Slave Adresse wird gesetzt
|
18 | //-------------------------------------------------
|
19 | }
|
20 |
|
21 | //Makros
|
22 |
|
23 | //Acknolage bei Byte empfangen oder erwartet Ack bei gesendetem Byte
|
24 | //-------------------------------------------------------------------
|
25 | /*MSB*/ /*LSB*/
|
26 | #define TWI_Ack TWCR = (1<<TWINT) | (1<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWWC) | (1<<TWEN) | (1<<TWIE);
|
27 |
|
28 | //Not Acknolage nach Byte empfangen oder erwartet Nack bei gesendetem Byte
|
29 | //------------------------------------------------------------------------
|
30 | /*MSB*/ /*LSB*/
|
31 | #define TWI_Nack TWCR = (1<<TWINT) | (0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWWC) | (1<<TWEN) | (1<<TWIE);
|
32 |
|
33 | //TWI Reset Bitmuster gleich mit TWI_Ack
|
34 | //---------------------------------------
|
35 | /*MSB*/ /*LSB*/
|
36 | #define TWI_Reset TWCR = (1<<7) | (1<<6) | (0<<5) | (0<<4) | (0<<3) | (1<<2) | (1<<0);
|
Teilweise muss sie zumindest funktionieren da ja der 88 auf dem Bus
gefunden wird. Bei NGW100 nutzen wir i2cdetect dazu. Die Senderoutine
wird vom meinem Projektpartner gebaut. ich möchte nur sicher gehen das
hier der Fehler nicht liegt um bessere Fehlerjagt zu betreiben.
Eventuel weis ja einer von euch was.
Mit freundlichen Grüßen
Philipp