- 12V Akku mit 280 Ah bauen         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Frage zu Input-Interrupt

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385

    Frage zu Input-Interrupt

    Anzeige

    Powerstation Test
    Hi, ich hab mir die Einführungen von www.rowalt.de durchgelesen und den Code für den Datenempfang mit UART über Interrupt ausprobiert.
    Ich hab nicht alles übernommen, hier mal der Code:
    Code:
    Dim I As Byte
    Ddrd = &B00100000
    On Urxc Onrxd
    Enable Urxc
    Enable Interrupts
    
    Main:
    'nix
    Goto Main
    
    Onrxd:
       I = Udr
       Printbin I
    Return
    Jetzt kommt aber wenn ich im Bascom-Terminal was sende irgendein random Buchstabe an:
    eingegeben -> bekommen
    a -> q
    b -> r
    c -> s

    aber:
    q -> q
    r -> r
    s -> s

    Baud ist in sowohl im Controller als auch am PC 9600.
    Muss ich des kapieren?

    mfg
    jagdfalke

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Du hast offenbar einen Finger für seltsame Erscheinungen.
    Du sagst, das $crystal und $baud stimmen ?
    Analog müßte sein
    j -> z
    A -> Q
    % -> 5

    Ist das so ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    Oh man, ich habs rausgefunden. $crystal hat nicht gestimmt. ich hatte ein .bas-file genommen, dass nicht die richtige Einstellung für Crystal hat und hab's da einfach reingeschrieben. Wenn $crystal 8000000 ist dann gehts.
    Aber mal zwei Fragen dazu:

    1.
    Warum ist crystal dafür eigenlich wichtig? Den Zusammenhang versteh ich nicht. Baud seh ich ja ein aber crystal ?

    2.
    Was bedeutet das Ddrd = &B00100000 genau? Hat das überhaupt was mit dem Interrupt zu tun? Ich frag das, weil es in dem Beispiel-Code steht aber mein Pogramm auch ohne auskommt.

    @Picnick:
    Ich seh grad du heißt Robert. Ist das deine Seite von der ich das hab?

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    crystal=
    erst dadurch weiß er, wie lange 1 sekunde dauert
    crystal = 8000000 --> wenn der Quarz 8 Millionen mal gebrummt hat, ist eine Sekunde rum
    Erst dadurch kann er mit BAUD = 9600 ausrechnen, wie breit er die Bit machen muß, damit 9600 Stück in eine Sekunde reinpassen.

    DDRD=

    jedes Bit in dem register stellt einen Pin am Port D dar. Is'n einser drin, nimmt er den Pin als Output, sonst als Input
    analog gibt's ein DDRA, DDRB, DDRC usw.

    Mit der UART hat das nix zu tun. wahrscheinlich hat das Beispiel da ein LED drauf gehängt ??


    Robert=
    Ich bestreite die Vaterschaft. Das muss'n Namensvetter sein
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    Alles klar. Hätte ja sein können.

    Ok, danke du hast mir sehr geholfen das ganze besser zu verstehen. Seltsam, dass meistens du mir antwortest. Ich komm mir vor als ob ich dir ziemlich auf die Nerven geh. Vorallem war dieser Thread ja nicht wirklich ein Problem, sry meine Schuld

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Zitat Zitat von jagdfalke
    ... als ob ich dir ziemlich auf die Nerven geh.
    Vergiß' sowas. Wenn ich Streß habe, geb' ich eh keine Antwort.

    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    Hi, ich hab jetzt was geschrieben:
    Code:
    Dim Incoming_ascii As Byte
    Dim Incoming_char As String * 1
    Dim Serial_in As String * 255
    Dim Temp_Byte As Byte
    Dim Data_str As String * 255
    Dim Header_str As String * 2
    Dim Data_len As String * 1
    
    Incoming_ascii = 0
    Incoming_char = ""
    Serial_in  = ""
    Temp_Byte = 0
    Data_str = ""
    Header_str = ""
    Data_len = ""
    
    On Urxc Onrxd
    Enable Urxc
    Enable Interrupts
    
    Main:
    
    Goto Main
    
    Onrxd:
    
       Incoming_ascii = Udr
       Incoming_char = Chr(incoming_ascii)
    
       If Incoming_char = ">" Then
          Serial_in = Serial_in + Incoming_char
          If Len(serial_in) > 2 Then
                Temp_byte = Len(serial_in) - 2
                Data_str = Left(serial_in , Temp_byte)
                Header_str = Right(serial_in , 2)
    
                Data_len = Left(header_str , 1)
    
                If Len(serial_in) = Data_len Then
                   Print Len(serial_in)
                   Print Data_len
                   Print Data_str
                   Print Header_str
                End if
                Serial_in = ""
          Else
             Print "String < 2"
             Serial_in = ""
          End If
       Else
          Serial_in = Serial_in + Incoming_char
       End If
    Return
    Die Bedingung Len(serial_in) = Data_len ist dummerweise nie erfüllt, schätz mal weil die Typen nicht übereinstimmen. Wie wandle ich die denn um? Einfach Integer = String scheint nicht zu funktionieren.
    Kann sich jemand den Code mal im groben und ganzen anschaun und mir sagen ob ich irgendwas wichtiges vergessen habe? Oder man was besser machen kann? Wäre echt super !!!

    mfg
    jagdfalke

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Hallo, Junge !

    Ich debugge mich normalerweise mit dem Print von einem zum nächsten durch:
    hinter "incoming_char = chr....."
    mach gleich einen Print incoming_char;

    Wenn alles funzt, ist das mehr oder weniger ein echo.

    dann schmeiss den Print und mach hinter "serial_in = serial_in + ..."
    einen "print serial_in"
    ein zwischenschritt:
    temp_byte = len(serial_in)
    print str(serial_in)

    Und so geht's weiter. dann kannst du immer schauen, wie's läuft und nicht das rauskommt, was sollte.

    EDIT: Ich mißtraue dem Len(xx) innerhalb einer "IF" abfrage
    probier temp_byte = len (..
    und dann if temp_byte > 2 ......
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    Ja das mach ich auch immer so. Und es passte eigentlich immer alles. Ich wollte eigenlich nur wissen ob mein Program vom Prinzip her passt und wie ich des String in ein Integer umwandeln kann.

  10. #10
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Für string--> Integer ist val zuständig

    x = val ( string )
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

12V Akku bauen