Usart Kommunikation

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo liebe Pi ler,

    nun nach vergebenem suchen und den versuch zu verstehen wie die Usart kommunikation funktioniert wollte ich hier im Forum mal nach fragen wie das ganze funktioniert.

    um die GPIO's anzusrepchen musstie ich die nötige Bibliothek dazu runterladen und einbinden

    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(3,GPIO.IN)
    GPIO.setup(5,GPIO.IN)
    GPIO.setup(7,GPIO.IN)
    GPIO.setup(8,GPIO.IN)
    GPIO.setup(9,GPIO.OUT)
    strmeasureone=str(GPIO.input(3)
    +GPIO.input(5)
    +GPIO.input(7)
    +GPIO.input(8))

    so das war ganz einfach nur nicht das was ich mir vorgestellt habe
    nun zur Usart.
    Ich kenn mich mit der USART kommunikation überhaupt nicht aus

    ich weiss zu mindest das der Pin 14 TXD und der Pin 15 RXD sind
    der eine zum schreiben der eine zum lesen

    was muss ich alles einstellen
    mit der Kombination zu einem Atmega 8

    $ sudo stty 19200 -F /dev/ttyAMA0
    Welche Baudrate muss ich wählen ? habt ihr da vlt eine Idee?

    Um das ganze zu Konfigurieren muss ich in das Verzeichnis /boot/cmdline.txt
    dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1
    Stimmt das ?

    Dann in das /etc/inittab Verzeichnis und auskommentieren
    # T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
    Stimmt das ?

    nun zur programmierung

    hab die dazu nötige bibliothek aus dem internet gezogen und installiert

    Code
    import serial as s
    
    
    weiter weiss ich nicht die PySerial API doku hilft mir auch nicht

    was ich versuche zu machen ist folgendes
    der Atmega8 kriegt ein ein EIN signal von mir und fängt an zahlen zu senden
    beliebig viele, alle sind 32 bit groß, nach dem alle zahlen gesendet wurden soll alles zugemacht werden .

    das mit dem Atmega läuft der Kollege der die aufgabe hatte macht das schon, nur muss ich jetzt meinen teil zum laufen bringen.
    bin am verzweifeln Bitte HILFE !

    hat jemand vlt einen code schnippsel wieich sowas hinbekommen

  • Hallo scream4040,

    ich denke mal das ich hier das Problem 5V <-> 3.3V bei den IO-Pins zu einem anderen Board nicht mehr zu erwähnen brauche. Auch das UART-Schnittstellen, falls diese an einem normalen Computer (PC) sich befinden, auch noch einen Pegelwandler benötigen.

    Denke auch daran, das die Leitungen RX/TX zum anderen Host gekreuzt sein sollten. Also RX (Raspi) zu TX (client) und umgekehrt. Egal ob das Gegenstück (der Client) nun ein Computer oder ein anderes Board sein sollte.

    Dies sei aber nur als Hinweis so am Rande erwähnt... :)

    Hinweis am Rande:
    Die hier vorkommenden Fremdwörter sowie Schreibfehler besitzen ein Echtheitszertifikat
    und sind zum Auslösen allg. Verwirrung und Panik vorgesehen! :lol:

    Einmal editiert, zuletzt von Cancriformis (27. Juli 2014 um 22:54)


  • ..guck mal...

    und hier:
    Atmel Atmega 8 an Raspberry Pi


    ich denke mal das ich hier das Problem 5V <-> 3.3V bei den IO-Pins zu einem anderen Board nicht mehr zu erwähnen brauche. Auch das UART-Schnittstellen, falls diese an einem normalen Computer (PC) sich befinden, auch noch einen Pegelwandler benötigen.

    Denke auch daran, das die Leitungen RX/TX zum anderen Host gekreuzt sein sollten. Also RX (Raspi) zu TX (client) und umgekehrt. Egal ob das Gegenstück (der Client) nun ein Computer oder ein anderes Board sein sollte.


    DANKE :thumbs1: und zu echten RS232 Schnittstellen braucht man z.B. sowas

    http://www.ebay.de/itm/0-20Max323…111954731&rt=nc

    max3232 ist wichtig, weil der auf der PI Seite mit 3,3V arbeiten kann !

    andere mit max oder ST 232 können nur mit 5V arbeiten !

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Nabend,

    also den uart freimachen solltest du auf jedenfall! ... denn sonst sendest du den kompletten bootvorgang mit... das kann zu Probelemen führen.

    jetzt kommts drauf an was du machen willst.. wenn du seriell senden willst und das mit manueller eingabe für dich reicht dann kannst du einfach minicom benutzen...

    wesentliche Sachen die du dort einstellen muss sind Startbit, Anzahl Datenbits, Anzahl der Stoppbits, Paritätsbit. Je nachdem wie deine Schnittstelle konfiguriert ist bzw. auf was dein empfänger wartet..

    Ansonsten kannst du mit python ein relativ einfaches Programm schreiben um etwas über den uart zu senden.

    ungefähr so (syntax beachten kann alles etwas verschoben sein hier):

    Das Programm musst du halt eventuell noch etwas erweitern.

    Die Spannungen musst du auf jedenfall beachten von deinen Eingängen. Der Pi darf nicht über 3.3V bekommen. Das geht gut mit Levelshiftern (74HCXX)>>Hab ich jetzt nicht im Kopf.

    MfG:D

    das muss /dev/ttyAMA0 sein

    Rede wenig, rede wahr, trinke mäßig, zahle bar.:angel:

    Einmal editiert, zuletzt von Kornfeld (27. Juli 2014 um 23:47)

  • Also was ich machen will ist folgendes:
    ich sende an den Atmega8 ein startsignal z.B ein Bit als start
    dann soll mein Pi nur noch lesen es werden floatzaheln gesendet

  • ein Bit wird sich da schlecht machen ein Byte wäre da schon eher die wahl.. bzw. einen Startbefehl wie "Start" oder sonstiges.. was du willst eigentlich. Du musst allerdings wissen auf was dein empfänger wartet um dir etwas zurückzusenden. Das müsst ihr in eurem Programm definiert haben.. oder wenn du meinst ein bit ist dann gemeint das du einfach eine "LED" ansteuerst.. aber das wäre im sinne der kommunikation quatsch.

    Rede wenig, rede wahr, trinke mäßig, zahle bar.:angel:

  • das mit dem Atmega läuft der Kollege der die aufgabe hatte macht das schon, nur muss ich jetzt meinen teil zum laufen bringen.

    der Kollege muss dir sagen was er von dir braucht um dir seine Zahl zu schicken.. dann muss er die schnittstele konfiguriert haben..

    Aber wie siehts aus mehr weisst du bis jetzt noch nicht oder?

    wenn du hier teile des codes posten könntest wäre es auch hilfreich

    Rede wenig, rede wahr, trinke mäßig, zahle bar.:angel:

    Einmal editiert, zuletzt von Kornfeld (28. Juli 2014 um 18:27)

  • Also,

    wir haben es endlich hinbekommen die schnittstelle musste erst über eine kleine schaltung von 5V auf 3,3V gezogen werden und umgekehrt. jetzt klappt die verbindung ich werde hier, wenn ich fertig bin eine ausführliche anleitung einlegen damit ihr euch das mal anschauen könnt.

    jetzt habe ich eine frage an die die Python programmierer:

    wenn ich werte erhalte erhalte ich folgendes:

    b'12'
    b'45.5'

    das ist zwar gut ich will aber mit diesen Zahlen arbeiten können wie geht das jemand eine Idee ?


  • wir haben es endlich hinbekommen

    :thumbs1:

    die schnittstelle musste erst über eine kleine schaltung von 5V auf 3,3V gezogen werden und umgekehrt.

    hatte ich hier in Beitrag #4 aber schon gesagt ;)

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (2. August 2014 um 15:01)

  • Ja ich weiss, so wie immer ist mal wieder ne schelcte nachricht drann
    wenn wir Zahlen übermitteln im float dann bekommen wir folgendes ergebnis:

    Vorher :b'4,5' ganz normale Zahlen
    Nachher:b'\x00.7\xc1N'

    woran liegt das

  • ich verstehe im moment nicht wieso ihr das als float zahlen sendet (ich glaub da vermachst du dich denn die serielle schnittstelle sendet ja im ascii)... bzw. mein ich bekommst du die werte über die schnitte als string.. d.h. es sind in dem moment einfach nur buchstaben... du musst dir den string dann zerhacken in die bereiche wo die zahlen stehen... und dann wandelst du dir diese um, um sie weiter zu verarbeiten in float oder int..

    Rede wenig, rede wahr, trinke mäßig, zahle bar.:angel:

  • zum code:


    ich sende ein "s" und erhalte dann eine Zahl (float) über den Atmel der benutzt dtostrf(21.78465,6,3,ergebnis) und schickt mir die sachen dann
    UART_Transmit(ergebnis[0])
    UART_Transmit(ergebnis[1])
    UART_Transmit(ergebnis[2])
    UART_Transmit(ergebnis[3])
    UART_Transmit(ergebnis[4])
    UART_Transmit(ergebnis[5])

    folgendes kommt dabei heraus
    b'\x00227N '
    und dann das b'tttttt'

    leider aber keine 21.786 die frage ist nun wo ist der fehler jemand ne idee ?

  • also... mag sein das es so auch geht... aber wenn ich einfach ein "s" senden wollte würde ich auch einfach

    Code
    UART.write("s")

    schicken...

    Code
    res=0
    
    
    while res != b...

    du alter pfuscher ^^ .. oder keine ahnung so richtig auf was du hinaus willst.. bzw. weiß ich nicht wie deine Antwort aussieht auf die du wartest.. aber wenn ich das mit dem decode gerade richtig gelesen habe liest der den ascii (hex) und kodiert oder dekodiert dir das...

    kontrolliert ihr das am logikanalysator was ihr euch da sendet??

    wenn ich das richtig interpretiere sendest du ein x53 (was dein s ist) das ist aber eigentlich quark würde ich sagen... da nutze lieber das es bei python so leicht gemacht ist und mache es so wie oben gezeigt.

    und erkläre mir mal bitte warum dass ende deiner floatzahl oder was auch immer tttttt ist...

    vielleicht kapier ich das ja auch bloß nicht... aber ich finds komisch...

    sag erstmal genau auf welche antwort du wartest und sage bitte nicht das du auf float wartest.. du sendest seriell!!! (lies da mal was drüber!)

    Rede wenig, rede wahr, trinke mäßig, zahle bar.:angel:

  • Hi,
    das finde ich schon sehr mystisch, was Du da so alles schreibst ...
    zum ersten: wie sehen die Schnittstellenparameter auf der RPi Seite und wie sehen sie auf der ATMEL-Seite aus? Alle bitte ...
    Hast Du mal z.B. mit minicom überprüft, ob das was Du erwartest auch ankommt, bevor Du - einen evtl. fehlerhalften Datenstrom - in Dein Programm fehlerhaft auswertest?
    Bist Du sicher dass in ergebnis[] auch das gewünschte Ergebnis drinsteht?

    cheers,
    -ds-

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!