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