Hallo,
wie sollte man denn die Serielle Schnittstelle einstellen damit das Gerät auch so empfängt wir der AVR sendet,
also ich mein jetzt nicht nur wieviel Baud, sondern auch den Rest wie Stoppbit, Parität, anzahl Bits usw. ?!
Hallo,
wie sollte man denn die Serielle Schnittstelle einstellen damit das Gerät auch so empfängt wir der AVR sendet,
also ich mein jetzt nicht nur wieviel Baud, sondern auch den Rest wie Stoppbit, Parität, anzahl Bits usw. ?!
guten abend zusammen,
also lass deinen Takt mal von einem externen Quarz machen. Saubere Taktraten lassen sich unter anderem aus folgenden Quarzfrequenzen generieren:
3,6863Mhz
14,7456MHz
zum erstgenannten noch 33p Bürdekapazitäten und dann müsste das funktionieren. Tut es auf jeden Fall bei mir
greetzle brat
und ach ja
serielle schnittstelle 8N1 also 8 bits, keine parität, und 1 stopbit
Das war aber aus deinem Code nicht zu ersehen.ha, ha, ha
das hab ich doch gemacht. nur an der empfangsseite kommt es verfälscht an.
Also wenn du die Zeilen:
$crystal=1000000 und
$baud=19200
und der Taktgenerator auf 1MHz steht (fusebits einstellen !, wobei ich nicht weiß, welche Settings der Mega 8 kann.)
dann sollte es funktionieren.
Du kannst Bascom auch eine andere Baudrate vorgaukeln...
mach' crystal = geteilt durch 4, dann kommst du auch auf 19200,
wenn du vorher 4800 hattest.
Funzt zwar, ist aber Quatsch, denn entweder ist dein Takt falsch in den Fusebits eingestellt, oder die Taktfrequenz falsch in Bascom eingegeben.
Gruß
Christopher
Also ich habs ets hinbekommen, das mein m16 mit 16Mhz läuft. und bei einer baudrate von 19200 mit dem gerät kommuniziert.
ich hab die kommunikation wie oben beschrieben realisiert, nun will ich das er das 2.empfangene Byte mit der Zahl 6 vergleicht, und mir 'fehler' bzw. 'kein fehler' über das UART ausgibt.
wenn ich im nun als 2.Byte eine 6 sende, gibt er kein fehler aus, und bei einer zahl ungleich 6 fehler. was so weit je schon mal gut ist. aber wiederhole ich diesen vorgang gibt er immer fehler aus.Code:Sub Status if Packete(2)= 6 then print 'kein Fehler' else print 'Fehler' return end sub
woran kann das liegen?
mfg
xeus
Kannst du den aktuellen Code reinstellen ?
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Hier der code, wie gesagt ich empfange ein packet mit 8 bytes, davon soll er das 2. mit '006' vergleichen.
desweiteren hab ich noch ein Problem mit der Checksummen berechnung, er läst mich bei einer bitverschiebung das ergebnis nicht in eine seperate variable schreiben.
wär nett wenn mir jemand helfen könnte das mit dem vergleich und der checksumme hintzkriegen.Code:$regfile = "m16def.dat" $crystal = 20000000 'Quarz: 3.6864 MHz $baud = 19200 Dim I As Byte Config Lcdpin = Pin , Db4 = Porta.6 , Db5 = Porta.5 , Db6 = Porta.4 , Db7 = Porta.3 , E = Porta.7 , Rs = Porta.2 ' Natürlich so wie es wirklich angeschlossen ist (4-Bit-Modus) Dim A As Byte Config Lcd = 20 * 4 'Baudrate der UART: 9600 Baud Config Pind.1 = Input Config Pind.0 = Output Config Pind.5 = Output Config Pind.2 = Input Dim Clc_l As Byte Dim Clc_h As Byte Dim New , New1 , New2 , New3 As Byte Dim Tmp As Byte Dim Bcclo As Byte Dim Bcchi As Byte Dim X As Byte Dim Packets(10) As Byte Dim Packete(8) As Byte Declare Sub Sendewr Declare Sub Empfangewr Declare Sub Clc Declare Sub Lcdout Declare Sub Status Dim Line1 As String * 20 Dim Line2 As String * 20 Dim Line3 As String * 20 Dim Line4 As String * 20 'PowerLED Portd.5 = 1 'Init Packets Packets(1) = 002 Packets(2) = 050 Packets(3) = 000 Packets(4) = 032 Packets(5) = 032 Packets(6) = 032 Packets(7) = 032 Packets(8) = 032 Packets(9) = 9 Packets(10) = 10 'LCD init Initlcd Line1 = "test" Line2 = " S T A R T!" Line3 = " com" Line4 = "www.ich.de" Gosub Lcdout Do 'Taster 1 If Pind.2 = 1 Then Line2 = " reset" Line3 = " com" Print "reset" Gosub Lcdout End If 'Taster 2 If Pind.4 = 1 Then Gosub Sendewr Gosub Empfangewr 'Gosub Status End If Loop 'SUBs 'Anfrage an WR stellen Sub Sendewr Line2 = " sende Anfrage" Line3 = " com" Printbin Packets(1) ; 10 Gosub Lcdout 'Gosub Clc Return End Sub Sendewr 'Status vom WR empfangen Sub Empfangewr Line2 = " warte auf Daten" Gosub Lcdout Inputbin Packete(1) , 8 Gosub Status Return End Sub Empfangewr 'Checksumme berechnen Sub Clc 'Init Bcclo = &H0XFF 'setze high Bcchi = &H0XFF 'setze high New = &B11011001 'lade byte New = New Xor Bcclo Tmp = Shift New , Left , 4 'Fehlermeldung New = Tmp Xor New Tmp = Shift New , Right , 5 'Fehlermeldung Bcclo = Bcchi 'setze gleich Bcchi = New Xor Tmp Tmp = Shift New , Left , 3 'Fehlermeldung Bcclo = Bcclo Xor Tmp Tmp = Shift New , Right , 4 'Fehlermeldung Bcclo = Bcclo Xor Tmp 'Gosub Lcdout Return End Sub Clc 'LCD Ausgabe Sub Lcdout Cls Locate 1 , 1 '1. Zeile Lcd Line1 Locate 2 , 1 '2. Zeile Lcd Line2 Locate 3 , 1 '3. Zeile Lcd Line3 Locate 4 , 3 '4. Zeile Lcd Line4 Return End Sub 'Status Auswertung Sub Status If Packete(2) = 006 Then 'Vergleich ob das 2.Byte den wert 6 trägt Line3 = "kein Fehler" Print "kein fehler" Else Line3 = " Fehler" Print "fehler" End If Gosub Lcdout Return End Sub Status End 'end program
mfg
xeus
Moddy: Code-Tags ausgebessert
mein Bascom ist aus mehreren Gründen stinkesauer mit deiner source
dim new, new1, .. as byte nimmt er nicht, das braucht er einzeln
SHIFT hat keinen output-parameter. das Feld wird geshiftet, bleibt aber, wo es ist.
wenn du sowas willst wie
Tmp = Shift New , Left , 4
muttu schreiben:
Tmp = New
Shift Tmp, Left , 4
Welche Art Checksum ist das ? (nur informativ)
Fehler Pakete(2)
Schau mal, ob der Sender nicht vielleicht <CR><LF> nach den 8 byte dazusendet.
Egal, überprüfe den input:
nach
inputbin pakete(1), 8
machst du
Print str(pakete(1)) ;str(pakete(2)) ;...str(pakete()
dann siehst du, was effektiv drinsteht und kannst dir vielleicht einen Reim drauf machen
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
erstmal danke, für deine hilfe.
bei der CRC handelt es sich um ein CCITT standrisiertes CRC Polynom:
mit 2Bytes BccLo & Bcchi
also, das mit XOR ist schon mal kein Problem.Bn=N^16+N^12+N^5+Bn-1
A. Init BccLo=0xFF, BccHi=0xFF
B. Für jedes Byte das gesendet und empfangen wird
new=new XOR BccLo
tmp=new<<4
new=tmp XOR new
tmp=new>>5
BccLo=BccHi
BccHi=new XOR tmp
tmp=new<<3
BccLo=BccLo XOR tmp
tmp=new>>4
BccLo=BccLo XOR tmp
C. Negieren Bit by Bit BccLo & BccHi: CLC_L=~BccLo CLC_H=~BccHi
das mit dem bitverschieben müsste eigentlich auch möglich sein. das problem ist nur den wert in die entsprechende variable zu übertragen.
Also mein sender hängt defenetiv keine bytes oder bits dran, denn bei dem sender handelt es sich um ein selbstgeschriebenes programm, sendet genau 6 bytes + 2bytes CLC_L,CLC_H
Noch eine zusätzliche Fragen:
wenn ích die bytes empfange (input packet(1)...)
muss es doch möglich sein z.b. das 2. byte mit einem vorgegebenen wert zu vergleichen, und daraufhin eine reaktion auszuführen.
gruß
xeus
Wegen dem 2. Byte: Ich hab ja gesagt, mach nach dem Empfang der 8 Byte ein print mit allen Zeichen.
Da werden irgendwelche verschiebungen stattfinden. da du ja weißt, was du schickst, kannst du daraus dann das Problem einkreisen
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Lesezeichen