-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: Ischarwaiting <- Zeichen Empfangen ATMEGA2560 geht nicht

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.08.2006
    Ort
    Kitzscher
    Alter
    38
    Beiträge
    237

    Ischarwaiting <- Zeichen Empfangen ATMEGA2560 geht nicht

    Anzeige

    Hallo

    Ich versuche gerade krampfhaft mit dem ATMEGA2560 das Register auszulesen wo hinterlegt ist ob sich ein Zeichen im RS232 Puffer befindet.

    Der Befehl Ischarwaiting sollte das normalerweise im Bascom tun aber es gibt keine Reaktion auf den Befehl.


    Hier mein getesteter Code :

    Code:
    If Ischarwaiting() = 1 Then
    
    Bb = Waitkey(#4)
    
    Select Case Bb
    Case "Befehl1_mach_dies_mach_jenes"
    
    Case Else
    End Select
    End If

    Was kann ich tun damit mein Programm nicht immer bei Waitkey endet ?
    Ohne die Abfrage ob sich etwas im Buffer befindet durchläuft mein µC die do loop Schleife nicht mehr.


    Gruß
    Steffen

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    halt ein, Kollege, andere Baustelle:
    "Ischarwaiting" funzt zusammen mit "CONFIG serialin=buffered"

    Was du meinst, ist irgendein Flag im zuständigen Hardware-register (weiß jetzt nicht, is beim 2560 aber eh woanders)

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

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    17.02.2006
    Beiträge
    29
    Hallo Steffen 44,
    ich hatte das gleiche Problem.
    Hast du schon mal auf der Seite http://www.rowalt.de/mc/index.htm
    unter Einführung 4 nachgelesen ?
    Ich denke das hilft dir weiter.
    MfG

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.08.2006
    Ort
    Kitzscher
    Alter
    38
    Beiträge
    237
    Code:
    If USR.RXC = 1 Then  'Wenn Byte empfangen...
        i = UDR            'Byte aus UART auslesen
        Select Case i
        Case "H"
          Print "Hallo AVR"
        Case "h"
          Print "hallo avr"
        Case Else
          Print "Unbekannter Befehl"
        End Select
      End If
    funktioniert überhaupt nicht da der ATMEGA2560 andere Register oder Flags hat oder was auch immer.


    Ich habe jetzt schon mal die Portnummer mit angegeben aber es funzt trotzdem nicht.

    Code:
    Open "com4:" For Binary As #4                               'USB Port    
    
    If Ischarwaiting(#4) = 1 Then 
    Bb = Waitkey(#4) 
    
    Select Case Bb 
    Case "do-something" 
    Sound Portl.4 , 400 , 450 ' Beep when Ischarwaiting(#4) = 1 
    Case Else 
    End Select 
    End If
    Die Port Nummer die das USB verwendet ist 4 aber es kommt trotzdem wieder ein Fehler : "Label not found [_ISKEY4 ] in file ...."

    Ich verstehe es einfach nicht und es funzt nicht


    Gruß
    Steffen

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.08.2006
    Ort
    Kitzscher
    Alter
    38
    Beiträge
    237
    so wie es ausschaut ist es ein Bug und erst ab der Version 1.11.8.4 von Bascom behoben nur wo bekommt man das nun her. Im Download Berreich von Bascom findet sich nur die 1.11.8.3.


    Naja hoffentlich wird die Beta 1.11.8.5 am wochenende freigegeben da hab ich vieleicht mehr Glück.

    Gruß
    Steffen

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    17.02.2006
    Beiträge
    29
    Hallo Steffen44,
    ich habe noch einmal nachgesehen wie ich das mit einem Atmega 128 programmiert habe. Hier der Code:

    '--------------------------------------------------------------

    ' serial INPUT

    '--------------------------------------------------------------
    $regfile = "m128def.dat"
    $crystal = 8000000
    $baud = 19200



    Config Serialin1 = Buffered ', Size = 20
    Enable Interrupts
    Enable Urxc
    On Urxc Interrupt0


    Dim A As Byte

    Open "Com1:" For Binary As #1




    A = 0

    Anfang:

    Cls
    Lcd "A=" ; A
    Waitms 300
    Goto Anfang



    Interrupt0:

    Inputbin #1 , A

    Return


    End



    Im Simulator für den Atmega 128 lief es.
    Du mußt nur das Regfile auf deinen Atmega 256 ändern.
    Der Prozessor wartet nicht auf ein Zeichen sondern benutzt den Interrupt.
    In der Zwischenzeit läuft er durch das normale Programm. In meinem Fall durch die mit Anfang gekennzeichnete Schleife. Erst wenn ein Zeichen empfangen wurde Wird URXC auf 1 gesetzt. Dann wird der Interrupt ausgelöst und springt zum Punkt Interrupt und legt das Zeichen in der Variable A ab darach springt an die Stelle zurück wo er herkam bevor er in den Interrupt sprang.
    Dann läuft er durch die "Anfang"-Schleife und zeigt das Zeichen auf einem Display, das am Port A angeschlossen ist an.

    Mfg Jürgen

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.08.2006
    Ort
    Kitzscher
    Alter
    38
    Beiträge
    237
    Hallo Jürgen

    der ATMEGA2560 ist übelst bockig entweder Bascom ist noch voller Fehler oder ich bin zu dumm. Der Code von dir wird ohne Fehler kompiliert soweit alles ok aber ich erhalte keine Reaktion auf meinem LCD Display A=0 wird immer angezeigt.


    Die einzigste Kommunikation die ich hinbekomme habe ist eine Bit Auswertung aber eine Zeichenkette/String zu senden ist unmöglich.


    Code:
    'Diese Anweisung setzt die Fusebits automatisch korrekt (Syntax $PROG LB, FB , FBH , FBX )
    $prog , 255 , &B11011001 ,                                  'Quarz an / Teiler aus / Jtag aus
    
    $regfile = "m2560def.dat"
    
    
    $hwstack = 32
    $swstack = 16
    $framesize = 40
    $crystal = 16000000                                         'Quarzfrequenz
    
    
                                              'Ist 1 wenn USB angeschlossen
    
    'Definition USB
    Config Com4 = 38400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    
    
    'Definition für LCD Display 40x4
    Config Lcd = 20 * 4
    Config Lcdpin = Pin , Db4 = Portb.7 , Db5 = Porth.2 , Db6 = Porth.0 , Db7 = Porte.4 , E = Portb.5 , Rs = Porte.6
    Config Lcdbus = 4
    
    
    Open "com4:" For Binary As #4
    
    
    
    
    
    Dim A As Byte , S As String * 2
    
    Do
    
    
    
    A = Inkey(#4)
    If A = 1 Then                                               'we got something
    A = Waitkey(#4)                                             'get it
    End If
    
    If A = 49 Then  'wenn die 1 auf der tastatur gedrückt wird dann mach was
    Sound Portl.4 , 400 , 450
    Print #4 , "ASCII code " ; A ; " from serial"
    End If
    
    
    
    Print #4 , "Test"
    
    Waitms 100
    
      ' End If
    
    Loop

    Wenn ich nur wüßte wie man den Simulator bedient das das Teil gibt mir nur Rätsel auf.

    Gruß
    Steffen

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    17.02.2006
    Beiträge
    29
    Hallo Steffen,
    nur nicht den Mut verlieren, wir schaffen das schon.
    Als erstes würde ich mir den empfangenen Wert ( A ) auf dem Display anzeigen lassen. Dies machst du wie folgt:

    cls
    LCD "A= " ; A
    waitms 100

    füge es ein vor die Zeile
    IF A = 49 then

    Zeigt das Display irgend etwas an, wenn du ein Zeichen sendest ?

    Dann beschreib doch mal deinen Aufbau der Hardware !
    Wie dibst du das Zeichen, das der Prozessor empfangen soll ein?
    Hast du ein Evulationsboard?
    Hast du deinen PC über eine RS232 an den Prozessor angeschlossen ?

    Ich benötige mehr Informationen.

    MfG Jürgen

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.08.2006
    Ort
    Kitzscher
    Alter
    38
    Beiträge
    237
    Ok also ich habe hier ein selbstgebautes Experimentierboard das auf dem RN-Mega2560 basiert. Das Board hat 8 Digitalausgänge, 16 Analogeingänge und 12 Digitaleingänge. Angeschlossen ist ein 4x20 Zeichen Display.

    Die ganze Hardware kommuniziert per RS232/USB mit dem Excel 2000 über das MSCOMM OCX. Das Excel habe ich im Prinzip als Grundlage um mir vernümftig etwas Visualisieren zu lassen. Wenn man alles im Hyper terminal anschauen muss wird man wahnsinnig.

    Das der µController vermutlich mit Inputbin und Input nichts anzeigt ist garantiert noch ein Bug in Bascom. Ich habe diese Befehle auch schon ohne Interupt versucht aber es gibt überhaupt keine Reaktion darauf.


    Das hatte ich auch schonmal vor die Schleife gesetzt aber es hat keine Auswirkung :
    cls
    LCD "A= " ; A
    waitms 100.


    Ich denke mal ich lasse es erstmal auf meiner Lösung beruhen auch wenn diese nicht gerade sehr fortschrittlich ist.

    Mein jetziges Problem ist das wenn ich aus dem Excel eine Zahl schicke damit der µC den Digitalausgang schaltet dann kann ich immer nur einen Impuls schicken. Mit nur einem kurzem Impuls kann ich aber keinen der Digitalausgänge permanent einschalten bis zum Ausschaltimpuls.

    Das müsste irgendwie wie eine Selbsthaltung funktionieren.


    Gruß
    Steffen

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    17.02.2006
    Beiträge
    29
    Hallo Steffen,

    Ich kenne 2 Möglichkeiten die Selbsthaltung deines Ports zu realisieren.

    1. beim Einlaufen des Zeichens den entsprechenden Port auf 1 setzen und
    beim nächsten Mal den Port auf 0 setzen.

    2. Den Befehl Toggle zu benutzen
    If A = 1 Then Toggle Portb.0
    Dieser Befehl negiert den Ausgang einfach, egal ob er vorher 1 oder 0 war.

    MfG Jürgen

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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