mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Raspberry PI und ATmega328 serielle Schnittstelle


Autor: Jonas (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Servus Leute,

ich bin gerade dabei, einen RaspberryPI3 und einen Atmgega328p über die 
serielle Schnittstelle der GPIOs des PI miteinander zu verbinden.
Der ATmega läuft mit 3,3V um auf einen Pegelwandler verzichten zu können 
und ist auf 8 MhZ mit internem Taktgeber gefused.

Die Erfolgsquote liegt aber nur bei 50%.
Es gelingt, von dem AVR Daten an den Pi zu senden und diese mit dem 
Terminalprogramm Cutecom auszulesen.
Jedoch klappt es nicht, mit Cutecom über die gesendeten Strings "l0\n" 
oder "l1\n" eine LED am Pi ein- und auszuschalten.

Die Hardwareverbindungen habe ich alle geprüft und sie sind in Ordnung.
Im Anhang ist der C-Quellcode für den AVR.

Hoffentlich könnt ihr mir helfen!
Danke im Vorraus.

Viele Grüße,

Jonas Wühr

Autor: Jonas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry Schreibfehler. Die Led ist natürlich am Avr und nicht am Pi 
angeschlossen.

Autor: Torsten C. (torsten_c) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jonas schrieb:
> ist auf 8 MhZ mit internem Taktgeber gefused

Der interne Taktgeber ist nicht sehr exakt und temperaturabhängig.

Mit 8MHz-Quarz hatte ich noch nie Probleme. Kann man am RPi die Baudrate 
verändern, z.B. sowas wie 9603 oder 19189 Baud?

Dann ist das Ganze aber immernoch von der Temperatur abhängig.

Autor: Rainer B. (katastrophenheinz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Narbend,
ich glaube, an dieser Stelle verwendest du die falschen Indices für 
rxBuffer. MMn findest du die empfangenen Zeichen ab Offset 0 und nicht 
ab Offset 1.
  if(stringRxFlag == 1)
  {
    if(rxBuffer[1]=='l')
    {
      if(rxBuffer[2]='1')
      {
        PORTB=(1<<PB1);
      }
      if(rxBuffer[2]='0')
      {
        PORTB&=~(1<<PB1);
      }
    }
  }

dh richtig wäre:
  if(stringRxFlag == 1)
  {
    if(rxBuffer[0]=='l')
    {
      if(rxBuffer[1]='1')
      {
        PORTB=(1<<PB1);
      }
      if(rxBuffer[1]='0')
      {
        PORTB&=~(1<<PB1);
      }
    }
  }

Ansonsten alle Teile mal unabhängig voneinander Testen, d.h. LED mit 
_delay_ms periodisch Blinken lassen, wenn das geht, den empfangenen 
String 1:1 wieder zurücksenden, erst wenn das geht, das gewünschte 
Programm aus getesteten Fragmenten zusammenbasteln.

Autor: Jonas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups... danke für die schnelke hilfe.

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.