-
2 Byte empfangen
Hi
Ich möchte über Rs232 16 Bit (also 2 Byte) empfangen.
Code:
$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
-
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
-
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
-
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.
-
Hi
@Marco78
das habe ich mir schon fast gedacht. deshalb bin ich auf fast die gleiche Idee gekommen. Trotzdem vielen Dank
Marcel
-
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.