Forum: Mikrocontroller und Digitale Elektronik Atmega 1284p serielle Schnittstelle


von Sukramaniul (Gast)


Lesenswert?

Hallo,

ich habe einen Atmega 1284p und möchte damit die seriellen Daten eines 
GPS-Moduls abgreifen. Den Atmega programmiere per Arduino ISP mit der 
Arduino IDE. Dafür benötige ich die Library NazaDecoder, welche mir die 
Seriellen Daten ausliest und in GPS Koordinaten umwandelt. Mit dem 
normalen Arduino Uno funktioniert das auch problemlos, nur mit dem 
Atmega1284p bekomme ich einfach keine Daten ausgelesen. Ich habe den TX 
Pin vom GPS Modul mit dem RX0 Pin des Atmega verbunden. Wenn das ganze 
mit dem Arduino auslese, verwende ich den RX Pin des Arduino.
Woran kann das liegen? Normalerweise dürfte da doch kein allzu großer 
Unterschied sein zwischen dem Atmega 328 des Arduino und des Atmega 
1284p?

Ich wäre über jede Hilfe sehr Dankbar.

von Jim M. (turboj)


Lesenswert?

Der 1284p hat zwei UARTs. Da muss man sich schon den richtigen 
aussuchen...

Ansonsten: Schaltplan, bitte.

von Einer K. (Gast)


Lesenswert?

In der Regel wird die erste UART eines AVR für die Kommunikation zum PC 
genutzt.
Arduino Tradition.
Von daher wundert es mich, dass das beim UNO einfach so funktioniert.

Soweit mir bekannt hat dein AVR 4 UART.
Es macht also wenig Sinn UART0 für dein GPS zu verwenden.

Übrigens:
Die Serielle ist kein Bus!

Die übliche Arduinos haben Angstwiderstände OnBoard, damit solche 
Kollisionen nicht zum rauchen führen.
Das ist wohl der Grund warum es am UNO (halbwegs) funktioniert.

von Wilhelm M. (wimalopaan)


Lesenswert?

Arduino F. schrieb:
> In der Regel wird die erste UART eines AVR für die Kommunikation zum PC
> genutzt.
> Arduino Tradition.
> Von daher wundert es mich, dass das beim UNO einfach so funktioniert.
>
> Soweit mir bekannt hat dein AVR 4 UART.

Nein,
1284p hat 2 Uart,
328p hat 1 Uart
328pb hat 2 Uart
324pb hat 3 Uart

von Sukramaniul (Gast)


Lesenswert?

Danke für eure Antworten.
Das heisst also ich müsste das über den 2. UART verbinden, also dann an 
den PIN RX1 statt RX0? Wie kann ich das im Programm festlegen?

Hier mal der Programmcode:
1
#include "NazaDecoderLib.h"
2
float Y_ist;
3
float X_ist; 
4
int sat;
5
6
void setup() {
7
  // put your setup code here, to run once:
8
Serial.begin(115200);
9
pinMode(24,OUTPUT);
10
}
11
12
void loop() {
13
  // put your main code here, to run repeatedly:
14
15
if(Serial.available())
16
  {
17
        uint8_t decodedMessage = NazaDecoder.decode(Serial.read());
18
    switch (decodedMessage)
19
    {   case NAZA_MESSAGE_GPS:
20
        //Serial.print("Lat: "); Serial.print(NazaDecoder.getLat(), 7);
21
        //Serial.print(", Lon: "); Serial.print(NazaDecoder.getLon(), 7);
22
        //Serial.print(", Sat: "); Serial.println(NazaDecoder.getNumSat());
23
        Y_ist = NazaDecoder.getLat();
24
        X_ist = NazaDecoder.getLon();
25
        sat = NazaDecoder.getNumSat();
26
        break;}
27
  }
28
29
30
if (X_ist = 0) {digitalWrite(24,LOW);}
31
else {digitalWrite(24,HIGH);}
32
33
}

eigentlich sollte es dann so sein, dass die GPS-Koordinaten in den 
beiden Variablen als Kommazahl gespeichert werden, zur überprüfung 
befindet sich eine LED am µC die Leuchtet sobald etwas empfangen wurde.

von Einer K. (Gast)


Lesenswert?

Serial.begin(115200); // verbindung zum PC, über USB
Serial1.begin(115200); // verbindung zum GPS Modul

Wilhelm M. schrieb:
> 1284p hat 2 Uart,
Immerhin...
Eine Zweite sollte hier doch reichen.

von Wilhelm M. (wimalopaan)


Lesenswert?

Arduino F. schrieb:
> Serial.begin(115200); // verbindung zum PC, über USB
> Serial1.begin(115200); // verbindung zum GPS Modul

Bist Du sicher, dass die Baud-Rate stimmt. Meine uBlox Neo-8 / Neo-6 
senden default mit 9600 Bd.

von Sukramaniul (Gast)


Lesenswert?

Achso dann nimmt man also einfach Serial1 anstatt Serial, also müsste 
das dann so aussehen oder?
1
#include "NazaDecoderLib.h"
2
float Y_ist;
3
float X_ist; 
4
int sat;
5
6
void setup() {
7
  // put your setup code here, to run once:
8
Serial.begin(115200);
9
Serial1.begin(115200);
10
pinMode(24,OUTPUT);
11
}
12
13
void loop() {
14
  // put your main code here, to run repeatedly:
15
16
if(Serial1.available())
17
  {
18
        uint8_t decodedMessage = NazaDecoder.decode(Serial1.read());
19
    switch (decodedMessage)
20
    {   case NAZA_MESSAGE_GPS:
21
        //Serial.print("Lat: "); Serial.print(NazaDecoder.getLat(), 7);
22
        //Serial.print(", Lon: "); Serial.print(NazaDecoder.getLon(), 7);
23
        //Serial.print(", Sat: "); Serial.println(NazaDecoder.getNumSat());
24
        Y_ist = NazaDecoder.getLat();
25
        X_ist = NazaDecoder.getLon();
26
        sat = NazaDecoder.getNumSat();
27
        break;}
28
  }
29
30
31
if (X_ist = 0) {digitalWrite(24,LOW);}
32
else {digitalWrite(24,HIGH);}
33
34
}


allerdings sind die Werte meiner drei Variablen immer noch null, obwohl 
das GPS Modul einwandfreien GPS Empfang hat. Was kann denn da noch das 
Problem sein? Das Beispielprogramm von der Library das mit dem Arduino 
Uno funktioniert sieht so aus:
1
#include "NazaDecoderLib.h"
2
3
void setup()
4
{
5
  Serial.begin(115200);
6
}
7
8
void loop()
9
{
10
  if(Serial.available())
11
  {
12
    uint8_t decodedMessage = NazaDecoder.decode(Serial.read());
13
    switch (decodedMessage)
14
    {   case NAZA_MESSAGE_GPS:
15
        Serial.print("Lat: "); Serial.print(NazaDecoder.getLat(), 7);
16
        Serial.print(", Lon: "); Serial.print(NazaDecoder.getLon(), 7);
17
        Serial.print(", Sat: "); Serial.println(NazaDecoder.getNumSat());
18
        break;}
19
  }
20
}

von Einer K. (Gast)


Lesenswert?

Wilhelm M. schrieb:
> Bist Du sicher, dass die Baud-Rate stimmt. Meine uBlox Neo-8 / Neo-6
> senden default mit 9600 Bd.
Durchaus möglich ....
Habs einfach stumpf aus dem Code entnommen.

Sukramaniul schrieb:
> if (X_ist = 0)
Das solltest du dringend nochmal überdenken!

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.