hallo, es geht jetzt.
die variablen müssen "Volatile" werden, weil diese beim programmablauf immer einen willkürlichen wert bekommen. weiterhin werden auch durch den compiler nicht-volatile-variablen wegoptimiert.
ich habe mir noch eine einfache for-schleife erstellt, die im avr-studio bei einem durchgang 0,75us verbraucht und habe dann dem entsprechend die zahlen für die us umgerechnet 10us = 14 und 200us ist 267.
läuft jetzt im normalen interrupt ganz toll. die messung läuft sehr genau.Code:// Das mit PD1 auf PORTD ist nur ein Beispiel, jeder beliebige Pin kann gewält werden #define MESS_PORT PORTB #define MESS_PORT_RICHTUNG DDRB #define MESS_PIN PINB #define MESS_BIT PB0 // Echo-Trigger Eingang oder einfach Messeingang #define US_PORT PORTB #define US_PORT_RICHTUNG DDRB #define US_BIT PB1 // Der Pin kommt zum Trigger-Puls Eingang uint16_t start_messung(void) { volatile uint16_t wert,i,x,x1; x=14; x1=267; wert=0; US_PORT_RICHTUNG|=(1<<US_BIT); // US_PIN auf Ausgang US_PORT|=(1<<US_BIT); // Trigger-Puls auf high for (i=0; i<x; i++) asm volatile("nop"); US_PORT&=~(1<<US_BIT); // Trigger-Puls Eingang wieder auf low for (i=0; i<x1; i++) asm volatile("nop"); // Wenn keine srf04 Messung dann einfach ab hier TCNT1=0; // Timerregister auf 0 TCCR1B|= (1<<CS11); // Timer starten while (MESS_PIN & (1<<MESS_BIT)) // Warten bis Echo/Mess Eingang auf low wert=TCNT1; TCCR1B&= ~(1<<CS11); // Timer wieder aus return wert; }
man lernt nie aus, habe heute noch mal mit der "volatile" gelesen und der wegoptimierung.
ihr alle habt eine hervorragende arbeit geleistet, ich hoffe es bleib weiterhin so. werde das andere musterprogramm auch noch umschreiben.
jetzt habe ich ein nächstes thema : ein i2ceeprom 24c64 oder 24c256 beschreiben und lesen. es gibt zwar einige vorschläge, aber da steige ich nicht durch. vielleicht interessiert euch auch das thema, und macht es übersichtlich . vielen dank.
mfg pebisoft







Zitieren

Lesezeichen