PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Auch Probleme mit UART - kriegs nicht hin...



Dani-Bruchflieger
05.08.2005, 22:04
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.

PicNick
06.08.2005, 07:47
Hardware: Was hast du wie womit zusammengeschlossen
Software: Quartz-einstellung, Baudrate ?
Senderoutine, Empfangsroutine ?
Geht das Senden nicht ?
Geht das Empfangen nicht ?

chr-mt
06.08.2005, 10:20
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

Dani-Bruchflieger
06.08.2005, 10:49
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....

Dani-Bruchflieger
06.08.2005, 10:55
Hier die Programme vom Sender:


$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:


$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

Dani-Bruchflieger
06.08.2005, 17:40
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?

PicNick
06.08.2005, 17:49
Du mußt beim "print" ein Semikolon anfügen, sonst sendet er <CR><LF>
hinten nach
PRINT variable ;

Dani-Bruchflieger
06.08.2005, 19:30
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 (Mega8), 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?