mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega 1284p serielle Schnittstelle


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Sukramaniul (Gast)
Datum:

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

Autor: Jim M. (turboj)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Der 1284p hat zwei UARTs. Da muss man sich schon den richtigen 
aussuchen...

Ansonsten: Schaltplan, bitte.

Autor: Arduino Fanboy D. (ufuf)
Datum:

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

: Bearbeitet durch User
Autor: Wilhelm M. (wimalopaan)
Datum:

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

Autor: Sukramaniul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include "NazaDecoderLib.h"
float Y_ist;
float X_ist; 
int sat;

void setup() {
  // put your setup code here, to run once:
Serial.begin(115200);
pinMode(24,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:

if(Serial.available())
  {
        uint8_t decodedMessage = NazaDecoder.decode(Serial.read());
    switch (decodedMessage)
    {   case NAZA_MESSAGE_GPS:
        //Serial.print("Lat: "); Serial.print(NazaDecoder.getLat(), 7);
        //Serial.print(", Lon: "); Serial.print(NazaDecoder.getLon(), 7);
        //Serial.print(", Sat: "); Serial.println(NazaDecoder.getNumSat());
        Y_ist = NazaDecoder.getLat();
        X_ist = NazaDecoder.getLon();
        sat = NazaDecoder.getNumSat();
        break;}
  }


if (X_ist = 0) {digitalWrite(24,LOW);}
else {digitalWrite(24,HIGH);}

}


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.

Autor: Arduino Fanboy D. (ufuf)
Datum:

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

Autor: Wilhelm M. (wimalopaan)
Datum:

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

Autor: Sukramaniul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso dann nimmt man also einfach Serial1 anstatt Serial, also müsste 
das dann so aussehen oder?
#include "NazaDecoderLib.h"
float Y_ist;
float X_ist; 
int sat;

void setup() {
  // put your setup code here, to run once:
Serial.begin(115200);
Serial1.begin(115200);
pinMode(24,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:

if(Serial1.available())
  {
        uint8_t decodedMessage = NazaDecoder.decode(Serial1.read());
    switch (decodedMessage)
    {   case NAZA_MESSAGE_GPS:
        //Serial.print("Lat: "); Serial.print(NazaDecoder.getLat(), 7);
        //Serial.print(", Lon: "); Serial.print(NazaDecoder.getLon(), 7);
        //Serial.print(", Sat: "); Serial.println(NazaDecoder.getNumSat());
        Y_ist = NazaDecoder.getLat();
        X_ist = NazaDecoder.getLon();
        sat = NazaDecoder.getNumSat();
        break;}
  }


if (X_ist = 0) {digitalWrite(24,LOW);}
else {digitalWrite(24,HIGH);}

}





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:


#include "NazaDecoderLib.h"

void setup()
{
  Serial.begin(115200);
}

void loop()
{
  if(Serial.available())
  {
    uint8_t decodedMessage = NazaDecoder.decode(Serial.read());
    switch (decodedMessage)
    {   case NAZA_MESSAGE_GPS:
        Serial.print("Lat: "); Serial.print(NazaDecoder.getLat(), 7);
        Serial.print(", Lon: "); Serial.print(NazaDecoder.getLon(), 7);
        Serial.print(", Sat: "); Serial.println(NazaDecoder.getNumSat());
        break;}
  }
}

Autor: Arduino Fanboy D. (ufuf)
Datum:

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

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.