- Labornetzteil AliExpress         
Ergebnis 1 bis 5 von 5

Thema: atmega644p & com2 & waitkey

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381

    atmega644p & com2 & waitkey

    Anzeige

    Praxistest und DIY Projekte
    Und ich schon wieder

    Nach dem der Bootloader nun funst, wollte ich eine Erkennung einbauen, die die "123" vom MCS Bootloader erkennt und dann in den Bootloaderbereich springt und dies alles über com2 vom mega644p:
    Code:
    $regfile = "m644pdef.DAT"
    $crystal = 14745600
    $baud = 57600
    Baud = 57600
    $hwstack = 40
    $swstack = 40
    $framesize = 40
    $lib "glcdKS108.lbx"                                                            'Include the library for the KS-108 controler
    
    '$sim
    
    '------------------------------------------------------------------------------- Grafik LCD
    Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Porta , Ce = 0 , Ce2 = 1 , Cd = 2 , Rd = 3 , Reset = 5 , Enable = 4
    Cls
    
    '------------------------------------------------------------------------------- Autoflash über RS232
    Dim Rs232_flash As Byte
    Dim Rs232_str As Byte
    Open "COM1:" For Binary As #1
    Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    Open "COM2:" For Binary As #2
    Config Com2 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    
    '-------------------------------------------------------------------------------SNAP
    
    Dim Lv As Byte
    Dim Temp As Word
    
    Dim Rf_rxd As Bit , Rf_sync As Bit
    
    Do
    '******************************************************************************* 'Automatisches Flashen über RS232
    
    Rs232_flash = Ischarwaiting(#2)
    If Rs232_flash = 1 Then                                                         'wurde was über RS232 empfangen?
       Rs232_str = Inkey(#2)                                                        'Empfangspuffer auslesen
       If Rs232_str = 123 Then                                                      'vom MCS-Programmer geschickte "123" empfangen?
       Print #1 , Rs232_str
       Else
       Print #1 , "kein Zeichen"                                                    'Sprungadresse zum Startbereich des Bootloaders
       End If
    End If
    
      If Rf_rxd = 1 Then
          Print
    
          End If
     'do anything....
    
      Print #1 , "neuer Mainloop"
      Wait 1
    Loop
    End
    nutze ich nun nur com1 funktioniert das alles. Ich komme mit der Zeichenerkennung Ischarwaiting & Inkey für com2 nicht klar.

    Lässt sich Ischarwaiting & Inkey genauso für com2 nutzen und zwar wie?
    => Ischarwaiting(#2) & Inkey(#2) funst leider nicht, Ischarwaiting(#2) bekomme ich zwar eine 1 wenn was empfangen wurde, jedoch bei Inkey bekomme ich keinen Wert.

    Help

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    11.02.2010
    Beiträge
    29
    Waitkey und Inkey funktionieren so wie du geschrieben hast mit z.B. waitkey(#2)
    Da du aber im Programm nicht auf den Empfang des Startbytes wartest musst du einen Buffer verwenden.
    Code:
    Config Serialin1 = Buffered , Size =10
    Serialin ist für COM1, Serialin1 für COM2.

    Grüße Stefan

    Edit: Was mit gerade noch aufgefallen ist.... du hast die Baudrate für COM2 nicht richtig eingestellt.
    Für COM1:
    Code:
    $baud = 57600
    (in deinem Code richtig)
    und für COM2:
    Code:
    $baud1 = 57600

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    Hi Reinhars,

    egal wie ich die Verwendung der Config für com2 benutze, funktioniert es nicht.
    Auch die config eines Buffers bringt nichts, ausgeben über die Seriell com2 funktioniert aber.
    ??? irgend welche Ideen?

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    11.02.2010
    Beiträge
    29
    Wenn ich das richtig gesehen habe, willst du an UART2 SNAP verwenden, das mach ich auch und es funktioniert bei mir.
    Hier meine SNAP sende/empfangsroutine:
    Code:
       ' Send packet including the preamble and SYNC byte
       Printbin #2 , Preamble ; Sbyte ; Hdb2 ; Hdb1 ; Dab1 ; Sab1
       Printbin #2 , Db8 ; Db7 ; Db6 ; Db5 ; Db4 ; Db3 ; Db2 ; Db1
       Printbin #2 , Crc2 ; Crc1
    
    Do
       Received = Waitkey(#2)
       If Received = 0 Then
          Slave = ""
          Exit Function
       End If
       If Received = Sbyte_x Then
          Inputbin #2 , Hdb2 , Hdb1 , Dab1 , Sab1 , Db8 , Db7 , Db6 , Db5 , Db4 , Db3 , Db2 , Db1 , Crc2 , Crc1       ' Get packet in binary mode
          Goto Packet
       Else
          Preamble = Received
       End If
    Loop
    Damit das Programm nicht ewig wartet, falls ein slave nicht da ist setzte ich einen timout.
    Code:
    $timeout = 2000000
    Bei deiner Konfiguration von den UARTs bin ich mir nicht sicher.... Für mich wäre logisch zuerst die config zu machen und anschliesend den Port zu öffnen.
    Bei mir schaut das so aus:
    Code:
    $baud1 = 9600
       Config Com2 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0       ' MUST MATCH THE SLAVE
    
       Config Print1 = Portd.4 , Mode = Set                     ' use portb.1 for the direction
       Rs485dir Alias Portd.4
    
       Config Rs485dir = Output
       Rs485dir = 0                                             ' go to receive mode
       Open "com2:" For Binary As #2
    Das ganze ist OHNE Buffer. Die Sachen für RS485 muss man in deinem Fall natürlich weglassen. Wobei ich dir für ein System mit mehreren Slaves RS-485 natürlich nur empfehlen kann.

    Achja, beim Slave sollte zwischen Empfangen und Senden eine gewisse Zeit gewartet werden. (z.B. Umschalten der Richtung bei RS-485) Schaden kanns nicht. Ich habe vor dem Senden (Slave) eine Wartezeit von 50ms.

    Hier noch die Slave Empfangsroutine MIT Buffer.

    Code:
    Do
       Idle
       While _rs_head_ptr0 <> _rs_tail_ptr0                     'check the status of the RS232 register
          Received = Inkey()
          If Received = Sbyte Then
             Inputbin Hdb2 , Hdb1 , Dab1 , Sab1 , Db8 , Db7 , Db6 , Db5 , Db4 , Db3 , Db2 , Db1 , Crc2 , Crc1       ' Get packet in binary mode
             Gosub Packet
          Else
             Preamble = Received
          End If
       Wend
    Loop
    Gruß Stefan

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    Hallo Stefan,

    jetzt funst es auch bei mir...
    Ich weiß jetzt nicht ganz genau warum, ich hatte schon alle Möglichkeiten durchgespielt, egal....
    Ich habe die Initialisierung mal so geschrieben:

    * Config Com2 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
    * Open "COM2:" For Binary As #2

    und so geht es.

    Zu Anfangs wollte ich nur einmal versuchen die com anzusprechen. Später nun will ich mich mal mit SNAP auseinandersetzen. Es gibt einige interessante Lösungen für Funk mit RFM12 & Snap.

    Also Danke Dir!
    Bis die Tage
    MAT

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad