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
}
}