-         

Ergebnis 1 bis 6 von 6

Thema: Programmfehler in ATMEGA8 Programm

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.04.2008
    Ort
    Esslingen
    Alter
    29
    Beiträge
    235

    Programmfehler in ATMEGA8 Programm

    Anzeige

    Nabend zusammen,
    folgendes Programm:

    Code:
    $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)
    Elektronische Bauteile funktionieren mit Rauch. Lässt man den Rauch raus, sind sie kaputt.

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.11.2008
    Ort
    Kapfenberg
    Beiträge
    628
    Fuse für JTAG richtig gesetzt?

    Gruß
    Thomas

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    48
    Beiträge
    1.254
    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

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.04.2008
    Ort
    Esslingen
    Alter
    29
    Beiträge
    235
    Fuses sind richtig und dein code Michael geht leider auch nicht.
    Elektronische Bauteile funktionieren mit Rauch. Lässt man den Rauch raus, sind sie kaputt.

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    48
    Beiträge
    1.254
    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

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.04.2008
    Ort
    Esslingen
    Alter
    29
    Beiträge
    235
    So hab mal folgendes ausprobiert

    Code:
    $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?
    Elektronische Bauteile funktionieren mit Rauch. Lässt man den Rauch raus, sind sie kaputt.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •