Hallo,
ich wollte mit dem tiny24 eine Ultraschall-Entfernungsmesser bauen, der
über den i2c bus abgefragt werden kann.
Für den i2c-bus benutze ich die dateien aus diesem beitrag:
Beitrag "TWI Slave mit USI AVR312"
I2c funktioniert.
Synchronisation erfolgt über Interrupt0. Signal ist mit nem Oszi zu
erkennen.
Ultraschall Signal wird vom Empfänger auch detektiert. Gibt ein schönes
deutliches Signal. der MC reagiert aber nicht wie erwartet.
ich habe zum Fehlersuchen 2 Led auf der platine (PA0 und PA3)
1 | /*Wenn Reset Flag gesetzt Lampen an*/
|
2 | if ( MCUSR & (1<<WDRF) )
|
3 | {
|
4 | PORTA &= ~(1<<PA3);//test led setzen
|
5 | PORTA |= (1<<PA0);
|
6 | }
|
7 | if ( MCUSR & (1<<BORF) )
|
8 | {
|
9 | PORTA |= (1<<PA3);//test led setzen
|
10 | PORTA &= ~(1<<PA0);
|
11 | }
|
12 | if ( MCUSR & (1<<EXTRF) )
|
13 | {
|
14 | PORTA &= ~(1<<PA3);//test led setzen
|
15 | PORTA &= ~(1<<PA0);
|
16 | }
|
17 | if ( MCUSR & (1<<PORF) )
|
18 | {
|
19 | PORTA |= (1<<PA3);//test led setzen
|
20 | PORTA |= (1<<PA0);
|
21 | }
|
22 | MCUSR &= ~ ((1<<WDRF) | (1<<BORF) | (1<<EXTRF) | (1<< PORF)); //Flags wieder löschen
|
Damit sollten ja beide LEDs angehen wenn es ein einfacher Power down
Reset war.
1 | void AC_Initialise(void)
|
2 | {
|
3 | //Analog Comparator
|
4 | ACSR |= (1<<ACI); // Interrupt Flag clearen
|
5 |
|
6 | ACSR |= (1<<ACIS1) // Output Rising Edge
|
7 | | (1<<ACIS0) // Output Rising Edge
|
8 | | (1<<ACIC); // Input Capture Timer1
|
9 |
|
10 | //nach sei(); noch ACSR |= (1<<ACIE) zum Enablen
|
11 |
|
12 | // PORTA &= ~((1<<PA0) | (1 << PA3) | (1 << PA7)); //alle test Led löschen
|
13 |
|
14 | //Timer1
|
15 | TCCR1B |= (1 << CS11); //Prescaler = 8 //Timer läuft
|
16 |
|
17 | TIFR1 |= (1<<ICF1) | (1 << TOV1); // Input Capture Flag + Timer overflow flag clearen // Pending interrupts beenden
|
18 | TIMSK1 |= ((1<<ICIE1) | (1<<TOIE1)) ; //Input Capture Interrupt enable + timer overflow interrupt enable
|
19 |
|
20 | //Timer reseten
|
21 | TCNT1 = 0;
|
22 |
|
23 | PINA = _BV(PA3);//test led togglen
|
24 | }
|
dieser Aufruf soll PA3 toggeln also led2 auschalten
1 | ISR(ANA_COMP_vect)
|
2 | {
|
3 | Timestamp = 53; //ICR1;
|
4 | dataInTimestamp = TRUE;
|
5 |
|
6 | // PORTA &= ~(1<<PA3);//test led löschen
|
7 | PINA = _BV(PA0);
|
8 | }
|
Das ist meine Interrupt-Routine für den Input Capture Interrupt. Sobald
die auslöst soll (PA0) led1 toggeln, um festzustellen, dass es
tatsächlich aufgerufen wurde.
Problem:
Wenn ich die Spanung anschließe, leuchten beide leds auf //OK
Led2 geht ganz kurz danach aus //OK
empfange ich ultraschall und das synchronisationssignal, leuchtet led2
kurz wieder auf //Fehler, hat der MC sich gerade resetet?
ich lese mit dem i2c-master immer nur 52 aus.
demnach immer overflow?
weshalb leuchtet die led kurz auf?
hab diesen beitrag bei meiner fehlersuche gefunden
Beitrag "Kein Zugriff auf globale Variable im Interrupt"
das ist das erste projekt mit dem gcc und nem tiny24 von mir.
Würde mich freuen wenn mir jemand weiterhelfen kann.