- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 8 von 8

Thema: Auch Probleme mit UART - kriegs nicht hin...

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.07.2005
    Ort
    18km südl. Lutherstadt Wittenberg
    Alter
    48
    Beiträge
    142

    Auch Probleme mit UART - kriegs nicht hin...

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hi,

    ich dreh langsam am Rad! Ich möchte gern meinen Modellflieger per Drucksensor MPXA4100A die aktuelle Flughöhe erfassen lassen, diesen ADC Wert (Word) zusammen mit der Integer, die die Differenz zwischen 2 Messungen beinhaltet, per UART mit den Bluetooth Modulen "Thor" an einen zweiten Mega8 senden. dieser soll die Variablen so umrechnen, daß aufm Display die aktuelle Flughöhe in 10m angezeigt wird. und mit hilfe der Differenz-Integer ein Ton per PWM generiert wird der, je nachdem ob Steigen oder Sinken bzw auch die Steig-/Sinkrate erkennen läßt ohne aufs Display gucken zu müssen.
    Ich probiere jetzt schon 2 Wochen lang, die 2 Prozessoren erstmal per Kabel von µc1-tx nach µc2-rx mit einander zur verständigung zu überreden - leider ohne Erfolg. könnte mir da mal jemand von Euch helfen, wie ichs gebacken bekomme, daß der Sender die Daten sauber rausbringt und der Empfänger sie wieder den korrekten Variablen zuordnet. - Den Rest mit dem ADC und umrechnen etc hab ich soweit am laufen, nur eben die Komunikation der beiden Prozzies kriege ich nicht hin.

    Danke und Grüße Dani.
    MfG Dani.

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Hardware: Was hast du wie womit zusammengeschlossen
    Software: Quartz-einstellung, Baudrate ?
    Senderoutine, Empfangsroutine ?
    Geht das Senden nicht ?
    Geht das Empfangen nicht ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    11.04.2005
    Beiträge
    1.469
    Hi,
    wandele die Werte doch mal in einen String um und guck' sie dir am Empfänger mit einem Terminalprogramm an.
    Dann weißt du schon mal, ob deine Senderoutine funktioniert.

    Gruß
    Christopher

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.07.2005
    Ort
    18km südl. Lutherstadt Wittenberg
    Alter
    48
    Beiträge
    142
    Hi,

    also ich möchte 2 Mega8 miteinander zur Erfolgreichen Komunikation überreden. Habe sie dazu per Drahtbrücken TXT mit RXD gekreuzt verbunden. Am Sender habe ich zur Kontrolle am PC-Terminal noch eine Verbindung zu einem MAX232 aber nur vom TXT. Die Prozzies laufen mit den int. 8MHz und Baud 9600 - ja ich weiß, da gibt es geringe Fehlerprozente - aber wenn beide mit der gleichen "falschen" Taktrate laufen, hebt sich das doch wieder auf?

    Senderoutine beschränkt sich darauf, mit Print 1 ein Startbyte zu senden, und dann die 4 Datenbytes, die ich per Overlay-Byte-variablen jeweils einzeln Printe und zwischendurch auch noch je 50msek warten lasse.
    Der Empfänger bekommt bei jedem Übertragenen Byte einen URXC-Interrupt, wonach die UDR in eine Prüfvariable übertragen wird. Dann wird nachgesehen, ob die Variable das Startbyte 1 ist und der Empfangszähler >5 in diesem Fall wird der Zähler auf 1 gesetzt. Danach wird die Prüfvariable in eine Buffervariable mit dem Array des Zählers übertragen, diese Buffer sind per Overlay wieder den Variablen der Datenbytes zugeordnet. Und zum Schluß wird der Empfangszähler noch erhöht, bevor die Interruptroutine wieder verlassen wird. Darum auch das 50msek Warten zw. den Printbefehlen am Sender.
    Momentan ist das Hauptproblem, daß der Sender nur Datensalat rausbringt. Das Terminal zeigt immer nur so ein O mit nem "Haar" oben dran an (weiß nicht wie das richtig heißt), obwohl ich mit $Crystal=8000000 und $Baud=9600 das doch korrekt eingestellt habe - Fusebits stehen auch auf int. 8MHz. Ich würde ja auch gern ein Quartz mit 7,372800MHz nehmen, aber ich finde mit AVR-Prog dazu die Einstellungen nicht. Dort gibts nur ext Clock, int RCosc., ext RCosc., ext LFXTAL und ext XTAL. Die Einstellung für ext Crystal finde ich dort nicht. Jetzt habe ich mir ein paar Oscillatoren schon bestellt mit den 7,3...MHz aber eigentlich sollte das ganze so klein und leicht wie möglich werden - jedenfalls der Sender....
    MfG Dani.

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.07.2005
    Ort
    18km südl. Lutherstadt Wittenberg
    Alter
    48
    Beiträge
    142
    Hier die Programme vom Sender:
    Code:
    $regfile = "m8def.dat"
    $crystal = 8000000
    Baud = 9600
    
    Dim I As Byte
    Dim T0ov As Byte
    Dim Akth As Word At &H70
    Dim Diffh As Integer At &H72
    Dim Akthlow As Byte At &H70 Overlay
    Dim Akthhigh As Byte At &H71 Overlay
    Dim Diffhlow As Byte At &H72 Overlay
    Dim Diffhhigh As Byte At &H73 Overlay
    Dim Lasth As Word
    Dim Temph As Word
    'Dim Zeroh As Word
    'Zeroh = 0
    
    Enable Interrupts
    'Enable Int1                                                 'Interrupt durch Taster zur Abfrage
    'On Int1 _interr1                                                     'der Nullpunkthöhe über Normalnull
    
    Ddrb.0 = 1
    Ddrb.1 = 1
    Portb.1 = 1
    
    Config Adc = Single , Prescaler = Auto , Reference = Avcc   'Konfig. des AD-Wandlers
    Start Adc
    'On Adc _adc Nosave
    
    Config Timer0 = Timer , Prescale = 1024                     'Timer0 für Durchlaufzeit der Hauptschleife
    Enable Timer0
    On Timer0 _t0
    Start Timer0
    
    
    ' *** Hauptschleife ***
    Do
    Toggle Portb.0
    Toggle Portb.1
      T0ov = 0                                                  'Überlaufzähler Timer0 rücksetzen
      Lasth = Akth                                              'Den Wert der letzten Messung sichern
      Akth = 0                                                  'Variable löschen
      For I = 1 To 16                                           '16 Meßwerte aufnehmen für Mittelwertbildung
        Temph = Getadc(0)                                       'Drucksensor am ADC0
        Akth = Akth + Temph
      Next
      Shift Akth , Right , 4                                    'Ergebnis /16 teilen
      'Akth = Akth - Zeroh                                       'Nullhöhe abziehen
      Diffh = Akth - Lasth                                      'Differenz zw. letzter und aktueller Messung
      Print 1                                                   '&B00000001
      Waitms 50
      Print Akthlow
      Waitms 50
      Print Akthhigh
      Waitms 50
      Print Diffhlow
      Waitms 50
      Print Diffhhigh
    
    
      Do                                                        'warten bis Timer0 10 mal übergelaufen ist,
      Loop Until T0ov = 10                                      'dann beginnt nächster Messzyklus
    
    Loop
    
    End
    
    ' *** Interruptroutinen ***
    
    '_adc:
    ' Return
    
    _t0:
     Incr T0ov
     Timer0 = 15
     Return
    
    '_interr1:
    'Zeroh = Getadc(0)                                           'Nullpunkt setzen
    'Return
    und Empfänger:
    Code:
    $regfile = "m8def.dat"                                      'Mega8
    $crystal = 8000000
    $baud = 9600
    
    Declare Sub Lcdinit
    Declare Sub Lcdwrite(byval Zeichen As Byte)
    
    Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.2 , Rs = Portd.3
    Config Lcd = 20 * 4a
    Waitms 100
    'Initlcd
    Call Lcdinit
    Cls
    
    Ddrb.0 = 1
    
    Dim Akth As Word At &H71
    Dim Diffh As Integer At &H73
    Dim Buffer(6) As Byte At &H70 Overlay
    Dim I As Byte
    Dim P As Byte
    Dim A As Word
    Dim D As Integer
    
    On Urxc _onrxc
    Enable Urxc
    Enable Interrupts
    I = 0
    
    Do
    If I > 5 Then
      A = Akth
      D = Diffh
      End If
    Locate 1 , 1
    Lcd A ; "    "
    Locate 2 , 1
    Lcd D ; "    "
    Locate 3 , 1
    Lcd P ; "     "
    Locate 4 , 1
    Lcd I
    Loop
    
    
    
    
    
      _onrxc:
      P = Udr
      If P = 1 And I = 6 Then
        I = 1
        End If
      If I < 6 Then
        Buffer(i) = P
        Incr I
        End If
      Toggle Portb.0
      Return
    
    
      Sub Lcdinit
         Call Lcdwrite(&B00101100)
         Call Lcdwrite(&B00001001)
         Call Lcdwrite(&B00101000)
         Call Lcdwrite(&B00000110)
         Call Lcdwrite(&B00001100)
       End Sub
    
    
       Sub Lcdwrite(byval Zeichen As Byte)
    
         ' Höherwertiges Nibble setzen
         If Zeichen.4 = 1 Then Portd.4 = 1 Else Portd.4 = 0
         If Zeichen.5 = 1 Then Portd.5 = 1 Else Portd.5 = 0
         If Zeichen.6 = 1 Then Portd.6 = 1 Else Portd.6 = 0
         If Zeichen.7 = 1 Then Portd.7 = 1 Else Portd.7 = 0
         ' Höherwertiges Nibble übertragen
         Portd.2 = 1
         Waitms 1
         Portd.2 = 0
         Waitms 1
    
         ' Niederwertiges Nibble setzen
         If Zeichen.0 = 1 Then Portd.4 = 1 Else Portd.4 = 0
         If Zeichen.1 = 1 Then Portd.5 = 1 Else Portd.5 = 0
         If Zeichen.2 = 1 Then Portd.6 = 1 Else Portd.6 = 0
         If Zeichen.3 = 1 Then Portd.7 = 1 Else Portd.7 = 0
         ' Niederwertiges Nibble übertragen
         Portd.2 = 1
         Waitms 1
         Portd.2 = 0
         Waitms 1
    
       End Sub
    MfG Dani.

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.07.2005
    Ort
    18km südl. Lutherstadt Wittenberg
    Alter
    48
    Beiträge
    142
    Hi,

    kann das sein, daß ich mit dem Befehl Print 1 nicht nur die 1 übertrage, sondern noch 2 weitere Bytes? - dann kann es ja nicht funzen!

    PS: mit dem ext Oscillator an den µCs werden die Daten jetzt schonmal sauber gesendet und Empfangen - jetzt muß ich nur wieder die Zuordnung der Daten zu den korrekten Variablen hinbekommen. Aber gibt es denn da keine Befehle, die nur das Datenbyte übertragen und mehr nicht?
    MfG Dani.

  7. #7
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Du mußt beim "print" ein Semikolon anfügen, sonst sendet er <CR><LF>
    hinten nach
    PRINT variable ;
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.07.2005
    Ort
    18km südl. Lutherstadt Wittenberg
    Alter
    48
    Beiträge
    142
    Hi,

    ahh - Danke! Mittlerweile hab ich es jetzt aber schon mit Printbin variable hinbekommen - als Startbyte nehme ich jetzt &H71 = 113 so eine krumme Zahl kommt beim ADC nach dem Reset nicht vor - jedenfalls wäre das sehr unwahrscheinlich. Auf jeden Fall hab ichs nun endlich irgentwie geschafft, daß der Empfänger am Display das ausgibt, was ich in dieser Etappe der Programmerstellung dort sehen wollte.
    Nächste Etappe ist das Erzeugen eines PWM-Tonsignales, das je nach Wert der Veränderung der Flughöhe (die Integervariable) auch in der Tönhöhe variiert. Da ich aber noch Anfänger bin, werde ich dabei wohl auch noch einiges an Hilfe gebrauchen können. - Wen mir mal jemand in Deutsch erklären könnte, wie ich einen PWM einstelle (Mega, dann wäre ich ihm ewig dankbar...

    Ach so, hatte ich fast vergessen: Wie kann man am Mega8 mit AVR-Prog die Fuses so einstellen, daß ich ein ext Quartz anschließen kann und nicht nur einen Oszillator?
    MfG Dani.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen