Zitat Zitat von striker1985 Beitrag anzeigen
... der Mikrocontroller startet neu .... Das ganze wirkt sehr zufällig ...
Ich habe generell in meiner main eine Blinkroutine - nach der Portdefinition und VOR jeglichen anderen Initialisierungen und VOR dem Erlauben von Interrupts. An der spezifischen Frequenz (ca. 0,1 sec) und der Anzahl der Blinkies kann ich eindeutig irgendwelche zufälligen Resets erkennen. Siehe Codebeispiel zwischen den "Ausrufungszeichen". Ich habe auch eine Testroutine die nur fallweise eingeklinkt wird und entsprechende Signalfolgen mit unterschiedlichen Blinkzeichen generiert, je nachdem, welcher Resetvektor gerade angesprungen wurde. Damit finde ich mich bei ähnlichen Fehlersuchen relativ schnell zurecht.
Code:
// ============================================================================== =
// ===  HAUPTProgramm =========================================================== =
// Initialisierungen, LED1 kurzblinken als Signal für Programmstart,
//   Ausgabe des Identifizierungsstrings per USART 
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                         
 int main(void)
 {                      //
// Pins/Ports als Ein- (0) oder Ausgänge (1) konfigurieren, Pull Ups (1) aktivieren
//   A = Ausgang, E = Eingang ohne , EU = Eingang MIT PullUp
  DDRB  = 0b00011111;   // siehe aktuell oben oder Fortschritt/R2D2
  PORTB = 0b00100000;   //    und Port/Pull Ups (1)  aktivieren
  DDRC  = 0b01110000;   // PC3 ist ADC3, PC0 .. 6 , kein PC7-Pin bei m168
  PORTC = 0b00000111;   // Beachte für ADC: PC3 ist ADC-Eingang ##>> OHNE Pullup !!
  DDRD  = 0b11110000;   // -> siehe unter DDRB,  sowie PD2,3 extInt
  PORTD = 0b00001111;   //    Pull Ups aktivieren
                        //   Encoder_1 = ExtINT0 = PortD2, Encoder_2 = PortD3
//  Dadurch Initialisierung der Anschlüsse für miniD0 auf mega328: - - - - - - - -
//          /RESET,PC6   1 A   A 28   PC5,(SCL), gLED
//             RxD,PD0   2 EU  A 27   PC4,(SDA), rLED
//             TxD,PD1___3 EU  E 26___PC3, ADC0=GP2D120
// SigMot1/ExtINT0,PD2   4 EU EU 25   PC2, SFH 5110, IN irDME 4     Rechts
// SigMot2/ExtINT1,PD3   5 EU EU 24   PC1, SFH 5110, IN irDME 3     Links
//   _|-- 3,4 Guz, PD4___6 A  EU 23___PC0, SFH 5110, IN irDME 1-2   Mitte
//     - - - - - - Belegung Pinne - - - - - - - - -
//          XTAL1  PB6___9 EU    20___VCC
//          XTAL2  PB7  10 EU EU 19   PB5, SCK, Taster2
//  PWM 1,2 uz+Guz,PD5  11 A   A 18   PB4, MISO,  _|-- 3,4  uz, (Taster1)
//  PWM 3,4 uz+Guz,PD6__12 A   A 17___PB3, MOSI, Reserve 2
//    _|-- 1,2  uz,PD7  13 A   A 16   PB2, Servo
//    _|-- 1,2 Guz,PB0  14 A   A 15   PB1, OC1A = SFH 415, OUT (irDME)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
  for(i=0; i<10; i++)   // LED/PC5 blinkt i-mal ##>> bevor Interrupts erlaubt sind
                        //   um ungewollte Resets u.ä. erkennen zu können
  {                       
    SetBit(PORTC, 5);   // LED auf PC5 schalten EIN, HELL
    waitms(3);          //    ... damit man kurze resets besser erkennt
    ClrBit(PORTC, 5);   // LED auf PC5 schalten AUS, Dunkel
    waitms(97);         //
  }                     // Ende von for(i=0; i<10; i++)
// ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//      Es folgen Initialisierungsroutinen, z.B.:
  init_USART0(MYUBRR);  //USART0 initialisieren mit wählbarer Baudrate (s.o.)
  XTI_0_1_init();       //Initialisiere den externen Interrupt 0 und 1
                        //
  sei();  //Globalen Interrupt freigeben
                        //
//      .....