ATmega162 / AVRDragon - Problem

OP #1027057
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

  }

}
OP #1027375
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.