hi.. ich habe soeben 2x 10k zwischen 5V und SDA sowie SCL eingelötet. ohne Erfolg ![Sad](https://www.roboternetz.de/phpBB2/images/smiles/icon_sad.gif)
Habe 10k genommen, weil ich kein 2,2 da hatte und es auch in einem anderen Thread gelesen hatte.
Es kann doch nicht daran liegen oder?
Ich habe bisher folgendes gemacht:
1. Einen anderen SRF02 ausprobiert.
2. Pullup wiederstände eingelötet
3. viele Änderungen im Code
Ich benutze bisher nur diesen einen SRF02 Sensor.
Folgenden Code:
Hauptprogramm:
Code:
//#include <stdlib.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include "rncontrol.h"
#include "SRF08.h"
/*### Variablen ###*/
//char wort[5]; //Zahlen (Integer und Float) müssen vor der Ausgabe per RS232 in ASCII-Zeichen konvertiert werden, für die ein Speicher benötigt wird.
//const float referenzspannung = 0.0048828125; //Referenzwert zur Multiplikation mit den Werten der Analogports (0...1023), um auf die Voltzahl zu kommen (0...5). Ergibt sich aus 5/1024.
//uint16_t analog; //Variable für jeweils an einem Analogport gemessenen Wert, um nicht für eine Ausgabe mehrere Messungen durchführen zu müssen.
/*### Hauptschleife ###*/
int main(void)
{
//Pins bzw. Ports als Ein-/Ausgänge konfigurieren
//DDRA |= 0x00; //00000000 -> alle Analogports als Eingänge
//DDRB |= 0x03; //00000011 -> PORTB.0 und PORTB.1 sind Kanäle des rechten Motors
//DDRC |= 0xFF; //11111111 -> PORTC.6 und PORTC.7 sind Kanäle des linken Motors, Rest sind LEDs für Lauflicht
//DDRD |= 0xB0; //10110000 -> PORTD.4 ist PWM-Kanal des linken Motors, PORTD.5 des rechten
//Initialisierungen
//setportcon(0); setportcon(1); setportcon(2); setportcon(3); setportcon(4); setportcon(5); //LEDs ausschalten
setportdoff(7); //Speaker aus
//init_timer1(); //Initialisierung Timer für PWM
init_USART(); //USART konfigurieren
//SFIOR &= ~(1<<PUD); // Pull-UP enable (nicht unbedingt nötig, aber zur Klarheit!)
//PORTA |= (1<<PA7); // internen Pull-Up an PA7 aktivieren
//timer1 für 10ms-Interrupt starten
TIMSK |=(1<<OCIE1A); //ctc interrupt
TCCR1B |=(1<<CS12) | (1<<CS10); //Prescaler 1024
TCCR1B |=(1<<WGM12); //Clear Timer on Compare Match Modus
OCR1A = 0x009C; //Compare auf 10ms bei 8MHz setzen
sendUSART("---------------------------------------------Start 1\r\n");
sei();
start_SRF08_automessung(); //Messung beginnen
uint16_t messwert;
while(1)
{
messwert=get_SRF08_distance();
sendUSART("Messerwert empfangen!\n");
}
}
ISR(TIMER1_COMPA_vect) //wird alle 10ms aufgerufen
{
sendUSART("Timer Startet\n");
SRF08_task();
}
twimaster.c
Code:
unsigned char i2c_start(unsigned char address){
uint8_t twst;
// send START condition
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
sendUSART("Hier wird noch ausgeführt!\n");
// wait until transmission completed
while(!(TWCR & (1<<TWINT)));
sendUSART("Hier leider nicht mehr!\n");
// check value of TWI Status Register. Mask prescaler bits.
twst = TW_STATUS & 0xF8;
if ( (twst != TW_START) && (twst != TW_REP_START)) return 1;
// send device address
TWDR = address;
TWCR = (1<<TWINT) | (1<<TWEN);
// wail until transmission completed and ACK/NACK has been received
while(!(TWCR & (1<<TWINT)));
// check value of TWI Status Register. Mask prescaler bits.
twst = TW_STATUS & 0xF8;
if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ){
return 1;
}
return 0;
}/* i2c_start */
Folgende Ausgabe über RS232:
Code:
---------------------------------------------Start 1Timer Startet
Hier wird noch ausgeführt!
Wenn ich das Programm starte, initialisiert er den Timer, welcher DIREKT den SRF08_task(); Befehl startet ohne dass vorher I2C initialisiert wurde. So steht es in dem Programm bei RN-Wissen.
Wenn ich das veränder, also die Initialisierung des I2C der Initialisierung des Timers vorziehe, funktionierts aber auch nicht.
Grob gesagt, bleibt er an folgender Stelle im twimaster.c hängen:
Code:
// wait until transmission completed
while(!(TWCR & (1<<TWINT)));
Vielen Dank für eure Hilfe!
Lesezeichen