ATMEGA32 + Watchdog

Gast #1114515
Lesenswert?

Hallo,

ich bin am verzweifeln.
Ich programmiere z.Z. mit einem ATMEGA32 auf einem STK500 Board.

Habe ein einfaches Programm zur Datenübertragung mit der UART 
geschrieben.

Nun habe ich das Problem, dass mein Programm einen Reset auslöst sobald 
die Funktion zur Datenübertragung der UART eingebunden ist.

void uart_send(unsigned char c)
{
  while (!(UCSRA & (1<<UDRE)))
    {}
    UDR = c;
  return;
}

Der Reset erfolgt auch im AVR Studio Ver 4.14 Simulator, also kein HW 
Problem?

Nun gehe ich davon aus, dass der Watchdog eingreift.
Daraufhin habe ich

#include <avr/wdt.h>

eingwebunden und mit dem Befehl

wdt_disable();

den WD ausgeschaltet. Jedoch macht das weder auf dem Controller noch in 
der Simulation einen Unterschied.

Kann mir bitte jemand helfen, ich bin extrem verzweifelt weil ich schon 
seit Stunden davor hänge und einfach nicht weiterkomme :(
Gast #1114526
Lesenswert?

Das gibt es aber meines Wissens nach nicht beim ATMEGA32. Weder im 
Datenblatt noch im AVR Studio ...

Im Datenblatt wird folgendes vorgeschlagen

void WDT_off(void)
{
/* reset WDT */
_WDR();
/* Write logical one to WDTOE and WDE */
WDTCR |= (1<<WDTOE) | (1<<WDE);
/* Turn off WDT */
WDTCR = 0x00;
}

Die Funktion

_WDR();

kennt AVR Studio irgendwie nicht ... wo finde ich die ... wenn ich sie 
auskommentiere klappt es zwar aber hat keine Einwirkung in der 
Simulation oder auf meinem Controller
#1114603
Lesenswert?

@ Sara:

Ich bezweifel deine Analyse. Wäre es der Watchdog, würde er unabhängig 
vom Programm immer irgendwann zuschlagen, nur halt an unterschiedlichen 
Stellen. Wenn der "Reset" nur dann auftritt, wenn du die Funktion 
uart_send benutzt, ist es eher wahrscheinlich, dass du versehentlich den 
Transmission-Complete-Interrupt freigeschaltet hast.
Gast #1114809
Lesenswert?

Hier mein kleiner Testcode.

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>

#define F_CPU 8000000L

int main(void)
{
  wdt_disable();

  DDRD |=  (1<<PD1);  //Initialisierung des UART Ports TXD
  DDRD &= ~(1<<PD0);  //Initialisierung des UART Ports RXD
  DDRA = 0xFF;

  UCSRB |=  (1<<TXEN)  | (1<<RXEN);
  UCSRB |=  (1<<TXCIE) | (1<<RXCIE);
  UBRRL = 25; //19200

  SREG =  (1<<7);    //Global Interrupts enable

  uart_send(0x14);

  while(1)
  {
      PORTA = 0x00;
      PORTA = 0xFF;
  }
}

void uart_send(unsigned char c)
{
  while (!(UCSRA & (1<<UDRE)))  // auf Senden warten
    {}
    UDR = c;
  return;
}


Am Temrinalprogramm wird anstatt 1x 0x14, ständig 0x14 ausgegeben :(
Verstehe nur noch Bahnhof. Den Atmega32 habe ich auch mal getauscht, 
ohne Erfolg.

Optimization steht auf Os
Wenn ich an der Zeile ->uart_send(0x14);<- einen Breakpoint in der 
Simulation setze, gelange ich dort auch immer wieder hin :(

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren