www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega162 / AVRDragon - Problem


Autor: Markus Vennebusch (markusv)
Datum:

Bewertung
0 lesenswert
nicht 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

  }

}

Autor: Stefan Wimmer (wswbln)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schaltplan?

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

Autor: Markus Vennebusch (markusv)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.