Hallo Zusammen,
ich habe eine Schaltung aufgebaut, in der ein ATmega8 über I2C mit einem SRF02 Ultraschallmodul redet. Ich benutze im Code die I2C-Master Implementierung von peter fleury.
Ich hatte jetzt schon öfter den Effekt, dass die Kommunikation im i2c_readAck() einfriert, was vermutlich darauf zurückzuführen ist, dass vom Slave (SRF02) keine Antwort zurück kommt.
Ich wollte nun also versuchen, das Ganze interrupt-basiert anzugehen. Leider bekomme ich es nicht mal auf die Reihe, einen Interrupt für Aktivitäten auf dem I2C-Bus zu aktivieren. Ich habe folgenden Code:
Was mache ich beim Aktivieren des Interrupts falsch? Es passiert einfach nichts ...Code:#include <stdlib.h> #include <stdio.h> #include <stdarg.h> #include <string.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/pgmspace.h> #include "delay.h" #include "lcd.h" #include "i2cmaster.h" #ifndef SIGNAL #include <avr/signal.h> #endif /* SIGNAL */ ISR (TWI_vect) { PORTB &= ~(1 << PB0); delayms(500); PORTB |= (1 << PB0); } unsigned int read_cm(unsigned char address) { unsigned char lowbyte,highbyte; unsigned int distance; i2c_start_wait(address+I2C_WRITE); while (i2c_write(0)); while (i2c_write(81)); i2c_stop(); i2c_start_wait(address+I2C_WRITE); while (i2c_write(2)); i2c_stop(); delayms(65); i2c_start_wait(address+I2C_READ); highbyte = i2c_readAck(); lowbyte = i2c_readNak(); distance = (highbyte<<8)+lowbyte; i2c_stop(); if(distance > 150) { PORTC = 0x00; } return distance; } int main(void) { ... i2c_init(); ... TWCR |= (1<<TWIE) | (1<<TWINT); sei(); for ( ;; ) { dist = read_cm(SRF02_ADDRESS); if (dist >= HEIGHT) { fill_percent = 0; } else { fill_percent = 100 - ((dist * 100) / HEIGHT); } delayms(3000); } }
Wie ist das eigentlich, muss ich als Implementierung nun twimaster.c oder i2cmaster.S verwenden?
AVR-GCC Version 4.3.0
Gruss,
mefiX







Zitieren

Lesezeichen