Guten tag alle miteinander ich hänge zur zeit wieder an einem kleinen problem ... diesmal ist es die TWI komunnikation zwischen eines Masters und einigen Slaves ziel des programms sollte es sein das ich über die UART an den master eine art identifiere schicke in dem fall (r,g,b) und darauf hin einen wert. Der master soll diesen identifiere und den Wert dann weiter an die Slaves schicken die an dem TWI bus hängen was ich in diesem fall mit einem Broadcast(senden an alle) machen wollte. Später sollen auch noch einzeilne slaves angesprochen werden können was aber dann nicht mehr all zu schwierig sein sollte sofern die kommunikation erst einmal funktioniert. Hier mal mein Code bis dto. Master: //------------------------------------Includes-------------------------- --------- #include <avr/io.h> #include <stdint.h> #include <compat\ina90.h> #include <avr/eeprom.h> #include <util\twi.h> #include "TWI_Master.h" //------------------------------------Defines--------------------------- --------- #define FOSC 3686400 #define BAUD 9600 #define MYUBRR (FOSC/(16L*BAUD))-1 static uint8_t rot; static uint8_t blau; static uint8_t gruen; //------------------------------------Functions------------------------- --------- //###################################################################### ######### //##################################USART############################### ######### //=============Init function========================= void USART_INIT(unsigned int ubrr) { //Set Bautrate UBRR0H =(unsigned char) (ubrr >>8); UBRR0L =(unsigned char)ubrr; //Enable receive and transive UCSR0B |= (1<<RXEN0) | (1<<TXEN0); //Set Frame format UCSR0C |= (1<<USBS0)|(1<<UCSZ00); } //=============Receive Enable======================== void USART_EnableRX() { UCSR0B |= ( 1 << RXEN0); } //=============Receive function====================== unsigned char USART_Rx(void) { while (!(UCSR0A & (1<<RXC0))); return UDR0; } //###################################################################### ######### //####################################TWI############################### ######### void TWI_INIT(void) { TWBR |= (1 << 0); //TWI frequenz = 3686400/(16+2*1*1)= 204800 TWCR |= (1 << TWEN) | (0<< TWIE); //Enabele TWI and TWI interrupt } int TWI_SEND(int slaveadresse,int anzahl,char *data) { _NOP(); TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); //send Start condition _NOP(); while(!(TWCR & (1 << TWINT))); //wait for transmitted start condition _NOP(); if((TWSR & 0xF8) != TW_START) //check for coroupt Start condition return 0; _NOP(); TWDR = slaveadresse; //set Slaveadress _NOP(); TWCR = (1 << TWINT) | (1 << TWEN); //start transmission of adress _NOP(); while(!(TWCR & (1 << TWINT))); //wait for acknowlege _NOP(); if((TWSR & 0xF8) != TW_MT_SLA_ACK) //check for coroupt Slaveadress transmission return 0; _NOP(); int i; _NOP(); for(i=0; i < anzahl;i++) { _NOP(); TWDR = data[i]; //write data into TWIDataRegister _NOP(); TWCR = (1 << TWINT) | (1 << TWEN); //sart transmisson of data _NOP(); while(!(TWCR & (1 << TWINT))); //wait for acknowlege _NOP(); if((TWSR & 0xF8) != TW_MT_DATA_ACK) //check for coroupt data transmission return 0; } _NOP(); TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO); //send stop condition return 1; } //###################################################################### ######### //##################################Sonstige############################ ######### void setred(void) { int check; uint8_t receive; receive = USART_Rx(); _NOP(); rot = receive; check = TWI_SEND(0,1,"r"); check = TWI_SEND(0,1,&receive); } void setblue(void) { int check; uint8_t receive; receive = USART_Rx(); _NOP(); blau = receive; check = TWI_SEND(0,1,"b"); check = TWI_SEND(0,1,&receive); } void setgreen(void) { int check; uint8_t receive; receive = USART_Rx(); _NOP(); gruen = receive; check = TWI_SEND(0,1,"g"); check = TWI_SEND(0,1,&receive); } int main(void) { DDRC &= (0 << DD5) & (0 << DD4); PORTC |= (1 << PC5) | (1 << PC4); //LED's auf Port C DDRC |= (1 << DD3) | (1 << DD2) | (1 << DD1) | (1 << DD0); PORTC |= (1<<PC4) | (1<<PC3) | (1<<PC2); //USART initialisieren USART_INIT(MYUBRR); //TWI initialisieren TWI_INIT(); uint8_t a = 10; uint8_t a1 = 20; uint8_t a2 = 30; uint8_t e; uint8_t e1; uint8_t e2; //Setzen auf dne zuletzt gespeicherten wert eeprom_busy_wait(); e = eeprom_read_byte (&a); rot = e; TWI_SEND(0,1,"r"); TWI_SEND(0,1,&e); eeprom_busy_wait(); e1 = eeprom_read_byte (&a1); blau = e1; TWI_SEND(0,1,"b"); TWI_SEND(0,1,&e1); eeprom_busy_wait(); e2 = eeprom_read_byte (&a2); gruen = e2; TWI_SEND(0,1,"g"); TWI_SEND(0,1,&e2); while(1) { unsigned char receive; receive = USART_Rx(); _NOP(); if(receive =='r') { setred(); } if(receive =='b') { setblue(); } if(receive =='g') { setgreen(); } //Speichern der aktuellen einstellungen????? if(receive =='s') { eeprom_busy_wait(); eeprom_write_byte (&a,rot); eeprom_busy_wait(); eeprom_write_byte (&a1,blau); eeprom_busy_wait(); eeprom_write_byte (&a2,gruen); } } } ----------------------------------------------------------------- Slave: //------------------------------------Includes-------------------------- --------- #include <avr/io.h> #include <stdint.h> #include <compat\ina90.h> #include <avr/eeprom.h> #include <util\twi.h> //------------------------------------Functions------------------------- --------- //###################################################################### ######### //####################################TWI############################### ######### void TWI_INIT(void) { TWBR |= (1 << 0); //TWI frequenz = 3686400/(16+2*1*1)= 204800 TWAR &= (0 << TWA6) & (0 << TWA5) & (0 << TWA4) & (0 << TWA3) & (0 << TWA2) & (0 << TWA1); TWAR |= (1 << TWA0) | (1 << TWGCE); // set Slaveadress TWCR |= (1 << TWEA) | (1<< TWEN); //Enabele TWI and Acknowlege } char TWI_RECEIVE(void) { uint8_t receive; while(!(TWCR & (1 << TWINT))); //wait for aktivitie on bus if((TWSR & 0xF8) == 0x80); //looking if data is reveived and acknowlege is send receive = TWDR; //reading data TWCR = (1 << TWINT); //setting bus receive end return receive; } //###################################################################### ######### //####################################Other############################# ######### void red(void) { char empf; empf = TWI_RECEIVE(); OCR0A = empf; } void blue(void) { char empf; empf = TWI_RECEIVE(); OCR1A = empf; } void green(void) { char empf; empf = TWI_RECEIVE(); OCR2A = empf; } int main(void) { char empfangen; //PWM Ausgänge auf "aus" setzen OCR0A = 0; OCR1A = 0; OCR2A = 255; //PWM Ausgang OC0A TCCR0A = (1 << COM0A1) | (1 << COM0A0)|(1 << WGM01)|(1 << WGM00); //invert Fast PWM 8bit TCCR0B = (1<<CS00); // no prescale -> enable counter PORTD |= (1 << 6); // enable pull-ups for inputs, set outputs high DDRD |= (1 << 6); //PWM Ausgang OC1A TCCR1A = (1 << COM1A1) | (1 << COM1A0)|(0 << WGM11)|(1 << WGM10); //invert Fast PWM 8bit TCCR1B = (1<<CS10); // no prescale -> enable counter PORTB |= (1 << 3) |(1 << 1); // enable pull-ups for inputs, set outputs high 0xff DDRB |= (1 << 3) | (1 << 1); // Pin LED auf 1 setzen //PWM Ausgang OC0A TCCR2A = (1 << COM0A1) | (1 << COM2A0)|(1 << WGM21)|(1 << WGM20); //invert Fast PWM 8bit TCCR2B = (1<<CS20); //no prescale -> enable counter //TWI initialisieren TWI_INIT(); DDRC |= 0xcf; PORTC |= (1<<PC6) | (1<<PC5) | (1<<PC4) | (1<<PC3) | (1<<PC2) | (1<<PC1); while(1) { empfangen = TWI_RECEIVE(); if(empfangen == 'r') red(); if(empfangen == 'b') blue(); if(empfangen == 'g') green(); } } Ps. ich weiß wirklich sauber ist das bis jetzt nicht programmiert G
Hi, fuer die TWI-Kommik habe ich das fertige Teil von Atmel genommen und es lief auf Anhieb. Bei mir sind's ein Master und 3 Skalven. Ich meine den hier: AVR155: Accessing I2C LCD display using the AVR TWI AVR311: Using the TWI module as I2C slave.pdf AVR315: Using the TWI module as I2C master.pdf liegen bei Atmel auffe Heimatseite.
danke das kenn ich schon ich werd mich wohl nochmals damit versuchen stell mich wohl nur zu blöd an gruß dominik
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.