Forum: Mikrocontroller und Digitale Elektronik ATmega162 / AVRDragon - Problem


von Markus V. (markusv)


Lesenswert?

Hallo!

Ich möchte mit Hilfe eines ATmega162 die Daten (zunächst ASCII-, später 
binäre Daten) eines GPS-Empfängers per TCP an eine Spezialsoftware auf 
einem normalen PC schicken. Der µC ist deswegen notwendig, weil diese 
besagte Software nur dann die GPS-Daten akzeptiert, wenn vorher eine 
spezielle Kennung (die in den GPS-Daten nicht enthalten ist) geschickt 
wird.

Daher habe ich mir einen AVR mit 2 UARTs gesucht, zwei MAX232 
angeschlossen und alles in eine Kiste gepackt. Direkt nach dem Start 
wird die Kennung ("SOURCE ...") geschickt. Die GPS-Daten kommen dann mit 
9600 Baud herein und werden per Interrupt an den zweiten UART übergeben 
(ebenfalls 9600 Baud), der an einen serial-to-ethernet-Konverter 
(conline) angeschlossen ist.

Ein einfacher TCP-Server auf dem Rechner zeigt, dass das Programm (siehe 
unten) prinzipiell funktioniert; also vernünftige Daten übertragen 
werden. Die Programmierung erfolgte übers AVRStudio mit einen AVRDragon 
über JTAG. Die Spannungsversorgung des µC erfolgt über einen RECOM 
DC/DC-Wandler; also wohl recht stabil...

Das Problem ist nun, dass der µC etwa jede Minute abstürzt (erkennbar 
daran, dass die Kennung "SOURCE..." neu geschickt wird), wenn der 
AVRDragon noch an der Schaltung hängt. Ohne AVRDragon stürzt er aber 
sogar etwa alle 10 Sekunden ab! Woran kann das liegen?

Ich habe schon versucht, das JTAGEN-Bit auszuschalten (hat ausser einem 
Aussperren nichts bewirkt) oder an den Pullup-Widerständen der JTAG-Pins 
(PC4-PC7) zu spielen. Nichts hilft.

Kann mir da jemand helfen? Vielen Dank!!!

Markus




Quellcode:
----------
#ifndef F_CPU
#define F_CPU 3686400UL
#endif

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdlib.h>

#define USART_BAUDRATE 9600
#define BAUD_PRESCALE  2 // (((F_CPU / (USART_BAUDRATE * 16UL)))-1)

// Interrupt-Routine
// =================
ISR(USART0_RXC_vect){

  //cli();
  UDR1 = UDR0;
  PORTC |= (1<<PC0);  // Schaltet DATA OUT-LED an
  //sei();

}

void sendWord(char Message[100]) {

  int i;
  for (i = 0; i < strlen(Message); i++) {
     while( !(UCSR1A & (1<<UDRE1) ) );
   UDR1 = Message[i];
  }

}

int main(void) {


  DDRA  = 0b00000000; // Alle Pins auf Eingang
  PORTA = 0b11111111; // Alle pull-up-Widerst�nde an

  DDRB  = 0b00000000;
  PORTB = 0b11111111;

  // backup DDRC  = 0b00000001;
  // backup PORTC = 0b11111110; // 11000011

  //        xxxx PINs für JTAG-Programmierung
  DDRC  = 0b11110001;
  PORTC = 0b11111110; // 11000011

  DDRD  = 0b00000000;
  PORTD = 0b11111111;

  DDRE  = 0b00000000;
  PORTE = 0b11111111;

  // UART0  (zum Lesen)
  UCSR0A = 0x00;
  UCSR0B = ( (1<<RXCIE0) | (1<<RXEN0) );
  //UCSR0B = ( (1<<RXCIE0) | (1<<RXEN0) | (1<<TXEN0) );
//            0 ?
  UCSR0C = ( (1 << UMSEL0 ) | // Configure for asynchronous operation
        (0<<UPM01) |  // No parity UPM?1 und UPM?0    ? = 1 oder 0
    (0<<UPM00) |
    (0<<USBS0) |  // 1 stopbit
    (1<<UCSZ01) | // 8 data bits   UCSZ?1 und UCSZ?0    ? = 1 oder 0
    (1<<UCSZ00) );

  UBRR0H = (BAUD_PRESCALE >> 8);
  UBRR0L =  BAUD_PRESCALE;

  // UART1 (zum Schreiben)
  UCSR1A = 0x00;
  UCSR1B = ( (1<<TXEN1) );
  //UCSR1B = ( (1<<RXCIE1) | (1<<RXEN1) | (1<<TXEN1) );
  //          0 ?
  UCSR1C = ( (1 << UMSEL1 ) | // Configure for asynchronous operation
        (0<<UPM11) |  // No parity UPM?1 und UPM?0    ? = 1 oder 0
    (0<<UPM10) |
    (0<<USBS1) |  // 1 stopbit
    (1<<UCSZ11) | // 8 data bits   UCSZ?1 und UCSZ?0    ? = 1 oder 0
    (1<<UCSZ10) );

  UBRR1H = (BAUD_PRESCALE >> 8);
  UBRR1L =  BAUD_PRESCALE;

  // Hier einmaliges Anmelden an Caster
  // Verschicke "SOURCE password/ABCD0\r\nSource-Agent: NTRIP 
NtripServerAVR/0.01\r\n\r\n"
  sendWord( "\r\n\r\n\r\n" );

  int i;
  for (i=0;i<2;i++) { _delay_ms(100); }
  sendWord( "SOURCE pwd TEST0\r\nSource-Agent: 
NTRIPNtripServerAVR\r\n\r\n\r\n" );

  sei();

  for (;;) {

    PORTC &= ~(1<<PC0);  // Schaltet DATA OUT-LED wieder aus

  }

}

von Stefan W. (wswbln)


Lesenswert?

Schaltplan?

Speziell: wie ist der Reseteingang des M162 beschaltet?
Wie sind die Fuses gesetzt?

von Markus V. (markusv)


Lesenswert?

Hallo!

einen Schaltplan habe ich nicht zu bieten.

Mangels besseren Wissens habe ich mit dem Reseteingang gar nichts 
gemacht. Er ist also offen! Was soll ich denn damit machen?

Die Fuses sehen folgendermaßen aus:
M161C 0
BODLEVEL Brown-out detection disabled
OCDEN 0
JTAGEN 1
SPIEN 1
WDTON 0
EESAVE 0
BOOTSZ Boot Flash size=1024 words start adress=$1C00
BOOTRST 0
CKDIV8 1
CKOUT 0
SUT_CKSEL Ext. Crystal Osc. 8.0- MHz; Start-up time: 16K CK + 65 ms

EXTENDED 0xFF
HIGH 0x99
LOW 0x7F

Gruss,
Markus

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.