PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [gelöst].Problem mit Portc schalten mit UART



MelMan
07.12.2008, 13:41
Hi @all


Bin total verzweifelt...seit 5 Stunden bekomm ich es nicht zu laufen. Folgendes: Ich möchte Portc.0 und Portc.1 eines ATMEGA8 per UART schalten. Wenn ich "016" sende, geht Portc.1 für 2 Sek an, wenn ich "000" sende, geht Portc.0 für 2 Sek an. So sollte es jedenfalls sein aber Portc.0 geht nicht an. Nun sende ich den Befehl einmal von einem ATMEGA644 (da funktioniert es nicht). Sende ich den Befehl aber per Terminal funktioniert es einwandfrei, ob wohl der Befeh identisch ist. Weis echt nicht mehr weiter. Hier mal mein Code:


$regfile = "m8def.dat"
$framesize = 48
$swstack = 16
$hwstack = 64
$crystal = 8000000
$baud = 9600


Dim Empfangen As String * 4
Dim X As Bit , Y As Bit , Z As Bit , Wecker As Bit
Dim Ansteuerung As Byte , Wecksound As Byte
Dim Ansteuerung2 As Integer

X = 0
Y = 0
Z = 0

Config Portb = Output
Config Portc = Output
Config Portd.4 = Output
Summer Alias Portd.4

On Urxc Onrxd
Enable Urxc
Enable Interrupts





Do
If Wecker = 1 Then : Gosub Wecker : End If
If Len(empfangen) > 2 Then
Ansteuerung2 = Val(empfangen)
Select Case Ansteuerung2
Case 300
Ansteuerung2 = 144
Empfangen = "144"
Wecker = 1
Gosub Lichterkette
Gosub Leuchtkugel
Case 301
Wecker = 0
Empfangen = ""
Case Is < 256
Ansteuerung = Val(empfangen)
Portb = Ansteuerung
Print Portb.0
Print Portb.1
Print Portb.2
Print Portb.3
Print Portb.4
Print Portb.5
Print Portb.6
Print Portb.7
Gosub Lichterkette
Gosub Stehlampe
Gosub Leuchtkugel
Empfangen = ""
End Select
End If
Loop
End

Lichterkette:
If Portb.4 = 1 Then : If X = 0 Then : Portc = &B00000000 : Portc.1 = 1 : X = 1 : Waitms 500: Portc = &B00000000 : Else : Nop : End If : Else : If X = 1 Then : Portc = &B00000000 : Portc.0 = 1 : X = 0 : Waitms 500 : Portc = &B00000000: Else : Nop : End If : End If
Return

Stehlampe:
If Portb.6 = 1 Then : If Y = 0 Then : Portc = &B00000000 : Portc.3 = 1 : Y = 1 : Waitms 500 : Portc = &B00000000: Else : Nop : End If : Else : If Y = 1 Then : Portc = &B00000000 : Portc.2 = 1 : Y = 0 : Waitms 500: Portc = &B00000000 : Else : Nop : End If : End If
Return

Leuchtkugel:
If Portb.7 = 1 Then : If Z = 0 Then : Portc = &B00000000 : Portc.5 = 1 : Z = 1 : Waitms 500 : Portc = &B00000000: Else : Nop : End If : Else : If Z = 1 Then : Portc = &B00000000 : Portc.4 = 1 : Z = 0 : Waitms 500 : Portc = &B00000000: Else : Nop : End If : End If
Return

Wecker:
Do
Wecksound = Wecksound + 1
Select Case Wecksound
Case 1 To 150
Summer = 1
Waitms 1
Summer = 0
Waitms 1
Case 151 To 255
Summer = 1
Waitms 2
Summer = 0
Waitms 2
If Wecksound >= 243 Then : Wecksound = 0 : Return : End If
End Select
Loop
End

Onrxd:
Empfangen = Empfangen + Chr(udr)
Return
Code-Tags verwenden ! (PicNick)



Mfg

for_ro
07.12.2008, 14:42
Config Portb = Output
Config Portc = Output
Config Portd.4 = Output

Lichterkette:
If Portb.4 = 1 Then

Hallo,
du hast Portb komplett als Output konfiguriert, und dann fragst du auf Portb.4 = 1 ab. Ist das gewollt?


If Portb.4 = 1 Then : If X = 0 Then : Portc = &B00000000 : Portc.1 = 1 : X = 1 : Waitms 500: Portc = &B00000000 : Else : Nop : End If : Else : If X = 1 Then : Portc = &B00000000 : Portc.0 = 1 : X = 0 : Waitms 500 : Portc = &B00000000: Else : Nop : End If : End If
Was soll denn das sein? Das kann man unmöglich lesen. Willst du damit Zeilen sparen? Das ist fast wie C, da muss man auch immer raten, was damit gemeint sein könnte. Setze die Befehle mal in einzelne Zeilen, dann kann man dir helfen.
Wenn du dein Programm mit Code Befehl einfügst, dann bleibt auch das Einrücken erhalten. Dein Programm liest sich dann viel einfacher.



Wenn ich "016" sende, geht Portc.1 für 2 Sek an, wenn ich "000" sende, geht Portc.0 für 2 Sek an. So sollte es jedenfalls sein aber Portc.0 geht nicht an.
Wo steht diese Unterscheidung denn in deinem Code? Ich sehe nur das Select Case Ansteuerung2 mit Cases 300, 301 und <256.

Gruß

Rolf

PicNick
07.12.2008, 15:58
Wenn der 644 was anderes sendet als das Terminal, wirst du wohl den sende-code vom 644 herzeigen müssen

MelMan
08.12.2008, 19:36
So sry war arbeiten. Also ich weis auch nicht warum aber jetzt auf einmal funktioniert wieder alles. Hab nur eine Stringlänge von 4 auf 3 runtergesetzt. Kann das was damit zu tun haben? Oder dass ich einen Text/Zahl sende, welcher as Integer definiert ist, die empfangenen Daten aber als String definiere?

EDIT: Habe das Gefühl es hängt damit zusammen.
Der Terminal ist ein selbst geschriebener mit VB. Der sendet einfach nur den Inalt von einer Textbox (Text1.Text). Der ATMEGA644 sendet wie folgt:

Dim Geraete As Byte
Dim Geraete1 As String * 3

Do
.
.
.
.
.
Gosub Senden
Print "300" 'Wecker ein
Print "301" 'Wecker aus
Loop
End

Senden:
Geraete1 = Str(geraete)
Print Format(geraete1 , 000)
Return


Also einmal definierte Variablen und einmal einfach nur "300" bzw. "301"

PicNick
08.12.2008, 20:11
Is möglicherweise das Problem, dass Bascom bei "print" ja noch ein CRLF anhängt, du kriegst also in Wirklichkeit 5 zeichen.

Schreibe


Print Format(geraete1, 000) ;

mit einem semikolon am Ende , dadurch wird CRLF unterdrückt

MelMan
09.12.2008, 17:02
So habs jetzt abgeändert jetzt funktioniert alles bestens=). Danke euch beiden