Also es ist mittlerweile so weit gediehen, dass immer wieder übertragen wird. Manchmal scheint das ganze aber zu hängen, sprich der Master sendet nach einer Übertragung kein Stoppsignal mehr. Auf welche Fehlerquellen könnte das deuten?
Hier nun die Codes für Master:
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include "i2cmaster.h"
#include <compat/twi.h>
void timer_init(void){
TCCR0 = (1 << CS02); //Frequenzteilung durch 256
}
void main(void){
DDRD = 0x00; //PORTD als Eingang
PORTD = 0xFF; // Pull-Up Widerstände an Port D aktiviert -> Schalter als Active-Low ausführen
DDRB = 0xFF;
PORTB = 0x00; //hier hängen LEDs dran, um eventuell beim Fehlersuchen zu helfen
unsigned int overflow_counter = 0;
unsigned char goal1[2];
goal1[0] = 0;
goal1[1] = 0;
timer_init();
i2c_init();
PORTB = (1 <<PB0);
for(;;){
PORTB = 0x00;
if ( TIFR & (1<<TOV0) ) {//wenn die timer/counter0 overflow Fahne '1' ist, dass ist immer wenn 1/152 sec erreicht sind (10Mhz/(256*256))
TIFR |= (1<<TOV0) ; //Overflow Bit wieder auf null setzen
overflow_counter++; //overflow counter inkrementieren
}
if (!(PIND & (1 << PD7)) && (overflow_counter > 100)){
PORTB = (1<<PB0);
goal[1]++;
i2c_start_wait(0x02+I2C_WRITE); // set device address and write mode
i2c_write(0x02); // write address = 2
i2c_write(goal1[1]); // write value goal[i] to Slave
i2c_stop();
i++;
overflow_counter = 0;
}
}
}
//end of bedienfeld.c
Und für den Slave:
Code:
//clockspeed 4Mhz ->
/* Dies ist das C-File für die Anzeigensteuerung, das I2C wird über einen Interrupt ausgelöst*/
#include <avr/io.h>
#include "show_digits.h" //File für die Umwandlung von Zehner- und Einserdezimal in BCD
#include <compat/twi.h>
#include <avr/interrupt.h>
#include "i2cnew/twislave.h"
#include <util/twi.h>
volatile unsigned char goal1 = 0;
volatile unsigned char goal2 = 0;
void timer_init(void){
TCCR0 = (1 << CS00); //Timer / Counter Control Register is set to devide by 8
}
void main(void){
int overflow_counter = 0; //overflow counter zählt die counter bit overflows
int pin_counter = 0;
DDRB = 0xFF;
PORTB = 0x00;
DDRD = 0xFF; //Alle PortD Pins auf Ausgang gesetzt (PD0-3 für BCD, PD4-7 für Ziffer 1-4)
PORTD = 0x00; //Alles auf Low, Anzeige aus
timer_init(); //timer wird gestartet
int i = 0;
init_twi_slave(0x02); //Alles für TWI Übertragung fertig machen
rxbuffer[6] = 78;
rxbuffer[2] = 00;
for(;;){
PORTB = 0x00;
goal1 = rxbuffer[2];
if ( TIFR & (1<<TOV0) ) {//wenn die timer/counter0 overflow Fahne '1' ist, dass ist immer wenn 1/195 sec erreicht sind (4Mhz/(8*256))
TIFR |= (1<<TOV0) ; //Overflow Bit wieder auf null setzen
overflow_counter++; //overflow counter inkrementieren
}
if (overflow_counter==30) {//Nach 10x256x8 = 20480 overflows oder 50ms
PORTD = 0x00; //Alle Ausgänge ausschalten
PORTD |= (1 << PD4); //Tor 1 Zehner anschalten
show_ten(goal1);
}
else if (overflow_counter==60) {
PORTD = 0x00; //Alle Ausgänge ausschalten
PORTD |= (1 << PD5); //Tor 1 Einser anschalten
show_one(goal1);
}
else if (overflow_counter==90) {
PORTD = 0x00; //Alle Ausgänge ausschalten
PORTD |= (1 << PD6); //Tor 2 Zehner anschalten
show_ten(goal2);
}
else if (overflow_counter==120) {
PORTD = 0x00; //Alle Ausgänge ausschalten
PORTD |= (1 << PD7); //Tor 2 Einser anschalten
show_one(goal2);
overflow_counter=0;
pin_counter++;
}
if (pin_counter > 60){
i++;
pin_counter = 0;
}
if (i == 7){
i=0;
}
}
}
Lesezeichen