-         

Ergebnis 1 bis 4 von 4

Thema: TWI Slave mit Mega8 und Mega128

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    24.04.2005
    Ort
    Bayern
    Alter
    31
    Beiträge
    336

    TWI Slave mit Mega8 und Mega128

    Anzeige

    Hallo
    ich habe nun das ganze Forum durchgesucht aber nichts richtiges gefunden.
    Ich will als Master einen Mega128 verwenden und als Slave einen Mega8.
    Als Bus verwende ich TWI.
    Für den Master verwende ich die Lib von Fleury.
    Der Interrupt kommt beim Slave aber ich kann die Daten nicht empfangen.

    Mit dem Master sende ich ein Byte zum Slave
    Code:
    #include <avr/io.h>
    #include "i2cmaster.h"
    
    
    #define Motor1  0x50      // device address of Motor1
    
    
    int main(void)
    {
    
    
         i2c_init();                             // initialize I2C library
    
         i2c_start_wait(Motor1+I2C_WRITE);     // set device address and write mode
        // i2c_write(0x10);                        // write address = 10
         i2c_write(0xFF);                        // write value 0x75 to Motor1
         i2c_stop();                             // set stop conditon = release bus
    }
    im Slave warte ich bis TWSR auf 0x80 gesetzt ist.
    Code:
    #include <avr/io.h>
    #include <avr/signal.h> 
    #include <avr/interrupt.h>
    #include <stdlib.h>
    #include <avr/pgmspace.h>
    #include "util/twi.h"
    
    #ifndef F_CPU
    #define F_CPU 16000000UL
    #endif
    
    
    ISR( TWI_vect )       
    {
    //Statusregister abfragen
    
    switch(TWSR)
    {
    case TW_SR_DATA_ACK:
    
    	OCR1A = TWDR; //PWM-Signal
    
    	return;
    
    }
    
    
    TWCR |= (1 << TWINT);
    }
    
    void main (void)
    {
     
    TWAR |= 0x50;                 // Slave Adresse
    TWCR |= (1<<TWEN)|(1<<TWEA)|(1<<TWIE) ;       //TWEN das TWI Modul aktivieren TWEA das Senden des Bestätigungsbits (ACK) zulassen              
    
    sei();
    		
    
    	DDRB =  0xff;
    	PORTB = 0x02;
    	DDRD =  0xff;
    	PORTD = 0x44;
    
    
    TCCR1A = (1<<WGM10)|(1<<COM1A1); // PWM, phase correct, 8 bit.
    TCCR1B =  (1<<CS11) |(1<<CS10); // set clock/prescaler 1/64 -> enable counter
    
    OCR1A = 30; //PWM-Signal
    
    
    }
    was habe ich da falsch gemacht?

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    24.04.2005
    Ort
    Bayern
    Alter
    31
    Beiträge
    336
    nun bin ich schon so weit dass ich weis dass das TWSR Register immer auf 0x00 steht.

  3. #3
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Probier mal einfach:
    TWAR |= 0x50; ===> TWAR = 0x50;
    wer weiss, was da vorher dringestanden hat


    Und du brauchst im Main noch eine Dauerschleife ( While (1); )
    sonst macht er ja flutsch und is weg
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    24.04.2005
    Ort
    Bayern
    Alter
    31
    Beiträge
    336
    danke ein blöder Fehler. nun funktioniert alles

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •