PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : atmega644p & com2 & waitkey



mat-sche
06.07.2010, 19:12
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:


$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 ](*,)

reinhars
07.07.2010, 09:08
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.

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:

$baud = 57600(in deinem Code richtig)
und für COM2:

$baud1 = 57600

mat-sche
07.07.2010, 19:29
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?

reinhars
08.07.2010, 07:16
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:


' 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.

$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:

$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.


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

mat-sche
09.07.2010, 16:29
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