Hardware: Was hast du wie womit zusammengeschlossen
Software: Quartz-einstellung, Baudrate ?
Senderoutine, Empfangsroutine ?
Geht das Senden nicht ?
Geht das Empfangen nicht ?
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.
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.
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
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.
Hier die Programme vom Sender:
und Empfänger: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
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.
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.
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.
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.
Lesezeichen