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
Folgende Ausgabe über RS232: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 */
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!







Zitieren

Lesezeichen