-         

Ergebnis 1 bis 6 von 6

Thema: [gelöst].Problem mit Portc schalten mit UART

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

    [gelöst].Problem mit Portc schalten mit UART

    Anzeige

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

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Zitat Zitat von MelMan
    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?

    Zitat Zitat von MelMan
    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.


    Zitat Zitat von MelMan
    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

  3. #3
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Wenn der 644 was anderes sendet als das Terminal, wirst du wohl den sende-code vom 644 herzeigen müssen
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.04.2008
    Ort
    Esslingen
    Alter
    29
    Beiträge
    235
    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"
    Elektronische Bauteile funktionieren mit Rauch. Lässt man den Rauch raus, sind sie kaputt.

  5. #5
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Is möglicherweise das Problem, dass Bascom bei "print" ja noch ein CRLF anhängt, du kriegst also in Wirklichkeit 5 zeichen.

    Schreibe
    Code:
    Print Format(geraete1, 000) ;
    mit einem semikolon am Ende , dadurch wird CRLF unterdrückt
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.04.2008
    Ort
    Esslingen
    Alter
    29
    Beiträge
    235
    So habs jetzt abgeändert jetzt funktioniert alles bestens=). Danke euch beiden
    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
  •