PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : TWI Taster Abfrage am Master und Ausgabe am Slave



Pinie
09.03.2011, 15:36
Hallo,
ich versuche schon seit Tagen einen Taster am Master Abzufragen und eine LED am Slave Leuchten zulassen.
leider bekomme ich das im Code Beispiel hier: http://www.rn-wissen.de/index.php/TWI_Slave_mit_avr-gcc
nicht hin könnte mir da jemand helfen?
Bin grade einwenig am verzweifeln.

Pinie
09.03.2011, 19:22
Guten Abend,
ich habe es jetzt mal im Slave versucht den Taster Abzufragen und auch im Slave eine LED einzuschalten aber es klappt nicht nur die Serielle Verbindung klappt:(


#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
#include "twislave.h"
#include "uart.h" //UART-Lib von P- Fleury
#include <stdlib.h> //nötig für Zahlumwandlung mit itoa
#include <util/delay.h>
#include <avr/io.h>

// LEDs sind high-active geschaltet
#define LED_AN(LED) (PORTD |= (1<<(LED)))
#define LED_AUS(LED) (PORTD &= ~(1<<(LED)))
#define LED1 PB0
#define LED2 PB1
// TASTER ist high-active geschaltet
#define TASTER PD2
#define TASTER_GEDRUECKT() (PIND & (1<<TASTER))
#define BAUD 9600 //Baudrate
#define SLAVE_ADRESSE 0x50 //Die Slave-Adresse

//Hilfsfunktion, um Zahlen über das UART auszugeben
void uart_puti( const int val )
{
char buffer[8];
uart_puts( itoa(val, buffer, 10) );
}
int main (void)
{
DDRA &= ~(1<<TASTER); // Port B: Eingang für Taster
DDRB |= (1<<LED1) | (1<<LED2); // Port D: Ausgang für LED1 und LED2

//TWI als Slave mit Adresse slaveadr starten
init_twi_slave(SLAVE_ADRESSE);
//i2cdatamit Werten füllen, die der Master auslesen und ändern kann
for(uint8_t i=0;i<i2c_buffer_size;i++)
{
i2cdata[i]=10+i;
}
//Serielle Schnittstelle aktivieren
uart_init((UART_BAUD_SELECT((BAUD),F_CPU)));
uart_puts("I2C-Test\r\n");
uart_puts("Teste I2C-Slave mit Adresse "); uart_puti(SLAVE_ADRESSE);
uart_puts("\r\n");
uart_puts("\r\n"); //Leerzeile
void ausgabe_RS232()
{
uart_puts("i2cdata:\r\n");
for(uint8_t i=0;i<i2c_buffer_size;i++)
{
uart_puti(i2cdata[i]);
uart_puts("\r\n");
}
uart_puts("\r\n");//leerzeile
_delay_ms(1000);
}
//in einer Endlosschleife den Inhalt der Buffer ausgeben
while(1)
{
{
ausgabe_RS232();
}
if (TASTER_GEDRUECKT())
{
LED_AN(LED1);
}
} //end.while
} //end.main
könnte mir da jemand mal einen Tipp geben was ich Falsch mach
wäre sehr nett

sternst
09.03.2011, 19:30
#define LED_AN(LED) (PORTD |= (1<<(LED)))
#define LED_AUS(LED) (PORTD &= ~(1<<(LED)))
#define LED1 PB0
#define LED2 PB1
// TASTER ist high-active geschaltet
#define TASTER PD2
#define TASTER_GEDRUECKT() (PIND & (1<<TASTER))
...
DDRA &= ~(1<<TASTER); // Port B: Eingang für Taster
DDRB |= (1<<LED1) | (1<<LED2); // Port D: Ausgang für LED1 und LED2Da passt ja praktisch gar nichts zusammen. Du musst dich schon entscheiden, an welchem Port Taster und LEDs nun tatsächlich sind.

Pinie
11.03.2011, 11:22
Hallo,
da hast du recht hätte mir ja auch auffallen können](*,)
könnte mir den Jemand sagen wie ich im Slave z.B. das erste Byte abfrage und dann wenn Byte1 = 42 Led1 angeht