PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programmfehler in ATMEGA8 Programm



MelMan
12.01.2009, 07:39
Nabend zusammen,
folgendes Programm:



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


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

X = 0
Y = 0
Z = 0
Wecker = 0

Config Portb = Output

Config Portc = Output

Config Portd.4 = Output
Config Portd.3 = Output
Summer Alias Portd.4
Pc Alias Portd.3

On Urxc Onrxd
Enable Urxc
Enable Interrupts





Do
If Len(empfangen) > 2 Then
Ansteuerung2 = Val(empfangen)
Select Case Ansteuerung2
Case 400
Pc = 1
Empfangen = ""
Case 401
Pc = 0
Empfangen = ""
Case Is < 256
Gosub Ansteuern
End Select
End If
Loop
End

Ansteuern:
Ansteuerung = Ansteuerung2
Portb = Ansteuerung
Gosub Stehlampe
Gosub Leuchtkugel
Gosub Lichterkette
Empfangen = ""
Return

Lichterkette:
If Portb.4 = 1 Then : If X = 0 Then : Portc = &B00000000 : Portc.1 = 1 : X = 1 : Waitms 500 : Portc = &B00000000 : End If : End If
If Portb.4 = 0 Then : If X = 1 Then : Portc = &B00000000 : Portc.0 = 1 : X = 0 : Waitms 500 : Portc = &B00000000 : 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 : End If : End If
If Portb.6 = 0 Then : If Y = 1 Then : Portc = &B00000000 : Portc.2 = 1 : Y = 0 : Waitms 500 : Portc = &B00000000 : 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 : End If : End If
If Portb.7 = 0 Then : If Z = 1 Then : Portc = &B00000000 : Portc.4 = 1 : Z = 0 : Waitms 500 : Portc = &B00000000 : End If : End If
Return

Onrxd:
Empfangen = Empfangen + Chr(udr)
Return



Problem ist: Der Portb wird nicht richtig gesetzt. Nachdem die
"Ansteuern" Schleife ausgeführt wurde, messe ich jeden Port von b durch
aber keiner ist "1". Deshalb funktionieren auch die Schleifen
Lichterkette, Leuchtkugel und Stehlampe nicht. Ist da irgendwas falsch?
(Der µC läuft über (Mhz Interner Takt)

TomEdl
12.01.2009, 16:26
Fuse für JTAG richtig gesetzt?

Gruß
Thomas
;)

Michael
12.01.2009, 16:41
Hallo Melman,

du mußt meines Wissens in der Onrxd-Routine den UDR aktiv auslesen.

Onrxd:
Temp = UDR
Empfangen = Empfangen + Chr(Temp)
Return

Gruß, Michael

MelMan
12.01.2009, 18:19
Fuses sind richtig und dein code Michael geht leider auch nicht.

Michael
12.01.2009, 18:42
Hallo MelMan,

naja, das rumstochern nützt hier nix, du solltest systematisch vorgehen.
Da PortB nicht gesetzt wird,
-Variable Ansteuerung2 leer?
-wird "Ansteuern überhaupt angesprungen?
-ist "If Len() >2 überhaupt erfüllt?
-wird Onrxd angesprungen?

Ich würde mit Onrxd anfangen und dort eine LED oder PortB einschalten, dann siehst du, ob es überhaupt passiert. Mit den anderen Punkten dann genauso weiter.

Gruß, Michael

MelMan
15.01.2009, 15:56
So hab mal folgendes ausprobiert



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

Dim Empfangen As String * 3
Dim Ansteuerung As Byte

Do
If Len(empfangen) > 2 Then
Gosub Ansteuern
End If
Loop
End

Ansteuern:
Ansteuerung = Val(empfangen)
Print Ansteuerung
Empfangen = ""
Return

Onrxd:
Empfangen = Empfangen + Chr(udr)
Return





Ich schicke als über nen Terminal einen string den der AT8 empfängt. Wenn ich jetzt "000" sende, bekomme ich "0" ausgegeben. Sende ich jetz "016" bekomme ich "0", sende ich noch mal "016" bekomme ich "06" und sende ich dann noch mal "016" bekomme ich erst meine "016". Das ist bei anderen Strings genauso, aber nur wenn ich vom String "000" starte. Woran liegt das?