PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Serielle Verbindung 2er Atmeg8535 ????



xlostx
22.03.2006, 23:02
Hallo leute!

Habe 2 atmeg8535 mittels txd ind rxd pins verbunden und möchte das der zweite daten an den ersten übergibt um diese auf einem lcd display anzuzeigen.
Haut auch fast hin, nur irgendwie verändert sich die zahl nicht es steht immer zehn und es flakert.
Ich habe den 2ten von txd zum ersten mit rxd verkabelt, beide funktionieren und erfüllen ihre programme bis auf die übertragung.

Ich poste mal die 2 codes vielleicht hat mal wer bock, schnell zu schauen was da nicht funkt.

Kurze programm beschreibung:
Ein chip der 1te hängt am display und hat eine temperaturauswertung und noch andere adc aufgaben die noch programmiert werden, der 2te soll am eingang anliegende impulse an 24 relaise der reihenfolge rauf oder runter schalten ( dient zur steuerung der lautstärke einer endstufe), alles is mal grob ausprogrammiert zum simulieren.

Der wert X (ein array) is der wert der sich verändern kann (lautstärke , zahl von 1 bis 24 ), und dieser zustand soll angezeigt werden am display.

Code 1 vom chip der empfängt und am display hängt:


$regfile = "8535def.dat"
$crystal = 4000000
$baud = 9600

Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinb.3 = Output
Config Pinb.4 = Output
Config Pinb.5 = Output
Config Pinb.6 = Output
Config Pinb.7 = Output
Config Pind.0 = Input
Config Pind.1 = Output
Config Pind.2 = Output
Config Pind.3 = Output
Config Pind.4 = Output
Config Pind.7 = Output

Config Pina.1 = Input
Config Pina.2 = Input

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.2 , Rs = Portc.0
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Cursor Off

Start Adc

Dim Temp As Single
Dim A As Single
Dim Volt As Word
Dim B As Single
Dim C As Single
Dim D As Single
Dim Volta1 As Word
Dim Rxd_eingang As Byte

Cls
Upperline
Lcd "Hallo Welt"
Lowerline
Lcd " LO.GO "
Waitms 90
Cls
Do

Volt = Getadc(0)
A = Volt * 5
Temp = A / 10.24
Locate 1 , 1
Lcd "T:" ; Fusing(temp , "#.") ; Chr(223) ; "C" ;

Volta1 = Getadc(1)
C = Volta1 * 5
D = C / 1024
Lowerline
Lcd "Porta1:" ; Fusing(d , "#.##") ; "V"


If Ischarwaiting() = 1 Then Gosub Empfang
Locate 1 , 10
Lcd "Vol:" ; Rxd_eingang ; " " 'hier soll der X wert vom 2ten chip zur anzeige kommen , geht aber nicht ganz,der wert verändert sich nicht bei aktionen des 2ten chips????

Loop

Empfang:

Rxd_eingang = Inkey()

Return


Code 2 vom chip der zum ersten schickt:


$regfile = "8535def.dat"
$crystal = 4000000
$baud = 9600

Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinb.3 = Output
Config Pinb.4 = Output

Config Pind.1 = Output
Config Pind.2 = Output
Config Pind.3 = Output
Config Pind.4 = Output
Config Pind.5 = Output
Config Pind.6 = Output

Config Pina.1 = Input
Config Pina.2 = Input

Porta.1 = 1
Porta.2 = 1

Portb.0 = 1
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Portb.4 = 1

Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Portd.5 = 1
Portd.6 = 1

Led1 Alias Portb.0
Led2 Alias Portb.1
Led3 Alias Portb.2
Led4 Alias Portb.3
Led5 Alias Portb.4
Led6 Alias Portd.2
Led7 Alias Portd.3
Led8 Alias Portd.4
Led9 Alias Portd.5
Led10 Alias Portd.6

I1 Alias Pina.1
I2 Alias Pina.2

Dim X As Integer

X = 0 'Dieses X will ich auf den ersten chip übertargen und der soll dann am lcd display angezeigt werden, wechselt natürlich ständig

Do

If I1 = 0 Then
X = X + 1
Print X
End If
If I2 = 0 Then
X = X - 1
Print X
End If
If X = 1 Or X = 0 Then
Led1 = 0 : X = 1
Print 01
Else
Led1 = 1
End If
If X = 2 Then
Led2 = 0
Print 02
Else
Led2 = 1
End If
If X = 3 Then
Led3 = 0
Print 03
Else
Led3 = 1
End If
If X = 4 Then
Led4 = 0
Print 04
Else
Led4 = 1
End If
If X = 5 Then
Led5 = 0
Print 05
Else
Led5 = 1
End If
If X = 6 Then
Led6 = 0
Print 06
Else
Led6 = 1
End If
If X = 7 Then
Led7 = 0
Print 07
Else
Led7 = 1
End If
If X = 8 Then
Led8 = 0
Print 08
Else
Led8 = 1
End If
If X = 9 Then
Led9 = 0
Print 09
Else
Led9 = 1
End If
If X = 10 Or X = 11 Then
Led10 = 0 : X = 10
Print 10
Else
Led10 = 1
End If
Waitms 30
Loop

Danke schon mal ,ein jeder tipp oder ratschlag wird gerne angenommen....DANKE[/code]

xlostx
23.03.2006, 12:42
Na kommt nur ein kleiner tipp;) ; danke!

veit
23.03.2006, 13:33
print x ?

muss dass nicht printbin x heißen ?

teslanikola
23.03.2006, 14:51
Ich hab dir ein paar Tips:

1. Arbeite bitte mit dem DDRX-Registern, dass mit deinem Config Pinb.X = Out/Input frist in BASCOM dermasen speicherplatz!!!
Benutze zb für Pind.5-7 ausgang => DDRB = 0b11100000; Da brauste für 8Pins nur eine befehl.

2. Wenn du Ports setzen willst ( einzelne Pins am ANFANG! ) wie hier:
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Portd.5 = 1
Portd.6 = 1

benutze den Befehl PortX = ... hier macht das:
Portd = 0b01111100

3. Nettes Programm ;-)

xlostx
23.03.2006, 23:20
He danke mal die tipps sind gut, das mit den ports wird gleich gemacht....
Das mit dem printbin x , also was is da anders oder besser?

Aber warum krieg ich keine verbindung zusammen mit den 2 microcontrollern ??? Oder hab ich eh eine nur wie kann ich es testen ??

lg danke soweit!

teslanikola
24.03.2006, 20:10
Was ich jetzt mal als dein "Problem" ansehe, ist, dass dein Code schon recht mächtig ist und du eigentlich ja dein Primärziel ( 2 AVR mit UART verbinden ) so nur schwer erreichen wirst. schreibe die mal ein kleines Programm in die 2 AVRs und zwar das zb. der Mster immer alle sekunde ein Zeichen zum anderen schick und bei sich eine LED anschalten / asuschalten soll, der 2. AVR soll bei Signaleingan eine LED Leuchten lassen und wenn das Siganl die richtigen DAten enthält eine Andere, so kannst du schonmal ermitteln wo dein Problem liegt.