Mega324A reset Problem

OP #3192550
Hallo,

ich habe ein Problem mit einem Programm. Prinzipiell benötige ich eine 
SoftSPI für die Anbindung weiterer Peripherie. Allerdings führt diese zu 
einem Reset meiner Hardware! Ich habe das ganze mal auf wesentliche 
zusammengefasst und als Anhang hochgeladen!

Anbei die Auszüge der wichtigsten Funktionen:
1
int main()
2
{     
3
  // Erlaubt globale Interrupts
4
  SOFTSPI_Init();
5

6
  for(char i = 0; i<255; i++)
7
    SOFTSPI_WriteRead_Synchron(0x00, SOFTSPI_MODE_1);
8

9
  while(1);
10
  
11
}

Setze ich einen Breakpoint auf die while-Schleife, und einen auf das 
Softspi_Init, hält das Programm immer wieder an der Softspi-Stelle, das 
while wird nie erreicht...

Das ist die WriteRead-Methode:
1
unsigned char SOFTSPI_WriteRead_Synchron(unsigned char dataout, char spi_mode)
2
{
3
  SOFTSPI_Clock_Mode(spi_mode);
4
  _delay_us(1);
5
  
6
  uint8_t datain=0;
7
  //das Byte wird Bitweise nacheinander gesendet, MSB zuerst
8
  for (uint8_t a=8; a>0; a--)
9
  {                
10
    datain<<=1;                      //Schieben um das Richtige Bit zusetzen
11

12
    // Daten schreiben Versuch 1
13
    if( ( spi_mode & 0x01 ) == 0x00 )    // CPHA = 0 --> Daten rauschreiben vor 1ten Flanke!
14
    {
15
      if (dataout & 0x80)
16
        SOFTSPI_MOSI_PORT |= SOFTSPI_MOSI_BIT;      //Set Output High
17
      else
18
        SOFTSPI_MOSI_PORT &= ~SOFTSPI_MOSI_BIT;      //Set Output Low
19
    }
20

21
    _delay_us(1);
22

23
    // Erste Flanke!
24
    if( ( spi_mode & 0x02 ) != 0x00 )    // CPOL = 1
25
      SOFTSPI_SCLK_PORT &= ~SOFTSPI_SCLK_BIT;        // CPHA = 1 --> Erste Flanke = Fallende Flanke
26
    else
27
      SOFTSPI_SCLK_PORT |= SOFTSPI_SCLK_BIT;        // CPHA = 0 --> Erste Flanke = Steigende Flanke
28
      
29
    // Daten schreiben Versuch 2
30
    if( ( spi_mode & 0x01 ) != 0x00 )    // CPHA = 1
31
    {
32
      // Daten rauschreiben nach 1ten Flanke!
33
      if (dataout & 0x80)
34
        SOFTSPI_MOSI_PORT |= SOFTSPI_MOSI_BIT;      //Set Output High
35
      else
36
        SOFTSPI_MOSI_PORT &= ~SOFTSPI_MOSI_BIT;      //Set Output Low
37
    }
38
    
39
    _delay_us(1);
40
    
41
    // Daten lesen Versuch 1
42
    if( ( spi_mode & 0x01 ) == 0x00 )    // CPHA = 0
43
    {  
44
      // Daten lesen nach erster Flanke!
45
      if (SOFTSPI_MISO_PIN & SOFTSPI_MISO_BIT)      //Lesen des Pegels
46
        datain |= 1;
47
    }
48
      
49
    // Zweite Flanke!
50
    if( ( spi_mode & 0x02 ) != 0x00 )    // CPOL = 1
51
      SOFTSPI_SCLK_PORT |= SOFTSPI_SCLK_BIT;        // CPHA = 1 --> Zweite Flanke = Steigende Flanke
52
    else
53
      SOFTSPI_SCLK_PORT &= ~SOFTSPI_SCLK_BIT;        // CPHA = 0 --> Zweite Flanke = Fallende Flanke
54

55

56
    _delay_us(1);
57

58
    // Daten lesen Versuch 2
59
    if( ( spi_mode & 0x01 ) != 0x00 )    // CPHA = 1
60
    {  
61
      // Daten lesen nach erster Flanke!
62
      if (SOFTSPI_MISO_PIN & SOFTSPI_MISO_BIT)      //Lesen des Pegels
63
        datain |= 1;
64
    }
65

66
    dataout<<=1;                    //Schiebe um nächstes Bit zusenden
67
  }
68

69
  return datain;
70
}


Sitze da nun schon 2 Tage dran und weiß nichtmehr weiter... Kann mir da 
wer helfen?
Angehängte Dateien:
OP #3194528
Ah, danke für die Antwort. Daran lag es jedoch nicht. Bei mir tritt das 
Problem auf, wie ich nun herausfand, das der Watchdog beim Debugging 
gestartet wird und dieser den Reset durchführt. Der WD lässt sich erst 
durch das Unterbrechen der Spannungsversorgung des Chips deaktivieren, 
wdt_disable() oder das manuelle Beschreiben der Register, deaktiviert 
den WDT nicht.

Kann damit prinzipiell leben, schön finde ich allerdings nicht. Habe 2 
AVR Dragons, beide zeigen das gleiche Verhalten. Arbeite mit AVR Studio 
5.1!
Gast #3194549
Hi

>Der WD lässt sich erst
>durch das Unterbrechen der Spannungsversorgung des Chips deaktivieren,
>wdt_disable() oder das manuelle Beschreiben der Register, deaktiviert
>den WDT nicht.

Zufällig WDTON-Fuse gesetzt?

MfG Spess
#3194571
Marcel Behlau schrieb:
> wdt_disable() oder das manuelle Beschreiben der Register, deaktiviert
> den WDT nicht.

"WDE is overridden by WDRF in MCUSR. This means that WDE is always set 
when WDRF is set. To clear WDE, WDRF must be cleared first."

Der WD sollte immer erst nach Abschluß der Entwicklung implementiert 
werden. Sonst verursacht oder versteckt er Fehler.
OP #3202460
Hey,

habe jetzt im MCUSR Register das WDRF Bit gelöscht und dann den WD 
ausgeschaltet. Resets treten nun nichtmehr auf. Danke schonmal für die 
Hilfe! Eine Erklärung, warum das WDRF mal gesetzt ist und mal nicht, 
habe ich allerdings noch nicht gefunden =/

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.