michaelb
30.12.2005, 18:15
Hi Leuts,
hab ein neues Problem mit meinem TWI!
An dem einen Board(Master) hängt ne LED an PB0 und ein GP2D12 an PA0 an dem anderen nur eine LED an PB0. Der Master wertet den Sensor aus und schickt je nach dem 0x02 oder 0x03 an den Slave! ADC Wert hab ich einzelnd schon getestet an dem liegt's wahrscheinlich net!
So Master Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#define ADCchannel_init DDRA=0x00 // ADC Port als Eingang deklarieren
#define ADCinit ADCSRA|=_BV(ADEN) // Teilt dem Board mit das der jeweilige Port für ADC verwendet wird
#define ADCdisable ADCSRA &=~_BV(ADEN) // machs das vorherige wieder rückgänig
#define ADCstart ADCSRA|=_BV(ADSC) // startet eine konvertierung auf dem gewünschten Kannal/Pin
#define ADCfree ADCSRA|=_BV(ADATE) // schaltet den freilaufenden Modus ein
#define ADCvintern ADMUX|=_BV(REFS0) // interne Spannungsversorgung
#define ADCinterrupt_on ADCSRA|=_BV(ADIE) // ADC interrupt wird freigeschalten
#define ADCprescaler_2 ADCSRA |=_BV(ADPS0) // gewünschter Teilungsfaktor/Prescaler
#define ADCprescaler_4 ADCSRA|=_BV(ADPS1)
#define ADCprescaler_8 ADCSRA=_BV(ADPS1) | _BV(ADPS0)
#define ADCprescaler_16 ADCSRA|=_BV(ADPS2)
#define ADCprescaler_32 ADCSRA=_BV(ADPS2) | _BV(ADPS0)
#define ADCprescaler_64 ADCSRA=_BV(ADPS2) | _BV(ADPS1)
#define ADCprescaler_128 ADCSRA=_BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0)
#define ADCprescaler_reset ADCSRA = ~_BV(ADPS2) & ~_BV(ADPS1) & ~_BV(ADPS0)
#define ADCchannel_1 //gewünschter Kannal z.B bei ATmega32 PINA0 - PINA7
#define ADCchannel_2 ADMUX|=_BV(MUX0) // bei nicht freilaufen muss ADCchannel_x vor
#define ADCchannel_3 ADMUX|=_BV(MUX1) // ADCstart kommen dann kann man mit getadc() der
#define ADCchannel_4 ADMUX= _BV(MUX1) | _BV(MUX0) // Adcwert des gewählten Kannals auslesen
#define ADCchannel_5 ADMUX|=_BV(MUX2)
#define ADCchannel_6 ADMUX= _BV(MUX2) | _BV(MUX0)
#define ADCchannel_7 ADMUX= _BV(MUX2) | _BV(MUX1)
#define ADCchannel_8 ADMUX= _BV(MUX2) | _BV(MUX1) | _BV(MUX0)
#define ADCchannel_reset ADMUX= ~_BV(MUX2) & ~_BV(MUX1) & ~_BV(MUX0)
unsigned volatile char slave_adresse, daten, error;
unsigned volatile int adc_wert;
int twi_start(void);
int twi_adresse(void);
int twi_daten(void);
void twi_stop(void);
int getadc(void);
int main(void)
{
DDRB = 0xFF;
DDRA = 0x00;
PORTA = 0xFF;
TWAR = 0x01;
TWBR = 0xC;
slave_adresse = 0x02;
daten = 0x03;
ADCinit;
ADCprescaler_16;
for(;;)
{
ADCchannel_1;
ADCstart;
adc_wert = getadc();
if (adc_wert>204)
{
PORTB = (1<<PB0);
daten = 0x03;
}
else
{
PORTB &= ~(1<<PB0);
daten = 0x02;
}
twi_start();
twi_adresse();
twi_daten();
twi_stop();
}
}
int twi_start(void)
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) == 0x08)
{
return 0;
}
else
{
return 1;
}
}
int twi_adresse(void)
{
TWDR = slave_adresse;
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) == 0x18)
{
return 0;
}
else
{
return 1;
}
}
int twi_daten(void)
{
TWDR = daten;
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)))
if ((TWSR & 0xF8) == 0x28)
{
return 0;
}
else
{
return 1;
}
}
void twi_stop(void)
{
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
}
int getadc(void)
{
while (ADCSRA & _BV(ADSC)) {}
return ADC;
}
und Slave:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
unsigned volatile char slave_adresse, daten;
int main(void)
{
sei();
DDRB = 0xFF;
PORTB &= ~(1<<PB0);
TWAR = 0x02;
TWBR = 0xC;
TWCR = (1<<TWEA)|(1<<TWEN)|(1<<TWIE);
TWSR &= 0b11111100;
TWCR |= (1<<TWINT);
for(;;)
{
if(daten == 0x03)
{
PORTB = (1<<PB0);
}
else
{
PORTB &= ~(1<<PB0);
}
}
}
SIGNAL (SIG_2WIRE_SERIAL)
{
if((TWSR & 0b11111000) == 0x80)
{
daten = TWDR;
}
else
{
daten = 0x00;
}
TWCR |= (1<<TWINT);
}
bitte helft mir! sagt mir jeden Fehler den ihr findet! Ich bedanke mich schon im Vorraus!
Gruß Michi
hab ein neues Problem mit meinem TWI!
An dem einen Board(Master) hängt ne LED an PB0 und ein GP2D12 an PA0 an dem anderen nur eine LED an PB0. Der Master wertet den Sensor aus und schickt je nach dem 0x02 oder 0x03 an den Slave! ADC Wert hab ich einzelnd schon getestet an dem liegt's wahrscheinlich net!
So Master Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#define ADCchannel_init DDRA=0x00 // ADC Port als Eingang deklarieren
#define ADCinit ADCSRA|=_BV(ADEN) // Teilt dem Board mit das der jeweilige Port für ADC verwendet wird
#define ADCdisable ADCSRA &=~_BV(ADEN) // machs das vorherige wieder rückgänig
#define ADCstart ADCSRA|=_BV(ADSC) // startet eine konvertierung auf dem gewünschten Kannal/Pin
#define ADCfree ADCSRA|=_BV(ADATE) // schaltet den freilaufenden Modus ein
#define ADCvintern ADMUX|=_BV(REFS0) // interne Spannungsversorgung
#define ADCinterrupt_on ADCSRA|=_BV(ADIE) // ADC interrupt wird freigeschalten
#define ADCprescaler_2 ADCSRA |=_BV(ADPS0) // gewünschter Teilungsfaktor/Prescaler
#define ADCprescaler_4 ADCSRA|=_BV(ADPS1)
#define ADCprescaler_8 ADCSRA=_BV(ADPS1) | _BV(ADPS0)
#define ADCprescaler_16 ADCSRA|=_BV(ADPS2)
#define ADCprescaler_32 ADCSRA=_BV(ADPS2) | _BV(ADPS0)
#define ADCprescaler_64 ADCSRA=_BV(ADPS2) | _BV(ADPS1)
#define ADCprescaler_128 ADCSRA=_BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0)
#define ADCprescaler_reset ADCSRA = ~_BV(ADPS2) & ~_BV(ADPS1) & ~_BV(ADPS0)
#define ADCchannel_1 //gewünschter Kannal z.B bei ATmega32 PINA0 - PINA7
#define ADCchannel_2 ADMUX|=_BV(MUX0) // bei nicht freilaufen muss ADCchannel_x vor
#define ADCchannel_3 ADMUX|=_BV(MUX1) // ADCstart kommen dann kann man mit getadc() der
#define ADCchannel_4 ADMUX= _BV(MUX1) | _BV(MUX0) // Adcwert des gewählten Kannals auslesen
#define ADCchannel_5 ADMUX|=_BV(MUX2)
#define ADCchannel_6 ADMUX= _BV(MUX2) | _BV(MUX0)
#define ADCchannel_7 ADMUX= _BV(MUX2) | _BV(MUX1)
#define ADCchannel_8 ADMUX= _BV(MUX2) | _BV(MUX1) | _BV(MUX0)
#define ADCchannel_reset ADMUX= ~_BV(MUX2) & ~_BV(MUX1) & ~_BV(MUX0)
unsigned volatile char slave_adresse, daten, error;
unsigned volatile int adc_wert;
int twi_start(void);
int twi_adresse(void);
int twi_daten(void);
void twi_stop(void);
int getadc(void);
int main(void)
{
DDRB = 0xFF;
DDRA = 0x00;
PORTA = 0xFF;
TWAR = 0x01;
TWBR = 0xC;
slave_adresse = 0x02;
daten = 0x03;
ADCinit;
ADCprescaler_16;
for(;;)
{
ADCchannel_1;
ADCstart;
adc_wert = getadc();
if (adc_wert>204)
{
PORTB = (1<<PB0);
daten = 0x03;
}
else
{
PORTB &= ~(1<<PB0);
daten = 0x02;
}
twi_start();
twi_adresse();
twi_daten();
twi_stop();
}
}
int twi_start(void)
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) == 0x08)
{
return 0;
}
else
{
return 1;
}
}
int twi_adresse(void)
{
TWDR = slave_adresse;
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) == 0x18)
{
return 0;
}
else
{
return 1;
}
}
int twi_daten(void)
{
TWDR = daten;
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)))
if ((TWSR & 0xF8) == 0x28)
{
return 0;
}
else
{
return 1;
}
}
void twi_stop(void)
{
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
}
int getadc(void)
{
while (ADCSRA & _BV(ADSC)) {}
return ADC;
}
und Slave:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
unsigned volatile char slave_adresse, daten;
int main(void)
{
sei();
DDRB = 0xFF;
PORTB &= ~(1<<PB0);
TWAR = 0x02;
TWBR = 0xC;
TWCR = (1<<TWEA)|(1<<TWEN)|(1<<TWIE);
TWSR &= 0b11111100;
TWCR |= (1<<TWINT);
for(;;)
{
if(daten == 0x03)
{
PORTB = (1<<PB0);
}
else
{
PORTB &= ~(1<<PB0);
}
}
}
SIGNAL (SIG_2WIRE_SERIAL)
{
if((TWSR & 0b11111000) == 0x80)
{
daten = TWDR;
}
else
{
daten = 0x00;
}
TWCR |= (1<<TWINT);
}
bitte helft mir! sagt mir jeden Fehler den ihr findet! Ich bedanke mich schon im Vorraus!
Gruß Michi