PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 2 Byte empfangen



southpole200
04.11.2006, 15:31
Hi

Ich möchte über Rs232 16 Bit (also 2 Byte) empfangen.


$regfile = "m8def.dat"
$crystal = 3686400
$baud = 9600
'##########################


'##########################
'######### RS232 ##########
On Urxc Onrxd
Enable Urxc
Enable Interrupts
'##########################

Dim Befehl As Byte

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcdbus = 4
Cursor Off

Do

Loop

Onrxd:
Befehl = Udr
Cls
Lcd Befehl.9
Return

Ich möchte wie ihr seht mit der "Funktion" Befel.9 das 10te Bit auslesen.
Empfangen werden aber max. 8 Bit also 1 Byte

Wie mache ich es, dass es funktioniert?

Marcel

AVRboy
04.11.2006, 15:49
hi,
Vieleicht geht das ja mit INPUT wenn du Befehl als WORD hast wartet der AVR solange bis er ein Word grosse Variabele eingelesen wurde.
Aber warum willst du nur ein Bit daraus auslesen.

mfg

southpole200
04.11.2006, 15:53
HI

Input braucht 2 Datenleitungen + GND
Ich will/habe aber nur 1 Datenleitung + GND zur Verfügung.

natürlich will ich mehrere Bit auslesen. das war jetzt nur ein Bsp.

Marcel

Marco78
04.11.2006, 18:00
Du kannst technisch ja nur 8 Bit empfangen (8N1). Das 10. Bit, das du auslesen willst, ist ja das zweite Bit des zweiten Bytes.

In Onrxd könntest du ja einen Zähler programmieren.

Onrxd:

Incr X

If X=2 then
Befehl=udr
cls
LCD Befehl.1
X=0
end if

return

Oder gleich
LCD Udr.1
Je nachdem, was ob du Befehl noch weiterhin brauchst oder nicht.
Und vorrausgesetzt, das LCD Befehl.1 überhaupt geht.

southpole200
04.11.2006, 19:14
Hi

@Marco78
das habe ich mir schon fast gedacht. deshalb bin ich auf fast die gleiche Idee gekommen. Trotzdem vielen Dank

Marcel

Vitis
05.11.2006, 10:55
Also, UDh ast Befehl mal nur als Byte deklariert (DIM as byte), da kannste kein neuntes Bit und auch kein achtes auslesen, weil das in die Variable nicht rein passt.
Du kannst die UART auch in 9n1 laufen lassen, für bestimmte Bus-Systeme wird das gerne verwendet um zu unterscheiden ob Daten oder Adressen übermittelt werden. Dafür gibts dann ein Register in der UART, wo die jeweiligen Bit dann drinn stehen, das nennt sich UCSRB, bzw. daraus das Bit RXB8.
Das läuft dann in etwa so (Pseudocode):

dim befehl as word at &Ha0
dim highbyte as byte at &Ha1 overlay
dim lowbyte as byte at &ha0 overlay

isr:
highbyte = ucsrb and &B00000001
lowbyte = udr
return
end

und schon haste 9 Bit in ner Wordvariable also 0 bis 512 als Datenwert.
Aber 2 Byte sind das natürlich nicht, was ja die fragestellung war.

Da geht das dann ähnlich, du brauchst dann nur ne Möglichkeit
zu erkennen welches das erte Byte ist. das geht dann über

a) ein Protokoll mit nem bestimmten Startbyte oder Endbyte oder 8.Bit, dann sinds also 3 Byte die rüber müssen bzw. einmal 9Bit, einmal 8 Bit
b) einer Pause zwischen den übertragenen Werten, wo dann ein Timer ablaufen kann und zurücksetzt.

bei a währs dann in etwa so:

dim tempbyte as byte

ISR:
tempbyte = ucsrb and &B00000001
if tempbyte=1 then
highbyte= udr
else
lowbyte = udr
endif

end
es wird also unterschieden ob bit 8 gesetzt, dann ists das highbyte der wordvariable oder eben nicht, dann ists der lowbyte der vasriable

klar, dass für die aktion die USART auf 9n1 konfiguriert werden muss.