hi.. ich habe soeben 2x 10k zwischen 5V und SDA sowie SCL eingelötet. ohne Erfolg
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