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


von Jonas (Gast)


Angehängte Dateien:

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

von Jonas (Gast)


Lesenswert?

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

von Torsten C. (torsten_c) Benutzerseite


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.

von Rainer B. (katastrophenheinz)


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.
1
  if(stringRxFlag == 1)
2
  {
3
    if(rxBuffer[1]=='l')
4
    {
5
      if(rxBuffer[2]='1')
6
      {
7
        PORTB=(1<<PB1);
8
      }
9
      if(rxBuffer[2]='0')
10
      {
11
        PORTB&=~(1<<PB1);
12
      }
13
    }
14
  }

dh richtig wäre:
1
  if(stringRxFlag == 1)
2
  {
3
    if(rxBuffer[0]=='l')
4
    {
5
      if(rxBuffer[1]='1')
6
      {
7
        PORTB=(1<<PB1);
8
      }
9
      if(rxBuffer[1]='0')
10
      {
11
        PORTB&=~(1<<PB1);
12
      }
13
    }
14
  }

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.

von Jonas (Gast)


Lesenswert?

Ups... danke für die schnelke hilfe.

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.